use std::sync::Arc; use { SyntaxNode, SyntaxRoot, TreeRoot, AstNode, SyntaxKind::*, }; #[derive(Debug, Clone, Copy)] pub struct File> { syntax: SyntaxNode, } impl AstNode for File { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { FILE => Some(File { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } #[derive(Debug, Clone, Copy)] pub struct Function> { syntax: SyntaxNode, } impl AstNode for Function { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { FUNCTION => Some(Function { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } #[derive(Debug, Clone, Copy)] pub struct Name> { syntax: SyntaxNode, } impl AstNode for Name { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { NAME => Some(Name { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } }