Skip to content

Commit 509f134

Browse files
Add const trait and const impl support to verus-syn (#2451)
Co-authored-by: zero-to-nat <nneamtu@andrew.cmu.edu>
1 parent 36e8e81 commit 509f134

12 files changed

Lines changed: 144 additions & 14 deletions

File tree

dependencies/syn/src/gen/clone.rs

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dependencies/syn/src/gen/debug.rs

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dependencies/syn/src/gen/eq.rs

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dependencies/syn/src/gen/fold.rs

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dependencies/syn/src/gen/hash.rs

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dependencies/syn/src/gen/visit.rs

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dependencies/syn/src/gen/visit_mut.rs

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dependencies/syn/src/item.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ ast_struct! {
197197
pub attrs: Vec<Attribute>,
198198
pub defaultness: Option<Token![default]>,
199199
pub unsafety: Option<Token![unsafe]>,
200+
pub constness: Option<Token![const]>,
200201
pub impl_token: Token![impl],
201202
pub generics: Generics,
202203
/// Trait this impl implements.
@@ -278,6 +279,7 @@ ast_struct! {
278279
pub vis: Visibility,
279280
pub unsafety: Option<Token![unsafe]>,
280281
pub auto_token: Option<Token![auto]>,
282+
pub constness: Option<Token![const]>,
281283
pub restriction: Option<ImplRestriction>,
282284
pub trait_token: Token![trait],
283285
pub ident: Ident,
@@ -1110,7 +1112,10 @@ pub(crate) mod parsing {
11101112
}))
11111113
}
11121114
}
1113-
} else if lookahead.peek(Token![const]) {
1115+
} else if lookahead.peek(Token![const])
1116+
&& !ahead.peek2(Token![impl])
1117+
&& !ahead.peek2(Token![trait])
1118+
{
11141119
let vis = input.parse()?;
11151120
let publish = input.parse()?;
11161121
let mode = input.parse()?;
@@ -1200,7 +1205,10 @@ pub(crate) mod parsing {
12001205
input.call(parse_trait_or_trait_alias)
12011206
} else if lookahead.peek(Token![auto]) && ahead.peek2(Token![trait]) {
12021207
input.parse().map(Item::Trait)
1208+
} else if lookahead.peek(Token![const]) && ahead.peek2(Token![trait]) {
1209+
input.parse().map(Item::Trait)
12031210
} else if lookahead.peek(Token![impl])
1211+
|| lookahead.peek(Token![const]) && ahead.peek2(Token![impl])
12041212
|| lookahead.peek(Token![default]) && !ahead.peek2(Token![!])
12051213
{
12061214
let allow_verbatim_impl = true;
@@ -2388,12 +2396,14 @@ pub(crate) mod parsing {
23882396
{
23892397
let unsafety = None;
23902398
let auto_token = None;
2399+
let const_token = None;
23912400
parse_rest_of_trait(
23922401
input,
23932402
attrs,
23942403
vis,
23952404
unsafety,
23962405
auto_token,
2406+
const_token,
23972407
trait_token,
23982408
ident,
23992409
generics,
@@ -2414,6 +2424,7 @@ pub(crate) mod parsing {
24142424
let vis: Visibility = input.parse()?;
24152425
let unsafety: Option<Token![unsafe]> = input.parse()?;
24162426
let auto_token: Option<Token![auto]> = input.parse()?;
2427+
let constness: Option<Token![const]> = input.parse()?;
24172428
let trait_token: Token![trait] = input.parse()?;
24182429
let ident: Ident = input.parse()?;
24192430
let generics: Generics = input.parse()?;
@@ -2423,6 +2434,7 @@ pub(crate) mod parsing {
24232434
vis,
24242435
unsafety,
24252436
auto_token,
2437+
constness,
24262438
trait_token,
24272439
ident,
24282440
generics,
@@ -2436,6 +2448,7 @@ pub(crate) mod parsing {
24362448
vis: Visibility,
24372449
unsafety: Option<Token![unsafe]>,
24382450
auto_token: Option<Token![auto]>,
2451+
constness: Option<Token![const]>,
24392452
trait_token: Token![trait],
24402453
ident: Ident,
24412454
mut generics: Generics,
@@ -2475,6 +2488,7 @@ pub(crate) mod parsing {
24752488
vis,
24762489
unsafety,
24772490
auto_token,
2491+
constness,
24782492
restriction: None,
24792493
trait_token,
24802494
ident,
@@ -2794,6 +2808,7 @@ pub(crate) mod parsing {
27942808
let has_visibility = allow_verbatim_impl && input.parse::<Visibility>()?.is_some();
27952809
let defaultness: Option<Token![default]> = input.parse()?;
27962810
let unsafety: Option<Token![unsafe]> = input.parse()?;
2811+
let mut constness: Option<Token![const]> = input.parse()?;
27972812
let impl_token: Token![impl] = input.parse()?;
27982813

27992814
let has_generics = generics::parsing::choose_generics_over_qpath(input);
@@ -2803,11 +2818,8 @@ pub(crate) mod parsing {
28032818
Generics::default()
28042819
};
28052820

2806-
let is_const_impl = allow_verbatim_impl
2807-
&& (input.peek(Token![const]) || input.peek(Token![?]) && input.peek2(Token![const]));
2808-
if is_const_impl {
2809-
input.parse::<Option<Token![?]>>()?;
2810-
input.parse::<Token![const]>()?;
2821+
if constness.is_none() {
2822+
constness = input.parse()?;
28112823
}
28122824

28132825
let polarity = if input.peek(Token![!]) && !input.peek2(token::Brace) {
@@ -2868,13 +2880,14 @@ pub(crate) mod parsing {
28682880
items.push(content.parse()?);
28692881
}
28702882

2871-
if has_visibility || is_const_impl || is_impl_for && trait_.is_none() {
2883+
if has_visibility || is_impl_for && trait_.is_none() {
28722884
Ok(None)
28732885
} else {
28742886
Ok(Some(ItemImpl {
28752887
attrs,
28762888
defaultness,
28772889
unsafety,
2890+
constness,
28782891
impl_token,
28792892
generics,
28802893
trait_,
@@ -3409,6 +3422,7 @@ pub(crate) mod printing {
34093422
self.vis.to_tokens(tokens);
34103423
self.unsafety.to_tokens(tokens);
34113424
self.auto_token.to_tokens(tokens);
3425+
self.constness.to_tokens(tokens);
34123426
self.trait_token.to_tokens(tokens);
34133427
self.ident.to_tokens(tokens);
34143428
self.generics.to_tokens(tokens);
@@ -3445,6 +3459,7 @@ pub(crate) mod printing {
34453459
tokens.append_all(self.attrs.outer());
34463460
self.defaultness.to_tokens(tokens);
34473461
self.unsafety.to_tokens(tokens);
3462+
self.constness.to_tokens(tokens);
34483463
self.impl_token.to_tokens(tokens);
34493464
self.generics.to_tokens(tokens);
34503465
if let Some((polarity, path, for_token)) = &self.trait_ {

dependencies/syn/syn.json

Lines changed: 19 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)