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