use std::sync::Arc; use { ast, SyntaxNode, SyntaxRoot, TreeRoot, AstNode, SyntaxKind::*, }; // ConstDef #[derive(Debug, Clone, Copy)] pub struct ConstDef> { syntax: SyntaxNode, } impl AstNode for ConstDef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { CONST_DEF => Some(ConstDef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::NameOwner for ConstDef {} impl ConstDef {} // EnumDef #[derive(Debug, Clone, Copy)] pub struct EnumDef> { syntax: SyntaxNode, } impl AstNode for EnumDef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { ENUM_DEF => Some(EnumDef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::NameOwner for EnumDef {} impl EnumDef {} // File #[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(FnDef::cast) } } // FnDef #[derive(Debug, Clone, Copy)] pub struct FnDef> { syntax: SyntaxNode, } impl AstNode for FnDef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { FN_DEF => Some(FnDef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::NameOwner for FnDef {} impl FnDef {} // Module #[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 ast::NameOwner for Module {} impl Module {} // Name #[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 {} // NameRef #[derive(Debug, Clone, Copy)] pub struct NameRef> { syntax: SyntaxNode, } impl AstNode for NameRef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { NAME_REF => Some(NameRef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl NameRef {} // StaticDef #[derive(Debug, Clone, Copy)] pub struct StaticDef> { syntax: SyntaxNode, } impl AstNode for StaticDef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { STATIC_DEF => Some(StaticDef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::NameOwner for StaticDef {} impl StaticDef {} // StructDef #[derive(Debug, Clone, Copy)] pub struct StructDef> { syntax: SyntaxNode, } impl AstNode for StructDef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { STRUCT_DEF => Some(StructDef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::NameOwner for StructDef {} impl StructDef {} // TraitDef #[derive(Debug, Clone, Copy)] pub struct TraitDef> { syntax: SyntaxNode, } impl AstNode for TraitDef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { TRAIT_DEF => Some(TraitDef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::NameOwner for TraitDef {} impl TraitDef {} // TypeDef #[derive(Debug, Clone, Copy)] pub struct TypeDef> { syntax: SyntaxNode, } impl AstNode for TypeDef { fn cast(syntax: SyntaxNode) -> Option { match syntax.kind() { TYPE_DEF => Some(TypeDef { syntax }), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::NameOwner for TypeDef {} impl TypeDef {}