Skip to content

Commit e6b4819

Browse files
mbrobbeldpc
authored andcommitted
tracing-attributes: support const values for target and name
Fixes: #2460
1 parent 908cc43 commit e6b4819

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-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: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,75 @@ fn impl_trait_return_type() {
238238

239239
handle.assert_finished();
240240
}
241+
242+
#[test]
243+
fn name_ident() {
244+
const MY_NAME: &str = "my_name";
245+
#[instrument(name = MY_NAME)]
246+
fn name() {}
247+
248+
let span_name = expect::span().named(MY_NAME);
249+
250+
let (collector, handle) = collector::mock()
251+
.new_span(span_name.clone())
252+
.enter(span_name.clone())
253+
.exit(span_name.clone())
254+
.drop_span(span_name)
255+
.only()
256+
.run_with_handle();
257+
258+
with_default(collector, || {
259+
name();
260+
});
261+
262+
handle.assert_finished();
263+
}
264+
265+
#[test]
266+
fn target_ident() {
267+
const MY_TARGET: &str = "my_target";
268+
269+
#[instrument(target = MY_TARGET)]
270+
fn target() {}
271+
272+
let span_target = expect::span().with_target(MY_TARGET);
273+
274+
let (collector, handle) = collector::mock()
275+
.new_span(span_target.clone())
276+
.enter(span_target.clone())
277+
.exit(span_target.clone())
278+
.drop_span(span_target)
279+
.only()
280+
.run_with_handle();
281+
282+
with_default(collector, || {
283+
target();
284+
});
285+
286+
handle.assert_finished();
287+
}
288+
289+
#[test]
290+
fn target_name_ident() {
291+
const MY_NAME: &str = "my_name";
292+
const MY_TARGET: &str = "my_target";
293+
294+
#[instrument(target = MY_TARGET, name = MY_NAME)]
295+
fn name_target() {}
296+
297+
let span_name_target = expect::span().named(MY_NAME).with_target(MY_TARGET);
298+
299+
let (collector, handle) = collector::mock()
300+
.new_span(span_name_target.clone())
301+
.enter(span_name_target.clone())
302+
.exit(span_name_target.clone())
303+
.drop_span(span_name_target)
304+
.only()
305+
.run_with_handle();
306+
307+
with_default(collector, || {
308+
name_target();
309+
});
310+
311+
handle.assert_finished();
312+
}

0 commit comments

Comments
 (0)