Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/parser/src/grammar/items.rs | 4 | ||||
| -rw-r--r-- | crates/parser/src/grammar/items/consts.rs | 1 | ||||
| -rw-r--r-- | crates/parser/test_data/generated/runner.rs | 2 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/ok/type_const.rast | 22 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/ok/type_const.rs | 1 | ||||
| -rw-r--r-- | crates/syntax/rust.ungram | 1 | ||||
| -rw-r--r-- | crates/syntax/src/ast/generated/nodes.rs | 2 |
7 files changed, 33 insertions, 0 deletions
diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index 6c46fac290..c5c6e04dd4 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs @@ -235,6 +235,7 @@ pub(super) fn opt_item(p: &mut Parser<'_>, m: Marker, is_in_extern: bool) -> Res T![trait] => traits::trait_(p, m), T![impl] => traits::impl_(p, m), + T![type] if p.nth(1) == T![const] => consts::konst(p, m), T![type] => type_alias(p, m), // test extern_block @@ -266,6 +267,9 @@ fn opt_item_without_modifiers(p: &mut Parser<'_>, m: Marker) -> Result<(), Marke T![use] => use_item::use_(p, m), T![mod] => mod_item(p, m), + // test type_const + // type const FOO: i32 = 2; + T![type] if la == T![const] => consts::konst(p, m), T![type] => type_alias(p, m), T![struct] => adt::strukt(p, m), T![enum] => adt::enum_(p, m), diff --git a/crates/parser/src/grammar/items/consts.rs b/crates/parser/src/grammar/items/consts.rs index e6a8aca586..cc5bb73bdc 100644 --- a/crates/parser/src/grammar/items/consts.rs +++ b/crates/parser/src/grammar/items/consts.rs @@ -3,6 +3,7 @@ use super::*; // test const_item // const C: u32 = 92; pub(super) fn konst(p: &mut Parser<'_>, m: Marker) { + p.eat(T![type]); p.bump(T![const]); const_or_static(p, m, true); } diff --git a/crates/parser/test_data/generated/runner.rs b/crates/parser/test_data/generated/runner.rs index 10b1f85d39..6dfb78b128 100644 --- a/crates/parser/test_data/generated/runner.rs +++ b/crates/parser/test_data/generated/runner.rs @@ -688,6 +688,8 @@ mod ok { #[test] fn type_alias() { run_and_expect_no_errors("test_data/parser/inline/ok/type_alias.rs"); } #[test] + fn type_const() { run_and_expect_no_errors("test_data/parser/inline/ok/type_const.rs"); } + #[test] fn type_item_type_params() { run_and_expect_no_errors("test_data/parser/inline/ok/type_item_type_params.rs"); } diff --git a/crates/parser/test_data/parser/inline/ok/type_const.rast b/crates/parser/test_data/parser/inline/ok/type_const.rast new file mode 100644 index 0000000000..9ceae9e44b --- /dev/null +++ b/crates/parser/test_data/parser/inline/ok/type_const.rast @@ -0,0 +1,22 @@ +SOURCE_FILE + CONST + TYPE_KW "type" + WHITESPACE " " + CONST_KW "const" + WHITESPACE " " + NAME + IDENT "FOO" + COLON ":" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "i32" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "2" + SEMICOLON ";" + WHITESPACE "\n" diff --git a/crates/parser/test_data/parser/inline/ok/type_const.rs b/crates/parser/test_data/parser/inline/ok/type_const.rs new file mode 100644 index 0000000000..8e2c425922 --- /dev/null +++ b/crates/parser/test_data/parser/inline/ok/type_const.rs @@ -0,0 +1 @@ +type const FOO: i32 = 2; diff --git a/crates/syntax/rust.ungram b/crates/syntax/rust.ungram index caf92aca87..768cf2013d 100644 --- a/crates/syntax/rust.ungram +++ b/crates/syntax/rust.ungram @@ -328,6 +328,7 @@ VariantDef = Const = Attr* Visibility? 'default'? + 'type'? 'const' (Name | '_') GenericParamList? ':' Type ('=' body:Expr)? WhereClause? ';' diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index 69fd703c03..9a2bba9ebf 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -484,6 +484,8 @@ impl Const { pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) } #[inline] pub fn default_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![default]) } + #[inline] + pub fn type_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![type]) } } pub struct ConstArg { pub(crate) syntax: SyntaxNode, |