Skip to content

Commit 574f77f

Browse files
Merge #351
351: Cleanup defmt tags r=japaric a=jonas-schievink This adds a `write` tag to identify format strings from user-defined `write!` invocations, and splits up the `fmt` tag into `prim` for primitives, and `derived` for `#[derive(Format)]`-generated strings. This allows tools to distinguish user-controlled format strings from generated ones. Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
2 parents ce27dfd + b4b3df3 commit 574f77f

3 files changed

Lines changed: 18 additions & 15 deletions

File tree

decoder/src/lib.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ include!(concat!(env!("OUT_DIR"), "/version.rs"));
3131

3232
#[derive(PartialEq, Eq, Debug)]
3333
pub enum Tag {
34-
/// A format string for use with `{=?}`. Used for both primitive format strings (which are
35-
/// special cased to have lower indices), and user format strings created by
36-
/// `#[derive(Format)]`.
37-
Fmt,
34+
/// Defmt-controlled format string for primitive types.
35+
Prim,
36+
/// Format string created by `#[derive(Format)]`.
37+
Derived,
38+
/// A user-defined format string from a `write!` invocation.
39+
Write,
3840
/// An interned string, for use with `{=istr}`.
3941
Str,
4042
/// Defines the global timestamp format.
@@ -50,12 +52,12 @@ pub enum Tag {
5052
impl Tag {
5153
fn to_level(&self) -> Option<Level> {
5254
match self {
53-
Tag::Fmt | Tag::Str | Tag::Timestamp => None,
5455
Tag::Trace => Some(Level::Trace),
5556
Tag::Debug => Some(Level::Debug),
5657
Tag::Info => Some(Level::Info),
5758
Tag::Warn => Some(Level::Warn),
5859
Tag::Error => Some(Level::Error),
60+
_ => None,
5961
}
6062
}
6163
}
@@ -1349,7 +1351,7 @@ mod tests {
13491351
);
13501352
entries.insert(
13511353
1,
1352-
TableEntry::new_without_symbol(Tag::Fmt, "Foo {{ x: {=u8} }}".to_owned()),
1354+
TableEntry::new_without_symbol(Tag::Derived, "Foo {{ x: {=u8} }}".to_owned()),
13531355
);
13541356

13551357
let table = Table {
@@ -1391,7 +1393,7 @@ mod tests {
13911393
);
13921394
entries.insert(
13931395
1,
1394-
TableEntry::new_without_symbol(Tag::Fmt, "Foo {{ x: {=u8} }}".to_owned()),
1396+
TableEntry::new_without_symbol(Tag::Derived, "Foo {{ x: {=u8} }}".to_owned()),
13951397
);
13961398

13971399
let table = Table {
@@ -1544,7 +1546,7 @@ mod tests {
15441546
entries.insert(
15451547
1,
15461548
TableEntry::new_without_symbol(
1547-
Tag::Fmt,
1549+
Tag::Derived,
15481550
"Flags {{ a: {=bool}, b: {=bool}, c: {=bool} }}".to_owned(),
15491551
),
15501552
);
@@ -1826,11 +1828,11 @@ mod tests {
18261828
);
18271829
entries.insert(
18281830
3,
1829-
TableEntry::new_without_symbol(Tag::Fmt, "None|Some({=?})".to_owned()),
1831+
TableEntry::new_without_symbol(Tag::Derived, "None|Some({=?})".to_owned()),
18301832
);
18311833
entries.insert(
18321834
2,
1833-
TableEntry::new_without_symbol(Tag::Fmt, "{=u8}".to_owned()),
1835+
TableEntry::new_without_symbol(Tag::Derived, "{=u8}".to_owned()),
18341836
);
18351837

18361838
let table = Table {

elf2table/src/symbol.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ impl Symbol {
3939

4040
pub fn tag(&self) -> SymbolTag<'_> {
4141
match &*self.tag {
42-
"defmt_prim" | "defmt_fmt" => SymbolTag::Defmt(Tag::Fmt),
42+
"defmt_prim" => SymbolTag::Defmt(Tag::Prim),
43+
"defmt_derived" => SymbolTag::Defmt(Tag::Derived),
44+
"defmt_write" => SymbolTag::Defmt(Tag::Write),
4345
"defmt_timestamp" => SymbolTag::Defmt(Tag::Timestamp),
4446
"defmt_str" => SymbolTag::Defmt(Tag::Str),
4547
"defmt_trace" => SymbolTag::Defmt(Tag::Trace),

macros/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ pub fn format(ts: TokenStream) -> TokenStream {
329329
))
330330
}
331331

332-
let sym = mksym(&fs, "fmt", false);
332+
let sym = mksym(&fs, "derived", false);
333333
exprs.push(quote!(
334334
if f.inner.needs_tag() {
335335
f.inner.istr(&defmt::export::istr(#sym));
@@ -346,7 +346,7 @@ pub fn format(ts: TokenStream) -> TokenStream {
346346
let mut pats = vec![];
347347
let args = fields(&ds.fields, &mut fs, &mut field_types, &mut pats);
348348

349-
let sym = mksym(&fs, "fmt", false);
349+
let sym = mksym(&fs, "derived", false);
350350
exprs.push(quote!(
351351
if f.inner.needs_tag() {
352352
f.inner.istr(&defmt::export::istr(#sym));
@@ -1023,8 +1023,7 @@ pub fn write(ts: TokenStream) -> TokenStream {
10231023
};
10241024

10251025
let fmt = &write.fmt;
1026-
// FIXME: Introduce a new `"write"` tag and decode it in a loop (breaking change).
1027-
let sym = mksym(&ls, "fmt", false);
1026+
let sym = mksym(&ls, "write", false);
10281027
quote!({
10291028
let fmt: ::defmt::Formatter<'_> = #fmt;
10301029
match (fmt.inner, #(&(#args)),*) {

0 commit comments

Comments
 (0)