Unnamed repository; edit this file 'description' to name the repository.
parse `type const` items
Adds parser support for the unstable `type const` syntax from the `min_generic_const_args` feature, e.g. `type const FOO: i32 = 2;`. Closes rust-lang/rust-analyzer#22038. Assisted-by: Claude Opus 4.6 (1M context) <[email protected]>
ypp 6 weeks ago
parent 17d028e · commit b4f32b4
-rw-r--r--crates/parser/src/grammar/items.rs4
-rw-r--r--crates/parser/src/grammar/items/consts.rs1
-rw-r--r--crates/parser/test_data/generated/runner.rs2
-rw-r--r--crates/parser/test_data/parser/inline/ok/type_const.rast22
-rw-r--r--crates/parser/test_data/parser/inline/ok/type_const.rs1
-rw-r--r--crates/syntax/rust.ungram1
-rw-r--r--crates/syntax/src/ast/generated/nodes.rs2
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,