| //! 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(), |
| } |
| } |
| } |