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 } } impl File { pub fn functions<'a>(&'a self) -> impl Iterator> + 'a { self.syntax() .children() .filter_map(Function::cast) } } #[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 } } impl Function { pub fn name(&self) -> Option> { self.syntax() .children() .filter_map(Name::cast) .next() } } #[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 } } impl Name {}