diff options
Diffstat (limited to 'src/tools/rust-analyzer/crates/parser/src/grammar/items/consts.rs')
-rw-r--r-- | src/tools/rust-analyzer/crates/parser/src/grammar/items/consts.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/parser/src/grammar/items/consts.rs b/src/tools/rust-analyzer/crates/parser/src/grammar/items/consts.rs new file mode 100644 index 000000000..9549ec9b4 --- /dev/null +++ b/src/tools/rust-analyzer/crates/parser/src/grammar/items/consts.rs @@ -0,0 +1,37 @@ +use super::*; + +// test const_item +// const C: u32 = 92; +pub(super) fn konst(p: &mut Parser<'_>, m: Marker) { + p.bump(T![const]); + const_or_static(p, m, true); +} + +pub(super) fn static_(p: &mut Parser<'_>, m: Marker) { + p.bump(T![static]); + const_or_static(p, m, false); +} + +fn const_or_static(p: &mut Parser<'_>, m: Marker, is_const: bool) { + p.eat(T![mut]); + + if is_const && p.eat(T![_]) { + // test anonymous_const + // const _: u32 = 0; + } else { + // test_err anonymous_static + // static _: i32 = 5; + name(p); + } + + if p.at(T![:]) { + types::ascription(p); + } else { + p.error("missing type for `const` or `static`"); + } + if p.eat(T![=]) { + expressions::expr(p); + } + p.expect(T![;]); + m.complete(p, if is_const { CONST } else { STATIC }); +} |