{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreifaeea7qmz7gejdof3nccxys2cn4dhdzvivu422uizom4zrrff6di",
    "uri": "at://did:plc:ivbknywyskln22er3nkssdhl/app.bsky.feed.post/3mn5dyc25sav2"
  },
  "path": "/t/parser-error-recovery-in-syn-for-better-ide-support-with-proc-macros/24362#post_15",
  "publishedAt": "2026-05-31T10:09:29.000Z",
  "site": "https://internals.rust-lang.org",
  "tags": [
    "github.com/tokio-rs/tracing",
    "tracing-attributes/src/lib.rs",
    "d9d4c542d"
  ],
  "textContent": "What I wish for from syn is an easy way to treat bodies opaquely.\n\n\n    #[async_trait]\n    pub trait MyTrait {\n        async fn my_fn(&self) {\n            let = self. // currently typing here\n        }\n    }\n\n\nThere should be no reason why the proc macro should struggle with this. The parts it cares about are completely valid. The body, which it doesn't really care about, is delimited in the Group. It should just forward it to the output.\n\nSome function attribute macros like `tracing::instrument` manually implement something like this.\n\ngithub.com/tokio-rs/tracing\n\n#### tracing-attributes/src/lib.rs\n\nd9d4c542d\n\n\n\n\n\n\n        652.             vis: &self.vis,\n\n\n        653.             sig: &self.sig,\n\n\n        654.             brace_token: &self.brace_token,\n\n\n        655.             block: &self.block,\n\n\n        656.         }\n\n\n        657.     }\n\n\n        658. }\n\n\n        659.\n\n        660. /// This parses a `TokenStream` into a `MaybeItemFn`\n\n\n        661. /// (just like `ItemFn`, but skips parsing the body).\n\n\n        662. impl Parse for MaybeItemFn {\n\n\n        663.     fn parse(input: ParseStream<'_>) -> syn::Result<Self> {\n\n\n        664.         let outer_attrs = input.call(Attribute::parse_outer)?;\n\n\n        665.         let vis: Visibility = input.parse()?;\n\n\n        666.         let sig: Signature = input.parse()?;\n\n\n        667.         let inner_attrs = input.call(Attribute::parse_inner)?;\n\n\n        668.         let block;\n\n\n        669.         let brace_token = syn::braced!(block in input);\n\n\n        670.         let block: TokenStream = block.call(|buffer| buffer.parse())?;\n\n\n        671.         Ok(Self {\n\n\n        672.             outer_attrs,\n\n\n\n",
  "title": "Parser error recovery in `syn` for better IDE support with proc-macros"
}