-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix bug in shebang handling #71487
Fix bug in shebang handling #71487
Conversation
r? @eddyb (rust_highfive has picked a reviewer for you, use r? to override) |
cc @petrochenkov this also fixes your comments on the previous PR (only the first line is whitespace-stripped, uses the correct is_whitespace function, & addresses the |
This comment has been minimized.
This comment has been minimized.
// Enable testing ICE's that require specific (untidy) | ||
// file formats easily eg. `issue-1234-ignore-tidy.rs` | ||
if filename.contains("ignore-tidy") { | ||
return; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a hack in the best meaning of the word.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could also place these kind of tests in a specific directory and filter those out?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The filename opt out looks good to me.
It seems better to keep tests in directories where they actually belong to.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// Enable testing ICE's that require specific (untidy) | ||
// file formats easily eg. `issue-1234-ignore-tidy.rs` | ||
if filename.contains("ignore-tidy") { | ||
return; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The filename opt out looks good to me.
It seems better to keep tests in directories where they actually belong to.
I believe an empty #!
[foo] should be considered equivalent to The important thing, IMO, is to not treat valid Rust syntax (starting with Having just wrangled C preprocessing (which has a similar problem with comment starting inside the header name of |
This PR should probably also add missing UI tests for #71372. |
On Monday, I will simplify & add UI tests. |
Ok, I guess we need to precisely define what is considered a shebang then (regardless of ambiguities with Rust). No spaces, then |
After a surprisingly large amount of thought for this seemingly simple situation, I believe there is actually no solution that both accepts all valid rust programs and all valid shebangs other than attempting to parse the file and falling back to deleting the shebang line if it doesn't parse 🙄 (which I don't think we should do). After a quick search, I don't think we'd break people if we were slightly stricter in how we handle shebangs, but I think that is the biggest risk with changing anything here. Most of these weird cases don't compile as is on stable so we won't break anyone by continuing to not have them compile. My proposed change:
Notably this doesn't handle the case with JustificationMy initial approach is defining shebangs as equivalent to the following regex:
(which really looks like a shebang until you get to the 4th character) But in terms of actual shebang acceptance, #!//bin/bash
[foo] But just as well this could be #!//bin/bash
pub fn not_a_sneaky_attribute() -> {
println!("Because everything sucks here, that was actually a shebang. Good luck figuring that out.");
} It's worth noting this doesn't currently compile: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=a0603ad05e578e7eaf118d540e8bcd49 (but I think it should) And also, And regardless of theoretical validity, But, |
Note that a Rust module cannot start with My suggestion was to disallow any potential overlap and error if IMO we should do this properly. I'll prepare a PR reverting the previous PR so that we can crater-run this one (EDIT: it's up as #71634). |
Revert rust-lang#71372 ("Fix #! (shebang) stripping account space issue"). While rust-lang#71372 fixed some of the problems `#!`-stripping had, it introduced others: * inefficient implementation (`.chars().filter(...).collect()` on the entire input file) * this also means the length returned isn't always correct, leading to e.g. rust-lang#71471 * it ignores whitespace anywhere, stripping ` # ! ...` which isn't a valid shebang * the definition of "whitespace" it uses includes newlines, which means even `\n#\n!\n...` is stripped as a shebang (and anything matching the regex `\s*#\s*!\s*`, and not followed by `[`, really) * it's backward-incompatible but didn't go through Crater Now, rust-lang#71487 is already open and will solve all of these issues. But for running Crater, and just in case rust-lang#71487 takes a bit longer, I decided it's safer to just revert rust-lang#71372. This will also make rust-lang#71372's diff clearer, as it will start again from the original whitespace-unaware version. r? @petrochenkov
This comment has been minimized.
This comment has been minimized.
We only need lexing, not parsing, and we only need to run the lexer loop until we encounter a first non-whitespace token. Seems pretty realistic :) This will also allow to avoid processing things like Pseudocode:
If it's only |
📌 Commit f1e14736e785d0353b7dc9f1174499ef94ae78d7 has been approved by |
⌛ Testing commit f1e14736e785d0353b7dc9f1174499ef94ae78d7 with merge d62fa51f12dfec9bba0b7c6cbf66fd1dee52062c... |
This comment has been minimized.
This comment has been minimized.
Looks like someone else fixed the same
|
Shebang handling was too agressive in stripping out the first line in cases where it is actually _not_ a shebang, but instead, valid rust (rust-lang#70528). This is a second attempt at resolving this issue (the first attempt was flawed, for, among other reasons, causing an ICE in certain cases (rust-lang#71372, rust-lang#71471). The behavior is now codified by a number of UI tests, but simply: For the first line to be a shebang, the following must all be true: 1. The line must start with `#!` 2. The line must contain a non whitespace character after `#!` 3. The next character in the file, ignoring comments & whitespace must not be `[` I believe this is a strict superset of what we used to allow, so perhaps a crater run is unnecessary, but probably not a terrible idea.
@bors r+ |
📌 Commit a93d316 has been approved by |
⌛ Testing commit a93d316 with merge b0fa18865969ed43e27c1fb8fcc1acb2c0aa60e0... |
@bors retry yield |
☀️ Test successful - checks-azure |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [syn](https://github.com/dtolnay/syn) | dependencies | major | `1` -> `2` | --- ### Release Notes <details> <summary>dtolnay/syn</summary> ### [`v2.0.8`](https://github.com/dtolnay/syn/releases/tag/2.0.8) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.7...2.0.8) - Treat `try` keyword as 2015-edition identifier in definition of try macro ([#​1422](https://github.com/dtolnay/syn/issues/1422)) ### [`v2.0.7`](https://github.com/dtolnay/syn/releases/tag/2.0.7) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.6...2.0.7) - Fix parsing of `mut self` inside of Type::BareFn ### [`v2.0.6`](https://github.com/dtolnay/syn/releases/tag/2.0.6) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.5...2.0.6) - Improve error message on missing ';' between statements ([#​1419](https://github.com/dtolnay/syn/issues/1419)) - Keep non-brace macro invocations in trailing expr position as Expr::Macro ([#​1420](https://github.com/dtolnay/syn/issues/1420)) ### [`v2.0.5`](https://github.com/dtolnay/syn/releases/tag/2.0.5) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.4...2.0.5) - Expose `ExprMacro` data structure even when `features="full"` is not used ([#​1417](https://github.com/dtolnay/syn/issues/1417)) ### [`v2.0.4`](https://github.com/dtolnay/syn/releases/tag/2.0.4) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.3...2.0.4) - Improve error reporting when parsing identifiers and paths ([#​1415](https://github.com/dtolnay/syn/issues/1415), [#​1416](https://github.com/dtolnay/syn/issues/1416)) ### [`v2.0.3`](https://github.com/dtolnay/syn/releases/tag/2.0.3) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.2...2.0.3) - Expose `ExprGroup` data structure even when `features="full"` is not used ([#​1412](https://github.com/dtolnay/syn/issues/1412)) ### [`v2.0.2`](https://github.com/dtolnay/syn/releases/tag/2.0.2) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.1...2.0.2) - Documentation improvements ### [`v2.0.1`](https://github.com/dtolnay/syn/releases/tag/2.0.1) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.0...2.0.1) - Add methods on syn::Meta for reporting error on an incorrect kind of attribute ([#​1409](https://github.com/dtolnay/syn/issues/1409)) ### [`v2.0.0`](https://github.com/dtolnay/syn/releases/tag/2.0.0) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.109...2.0.0) This release contains a batch of syntax tree improvements to incorporate ongoing Rust language development from the past 3.5 years since syn 1. It never seems like an ideal time to finalize a syntax tree design, considering the frankly alarming number of syntax-disrupting language features currently in flight: keyword generics, restrictions, capabilities and contexts, conditional constness, new varieties of literals, dyn revamp such as explicitly dyn-safe traits and dyn-star, expression syntax in various phases of being added or being torn out (const blocks, try blocks, raw references), auto traits and negative impls, generalizations to higher rank trait bounds, async closures and static async trait methods, postfix keywords, pattern types, return type notation, unsafe attributes, … The plan continues to be the same as laid out originally in the 1.0.0 release announcement: > Be aware that the underlying Rust language will continue to evolve. Syn is able to accommodate most kinds of Rust grammar changes via the nonexhaustive enums and `Verbatim` variants in the syntax tree, but we will plan to put out new major versions on a 12 to 24 month cadence to incorporate ongoing language changes as needed. If anything, the takeaway from the 3.5 year longevity of syn 1 is that this period was tamer from a language development perspective than anticipated, but that is unlikely to last and I think around 24 months is still the correct cadence to expect between releases going forward. <br> <p align="center"><a href="https://docs.rs/syn/2/syn/">[API documentation for 2.0]</a></p> ### Breaking changes - Minimum required Rust version is raised from rustc 1.31 to 1.56. ##### Expressions - Support for `box expr` syntax has been deleted, as it has been deleted recently from rustc. - Support for type ascription syntax `expr: Type` in expression position has been deleted. - Support for unstable `&raw const expr` raw-pointer reference syntax has been deleted. - The representation of generic arguments has been unified between method calls and non-method paths into a single `GenericArgument` type, which supersedes the previous `GenericMethodArgument` and `MethodTurbofish`. - Generic arguments now distinguish between associated types (`AssocType`) and associated constant values (`AssocConst`). Previously these would be parsed ambiguously as `Binding`. - The binary assignment operators in `BinOp` have been renamed to align with the naming used by the standard library's `core::ops` module's traits. For example `BinOp::AddEq` is now called `BinOp::AddAssign`. - `Expr::Struct` struct construction expressions now support structs which are a variant of an enum associated type of a trait, as in `<Type as Trait>::Assoc::Variant { ... }`, which has recently been added to Rust. - `Expr::Range` now follows the `start` and `end` naming used by the standard library's `RangeBounds` trait, rather than `from`/`to` or `lo`/`hi`. - `Expr::AssignOp` has been merged into `Expr::Binary`, which now represents both non-assignment and assignment binary operators. - Stricter parsing of ranges. None of the following are valid expressions, but were previously accepted by syn: `..=`, `lo..=`, `...`, `...hi`, `lo...`, `lo...hi`. - `Expr::Closure` now includes a representation for `for<...>` lifetimes. ##### Statements - Variants `Stmt::Expr` (tail-position expression without trailing semicolon) and `Stmt::Semi` (non-tail expression with trailing semicolon) have been combined into `Stmt::Expr` with the optional semicolon represented by `Option<Token![;]>`. - The syntax tree for `Stmt::Local` has been extended to handle `let`/`else` syntax. - Macros in statement position are now uniformly parsed as `Stmt::Macro`. Previously these would be disambiguated to `Stmt::Item`, although it was ambiguous whether a macro in statement position would expand to an item (like `thread_local! { ... }`) vs an expression (like `println! { ... }`). ##### Patterns - Pattern parsing for all the different syntactic positions in which patterns are allowed has been split into `Pat::parse_single` (for function- and closure-argument position, where top-level `|` is not allowed), `Pat::parse_multi` (where `|` is allowed) and `Pat::parse_multi_with_leading_vert` (for the pattern of match arms, which allow an optional leading `|`). Previously only a single `parse` behavior was supported and behaved like the new `parse_single`. - The `Pat` syntax tree now shares more common data structures with the `Expr` syntax tree where possible, such as for literals, paths, macros, and ranges in pattern position. - Parsing of struct field patterns does a better job rejecting bogus syntax such as `Struct { 0 asdf }` and `Struct { ref mut 0: asdf }`, which were previously incorrectly accepted. - `Pat::Range` now supports one-sided ranges by representing the start and end bound of the range by `Option<Expr>`. - `Pat::Struct` keeps track of attributes on the optional `..` "rest" part of the pattern, as in `let Struct { x, #[cfg(any())] .. } = _;`. - Parsing unary negation now enforces that only literal patterns can be unarily negated. For example `-self::CONST` and `-const { 0i32 }` are not valid syntax in pattern position. - `Pat::TupleStruct` no longer wraps a value of type `PatTuple` but represents that information in its fields directly. - A single parenthesized pattern without trailing comma inside the parentheses is no longer considered a `Pat::Tuple`, it will be parsed as `Pat::Paren`. - One-sided range patterns are no longer allowed inside of slice patterns. `[lo..]` and `[..=hi]` are not considered valid pattern syntax by Rust. ##### Items - Typed `self` in a method signature, such as `self: Pin<&mut Self>`, will now be parsed as `FnArg::Receiver`. This means `self`, whether with or without an explicit type, is always treated as a `Receiver`. Previously only the `&self` and `&mut self` shorthand receivers were parsed as `Receiver`. - `TraitItem::Method` and `ImplItem::Method` have been renamed to `TraitItem::Fn` and `ImplItem::Fn`, as they do not necessarily represent methods if the function signature contains no `self`. - `Item::Macro2` has been deleted as "macros 2.0" syntax is no longer considered on track for stabilization. - Various item kinds now hold `Generics` which didn't used to have them. - The variadic argument of an extern function signature can now be given an optional parameter name. - `WherePredicate::Eq` is no longer supported. - `Visibility::Crate` is no longer supported. This syntax has been removed from rustc. - Public visibility is now represented by a single `Token![pub]` token rather than the old `VisPublic` struct. - `LifetimeDef` is now called `LifetimeParam`. This name makes more sense in the context of the `GenericParam` enum (which also includes `TypeParam` and `ConstParam`), and is the name that the Rust Reference uses. - Modules and extern blocks (`Item::Mod` and `Item::ForeignMod`) can now be marked `unsafe`. ##### Attributes - The syntax tree for `Attribute` has been redesigned. The new API better accommodates attributes which mix structured and unstructured content at different levels of nesting. - `AttributeArgs` has been removed. Use `Punctuated<Meta, Token![,]>`. - For parsing attribute contents, `parse_meta()` is superseded by a new parsing library called `syn::meta`, and the `parse_nested_meta` method on `Attribute`. ##### Tokens - In string literals, the handling of non-ASCII whitespace after trailing `\` now matches what is implemented by rustc. Space, horizontal tab, line feed, and carriage return are the only 4 whitespace characters which are supposed to be stripped from the beginning of the next line. - The delimiter tokens `syn::token::Paren`, `Bracket`, and `Brace` now store 2 spans (the open and close punctuation separately) rather than just 1. Use `.join()` to obtain a single `Span` spanning the whole group. - Keyword construction now requires a single span; an array of 1 span is no longer accepted. Use `Token![trait](span)` instead of `Token![trait]([span])`. - Some token types have been renamed to conform with terminology used by the [Rust Reference](https://doc.rust-lang.org/1.68.0/reference/tokens.html#punctuation). These are `Add`->`Plus`, `Bang`->`Not`, `Colon2`->`PathSep`, `Div`->`Slash`, `Dot2`->`DotDot`, `Dot3`->`DotDotDot`, `Rem`->`Percent`, and `Sub`->`Minus`. ##### More - Several enums have been made `#[non_exhaustive]` in anticipation of upcoming language changes. This includes `WherePredicate`, `Lit`, and `GenericArgument`. - The `impl Extend<Pair<T, P>> for Punctuated<T, P>` now requires `P: Default` and will push a default punctuation between the pre-existing elements and the new ones, if there is not already a trailing punctuation. Previously it would panic in this situation. - `ParseStream::parse_terminated` now takes a peek-style punctuation argument instead of turbofish. Replace `input.parse_terminated::<_, Token![,]>(Thing::parse)` with `input.parse_terminated(Thing::parse, Token![,])`. ### [`v1.0.109`](https://github.com/dtolnay/syn/compare/1.0.108...1.0.109) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.108...1.0.109) ### [`v1.0.108`](https://github.com/dtolnay/syn/releases/tag/1.0.108) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.107...1.0.108) - Fix handling of unusual whitespace after escaped newlines in `LitStr::value` ([#​1381](https://github.com/dtolnay/syn/issues/1381), thanks [@​ModProg](https://github.com/ModProg)) ### [`v1.0.107`](https://github.com/dtolnay/syn/releases/tag/1.0.107) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.106...1.0.107) - Opt out of `-Zrustdoc-scrape-examples` on docs.rs for now ### [`v1.0.106`](https://github.com/dtolnay/syn/releases/tag/1.0.106) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.105...1.0.106) - Documentation improvements ### [`v1.0.105`](https://github.com/dtolnay/syn/releases/tag/1.0.105) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.104...1.0.105) - Improve parse errors related to `dyn` and `impl` type syntax ([#​1245](https://github.com/dtolnay/syn/issues/1245)) ### [`v1.0.104`](https://github.com/dtolnay/syn/releases/tag/1.0.104) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.103...1.0.104) - Add `PathArguments::is_none()` ### [`v1.0.103`](https://github.com/dtolnay/syn/releases/tag/1.0.103) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.102...1.0.103) - Implement `PartialOrd` for `Cursor` ([#​1236](https://github.com/dtolnay/syn/issues/1236), [#​1237](https://github.com/dtolnay/syn/issues/1237), thanks [@​CAD97](https://github.com/CAD97)) ### [`v1.0.102`](https://github.com/dtolnay/syn/releases/tag/1.0.102) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.101...1.0.102) - More efficient internal representation for `TokenBuffer` ([#​1223](https://github.com/dtolnay/syn/issues/1223), thanks [@​CAD97](https://github.com/CAD97)) - Fix parsing of a left shift after macro metavariable in type position ([#​1229](https://github.com/dtolnay/syn/issues/1229)) ### [`v1.0.101`](https://github.com/dtolnay/syn/releases/tag/1.0.101) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.100...1.0.101) - Eliminate a bunch of redundant work done by LitStr::parse ([#​1221](https://github.com/dtolnay/syn/issues/1221)) ### [`v1.0.100`](https://github.com/dtolnay/syn/releases/tag/1.0.100) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.99...1.0.100) - Parse closures with explicit empty lifetime parameter list `for<> || -> T {…}` ([#​1212](https://github.com/dtolnay/syn/issues/1212), [https://github.com/rust-lang/rust/issues/97362](https://github.com/rust-lang/rust/issues/97362)) - Parse `dyn*` provisional syntax ([#​1213](https://github.com/dtolnay/syn/issues/1213), [https://github.com/rust-lang/rust/issues/91611](https://github.com/rust-lang/rust/issues/91611)) - Parse attributes on the "rest" pattern of a struct in pattern position, `Struct { #[attr] .. }` ([#​1214](https://github.com/dtolnay/syn/issues/1214)) - Parse `static async` and `static async move` closures ([#​1215](https://github.com/dtolnay/syn/issues/1215), [https://github.com/rust-lang/rust/issues/62290](https://github.com/rust-lang/rust/issues/62290)) ### [`v1.0.99`](https://github.com/dtolnay/syn/releases/tag/1.0.99) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.98...1.0.99) - Add categories and keywords to crates.io metadata ### [`v1.0.98`](https://github.com/dtolnay/syn/releases/tag/1.0.98) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.97...1.0.98) - Format example code with rustfmt ### [`v1.0.97`](https://github.com/dtolnay/syn/releases/tag/1.0.97) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.96...1.0.97) - Update examples ### [`v1.0.96`](https://github.com/dtolnay/syn/releases/tag/1.0.96) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.95...1.0.96) - Add a `punct_mut()` method on `syn::punctuated::Pair` to return `Option<&mut P>` ([#​1183](https://github.com/dtolnay/syn/issues/1183)) ### [`v1.0.95`](https://github.com/dtolnay/syn/releases/tag/1.0.95) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.94...1.0.95) - Replace unicode-xid with unicode-ident crate: https://github.com/dtolnay/unicode-ident ### [`v1.0.94`](https://github.com/dtolnay/syn/releases/tag/1.0.94) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.93...1.0.94) - Resolve some unused_macro_rules warnings ### [`v1.0.93`](https://github.com/dtolnay/syn/releases/tag/1.0.93) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.92...1.0.93) - Fix compile error when `Some` means something unusual in the expression namespace of the scope where `custom_keyword` is invoked ([#​1171](https://github.com/dtolnay/syn/issues/1171), thanks [@​zakarumych](https://github.com/zakarumych)) ### [`v1.0.92`](https://github.com/dtolnay/syn/releases/tag/1.0.92) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.91...1.0.92) - Make compatible with Miri's tag-raw-pointers mode ([#​1166](https://github.com/dtolnay/syn/issues/1166), thanks [@​saethlin](https://github.com/saethlin)) ### [`v1.0.91`](https://github.com/dtolnay/syn/releases/tag/1.0.91) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.90...1.0.91) - impl ToTokens for RangeLimits - impl Parse for ExprAwait - impl Parse for GenericMethodArgument - impl Parse for MethodTurbofish ### [`v1.0.90`](https://github.com/dtolnay/syn/releases/tag/1.0.90) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.89...1.0.90) - Update recommended exhaustive matching idiom to use `non_exhaustive_omitted_patterns` lint: ```rust match expr { Expr::Array(e) => {…} Expr::Assign(e) => {…} ... Expr::Yield(e) => {…} #[cfg_attr(test, deny(non_exhaustive_omitted_patterns))] _ => {/* some sane fallback */} } ``` ### [`v1.0.89`](https://github.com/dtolnay/syn/releases/tag/1.0.89) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.88...1.0.89) - Remove support for inner attributes on non-block expressions ([#​1146](https://github.com/dtolnay/syn/issues/1146), [https://github.com/rust-lang/rust/pull/83312](https://github.com/rust-lang/rust/pull/83312)) - Fix panic on comma after `mut self` in a bare fn type ([#​1148](https://github.com/dtolnay/syn/issues/1148)) ### [`v1.0.88`](https://github.com/dtolnay/syn/releases/tag/1.0.88) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.87...1.0.88) - Parse `..` pattern in pattern of `let` ([#​1136](https://github.com/dtolnay/syn/issues/1136)) - Parse `for<…>` lifetime introducer on closures ([#​1135](https://github.com/dtolnay/syn/issues/1135)) - Reject postfix operators after cast ([#​1117](https://github.com/dtolnay/syn/issues/1117)) - Implement extra-traits for `Nothing` ([#​1144](https://github.com/dtolnay/syn/issues/1144)) ### [`v1.0.87`](https://github.com/dtolnay/syn/releases/tag/1.0.87) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.86...1.0.87) - Parse trait bounds containing associated constant constraint ([#​1138](https://github.com/dtolnay/syn/issues/1138)) - Change syntax of where-clauses on generic associated types ([#​1071](https://github.com/dtolnay/syn/issues/1071), [https://github.com/rust-lang/rust/issues/89122](https://github.com/rust-lang/rust/issues/89122)) ### [`v1.0.86`](https://github.com/dtolnay/syn/releases/tag/1.0.86) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.85...1.0.86) - Add support for parsing if- and while-let-chains (RFC 2497) ### [`v1.0.85`](https://github.com/dtolnay/syn/releases/tag/1.0.85) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.84...1.0.85) - Add `token()` method to each variant of syn::Lit to expose the underlying token representation with original formatting ### [`v1.0.84`](https://github.com/dtolnay/syn/releases/tag/1.0.84) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.83...1.0.84) - Add [`parse_quote_spanned!`](https://docs.rs/syn/1.0.84/syn/macro.parse_quote_spanned.html) macro which is a combination `parse_quote!` + `quote_spanned!` ### [`v1.0.83`](https://github.com/dtolnay/syn/releases/tag/1.0.83) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.82...1.0.83) - Fix panic parsing trait impl with qself in trait type: `impl <Thing<>>::Trait for Type {}` ([#​1109](https://github.com/dtolnay/syn/issues/1109)) - Preserve attributes on let-else stmt: `#[attr] let pat = val else { return }` ([#​1110](https://github.com/dtolnay/syn/issues/1110)) ### [`v1.0.82`](https://github.com/dtolnay/syn/releases/tag/1.0.82) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.81...1.0.82) - Support parenthesized generic argument syntax with `::` disambiguator: `Fn::() -> !` ([#​1096](https://github.com/dtolnay/syn/issues/1096)) ### [`v1.0.81`](https://github.com/dtolnay/syn/releases/tag/1.0.81) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.80...1.0.81) - Support arbitrary precision negative literal tokens on rustc 1.56+ ([#​1087](https://github.com/dtolnay/syn/issues/1087), [#​1088](https://github.com/dtolnay/syn/issues/1088)) ### [`v1.0.80`](https://github.com/dtolnay/syn/releases/tag/1.0.80) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.79...1.0.80) - Parse unstable `~const` syntax in where-clauses ([#​1083](https://github.com/dtolnay/syn/issues/1083), tracking issue [https://github.com/rust-lang/rust/issues/67792](https://github.com/rust-lang/rust/issues/67792)) ### [`v1.0.79`](https://github.com/dtolnay/syn/releases/tag/1.0.79) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.78...1.0.79) - Support trailing `+` in `dyn Trait` syntax, including bare (non-`dyn`) pre-2018 trait object syntax ([#​1075](https://github.com/dtolnay/syn/issues/1075), [#​1077](https://github.com/dtolnay/syn/issues/1077), [#​1078](https://github.com/dtolnay/syn/issues/1078), [#​1079](https://github.com/dtolnay/syn/issues/1079), [#​1080](https://github.com/dtolnay/syn/issues/1080), [#​1081](https://github.com/dtolnay/syn/issues/1081)) ### [`v1.0.78`](https://github.com/dtolnay/syn/releases/tag/1.0.78) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.77...1.0.78) - Parse trailing `+` in the bounds of `impl Trait` type ([#​1073](https://github.com/dtolnay/syn/issues/1073)) ### [`v1.0.77`](https://github.com/dtolnay/syn/releases/tag/1.0.77) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.76...1.0.77) - Match Rust 1.57+'s parsing of dot and question mark after a curly braced macro invocation ([#​1068](https://github.com/dtolnay/syn/issues/1068)) ### [`v1.0.76`](https://github.com/dtolnay/syn/releases/tag/1.0.76) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.75...1.0.76) - Parse unstable `let`–`else` syntax ([#​1050](https://github.com/dtolnay/syn/issues/1050), [#​1057](https://github.com/dtolnay/syn/issues/1057)) - Parse qualified braced variant expressions and patterns: `<E>::V {..}` ([#​1058](https://github.com/dtolnay/syn/issues/1058), [#​1059](https://github.com/dtolnay/syn/issues/1059)) - Fix precedence of outer attributes in front of an assignment expression in statement position ([#​1060](https://github.com/dtolnay/syn/issues/1060)) ### [`v1.0.75`](https://github.com/dtolnay/syn/releases/tag/1.0.75) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.74...1.0.75) - Improve spans on a method without body inside an impl block - Documentation improvements ([#​922](https://github.com/dtolnay/syn/issues/922), thanks [@​Tamschi](https://github.com/Tamschi)) ### [`v1.0.74`](https://github.com/dtolnay/syn/releases/tag/1.0.74) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.73...1.0.74) - Reject `for<'a> dyn Trait<'a>` syntax; the correct representation is `dyn for<'a> Trait<'a>` ([#​1042](https://github.com/dtolnay/syn/issues/1042)) ### [`v1.0.73`](https://github.com/dtolnay/syn/releases/tag/1.0.73) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.72...1.0.73) - Add From\<Ident>, From\<Index>, From\<usize> for Member ([#​1038](https://github.com/dtolnay/syn/issues/1038), thanks [@​m-ou-se](https://github.com/m-ou-se)) ### [`v1.0.72`](https://github.com/dtolnay/syn/releases/tag/1.0.72) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.71...1.0.72) - Parse const generics which use value of a previous const generic parameter as a default value ([#​1027](https://github.com/dtolnay/syn/issues/1027)) ### [`v1.0.71`](https://github.com/dtolnay/syn/releases/tag/1.0.71) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.70...1.0.71) - Fix panic deserializing an ItemImpl with a non-path in trait position ([#​1023](https://github.com/dtolnay/syn/issues/1023)) - Parse visibility on impl blocks ([#​1024](https://github.com/dtolnay/syn/issues/1024)) - Fix parsing a type parameter default on the first generic parameter of an impl block ([#​1025](https://github.com/dtolnay/syn/issues/1025), thanks [@​taiki-e](https://github.com/taiki-e)) ### [`v1.0.70`](https://github.com/dtolnay/syn/releases/tag/1.0.70) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.69...1.0.70) - Fix precedence of closure body vs ExprRange rhs: `|| .. .method()` ([#​1019](https://github.com/dtolnay/syn/issues/1019)) - Parse inner attributes inside of structs and enums ([#​1022](https://github.com/dtolnay/syn/issues/1022)) ### [`v1.0.69`](https://github.com/dtolnay/syn/releases/tag/1.0.69) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.68...1.0.69) - Improve Parse impls of ExprBox, ExprUnary, ExprLet, ExprClosure, ExprReference, ExprBreak, ExprContinue, ExprReturn, ExprYield to respect precedence for parsing a subexpression beginning with the respective keyword/punctuation ([#​1007](https://github.com/dtolnay/syn/issues/1007), [#​1008](https://github.com/dtolnay/syn/issues/1008), [#​1009](https://github.com/dtolnay/syn/issues/1009), [#​1010](https://github.com/dtolnay/syn/issues/1010), [#​1011](https://github.com/dtolnay/syn/issues/1011), [#​1012](https://github.com/dtolnay/syn/issues/1012), [#​1013](https://github.com/dtolnay/syn/issues/1013), [#​1014](https://github.com/dtolnay/syn/issues/1014), [#​1015](https://github.com/dtolnay/syn/issues/1015)) ### [`v1.0.68`](https://github.com/dtolnay/syn/releases/tag/1.0.68) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.67...1.0.68) - Preserve span of `LexError` on conversion to `syn::Error` ([#​1006](https://github.com/dtolnay/syn/issues/1006)) ### [`v1.0.67`](https://github.com/dtolnay/syn/releases/tag/1.0.67) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.66...1.0.67) - Accept outer attributes in the Parse impl of ExprBlock ([#​1004](https://github.com/dtolnay/syn/issues/1004)) ### [`v1.0.66`](https://github.com/dtolnay/syn/releases/tag/1.0.66) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.65...1.0.66) - Parse equality constraints on generic associated types ([#​979](https://github.com/dtolnay/syn/issues/979)) - Parse default value exprs in const generic declarations ([#​980](https://github.com/dtolnay/syn/issues/980)) - Fix infinite loop parsing malformed type ascription expression in non-`full` mode ([#​978](https://github.com/dtolnay/syn/issues/978)) - Improve Parse impls of ExprArray, ExprAsync, ExprBlock, ExprMacro, ExprParen, ExprRepeat, ExprStruct, ExprTryBlock, ExprUnsafe to succeed parsing even in the presence of trailing binary operators ([#​991](https://github.com/dtolnay/syn/issues/991), [#​992](https://github.com/dtolnay/syn/issues/992), [#​993](https://github.com/dtolnay/syn/issues/993), [#​994](https://github.com/dtolnay/syn/issues/994), [#​995](https://github.com/dtolnay/syn/issues/995), [#​996](https://github.com/dtolnay/syn/issues/996), [#​997](https://github.com/dtolnay/syn/issues/997), [#​998](https://github.com/dtolnay/syn/issues/998), [#​999](https://github.com/dtolnay/syn/issues/999)) ### [`v1.0.65`](https://github.com/dtolnay/syn/releases/tag/1.0.65) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.64...1.0.65) - Parse visibility on macro_rules ([#​981](https://github.com/dtolnay/syn/issues/981), tracking issue [rust-lang/rust#​78855](https://github.com/rust-lang/rust/issues/78855)) - Parse leading vert in or-patterns ([#​982](https://github.com/dtolnay/syn/issues/982), matching the Rust grammar change in [rust-lang/rust#​81869](https://github.com/rust-lang/rust/issues/81869)) - Parse static with omitted type ([#​983](https://github.com/dtolnay/syn/issues/983)) - Parse placeholder type in type parameter position ([#​984](https://github.com/dtolnay/syn/issues/984)) ### [`v1.0.64`](https://github.com/dtolnay/syn/releases/tag/1.0.64) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.63...1.0.64) - Avoid `clippy::expl_impl_clone_on_copy` pedantic lint in downstream custom token types ([#​976](https://github.com/dtolnay/syn/issues/976)) ### [`v1.0.63`](https://github.com/dtolnay/syn/releases/tag/1.0.63) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.62...1.0.63) - Fix parsing associated types with empty trait bound list after colon ([#​974](https://github.com/dtolnay/syn/issues/974)) ### [`v1.0.62`](https://github.com/dtolnay/syn/releases/tag/1.0.62) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.61...1.0.62) - Republish to work around docs.rs bug [https://github.com/rust-lang/docs.rs/issues/1300](https://github.com/rust-lang/docs.rs/issues/1300) ### [`v1.0.61`](https://github.com/dtolnay/syn/releases/tag/1.0.61) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.60...1.0.61) - Improve assertion failures on invalid use of `Punctuated` API ([#​970](https://github.com/dtolnay/syn/issues/970), thanks [@​osa1](https://github.com/osa1)) - Add `Lifetime::span` and `Lifetime::set_span` accessors ([#​971](https://github.com/dtolnay/syn/issues/971)) ### [`v1.0.60`](https://github.com/dtolnay/syn/releases/tag/1.0.60) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.59...1.0.60) - Provide an idiom for testing exhaustiveness of pattern matches on `Expr`, `Type`, `Pat`, `Item`, `ForeignItem`, `TraitItem`, and `ImplItem` ([#​694](https://github.com/dtolnay/syn/issues/694)) ```rust match expr { Expr::Array(e) => {...} Expr::Assign(e) => {...} ... Expr::Yield(e) => {...} #[cfg(test)] Expr::__TestExhaustive(_) => unimplemented!(), #[cfg(not(test))] _ => { /* some sane fallback */ } } ``` The above is the only supported idiom for exhaustive matching of those enum. Do not write anything differently as it is not supported. The conditional compilation on match-arms lets us fail your tests but not break your library when adding a variant. You will be notified by a test failure when a variant is added, so that you can add code to handle it, but your library will continue to compile and work for downstream users in the interim. ### [`v1.0.59`](https://github.com/dtolnay/syn/releases/tag/1.0.59) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.58...1.0.59) - Parse empty supertrait lists consistently with rustc ([#​952](https://github.com/dtolnay/syn/issues/952)) - Fix loss of span information on comma tokens inside of Type::Tuple during parse ([#​959](https://github.com/dtolnay/syn/issues/959)) ### [`v1.0.58`](https://github.com/dtolnay/syn/releases/tag/1.0.58) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.57...1.0.58) - Allow literals to parse as a const generic path argument even without "full" feature enabled ([#​951](https://github.com/dtolnay/syn/issues/951)) ```rust pub struct Struct { array: Array<10>, // used to require `features = "full"` } ``` ### [`v1.0.57`](https://github.com/dtolnay/syn/releases/tag/1.0.57) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.56...1.0.57) - Make Punctuated::new available as a `const fn` ([#​949](https://github.com/dtolnay/syn/issues/949)) ### [`v1.0.56`](https://github.com/dtolnay/syn/releases/tag/1.0.56) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.55...1.0.56) - Add [`Error::into_compile_error`](https://docs.rs/syn/1.0.56/syn/struct.Error.html#method.into_compile_error) ### [`v1.0.55`](https://github.com/dtolnay/syn/releases/tag/1.0.55) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.54...1.0.55) - Preserve None-delimited group around macro metavariable when parsing `T<$ty>` ([#​944](https://github.com/dtolnay/syn/issues/944), [#​945](https://github.com/dtolnay/syn/issues/945)) ### [`v1.0.54`](https://github.com/dtolnay/syn/releases/tag/1.0.54) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.53...1.0.54) - Fix parsing of `impl` items with macro metavariable in the trait path: `impl $trait for Type {...}` ([#​942](https://github.com/dtolnay/syn/issues/942)) ### [`v1.0.53`](https://github.com/dtolnay/syn/releases/tag/1.0.53) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.52...1.0.53) - Parse `impl !Trait {...}` syntax ([#​936](https://github.com/dtolnay/syn/issues/936)) ### [`v1.0.52`](https://github.com/dtolnay/syn/releases/tag/1.0.52) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.51...1.0.52) - Parse `unsafe extern` block syntax ([#​918](https://github.com/dtolnay/syn/issues/918)) - Parse `unsafe mod` syntax ([#​919](https://github.com/dtolnay/syn/issues/919)) - Parse `const {...}` block syntax ([#​921](https://github.com/dtolnay/syn/issues/921)) - Parse destructuring assignment syntax ([#​933](https://github.com/dtolnay/syn/issues/933)) ### [`v1.0.51`](https://github.com/dtolnay/syn/releases/tag/1.0.51) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.50...1.0.51) - Allow parsing signatures in which const generic params appear in front of lifetime params ([#​920](https://github.com/dtolnay/syn/issues/920)) ### [`v1.0.50`](https://github.com/dtolnay/syn/releases/tag/1.0.50) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.48...1.0.50) - Apply `doc(cfg(...))` on feature gated APIs for docs.rs-rendered documentation ([#​925](https://github.com/dtolnay/syn/issues/925)) ### [`v1.0.48`](https://github.com/dtolnay/syn/releases/tag/1.0.48) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.47...1.0.48) - Rebuild for https://astexplorer.net ### [`v1.0.47`](https://github.com/dtolnay/syn/releases/tag/1.0.47) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.46...1.0.47) - Documentation improvements ### [`v1.0.46`](https://github.com/dtolnay/syn/releases/tag/1.0.46) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.45...1.0.46) - Fix parsing structured attributes that contain nested absolute paths, such as `#[derive(::serde::Serialize)]` ([#​909](https://github.com/dtolnay/syn/issues/909)) ### [`v1.0.45`](https://github.com/dtolnay/syn/releases/tag/1.0.45) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.44...1.0.45) - Provide more detailed error messages when parsing specific literal kind ([#​908](https://github.com/dtolnay/syn/issues/908)) ### [`v1.0.44`](https://github.com/dtolnay/syn/releases/tag/1.0.44) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.43...1.0.44) - Fix some parsing of patterns inside of None-delimited groups ([#​907](https://github.com/dtolnay/syn/issues/907)) ### [`v1.0.43`](https://github.com/dtolnay/syn/releases/tag/1.0.43) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.42...1.0.43) - Add Parse impl for syn::Signature ### [`v1.0.42`](https://github.com/dtolnay/syn/releases/tag/1.0.42) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.41...1.0.42) - Fix several bugs involving unusual suffixes on integer and floating point literal tokens ([#​898](https://github.com/dtolnay/syn/issues/898), [#​899](https://github.com/dtolnay/syn/issues/899), [#​900](https://github.com/dtolnay/syn/issues/900)) ### [`v1.0.41`](https://github.com/dtolnay/syn/releases/tag/1.0.41) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.40...1.0.41) - Fix panic on printing an incomplete (having fewer path segments than originally parsed with) qualified path (ExprPath, PatPath, TypePath containing QSelf) ([#​891](https://github.com/dtolnay/syn/issues/891), thanks [@​taiki-e](https://github.com/taiki-e)) - Fix panic triggered by syntactically invalid overflowing negative float literal after `.` in a field access position, e.g. `let _ = obj.-0.9E999999` ([#​895](https://github.com/dtolnay/syn/issues/895), thanks [@​sameer](https://github.com/sameer)) - Enable using `parse_macro_input!` with a Parser function rather than type having a Parse impl ([#​896](https://github.com/dtolnay/syn/issues/896), thanks [@​sbrocket](https://github.com/sbrocket)) ### [`v1.0.40`](https://github.com/dtolnay/syn/releases/tag/1.0.40) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.39...1.0.40) - Fix panic on parsing float literals having both an exponent and a suffix beginning with 'e' or 'E', such as `9e99e999` ([#​893](https://github.com/dtolnay/syn/issues/893)) ### [`v1.0.39`](https://github.com/dtolnay/syn/releases/tag/1.0.39) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.38...1.0.39) - Improve compile time by pre-expanding derives ([#​885](https://github.com/dtolnay/syn/issues/885)) - Parse const generic parameters in any order relative to type parameters ([#​886](https://github.com/dtolnay/syn/issues/886)) ### [`v1.0.38`](https://github.com/dtolnay/syn/releases/tag/1.0.38) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.37...1.0.38) - Accept traits with parenthesized path arguments in impls ([#​880](https://github.com/dtolnay/syn/issues/880), thanks [@​alecmocatta](https://github.com/alecmocatta)) ### [`v1.0.37`](https://github.com/dtolnay/syn/releases/tag/1.0.37) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.36...1.0.37) - Handle shebang in a way that matches rustc 1.46+ ([#​876](https://github.com/dtolnay/syn/issues/876), [https://github.com/rust-lang/rust/pull/71487](https://github.com/rust-lang/rust/pull/71487), [https://github.com/rust-lang/rust/pull/73596](https://github.com/rust-lang/rust/pull/73596)) ```rust #!//am/i/a/comment fn main() {} // ^ shebang ``` ```rust #!//am/i/a/comment [allow(dead_code)] // ^ not a shebang fn main() {} ``` - Accept <code>tuple.0. 0</code> as a tuple indexing expression ([#​877](https://github.com/dtolnay/syn/issues/877)) ### [`v1.0.36`](https://github.com/dtolnay/syn/releases/tag/1.0.36) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.35...1.0.36) - Add Lit::span, Lit::set_span ([#​874](https://github.com/dtolnay/syn/issues/874)) ### [`v1.0.35`](https://github.com/dtolnay/syn/releases/tag/1.0.35) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.34...1.0.35) - Fix parsing of Expr::Field in non-full mode ([#​870](https://github.com/dtolnay/syn/issues/870)) ### [`v1.0.34`](https://github.com/dtolnay/syn/releases/tag/1.0.34) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.33...1.0.34) - Documentation improvements ### [`v1.0.33`](https://github.com/dtolnay/syn/releases/tag/1.0.33) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.32...1.0.33) - Parse `tuple.0.0` as an indexing expression ([https://github.com/rust-lang/rust/pull/71322](https://github.com/rust-lang/rust/pull/71322)) - Add `Parse` impls for optional of proc-macro2 types: `Option<TokenTree>`, `Option<Punct>`, `Option<Literal>`, `Option<Group>` ### [`v1.0.32`](https://github.com/dtolnay/syn/releases/tag/1.0.32) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.31...1.0.32) - Fix parsing $:item macro_rules metavariables containing outer attributes ([#​852](https://github.com/dtolnay/syn/issues/852)) ### [`v1.0.31`](https://github.com/dtolnay/syn/releases/tag/1.0.31) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.30...1.0.31) - Add [`Expr::parse_without_eager_brace`](https://docs.rs/syn/1.0.31/syn/enum.Expr.html#method.parse_without_eager_brace) to parse expressions in ambiguous syntactic position. Rust grammar has an ambiguity where braces sometimes turn a path expression into a struct initialization and sometimes do not. In the following code, the expression `S {}` is one expression. Presumably there is an empty struct `struct S {}` defined somewhere which it is instantiating. ```rust let _ = *S {}; // parsed by rustc as: `*(S {})` ``` We would want to parse the above using `Expr::parse` after the `=` token. But in the following, `S {}` is *not* a struct init expression. ```rust if *S {} {} // parsed by rustc as: // // if (*S) { // /* empty block */ // } // { // /* another empty block */ // } ``` For that reason we would want to parse if-conditions using `Expr::parse_without_eager_brace` after the `if` token. Same for similar syntactic positions such as the condition expr after a `while` token or the expr at the top of a `match`. The Rust grammar's choices around which way this ambiguity is resolved at various syntactic positions is fairly arbitrary. Really either parse behavior could work in most positions, and language designers just decide each case based on which is more likely to be what the programmer had in mind most of the time. ```rust if return S {} {} // parsed by rustc as: // // if (return (S {})) { // } // // but could equally well have been this other arbitrary choice: // // if (return S) { // } // {} ``` Note the grammar ambiguity on trailing braces is distinct from precedence and is not captured by assigning a precedence level to the braced struct init expr in relation to other operators. This can be illustrated by `return 0..S {}` vs `match 0..S {}`. The former parses as `return (0..(S {}))` implying tighter precedence for struct init than `..`, while the latter parses as `match (0..S) {}` implying tighter precedence for `..` than struct init, a contradiction. ### [`v1.0.30`](https://github.com/dtolnay/syn/releases/tag/1.0.30) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.29...1.0.30) - Parse struct init expressions where the type name is an interpolated macro_rules metavariable, such as `$struct {}` where $struct:ident ([#​842](https://github.com/dtolnay/syn/issues/842)) - Handle nesting of None-delimited groups ([#​843](https://github.com/dtolnay/syn/issues/843), thanks [@​Aaron1011](https://github.com/Aaron1011)) ### [`v1.0.29`](https://github.com/dtolnay/syn/releases/tag/1.0.29) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.28...1.0.29) - Parse macro call exprs where the macro name is an interpolated macro_rules metavariable, such as `$macro!()` ([#​838](https://github.com/dtolnay/syn/issues/838)) - Parse paths containing generic parameters where the first path segment is an interpolated macro_rules metavariable, such as `$seg<'a>` ([#​839](https://github.com/dtolnay/syn/issues/839)) ### [`v1.0.28`](https://github.com/dtolnay/syn/releases/tag/1.0.28) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.27...1.0.28) - Recognize empty None-delimited group produced by interpolating a $:vis macro metavariable when parsing a Visibility ([#​836](https://github.com/dtolnay/syn/issues/836)) ### [`v1.0.27`](https://github.com/dtolnay/syn/releases/tag/1.0.27) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.26...1.0.27) - Parse function calls in which the callee is an interpolated macro variable `$fn(...)` ([#​833](https://github.com/dtolnay/syn/issues/833)) ### [`v1.0.26`](https://github.com/dtolnay/syn/releases/tag/1.0.26) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.25...1.0.26) - Parse paths containing an interpolated first component, such as `$first::rest` ([https://github.com/rust-lang/rust/issues/72608](https://github.com/rust-lang/rust/issues/72608), [#​832](https://github.com/dtolnay/syn/issues/832)) ### [`v1.0.25`](https://github.com/dtolnay/syn/releases/tag/1.0.25) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.24...1.0.25) - Parse opt-out `?const` trait bounds ([#​767](https://github.com/dtolnay/syn/issues/767)) - Parse const generics in method generic arguments ([#​816](https://github.com/dtolnay/syn/issues/816), thanks [@​yodaldevoid](https://github.com/yodaldevoid)) - Parse trait bounds on type alias items ([#​821](https://github.com/dtolnay/syn/issues/821)) - Parse const generics on impl blocks ([#​822](https://github.com/dtolnay/syn/issues/822)) - Fix precedence of attributes on binary expressions to match rustc ([#​823](https://github.com/dtolnay/syn/issues/823)) - Remove parsing of `extern::` paths which were removed from nightly in January 2019 ([#​825](https://github.com/dtolnay/syn/issues/825), [https://github.com/rust-lang/rust/pull/57572](https://github.com/rust-lang/rust/pull/57572)) - Add `Punctuated::clear`, analogous to Vec::clear ([#​828](https://github.com/dtolnay/syn/issues/828)) ### [`v1.0.24`](https://github.com/dtolnay/syn/releases/tag/1.0.24) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.23...1.0.24) - Parse `mut self` receiver in function pointer type ([#​812](https://github.com/dtolnay/syn/issues/812), [#​814](https://github.com/dtolnay/syn/issues/814)) - Parse const trait impls ([#​813](https://github.com/dtolnay/syn/issues/813)) - Improve error reporting inside struct expressions and struct patterns ([#​818](https://github.com/dtolnay/syn/issues/818)) ### [`v1.0.23`](https://github.com/dtolnay/syn/releases/tag/1.0.23) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.22...1.0.23) - Parse inner attributes in traits ([#​803](https://github.com/dtolnay/syn/issues/803)) - Parse const underscore in traits and impls ([#​804](https://github.com/dtolnay/syn/issues/804)) - Implement Extend<Error> for Error ([#​805](https://github.com/dtolnay/syn/issues/805)) - Parse Or patterns ([#​806](https://github.com/dtolnay/syn/issues/806)) - Parse outer attributes on Expr\* structs ([#​807](https://github.com/dtolnay/syn/issues/807)) - Parse top level const/static without value ([#​808](https://github.com/dtolnay/syn/issues/808)) - Parse syntactically accepted functions ([#​809](https://github.com/dtolnay/syn/issues/809)) - Parse extern static with value ([#​810](https://github.com/dtolnay/syn/issues/810)) Thanks [@​taiki-e](https://github.com/taiki-e) for all of these. ### [`v1.0.22`](https://github.com/dtolnay/syn/releases/tag/1.0.22) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.21...1.0.22) - Parse literal suffix on byte string, byte, and char literal tokens: `br#"..."#suffix`, `b'?'suffix`, `'?'suffix` ([#​799](https://github.com/dtolnay/syn/issues/799), [#​800](https://github.com/dtolnay/syn/issues/800)) ### [`v1.0.21`](https://github.com/dtolnay/syn/releases/tag/1.0.21) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.20...1.0.21) - Documentation improvements ### [`v1.0.20`](https://github.com/dtolnay/syn/releases/tag/1.0.20) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.19...1.0.20) - Improve span of error message when an error during `syn::Macro::parse_body` is triggered past the last token of the macro body ([#​791](https://github.com/dtolnay/syn/issues/791)) ### [`v1.0.19`](https://github.com/dtolnay/syn/releases/tag/1.0.19) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.18...1.0.19) - Parse a more lenient extern type syntax inside extern blocks ([#​763](https://github.com/dtolnay/syn/issues/763)) ### [`v1.0.18`](https://github.com/dtolnay/syn/releases/tag/1.0.18) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.17...1.0.18) - Ignore unparsed empty None-delimited groups at the end of a macro input ([#​783](https://github.com/dtolnay/syn/issues/783)) ### [`v1.0.17`](https://github.com/dtolnay/syn/releases/tag/1.0.17) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.16...1.0.17) - Expose `syn::Lit` in `default-features = false` mode ### [`v1.0.16`](https://github.com/dtolnay/syn/releases/tag/1.0.16) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.15...1.0.16) - Fix parsing of `&raw` raw reference operator ([https://github.com/rust-lang/rust/issues/64490](https://github.com/rust-lang/rust/issues/64490)) to require explicitly specified constness, `&raw mut` or `&raw const` ### [`v1.0.15`](https://github.com/dtolnay/syn/releases/tag/1.0.15) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.14...1.0.15) - Add [`Punctuated::first_mut`](https://docs.rs/syn/1.0.15/syn/punctuated/struct.Punctuated.html#method.first_mut) to return a mut reference to the first sequence element ### [`v1.0.14`](https://github.com/dtolnay/syn/releases/tag/1.0.14) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.13...1.0.14) - Produce more helpful error messages from [Attribute::parse_args](https://docs.rs/syn/1.0/syn/struct.Attribute.html#method.parse_args) ### [`v1.0.13`](https://github.com/dtolnay/syn/releases/tag/1.0.13) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.12...1.0.13) - Allow parse_quote! to parse Vec\<Stmt>, with the same behavior as Block::parse_within ([#​741](https://github.com/dtolnay/syn/issues/741)) ### [`v1.0.12`](https://github.com/dtolnay/syn/releases/tag/1.0.12) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.11...1.0.12) - Reject function signatures with an incorrectly placed receiver parameter, like `fn f(x: u8, &self)` - Produce correctly spanned error when parsing punct beyond the end of a delimited group ([#​739](https://github.com/dtolnay/syn/issues/739)) ### [`v1.0.11`](https://github.com/dtolnay/syn/releases/tag/1.0.11) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.10...1.0.11) - Implement quote::IdentFragment for syn::Member and syn::Index so that spans are preserved when using these types in quote's `format_ident!` macro ```rust use quote::format_ident; use syn::Index; let index: Index = /* ... */; let ident = format_ident!("__{}", index); // produces __0, __1, etc ``` ### [`v1.0.10`](https://github.com/dtolnay/syn/releases/tag/1.0.10) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.9...1.0.10) - Provide `Hash` and `Eq` impls for syn::Member even without "extra-traits" feature enabled, as this type is commonly useful in a hashset ### [`v1.0.9`](https://github.com/dtolnay/syn/releases/tag/1.0.9) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.8...1.0.9) - Fix failure to parse tuple struct fields of tuple type starting with `crate` ([#​720](https://github.com/dtolnay/syn/issues/720), [#​723](https://github.com/dtolnay/syn/issues/723), thanks [@​mystor](https://github.com/mystor)) - Fix unexpected tokens being ignored when using Speculative::advance_to ([#​721](https://github.com/dtolnay/syn/issues/721), [#​723](https://github.com/dtolnay/syn/issues/723), thanks [@​mystor](https://github.com/mystor)) ### [`v1.0.8`](https://github.com/dtolnay/syn/releases/tag/1.0.8) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.7...1.0.8) - Require trailing comma when parsing TypeTuple with one element ([#​716](https://github.com/dtolnay/syn/issues/716), thanks [@​8BitMate](https://github.com/8BitMate)) ### [`v1.0.7`](https://github.com/dtolnay/syn/releases/tag/1.0.7) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.6...1.0.7) - Add a receiver getter to syn::Signature ([#​714](https://github.com/dtolnay/syn/issues/714), thanks [@​mystor](https://github.com/mystor)) ```rust impl Signature { /// A method's `self` receiver, such as `&self` or `self: Box<Self>`. pub fn receiver(&self) -> Option<&FnArg>; } ``` ### [`v1.0.6`](https://github.com/dtolnay/syn/releases/tag/1.0.6) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.5...1.0.6) - Add conversions from Item{Struct,Enum,Union} into DeriveInput ([#​711](https://github.com/dtolnay/syn/issues/711), thanks [@​mystor](https://github.com/mystor)) - Add Fields::len and Fields::is_empty ([#​712](https://github.com/dtolnay/syn/issues/712), thanks [@​mjbshaw](https://github.com/mjbshaw)) ### [`v1.0.5`](https://github.com/dtolnay/syn/releases/tag/1.0.5) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.4...1.0.5) - Expose syn::Variadic with just "derive" feature, not "full", because it appears in Type::BareFn ### [`v1.0.4`](https://github.com/dtolnay/syn/releases/tag/1.0.4) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.3...1.0.4) - Fix size_hint of Punctuated iterators ([#​700](https://github.com/dtolnay/syn/issues/700), thanks [@​ExpHP](https://github.com/ExpHP)) ### [`v1.0.3`](https://github.com/dtolnay/syn/releases/tag/1.0.3) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.2...1.0.3) - Add [`Path::get_ident`](https://docs.rs/syn/1.0/syn/struct.Path.html#method.get_ident) ([#​696](https://github.com/dtolnay/syn/issues/696), thanks [@​infinity0](https://github.com/infinity0)) ### [`v1.0.2`](https://github.com/dtolnay/syn/releases/tag/1.0.2) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.1...1.0.2) - Documentation improvements ### [`v1.0.1`](https://github.com/dtolnay/syn/releases/tag/1.0.1) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.0...1.0.1) - Add [`LitInt::base10_parse`](https://docs.rs/syn/1.0/syn/struct.LitInt.html#method.base10\_parse) to produce error that has the right span when parsing literal digits </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/agbrs/agb). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xMC4yIiwidXBkYXRlZEluVmVyIjoiMzUuMTcuMSJ9-->
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [syn](https://github.com/dtolnay/syn) | dependencies | major | `1` -> `2` | --- ### Release Notes <details> <summary>dtolnay/syn (syn)</summary> ### [`v2.0.27`](https://github.com/dtolnay/syn/releases/tag/2.0.27) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.26...2.0.27) - Documentation improvements (thanks [@​GuillaumeGomez](https://github.com/GuillaumeGomez)) ### [`v2.0.26`](https://github.com/dtolnay/syn/releases/tag/2.0.26) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.25...2.0.26) - Implement `Spanned` for `QSelf` ([#​1465](https://github.com/dtolnay/syn/issues/1465)) ### [`v2.0.25`](https://github.com/dtolnay/syn/releases/tag/2.0.25) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.24...2.0.25) - Support single identifier as unbraced const generic argument ([#​1483](https://github.com/dtolnay/syn/issues/1483)) - Produce error message when LitStr::parse is used on a suffixed string literal ([#​1484](https://github.com/dtolnay/syn/issues/1484)) ### [`v2.0.24`](https://github.com/dtolnay/syn/releases/tag/2.0.24) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.23...2.0.24) - Fix duplication of braces around const generic argument in non-full mode ([#​1482](https://github.com/dtolnay/syn/issues/1482)) ### [`v2.0.23`](https://github.com/dtolnay/syn/releases/tag/2.0.23) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.22...2.0.23) - Preserve attributes on verbatim Item in statement position ([#​1476](https://github.com/dtolnay/syn/issues/1476)) - Support generic_const_exprs where-clauses such as `where [(); { T::COUNT }]:` in non-"full" mode ([#​1478](https://github.com/dtolnay/syn/issues/1478)) ### [`v2.0.22`](https://github.com/dtolnay/syn/releases/tag/2.0.22) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.21...2.0.22) - Parse `c"…"` c-string literals (tracking issue: [https://github.com/rust-lang/rust/issues/105723](https://github.com/rust-lang/rust/issues/105723)) ### [`v2.0.21`](https://github.com/dtolnay/syn/releases/tag/2.0.21) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.20...2.0.21) - Fix value computed by `LitByteStr::value` in the case of a cooked byte string literal containing form feed or vertical tab characters following an escaped newline ([#​1474](https://github.com/dtolnay/syn/issues/1474)) ### [`v2.0.20`](https://github.com/dtolnay/syn/releases/tag/2.0.20) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.19...2.0.20) - Documentation improvements ### [`v2.0.19`](https://github.com/dtolnay/syn/releases/tag/2.0.19) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.18...2.0.19) - Improve rendering of compile errors within 2015-edition code calling a 2018+ edition proc macro ([#​1467](https://github.com/dtolnay/syn/issues/1467), thanks [@​danielhenrymantilla](https://github.com/danielhenrymantilla)) ### [`v2.0.18`](https://github.com/dtolnay/syn/releases/tag/2.0.18) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.17...2.0.18) - Permit empty attr in syn::meta::parser ([#​1460](https://github.com/dtolnay/syn/issues/1460)) ### [`v2.0.17`](https://github.com/dtolnay/syn/releases/tag/2.0.17) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.16...2.0.17) - Enable proc_macro support on wasm targets ([#​1459](https://github.com/dtolnay/syn/issues/1459)) ### [`v2.0.16`](https://github.com/dtolnay/syn/releases/tag/2.0.16) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.15...2.0.16) - Parse `builtin #` syntax as Expr::Verbatim ([https://github.com/rust-lang/rust/issues/110680](https://github.com/rust-lang/rust/issues/110680), [#​1454](https://github.com/dtolnay/syn/issues/1454)) ### [`v2.0.15`](https://github.com/dtolnay/syn/releases/tag/2.0.15) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.14...2.0.15) - Ensure `Type::Tuple` of length 1 prints as a tuple even if trailing comma is not provided in the Punctuated ([#​1444](https://github.com/dtolnay/syn/issues/1444), thanks [@​Fancyflame](https://github.com/Fancyflame)) ### [`v2.0.14`](https://github.com/dtolnay/syn/releases/tag/2.0.14) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.13...2.0.14) - Add Punctuated::pop_punct() ([#​1442](https://github.com/dtolnay/syn/issues/1442), thanks [@​programmerjake](https://github.com/programmerjake)) ### [`v2.0.13`](https://github.com/dtolnay/syn/releases/tag/2.0.13) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.12...2.0.13) - Improve spans of Expr::Field parsed from a float Literal ([#​1433](https://github.com/dtolnay/syn/issues/1433), [#​1436](https://github.com/dtolnay/syn/issues/1436)) ### [`v2.0.12`](https://github.com/dtolnay/syn/releases/tag/2.0.12) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.11...2.0.12) - Refer to `compile_error!` by absolute path in token stream produced by syn::Error::to_compile_error ([#​1431](https://github.com/dtolnay/syn/issues/1431), thanks [@​smoelius](https://github.com/smoelius)) ### [`v2.0.11`](https://github.com/dtolnay/syn/releases/tag/2.0.11) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.10...2.0.11) - Improve error message on empty parens inside parse_nested_meta ([#​1428](https://github.com/dtolnay/syn/issues/1428)) ### [`v2.0.10`](https://github.com/dtolnay/syn/releases/tag/2.0.10) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.9...2.0.10) - Fix visibility being parsed incorrectly on macro invocations inside of a trait ### [`v2.0.9`](https://github.com/dtolnay/syn/releases/tag/2.0.9) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.8...2.0.9) - Disallow `type` items in an extern block, trait, or module from being marked `default` ### [`v2.0.8`](https://github.com/dtolnay/syn/releases/tag/2.0.8) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.7...2.0.8) - Treat `try` keyword as 2015-edition identifier in definition of try macro ([#​1422](https://github.com/dtolnay/syn/issues/1422)) ### [`v2.0.7`](https://github.com/dtolnay/syn/releases/tag/2.0.7) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.6...2.0.7) - Fix parsing of `mut self` inside of Type::BareFn ### [`v2.0.6`](https://github.com/dtolnay/syn/releases/tag/2.0.6) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.5...2.0.6) - Improve error message on missing ';' between statements ([#​1419](https://github.com/dtolnay/syn/issues/1419)) - Keep non-brace macro invocations in trailing expr position as Expr::Macro ([#​1420](https://github.com/dtolnay/syn/issues/1420)) ### [`v2.0.5`](https://github.com/dtolnay/syn/releases/tag/2.0.5) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.4...2.0.5) - Expose `ExprMacro` data structure even when `features="full"` is not used ([#​1417](https://github.com/dtolnay/syn/issues/1417)) ### [`v2.0.4`](https://github.com/dtolnay/syn/releases/tag/2.0.4) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.3...2.0.4) - Improve error reporting when parsing identifiers and paths ([#​1415](https://github.com/dtolnay/syn/issues/1415), [#​1416](https://github.com/dtolnay/syn/issues/1416)) ### [`v2.0.3`](https://github.com/dtolnay/syn/releases/tag/2.0.3) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.2...2.0.3) - Expose `ExprGroup` data structure even when `features="full"` is not used ([#​1412](https://github.com/dtolnay/syn/issues/1412)) ### [`v2.0.2`](https://github.com/dtolnay/syn/releases/tag/2.0.2) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.1...2.0.2) - Documentation improvements ### [`v2.0.1`](https://github.com/dtolnay/syn/releases/tag/2.0.1) [Compare Source](https://github.com/dtolnay/syn/compare/2.0.0...2.0.1) - Add methods on syn::Meta for reporting error on an incorrect kind of attribute ([#​1409](https://github.com/dtolnay/syn/issues/1409)) ### [`v2.0.0`](https://github.com/dtolnay/syn/releases/tag/2.0.0) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.109...2.0.0) This release contains a batch of syntax tree improvements to incorporate ongoing Rust language development from the past 3.5 years since syn 1. It never seems like an ideal time to finalize a syntax tree design, considering the frankly alarming number of syntax-disrupting language features currently in flight: keyword generics, restrictions, capabilities and contexts, conditional constness, new varieties of literals, dyn revamp such as explicitly dyn-safe traits and dyn-star, expression syntax in various phases of being added or being torn out (const blocks, try blocks, raw references), auto traits and negative impls, generalizations to higher rank trait bounds, async closures and static async trait methods, postfix keywords, pattern types, return type notation, unsafe attributes, … The plan continues to be the same as laid out originally in the 1.0.0 release announcement: > Be aware that the underlying Rust language will continue to evolve. Syn is able to accommodate most kinds of Rust grammar changes via the nonexhaustive enums and `Verbatim` variants in the syntax tree, but we will plan to put out new major versions on a 12 to 24 month cadence to incorporate ongoing language changes as needed. If anything, the takeaway from the 3.5 year longevity of syn 1 is that this period was tamer from a language development perspective than anticipated, but that is unlikely to last and I think around 24 months is still the correct cadence to expect between releases going forward. <br> <p align="center"><a href="https://docs.rs/syn/2/syn/">[API documentation for 2.0]</a></p> ### Breaking changes - Minimum required Rust version is raised from rustc 1.31 to 1.56. ##### Expressions - Support for `box expr` syntax has been deleted, as it has been deleted recently from rustc. - Support for type ascription syntax `expr: Type` in expression position has been deleted. - Support for unstable `&raw const expr` raw-pointer reference syntax has been deleted. - The representation of generic arguments has been unified between method calls and non-method paths into a single `GenericArgument` type, which supersedes the previous `GenericMethodArgument` and `MethodTurbofish`. - Generic arguments now distinguish between associated types (`AssocType`) and associated constant values (`AssocConst`). Previously these would be parsed ambiguously as `Binding`. - The binary assignment operators in `BinOp` have been renamed to align with the naming used by the standard library's `core::ops` module's traits. For example `BinOp::AddEq` is now called `BinOp::AddAssign`. - `Expr::Struct` struct construction expressions now support structs which are a variant of an enum associated type of a trait, as in `<Type as Trait>::Assoc::Variant { ... }`, which has recently been added to Rust. - `Expr::Range` now follows the `start` and `end` naming used by the standard library's `RangeBounds` trait, rather than `from`/`to` or `lo`/`hi`. - `Expr::AssignOp` has been merged into `Expr::Binary`, which now represents both non-assignment and assignment binary operators. - Stricter parsing of ranges. None of the following are valid expressions, but were previously accepted by syn: `..=`, `lo..=`, `...`, `...hi`, `lo...`, `lo...hi`. - `Expr::Closure` now includes a representation for `for<...>` lifetimes. ##### Statements - Variants `Stmt::Expr` (tail-position expression without trailing semicolon) and `Stmt::Semi` (non-tail expression with trailing semicolon) have been combined into `Stmt::Expr` with the optional semicolon represented by `Option<Token![;]>`. - The syntax tree for `Stmt::Local` has been extended to handle `let`/`else` syntax. - Macros in statement position are now uniformly parsed as `Stmt::Macro`. Previously these would be disambiguated to `Stmt::Item`, although it was ambiguous whether a macro in statement position would expand to an item (like `thread_local! { ... }`) vs an expression (like `println! { ... }`). ##### Patterns - Pattern parsing for all the different syntactic positions in which patterns are allowed has been split into `Pat::parse_single` (for function- and closure-argument position, where top-level `|` is not allowed), `Pat::parse_multi` (where `|` is allowed) and `Pat::parse_multi_with_leading_vert` (for the pattern of match arms, which allow an optional leading `|`). Previously only a single `parse` behavior was supported and behaved like the new `parse_single`. - The `Pat` syntax tree now shares more common data structures with the `Expr` syntax tree where possible, such as for literals, paths, macros, and ranges in pattern position. - Parsing of struct field patterns does a better job rejecting bogus syntax such as `Struct { 0 asdf }` and `Struct { ref mut 0: asdf }`, which were previously incorrectly accepted. - `Pat::Range` now supports one-sided ranges by representing the start and end bound of the range by `Option<Expr>`. - `Pat::Struct` keeps track of attributes on the optional `..` "rest" part of the pattern, as in `let Struct { x, #[cfg(any())] .. } = _;`. - Parsing unary negation now enforces that only literal patterns can be unarily negated. For example `-self::CONST` and `-const { 0i32 }` are not valid syntax in pattern position. - `Pat::TupleStruct` no longer wraps a value of type `PatTuple` but represents that information in its fields directly. - A single parenthesized pattern without trailing comma inside the parentheses is no longer considered a `Pat::Tuple`, it will be parsed as `Pat::Paren`. - One-sided range patterns are no longer allowed inside of slice patterns. `[lo..]` and `[..=hi]` are not considered valid pattern syntax by Rust. ##### Items - Typed `self` in a method signature, such as `self: Pin<&mut Self>`, will now be parsed as `FnArg::Receiver`. This means `self`, whether with or without an explicit type, is always treated as a `Receiver`. Previously only the `&self` and `&mut self` shorthand receivers were parsed as `Receiver`. - `TraitItem::Method` and `ImplItem::Method` have been renamed to `TraitItem::Fn` and `ImplItem::Fn`, as they do not necessarily represent methods if the function signature contains no `self`. - `Item::Macro2` has been deleted as "macros 2.0" syntax is no longer considered on track for stabilization. - Various item kinds now hold `Generics` which didn't used to have them. - The variadic argument of an extern function signature can now be given an optional parameter name. - `WherePredicate::Eq` is no longer supported. - `Visibility::Crate` is no longer supported. This syntax has been removed from rustc. - Public visibility is now represented by a single `Token![pub]` token rather than the old `VisPublic` struct. - `LifetimeDef` is now called `LifetimeParam`. This name makes more sense in the context of the `GenericParam` enum (which also includes `TypeParam` and `ConstParam`), and is the name that the Rust Reference uses. - Modules and extern blocks (`Item::Mod` and `Item::ForeignMod`) can now be marked `unsafe`. ##### Attributes - The syntax tree for `Attribute` has been redesigned. The new API better accommodates attributes which mix structured and unstructured content at different levels of nesting. - `AttributeArgs` has been removed. Use `Punctuated<Meta, Token![,]>`. - For parsing attribute contents, `parse_meta()` is superseded by a new parsing library called `syn::meta`, and the `parse_nested_meta` method on `Attribute`. ##### Tokens - In string literals, the handling of non-ASCII whitespace after trailing `\` now matches what is implemented by rustc. Space, horizontal tab, line feed, and carriage return are the only 4 whitespace characters which are supposed to be stripped from the beginning of the next line. - The delimiter tokens `syn::token::Paren`, `Bracket`, and `Brace` now store 2 spans (the open and close punctuation separately) rather than just 1. Use `.join()` to obtain a single `Span` spanning the whole group. - Keyword construction now requires a single span; an array of 1 span is no longer accepted. Use `Token![trait](span)` instead of `Token![trait]([span])`. - Some token types have been renamed to conform with terminology used by the [Rust Reference](https://doc.rust-lang.org/1.68.0/reference/tokens.html#punctuation). These are `Add`->`Plus`, `Bang`->`Not`, `Colon2`->`PathSep`, `Div`->`Slash`, `Dot2`->`DotDot`, `Dot3`->`DotDotDot`, `Rem`->`Percent`, and `Sub`->`Minus`. ##### More - Several enums have been made `#[non_exhaustive]` in anticipation of upcoming language changes. This includes `WherePredicate`, `Lit`, and `GenericArgument`. - The `impl Extend<Pair<T, P>> for Punctuated<T, P>` now requires `P: Default` and will push a default punctuation between the pre-existing elements and the new ones, if there is not already a trailing punctuation. Previously it would panic in this situation. - `ParseStream::parse_terminated` now takes a peek-style punctuation argument instead of turbofish. Replace `input.parse_terminated::<_, Token![,]>(Thing::parse)` with `input.parse_terminated(Thing::parse, Token![,])`. ### [`v1.0.109`](https://github.com/dtolnay/syn/compare/1.0.108...1.0.109) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.108...1.0.109) ### [`v1.0.108`](https://github.com/dtolnay/syn/releases/tag/1.0.108) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.107...1.0.108) - Fix handling of unusual whitespace after escaped newlines in `LitStr::value` ([#​1381](https://github.com/dtolnay/syn/issues/1381), thanks [@​ModProg](https://github.com/ModProg)) ### [`v1.0.107`](https://github.com/dtolnay/syn/releases/tag/1.0.107) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.106...1.0.107) - Opt out of `-Zrustdoc-scrape-examples` on docs.rs for now ### [`v1.0.106`](https://github.com/dtolnay/syn/releases/tag/1.0.106) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.105...1.0.106) - Documentation improvements ### [`v1.0.105`](https://github.com/dtolnay/syn/releases/tag/1.0.105) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.104...1.0.105) - Improve parse errors related to `dyn` and `impl` type syntax ([#​1245](https://github.com/dtolnay/syn/issues/1245)) ### [`v1.0.104`](https://github.com/dtolnay/syn/releases/tag/1.0.104) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.103...1.0.104) - Add `PathArguments::is_none()` ### [`v1.0.103`](https://github.com/dtolnay/syn/releases/tag/1.0.103) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.102...1.0.103) - Implement `PartialOrd` for `Cursor` ([#​1236](https://github.com/dtolnay/syn/issues/1236), [#​1237](https://github.com/dtolnay/syn/issues/1237), thanks [@​CAD97](https://github.com/CAD97)) ### [`v1.0.102`](https://github.com/dtolnay/syn/releases/tag/1.0.102) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.101...1.0.102) - More efficient internal representation for `TokenBuffer` ([#​1223](https://github.com/dtolnay/syn/issues/1223), thanks [@​CAD97](https://github.com/CAD97)) - Fix parsing of a left shift after macro metavariable in type position ([#​1229](https://github.com/dtolnay/syn/issues/1229)) ### [`v1.0.101`](https://github.com/dtolnay/syn/releases/tag/1.0.101) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.100...1.0.101) - Eliminate a bunch of redundant work done by LitStr::parse ([#​1221](https://github.com/dtolnay/syn/issues/1221)) ### [`v1.0.100`](https://github.com/dtolnay/syn/releases/tag/1.0.100) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.99...1.0.100) - Parse closures with explicit empty lifetime parameter list `for<> || -> T {…}` ([#​1212](https://github.com/dtolnay/syn/issues/1212), [https://github.com/rust-lang/rust/issues/97362](https://github.com/rust-lang/rust/issues/97362)) - Parse `dyn*` provisional syntax ([#​1213](https://github.com/dtolnay/syn/issues/1213), [https://github.com/rust-lang/rust/issues/91611](https://github.com/rust-lang/rust/issues/91611)) - Parse attributes on the "rest" pattern of a struct in pattern position, `Struct { #[attr] .. }` ([#​1214](https://github.com/dtolnay/syn/issues/1214)) - Parse `static async` and `static async move` closures ([#​1215](https://github.com/dtolnay/syn/issues/1215), [https://github.com/rust-lang/rust/issues/62290](https://github.com/rust-lang/rust/issues/62290)) ### [`v1.0.99`](https://github.com/dtolnay/syn/releases/tag/1.0.99) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.98...1.0.99) - Add categories and keywords to crates.io metadata ### [`v1.0.98`](https://github.com/dtolnay/syn/releases/tag/1.0.98) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.97...1.0.98) - Format example code with rustfmt ### [`v1.0.97`](https://github.com/dtolnay/syn/releases/tag/1.0.97) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.96...1.0.97) - Update examples ### [`v1.0.96`](https://github.com/dtolnay/syn/releases/tag/1.0.96) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.95...1.0.96) - Add a `punct_mut()` method on `syn::punctuated::Pair` to return `Option<&mut P>` ([#​1183](https://github.com/dtolnay/syn/issues/1183)) ### [`v1.0.95`](https://github.com/dtolnay/syn/releases/tag/1.0.95) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.94...1.0.95) - Replace unicode-xid with unicode-ident crate: https://github.com/dtolnay/unicode-ident ### [`v1.0.94`](https://github.com/dtolnay/syn/releases/tag/1.0.94) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.93...1.0.94) - Resolve some unused_macro_rules warnings ### [`v1.0.93`](https://github.com/dtolnay/syn/releases/tag/1.0.93) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.92...1.0.93) - Fix compile error when `Some` means something unusual in the expression namespace of the scope where `custom_keyword` is invoked ([#​1171](https://github.com/dtolnay/syn/issues/1171), thanks [@​zakarumych](https://github.com/zakarumych)) ### [`v1.0.92`](https://github.com/dtolnay/syn/releases/tag/1.0.92) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.91...1.0.92) - Make compatible with Miri's tag-raw-pointers mode ([#​1166](https://github.com/dtolnay/syn/issues/1166), thanks [@​saethlin](https://github.com/saethlin)) ### [`v1.0.91`](https://github.com/dtolnay/syn/releases/tag/1.0.91) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.90...1.0.91) - impl ToTokens for RangeLimits - impl Parse for ExprAwait - impl Parse for GenericMethodArgument - impl Parse for MethodTurbofish ### [`v1.0.90`](https://github.com/dtolnay/syn/releases/tag/1.0.90) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.89...1.0.90) - Update recommended exhaustive matching idiom to use `non_exhaustive_omitted_patterns` lint: ```rust match expr { Expr::Array(e) => {…} Expr::Assign(e) => {…} ... Expr::Yield(e) => {…} #[cfg_attr(test, deny(non_exhaustive_omitted_patterns))] _ => {/* some sane fallback */} } ``` ### [`v1.0.89`](https://github.com/dtolnay/syn/releases/tag/1.0.89) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.88...1.0.89) - Remove support for inner attributes on non-block expressions ([#​1146](https://github.com/dtolnay/syn/issues/1146), [https://github.com/rust-lang/rust/pull/83312](https://github.com/rust-lang/rust/pull/83312)) - Fix panic on comma after `mut self` in a bare fn type ([#​1148](https://github.com/dtolnay/syn/issues/1148)) ### [`v1.0.88`](https://github.com/dtolnay/syn/releases/tag/1.0.88) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.87...1.0.88) - Parse `..` pattern in pattern of `let` ([#​1136](https://github.com/dtolnay/syn/issues/1136)) - Parse `for<…>` lifetime introducer on closures ([#​1135](https://github.com/dtolnay/syn/issues/1135)) - Reject postfix operators after cast ([#​1117](https://github.com/dtolnay/syn/issues/1117)) - Implement extra-traits for `Nothing` ([#​1144](https://github.com/dtolnay/syn/issues/1144)) ### [`v1.0.87`](https://github.com/dtolnay/syn/releases/tag/1.0.87) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.86...1.0.87) - Parse trait bounds containing associated constant constraint ([#​1138](https://github.com/dtolnay/syn/issues/1138)) - Change syntax of where-clauses on generic associated types ([#​1071](https://github.com/dtolnay/syn/issues/1071), [https://github.com/rust-lang/rust/issues/89122](https://github.com/rust-lang/rust/issues/89122)) ### [`v1.0.86`](https://github.com/dtolnay/syn/releases/tag/1.0.86) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.85...1.0.86) - Add support for parsing if- and while-let-chains (RFC 2497) ### [`v1.0.85`](https://github.com/dtolnay/syn/releases/tag/1.0.85) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.84...1.0.85) - Add `token()` method to each variant of syn::Lit to expose the underlying token representation with original formatting ### [`v1.0.84`](https://github.com/dtolnay/syn/releases/tag/1.0.84) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.83...1.0.84) - Add [`parse_quote_spanned!`](https://docs.rs/syn/1.0.84/syn/macro.parse_quote_spanned.html) macro which is a combination `parse_quote!` + `quote_spanned!` ### [`v1.0.83`](https://github.com/dtolnay/syn/releases/tag/1.0.83) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.82...1.0.83) - Fix panic parsing trait impl with qself in trait type: `impl <Thing<>>::Trait for Type {}` ([#​1109](https://github.com/dtolnay/syn/issues/1109)) - Preserve attributes on let-else stmt: `#[attr] let pat = val else { return }` ([#​1110](https://github.com/dtolnay/syn/issues/1110)) ### [`v1.0.82`](https://github.com/dtolnay/syn/releases/tag/1.0.82) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.81...1.0.82) - Support parenthesized generic argument syntax with `::` disambiguator: `Fn::() -> !` ([#​1096](https://github.com/dtolnay/syn/issues/1096)) ### [`v1.0.81`](https://github.com/dtolnay/syn/releases/tag/1.0.81) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.80...1.0.81) - Support arbitrary precision negative literal tokens on rustc 1.56+ ([#​1087](https://github.com/dtolnay/syn/issues/1087), [#​1088](https://github.com/dtolnay/syn/issues/1088)) ### [`v1.0.80`](https://github.com/dtolnay/syn/releases/tag/1.0.80) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.79...1.0.80) - Parse unstable `~const` syntax in where-clauses ([#​1083](https://github.com/dtolnay/syn/issues/1083), tracking issue [https://github.com/rust-lang/rust/issues/67792](https://github.com/rust-lang/rust/issues/67792)) ### [`v1.0.79`](https://github.com/dtolnay/syn/releases/tag/1.0.79) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.78...1.0.79) - Support trailing `+` in `dyn Trait` syntax, including bare (non-`dyn`) pre-2018 trait object syntax ([#​1075](https://github.com/dtolnay/syn/issues/1075), [#​1077](https://github.com/dtolnay/syn/issues/1077), [#​1078](https://github.com/dtolnay/syn/issues/1078), [#​1079](https://github.com/dtolnay/syn/issues/1079), [#​1080](https://github.com/dtolnay/syn/issues/1080), [#​1081](https://github.com/dtolnay/syn/issues/1081)) ### [`v1.0.78`](https://github.com/dtolnay/syn/releases/tag/1.0.78) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.77...1.0.78) - Parse trailing `+` in the bounds of `impl Trait` type ([#​1073](https://github.com/dtolnay/syn/issues/1073)) ### [`v1.0.77`](https://github.com/dtolnay/syn/releases/tag/1.0.77) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.76...1.0.77) - Match Rust 1.57+'s parsing of dot and question mark after a curly braced macro invocation ([#​1068](https://github.com/dtolnay/syn/issues/1068)) ### [`v1.0.76`](https://github.com/dtolnay/syn/releases/tag/1.0.76) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.75...1.0.76) - Parse unstable `let`–`else` syntax ([#​1050](https://github.com/dtolnay/syn/issues/1050), [#​1057](https://github.com/dtolnay/syn/issues/1057)) - Parse qualified braced variant expressions and patterns: `<E>::V {..}` ([#​1058](https://github.com/dtolnay/syn/issues/1058), [#​1059](https://github.com/dtolnay/syn/issues/1059)) - Fix precedence of outer attributes in front of an assignment expression in statement position ([#​1060](https://github.com/dtolnay/syn/issues/1060)) ### [`v1.0.75`](https://github.com/dtolnay/syn/releases/tag/1.0.75) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.74...1.0.75) - Improve spans on a method without body inside an impl block - Documentation improvements ([#​922](https://github.com/dtolnay/syn/issues/922), thanks [@​Tamschi](https://github.com/Tamschi)) ### [`v1.0.74`](https://github.com/dtolnay/syn/releases/tag/1.0.74) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.73...1.0.74) - Reject `for<'a> dyn Trait<'a>` syntax; the correct representation is `dyn for<'a> Trait<'a>` ([#​1042](https://github.com/dtolnay/syn/issues/1042)) ### [`v1.0.73`](https://github.com/dtolnay/syn/releases/tag/1.0.73) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.72...1.0.73) - Add From\<Ident>, From\<Index>, From\<usize> for Member ([#​1038](https://github.com/dtolnay/syn/issues/1038), thanks [@​m-ou-se](https://github.com/m-ou-se)) ### [`v1.0.72`](https://github.com/dtolnay/syn/releases/tag/1.0.72) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.71...1.0.72) - Parse const generics which use value of a previous const generic parameter as a default value ([#​1027](https://github.com/dtolnay/syn/issues/1027)) ### [`v1.0.71`](https://github.com/dtolnay/syn/releases/tag/1.0.71) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.70...1.0.71) - Fix panic deserializing an ItemImpl with a non-path in trait position ([#​1023](https://github.com/dtolnay/syn/issues/1023)) - Parse visibility on impl blocks ([#​1024](https://github.com/dtolnay/syn/issues/1024)) - Fix parsing a type parameter default on the first generic parameter of an impl block ([#​1025](https://github.com/dtolnay/syn/issues/1025), thanks [@​taiki-e](https://github.com/taiki-e)) ### [`v1.0.70`](https://github.com/dtolnay/syn/releases/tag/1.0.70) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.69...1.0.70) - Fix precedence of closure body vs ExprRange rhs: `|| .. .method()` ([#​1019](https://github.com/dtolnay/syn/issues/1019)) - Parse inner attributes inside of structs and enums ([#​1022](https://github.com/dtolnay/syn/issues/1022)) ### [`v1.0.69`](https://github.com/dtolnay/syn/releases/tag/1.0.69) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.68...1.0.69) - Improve Parse impls of ExprBox, ExprUnary, ExprLet, ExprClosure, ExprReference, ExprBreak, ExprContinue, ExprReturn, ExprYield to respect precedence for parsing a subexpression beginning with the respective keyword/punctuation ([#​1007](https://github.com/dtolnay/syn/issues/1007), [#​1008](https://github.com/dtolnay/syn/issues/1008), [#​1009](https://github.com/dtolnay/syn/issues/1009), [#​1010](https://github.com/dtolnay/syn/issues/1010), [#​1011](https://github.com/dtolnay/syn/issues/1011), [#​1012](https://github.com/dtolnay/syn/issues/1012), [#​1013](https://github.com/dtolnay/syn/issues/1013), [#​1014](https://github.com/dtolnay/syn/issues/1014), [#​1015](https://github.com/dtolnay/syn/issues/1015)) ### [`v1.0.68`](https://github.com/dtolnay/syn/releases/tag/1.0.68) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.67...1.0.68) - Preserve span of `LexError` on conversion to `syn::Error` ([#​1006](https://github.com/dtolnay/syn/issues/1006)) ### [`v1.0.67`](https://github.com/dtolnay/syn/releases/tag/1.0.67) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.66...1.0.67) - Accept outer attributes in the Parse impl of ExprBlock ([#​1004](https://github.com/dtolnay/syn/issues/1004)) ### [`v1.0.66`](https://github.com/dtolnay/syn/releases/tag/1.0.66) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.65...1.0.66) - Parse equality constraints on generic associated types ([#​979](https://github.com/dtolnay/syn/issues/979)) - Parse default value exprs in const generic declarations ([#​980](https://github.com/dtolnay/syn/issues/980)) - Fix infinite loop parsing malformed type ascription expression in non-`full` mode ([#​978](https://github.com/dtolnay/syn/issues/978)) - Improve Parse impls of ExprArray, ExprAsync, ExprBlock, ExprMacro, ExprParen, ExprRepeat, ExprStruct, ExprTryBlock, ExprUnsafe to succeed parsing even in the presence of trailing binary operators ([#​991](https://github.com/dtolnay/syn/issues/991), [#​992](https://github.com/dtolnay/syn/issues/992), [#​993](https://github.com/dtolnay/syn/issues/993), [#​994](https://github.com/dtolnay/syn/issues/994), [#​995](https://github.com/dtolnay/syn/issues/995), [#​996](https://github.com/dtolnay/syn/issues/996), [#​997](https://github.com/dtolnay/syn/issues/997), [#​998](https://github.com/dtolnay/syn/issues/998), [#​999](https://github.com/dtolnay/syn/issues/999)) ### [`v1.0.65`](https://github.com/dtolnay/syn/releases/tag/1.0.65) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.64...1.0.65) - Parse visibility on macro_rules ([#​981](https://github.com/dtolnay/syn/issues/981), tracking issue [rust-lang/rust#78855](https://github.com/rust-lang/rust/issues/78855)) - Parse leading vert in or-patterns ([#​982](https://github.com/dtolnay/syn/issues/982), matching the Rust grammar change in [rust-lang/rust#81869](https://github.com/rust-lang/rust/issues/81869)) - Parse static with omitted type ([#​983](https://github.com/dtolnay/syn/issues/983)) - Parse placeholder type in type parameter position ([#​984](https://github.com/dtolnay/syn/issues/984)) ### [`v1.0.64`](https://github.com/dtolnay/syn/releases/tag/1.0.64) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.63...1.0.64) - Avoid `clippy::expl_impl_clone_on_copy` pedantic lint in downstream custom token types ([#​976](https://github.com/dtolnay/syn/issues/976)) ### [`v1.0.63`](https://github.com/dtolnay/syn/releases/tag/1.0.63) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.62...1.0.63) - Fix parsing associated types with empty trait bound list after colon ([#​974](https://github.com/dtolnay/syn/issues/974)) ### [`v1.0.62`](https://github.com/dtolnay/syn/releases/tag/1.0.62) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.61...1.0.62) - Republish to work around docs.rs bug [https://github.com/rust-lang/docs.rs/issues/1300](https://github.com/rust-lang/docs.rs/issues/1300) ### [`v1.0.61`](https://github.com/dtolnay/syn/releases/tag/1.0.61) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.60...1.0.61) - Improve assertion failures on invalid use of `Punctuated` API ([#​970](https://github.com/dtolnay/syn/issues/970), thanks [@​osa1](https://github.com/osa1)) - Add `Lifetime::span` and `Lifetime::set_span` accessors ([#​971](https://github.com/dtolnay/syn/issues/971)) ### [`v1.0.60`](https://github.com/dtolnay/syn/releases/tag/1.0.60) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.59...1.0.60) - Provide an idiom for testing exhaustiveness of pattern matches on `Expr`, `Type`, `Pat`, `Item`, `ForeignItem`, `TraitItem`, and `ImplItem` ([#​694](https://github.com/dtolnay/syn/issues/694)) ```rust match expr { Expr::Array(e) => {...} Expr::Assign(e) => {...} ... Expr::Yield(e) => {...} #[cfg(test)] Expr::__TestExhaustive(_) => unimplemented!(), #[cfg(not(test))] _ => { /* some sane fallback */ } } ``` The above is the only supported idiom for exhaustive matching of those enum. Do not write anything differently as it is not supported. The conditional compilation on match-arms lets us fail your tests but not break your library when adding a variant. You will be notified by a test failure when a variant is added, so that you can add code to handle it, but your library will continue to compile and work for downstream users in the interim. ### [`v1.0.59`](https://github.com/dtolnay/syn/releases/tag/1.0.59) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.58...1.0.59) - Parse empty supertrait lists consistently with rustc ([#​952](https://github.com/dtolnay/syn/issues/952)) - Fix loss of span information on comma tokens inside of Type::Tuple during parse ([#​959](https://github.com/dtolnay/syn/issues/959)) ### [`v1.0.58`](https://github.com/dtolnay/syn/releases/tag/1.0.58) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.57...1.0.58) - Allow literals to parse as a const generic path argument even without "full" feature enabled ([#​951](https://github.com/dtolnay/syn/issues/951)) ```rust pub struct Struct { array: Array<10>, // used to require `features = "full"` } ``` ### [`v1.0.57`](https://github.com/dtolnay/syn/releases/tag/1.0.57) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.56...1.0.57) - Make Punctuated::new available as a `const fn` ([#​949](https://github.com/dtolnay/syn/issues/949)) ### [`v1.0.56`](https://github.com/dtolnay/syn/releases/tag/1.0.56) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.55...1.0.56) - Add [`Error::into_compile_error`](https://docs.rs/syn/1.0.56/syn/struct.Error.html#method.into_compile_error) ### [`v1.0.55`](https://github.com/dtolnay/syn/releases/tag/1.0.55) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.54...1.0.55) - Preserve None-delimited group around macro metavariable when parsing `T<$ty>` ([#​944](https://github.com/dtolnay/syn/issues/944), [#​945](https://github.com/dtolnay/syn/issues/945)) ### [`v1.0.54`](https://github.com/dtolnay/syn/releases/tag/1.0.54) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.53...1.0.54) - Fix parsing of `impl` items with macro metavariable in the trait path: `impl $trait for Type {...}` ([#​942](https://github.com/dtolnay/syn/issues/942)) ### [`v1.0.53`](https://github.com/dtolnay/syn/releases/tag/1.0.53) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.52...1.0.53) - Parse `impl !Trait {...}` syntax ([#​936](https://github.com/dtolnay/syn/issues/936)) ### [`v1.0.52`](https://github.com/dtolnay/syn/releases/tag/1.0.52) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.51...1.0.52) - Parse `unsafe extern` block syntax ([#​918](https://github.com/dtolnay/syn/issues/918)) - Parse `unsafe mod` syntax ([#​919](https://github.com/dtolnay/syn/issues/919)) - Parse `const {...}` block syntax ([#​921](https://github.com/dtolnay/syn/issues/921)) - Parse destructuring assignment syntax ([#​933](https://github.com/dtolnay/syn/issues/933)) ### [`v1.0.51`](https://github.com/dtolnay/syn/releases/tag/1.0.51) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.50...1.0.51) - Allow parsing signatures in which const generic params appear in front of lifetime params ([#​920](https://github.com/dtolnay/syn/issues/920)) ### [`v1.0.50`](https://github.com/dtolnay/syn/releases/tag/1.0.50) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.48...1.0.50) - Apply `doc(cfg(...))` on feature gated APIs for docs.rs-rendered documentation ([#​925](https://github.com/dtolnay/syn/issues/925)) ### [`v1.0.48`](https://github.com/dtolnay/syn/releases/tag/1.0.48) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.47...1.0.48) - Rebuild for https://astexplorer.net ### [`v1.0.47`](https://github.com/dtolnay/syn/releases/tag/1.0.47) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.46...1.0.47) - Documentation improvements ### [`v1.0.46`](https://github.com/dtolnay/syn/releases/tag/1.0.46) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.45...1.0.46) - Fix parsing structured attributes that contain nested absolute paths, such as `#[derive(::serde::Serialize)]` ([#​909](https://github.com/dtolnay/syn/issues/909)) ### [`v1.0.45`](https://github.com/dtolnay/syn/releases/tag/1.0.45) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.44...1.0.45) - Provide more detailed error messages when parsing specific literal kind ([#​908](https://github.com/dtolnay/syn/issues/908)) ### [`v1.0.44`](https://github.com/dtolnay/syn/releases/tag/1.0.44) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.43...1.0.44) - Fix some parsing of patterns inside of None-delimited groups ([#​907](https://github.com/dtolnay/syn/issues/907)) ### [`v1.0.43`](https://github.com/dtolnay/syn/releases/tag/1.0.43) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.42...1.0.43) - Add Parse impl for syn::Signature ### [`v1.0.42`](https://github.com/dtolnay/syn/releases/tag/1.0.42) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.41...1.0.42) - Fix several bugs involving unusual suffixes on integer and floating point literal tokens ([#​898](https://github.com/dtolnay/syn/issues/898), [#​899](https://github.com/dtolnay/syn/issues/899), [#​900](https://github.com/dtolnay/syn/issues/900)) ### [`v1.0.41`](https://github.com/dtolnay/syn/releases/tag/1.0.41) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.40...1.0.41) - Fix panic on printing an incomplete (having fewer path segments than originally parsed with) qualified path (ExprPath, PatPath, TypePath containing QSelf) ([#​891](https://github.com/dtolnay/syn/issues/891), thanks [@​taiki-e](https://github.com/taiki-e)) - Fix panic triggered by syntactically invalid overflowing negative float literal after `.` in a field access position, e.g. `let _ = obj.-0.9E999999` ([#​895](https://github.com/dtolnay/syn/issues/895), thanks [@​sameer](https://github.com/sameer)) - Enable using `parse_macro_input!` with a Parser function rather than type having a Parse impl ([#​896](https://github.com/dtolnay/syn/issues/896), thanks [@​sbrocket](https://github.com/sbrocket)) ### [`v1.0.40`](https://github.com/dtolnay/syn/releases/tag/1.0.40) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.39...1.0.40) - Fix panic on parsing float literals having both an exponent and a suffix beginning with 'e' or 'E', such as `9e99e999` ([#​893](https://github.com/dtolnay/syn/issues/893)) ### [`v1.0.39`](https://github.com/dtolnay/syn/releases/tag/1.0.39) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.38...1.0.39) - Improve compile time by pre-expanding derives ([#​885](https://github.com/dtolnay/syn/issues/885)) - Parse const generic parameters in any order relative to type parameters ([#​886](https://github.com/dtolnay/syn/issues/886)) ### [`v1.0.38`](https://github.com/dtolnay/syn/releases/tag/1.0.38) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.37...1.0.38) - Accept traits with parenthesized path arguments in impls ([#​880](https://github.com/dtolnay/syn/issues/880), thanks [@​alecmocatta](https://github.com/alecmocatta)) ### [`v1.0.37`](https://github.com/dtolnay/syn/releases/tag/1.0.37) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.36...1.0.37) - Handle shebang in a way that matches rustc 1.46+ ([#​876](https://github.com/dtolnay/syn/issues/876), [https://github.com/rust-lang/rust/pull/71487](https://github.com/rust-lang/rust/pull/71487), [https://github.com/rust-lang/rust/pull/73596](https://github.com/rust-lang/rust/pull/73596)) ```rust #!//am/i/a/comment fn main() {} // ^ shebang ``` ```rust #!//am/i/a/comment [allow(dead_code)] // ^ not a shebang fn main() {} ``` - Accept <code>tuple.0. 0</code> as a tuple indexing expression ([#​877](https://github.com/dtolnay/syn/issues/877)) ### [`v1.0.36`](https://github.com/dtolnay/syn/releases/tag/1.0.36) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.35...1.0.36) - Add Lit::span, Lit::set_span ([#​874](https://github.com/dtolnay/syn/issues/874)) ### [`v1.0.35`](https://github.com/dtolnay/syn/releases/tag/1.0.35) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.34...1.0.35) - Fix parsing of Expr::Field in non-full mode ([#​870](https://github.com/dtolnay/syn/issues/870)) ### [`v1.0.34`](https://github.com/dtolnay/syn/releases/tag/1.0.34) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.33...1.0.34) - Documentation improvements ### [`v1.0.33`](https://github.com/dtolnay/syn/releases/tag/1.0.33) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.32...1.0.33) - Parse `tuple.0.0` as an indexing expression ([https://github.com/rust-lang/rust/pull/71322](https://github.com/rust-lang/rust/pull/71322)) - Add `Parse` impls for optional of proc-macro2 types: `Option<TokenTree>`, `Option<Punct>`, `Option<Literal>`, `Option<Group>` ### [`v1.0.32`](https://github.com/dtolnay/syn/releases/tag/1.0.32) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.31...1.0.32) - Fix parsing $:item macro_rules metavariables containing outer attributes ([#​852](https://github.com/dtolnay/syn/issues/852)) ### [`v1.0.31`](https://github.com/dtolnay/syn/releases/tag/1.0.31) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.30...1.0.31) - Add [`Expr::parse_without_eager_brace`](https://docs.rs/syn/1.0.31/syn/enum.Expr.html#method.parse_without_eager_brace) to parse expressions in ambiguous syntactic position. Rust grammar has an ambiguity where braces sometimes turn a path expression into a struct initialization and sometimes do not. In the following code, the expression `S {}` is one expression. Presumably there is an empty struct `struct S {}` defined somewhere which it is instantiating. ```rust let _ = *S {}; // parsed by rustc as: `*(S {})` ``` We would want to parse the above using `Expr::parse` after the `=` token. But in the following, `S {}` is *not* a struct init expression. ```rust if *S {} {} // parsed by rustc as: // // if (*S) { // /* empty block */ // } // { // /* another empty block */ // } ``` For that reason we would want to parse if-conditions using `Expr::parse_without_eager_brace` after the `if` token. Same for similar syntactic positions such as the condition expr after a `while` token or the expr at the top of a `match`. The Rust grammar's choices around which way this ambiguity is resolved at various syntactic positions is fairly arbitrary. Really either parse behavior could work in most positions, and language designers just decide each case based on which is more likely to be what the programmer had in mind most of the time. ```rust if return S {} {} // parsed by rustc as: // // if (return (S {})) { // } // // but could equally well have been this other arbitrary choice: // // if (return S) { // } // {} ``` Note the grammar ambiguity on trailing braces is distinct from precedence and is not captured by assigning a precedence level to the braced struct init expr in relation to other operators. This can be illustrated by `return 0..S {}` vs `match 0..S {}`. The former parses as `return (0..(S {}))` implying tighter precedence for struct init than `..`, while the latter parses as `match (0..S) {}` implying tighter precedence for `..` than struct init, a contradiction. ### [`v1.0.30`](https://github.com/dtolnay/syn/releases/tag/1.0.30) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.29...1.0.30) - Parse struct init expressions where the type name is an interpolated macro_rules metavariable, such as `$struct {}` where $struct:ident ([#​842](https://github.com/dtolnay/syn/issues/842)) - Handle nesting of None-delimited groups ([#​843](https://github.com/dtolnay/syn/issues/843), thanks [@​Aaron1011](https://github.com/Aaron1011)) ### [`v1.0.29`](https://github.com/dtolnay/syn/releases/tag/1.0.29) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.28...1.0.29) - Parse macro call exprs where the macro name is an interpolated macro_rules metavariable, such as `$macro!()` ([#​838](https://github.com/dtolnay/syn/issues/838)) - Parse paths containing generic parameters where the first path segment is an interpolated macro_rules metavariable, such as `$seg<'a>` ([#​839](https://github.com/dtolnay/syn/issues/839)) ### [`v1.0.28`](https://github.com/dtolnay/syn/releases/tag/1.0.28) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.27...1.0.28) - Recognize empty None-delimited group produced by interpolating a $:vis macro metavariable when parsing a Visibility ([#​836](https://github.com/dtolnay/syn/issues/836)) ### [`v1.0.27`](https://github.com/dtolnay/syn/releases/tag/1.0.27) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.26...1.0.27) - Parse function calls in which the callee is an interpolated macro variable `$fn(...)` ([#​833](https://github.com/dtolnay/syn/issues/833)) ### [`v1.0.26`](https://github.com/dtolnay/syn/releases/tag/1.0.26) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.25...1.0.26) - Parse paths containing an interpolated first component, such as `$first::rest` ([https://github.com/rust-lang/rust/issues/72608](https://github.com/rust-lang/rust/issues/72608), [#​832](https://github.com/dtolnay/syn/issues/832)) ### [`v1.0.25`](https://github.com/dtolnay/syn/releases/tag/1.0.25) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.24...1.0.25) - Parse opt-out `?const` trait bounds ([#​767](https://github.com/dtolnay/syn/issues/767)) - Parse const generics in method generic arguments ([#​816](https://github.com/dtolnay/syn/issues/816), thanks [@​yodaldevoid](https://github.com/yodaldevoid)) - Parse trait bounds on type alias items ([#​821](https://github.com/dtolnay/syn/issues/821)) - Parse const generics on impl blocks ([#​822](https://github.com/dtolnay/syn/issues/822)) - Fix precedence of attributes on binary expressions to match rustc ([#​823](https://github.com/dtolnay/syn/issues/823)) - Remove parsing of `extern::` paths which were removed from nightly in January 2019 ([#​825](https://github.com/dtolnay/syn/issues/825), [https://github.com/rust-lang/rust/pull/57572](https://github.com/rust-lang/rust/pull/57572)) - Add `Punctuated::clear`, analogous to Vec::clear ([#​828](https://github.com/dtolnay/syn/issues/828)) ### [`v1.0.24`](https://github.com/dtolnay/syn/releases/tag/1.0.24) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.23...1.0.24) - Parse `mut self` receiver in function pointer type ([#​812](https://github.com/dtolnay/syn/issues/812), [#​814](https://github.com/dtolnay/syn/issues/814)) - Parse const trait impls ([#​813](https://github.com/dtolnay/syn/issues/813)) - Improve error reporting inside struct expressions and struct patterns ([#​818](https://github.com/dtolnay/syn/issues/818)) ### [`v1.0.23`](https://github.com/dtolnay/syn/releases/tag/1.0.23) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.22...1.0.23) - Parse inner attributes in traits ([#​803](https://github.com/dtolnay/syn/issues/803)) - Parse const underscore in traits and impls ([#​804](https://github.com/dtolnay/syn/issues/804)) - Implement Extend<Error> for Error ([#​805](https://github.com/dtolnay/syn/issues/805)) - Parse Or patterns ([#​806](https://github.com/dtolnay/syn/issues/806)) - Parse outer attributes on Expr\* structs ([#​807](https://github.com/dtolnay/syn/issues/807)) - Parse top level const/static without value ([#​808](https://github.com/dtolnay/syn/issues/808)) - Parse syntactically accepted functions ([#​809](https://github.com/dtolnay/syn/issues/809)) - Parse extern static with value ([#​810](https://github.com/dtolnay/syn/issues/810)) Thanks [@​taiki-e](https://github.com/taiki-e) for all of these. ### [`v1.0.22`](https://github.com/dtolnay/syn/releases/tag/1.0.22) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.21...1.0.22) - Parse literal suffix on byte string, byte, and char literal tokens: `br#"..."#suffix`, `b'?'suffix`, `'?'suffix` ([#​799](https://github.com/dtolnay/syn/issues/799), [#​800](https://github.com/dtolnay/syn/issues/800)) ### [`v1.0.21`](https://github.com/dtolnay/syn/releases/tag/1.0.21) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.20...1.0.21) - Documentation improvements ### [`v1.0.20`](https://github.com/dtolnay/syn/releases/tag/1.0.20) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.19...1.0.20) - Improve span of error message when an error during `syn::Macro::parse_body` is triggered past the last token of the macro body ([#​791](https://github.com/dtolnay/syn/issues/791)) ### [`v1.0.19`](https://github.com/dtolnay/syn/releases/tag/1.0.19) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.18...1.0.19) - Parse a more lenient extern type syntax inside extern blocks ([#​763](https://github.com/dtolnay/syn/issues/763)) ### [`v1.0.18`](https://github.com/dtolnay/syn/releases/tag/1.0.18) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.17...1.0.18) - Ignore unparsed empty None-delimited groups at the end of a macro input ([#​783](https://github.com/dtolnay/syn/issues/783)) ### [`v1.0.17`](https://github.com/dtolnay/syn/releases/tag/1.0.17) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.16...1.0.17) - Expose `syn::Lit` in `default-features = false` mode ### [`v1.0.16`](https://github.com/dtolnay/syn/releases/tag/1.0.16) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.15...1.0.16) - Fix parsing of `&raw` raw reference operator ([https://github.com/rust-lang/rust/issues/64490](https://github.com/rust-lang/rust/issues/64490)) to require explicitly specified constness, `&raw mut` or `&raw const` ### [`v1.0.15`](https://github.com/dtolnay/syn/releases/tag/1.0.15) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.14...1.0.15) - Add [`Punctuated::first_mut`](https://docs.rs/syn/1.0.15/syn/punctuated/struct.Punctuated.html#method.first_mut) to return a mut reference to the first sequence element ### [`v1.0.14`](https://github.com/dtolnay/syn/releases/tag/1.0.14) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.13...1.0.14) - Produce more helpful error messages from [Attribute::parse_args](https://docs.rs/syn/1.0/syn/struct.Attribute.html#method.parse_args) ### [`v1.0.13`](https://github.com/dtolnay/syn/releases/tag/1.0.13) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.12...1.0.13) - Allow parse_quote! to parse Vec\<Stmt>, with the same behavior as Block::parse_within ([#​741](https://github.com/dtolnay/syn/issues/741)) ### [`v1.0.12`](https://github.com/dtolnay/syn/releases/tag/1.0.12) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.11...1.0.12) - Reject function signatures with an incorrectly placed receiver parameter, like `fn f(x: u8, &self)` - Produce correctly spanned error when parsing punct beyond the end of a delimited group ([#​739](https://github.com/dtolnay/syn/issues/739)) ### [`v1.0.11`](https://github.com/dtolnay/syn/releases/tag/1.0.11) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.10...1.0.11) - Implement quote::IdentFragment for syn::Member and syn::Index so that spans are preserved when using these types in quote's `format_ident!` macro ```rust use quote::format_ident; use syn::Index; let index: Index = /* ... */; let ident = format_ident!("__{}", index); // produces __0, __1, etc ``` ### [`v1.0.10`](https://github.com/dtolnay/syn/releases/tag/1.0.10) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.9...1.0.10) - Provide `Hash` and `Eq` impls for syn::Member even without "extra-traits" feature enabled, as this type is commonly useful in a hashset ### [`v1.0.9`](https://github.com/dtolnay/syn/releases/tag/1.0.9) [Compare Source](https://github.com/dtolnay/syn/compare/1.0.8...1.0.9) - Fix failure to parse tuple struct fields of tuple type starting with `crate` ([#​720](https://github.com/dtolnay/syn/issues/720), [#​723](https://github.com/dtolnay/syn/issues/723), thanks [@​mystor](https://github.com/mystor)) - Fix unexpected tokens being ignored when using Speculative::advance_to ([#​721](https://github.com/dtolnay/syn/issues/721), [#​723](https://github.com/dtolnay/syn/issues/723), thank </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/grafbase/api). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4xMS4wIiwidXBkYXRlZEluVmVyIjoiMzYuMTEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->
Shebang handling was too agressive in stripping out the first line in cases where it is actually not a shebang, but instead, valid rust (#70528). This is a second attempt at resolving this issue (the first attempt was reverted, for, among other reasons, causing an ICE in certain cases (#71372, #71471).
The behavior is now codified by a number of UI tests, but simply:
For the first line to be a shebang, the following must all be true:
#!
#!
[
I believe this is a strict superset of what we used to allow, so perhaps a crater run is unnecessary, but probably not a terrible idea.
Fixes #70528