use std::sync::Arc; use { SyntaxNode, SyntaxRoot, TreeRoot, AstNode, SyntaxKind::*, }; #[derive(Debug, Clone, Copy)] pub struct ConstItem> { syntax: SyntaxNode, } impl AstNode for ConstItem { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { CONST_ITEM => Some(ConstItem { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ConstItem { pub fn name(&self) -> Option> { self.syntax() .children() .filter_map(Name::cast) .next() } } #[derive(Debug, Clone, Copy)] pub struct Enum> { syntax: SyntaxNode, } impl AstNode for Enum { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { ENUM => Some(Enum { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl Enum { pub fn name(&self) -> Option> { self.syntax() .children() .filter_map(Name::cast) .next() } } #[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 Module> { syntax: SyntaxNode, } impl AstNode for Module { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { MODULE => Some(Module { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl Module { 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 {} #[derive(Debug, Clone, Copy)] pub struct StaticItem> { syntax: SyntaxNode, } impl AstNode for StaticItem { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { STATIC_ITEM => Some(StaticItem { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl StaticItem { pub fn name(&self) -> Option> { self.syntax() .children() .filter_map(Name::cast) .next() } } #[derive(Debug, Clone, Copy)] pub struct Struct> { syntax: SyntaxNode, } impl AstNode for Struct { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { STRUCT => Some(Struct { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl Struct { pub fn name(&self) -> Option> { self.syntax() .children() .filter_map(Name::cast) .next() } } #[derive(Debug, Clone, Copy)] pub struct Trait> { syntax: SyntaxNode, } impl AstNode for Trait { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { TRAIT => Some(Trait { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl Trait { pub fn name(&self) -> Option> { self.syntax() .children() .filter_map(Name::cast) .next() } }