summaryrefslogtreecommitdiffstats
path: root/src/tools/rust-analyzer/crates/syntax/src/ast/generated.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/rust-analyzer/crates/syntax/src/ast/generated.rs')
-rw-r--r--src/tools/rust-analyzer/crates/syntax/src/ast/generated.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/syntax/src/ast/generated.rs b/src/tools/rust-analyzer/crates/syntax/src/ast/generated.rs
new file mode 100644
index 000000000..843b43cf0
--- /dev/null
+++ b/src/tools/rust-analyzer/crates/syntax/src/ast/generated.rs
@@ -0,0 +1,41 @@
+//! This file is actually hand-written, but the submodules are indeed generated.
+#[rustfmt::skip]
+pub(crate) mod nodes;
+#[rustfmt::skip]
+pub(crate) mod tokens;
+
+use crate::{
+ AstNode,
+ SyntaxKind::{self, *},
+ SyntaxNode,
+};
+
+pub(crate) use nodes::*;
+
+// Stmt is the only nested enum, so it's easier to just hand-write it
+impl AstNode for Stmt {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ LET_STMT | EXPR_STMT => true,
+ _ => Item::can_cast(kind),
+ }
+ }
+ fn cast(syntax: SyntaxNode) -> Option<Self> {
+ let res = match syntax.kind() {
+ LET_STMT => Stmt::LetStmt(LetStmt { syntax }),
+ EXPR_STMT => Stmt::ExprStmt(ExprStmt { syntax }),
+ _ => {
+ let item = Item::cast(syntax)?;
+ Stmt::Item(item)
+ }
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxNode {
+ match self {
+ Stmt::LetStmt(it) => &it.syntax,
+ Stmt::ExprStmt(it) => &it.syntax,
+ Stmt::Item(it) => it.syntax(),
+ }
+ }
+}