Skip to content

Commit 10df309

Browse files
mbrobbeldpc
authored andcommitted
tracing-attributes: support const values for target and name
Fixes: #2460
1 parent ac8b8df commit 10df309

File tree

2 files changed

+64
-3
lines changed

2 files changed

+64
-3
lines changed

tracing-attributes/src/attr.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ pub(crate) struct EventArgs {
1717
#[derive(Clone, Default, Debug)]
1818
pub(crate) struct InstrumentArgs {
1919
level: Option<Level>,
20-
pub(crate) name: Option<LitStr>,
21-
target: Option<LitStr>,
20+
pub(crate) name: Option<LitStrOrIdent>,
21+
target: Option<LitStrOrIdent>,
2222
pub(crate) parent: Option<Expr>,
2323
pub(crate) follows_from: Option<Expr>,
2424
pub(crate) skips: HashSet<Ident>,
@@ -86,6 +86,8 @@ impl Parse for InstrumentArgs {
8686
// XXX: apparently we support names as either named args with an
8787
// sign, _or_ as unnamed string literals. That's weird, but
8888
// changing it is apparently breaking.
89+
// This also means that when using idents for name, it must be via
90+
// a named arg.
8991
if args.name.is_some() {
9092
return Err(input.error("expected only a single `name` argument"));
9193
}
@@ -198,8 +200,32 @@ impl Parse for EventArgs {
198200
}
199201
}
200202

203+
#[derive(Debug, Clone)]
204+
pub(super) enum LitStrOrIdent {
205+
LitStr(LitStr),
206+
Ident(Ident),
207+
}
208+
209+
impl ToTokens for LitStrOrIdent {
210+
fn to_tokens(&self, tokens: &mut TokenStream) {
211+
match self {
212+
LitStrOrIdent::LitStr(target) => target.to_tokens(tokens),
213+
LitStrOrIdent::Ident(ident) => ident.to_tokens(tokens),
214+
}
215+
}
216+
}
217+
218+
impl Parse for LitStrOrIdent {
219+
fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
220+
input
221+
.parse::<LitStr>()
222+
.map(LitStrOrIdent::LitStr)
223+
.or_else(|_| input.parse::<Ident>().map(LitStrOrIdent::Ident))
224+
}
225+
}
226+
201227
struct StrArg<T> {
202-
value: LitStr,
228+
value: LitStrOrIdent,
203229
_p: std::marker::PhantomData<T>,
204230
}
205231

tracing-attributes/tests/instrument.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,3 +239,38 @@ fn impl_trait_return_type() {
239239

240240
handle.assert_finished();
241241
}
242+
243+
#[test]
244+
fn target_name_ident() {
245+
const MY_NAME: &str = "my_name";
246+
const MY_NAME2: &str = "my_name2";
247+
const MY_TARGET: &str = "my_target";
248+
249+
#[instrument(name = MY_NAME)]
250+
fn name() {}
251+
252+
#[instrument(target = MY_TARGET, name = MY_NAME2)]
253+
fn target() {}
254+
255+
let span_name = expect::span().named(MY_NAME);
256+
let span_target = expect::span().named(MY_NAME2).with_target(MY_TARGET);
257+
258+
let (collector, handle) = collector::mock()
259+
.new_span(span_name.clone())
260+
.enter(span_name.clone())
261+
.exit(span_name.clone())
262+
.drop_span(span_name)
263+
.new_span(span_target.clone())
264+
.enter(span_target.clone())
265+
.exit(span_target.clone())
266+
.drop_span(span_target)
267+
.only()
268+
.run_with_handle();
269+
270+
with_default(collector, || {
271+
name();
272+
target();
273+
});
274+
275+
handle.assert_finished();
276+
}

0 commit comments

Comments
 (0)