From 689661c95968cb438f8bd1f10ce0ee096287741b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 9 Apr 2020 13:00:09 +0200 Subject: Scale back to only two traits --- xtask/src/ast_src.rs | 8 ---- xtask/src/codegen/gen_syntax.rs | 87 +++++++++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 37 deletions(-) (limited to 'xtask') diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs index 3200acc86..5fed777ac 100644 --- a/xtask/src/ast_src.rs +++ b/xtask/src/ast_src.rs @@ -549,7 +549,6 @@ pub(crate) const AST_SRC: AstSrc = AstSrc { struct Block: AttrsOwner, ModuleItemOwner { LCurly, statements: [Stmt], - statements_or_semi: [StmtOrSemi], Expr, RCurly, } @@ -749,12 +748,10 @@ pub(crate) const AST_SRC: AstSrc = AstSrc { enum AttrInput { Literal, TokenTree } enum Stmt { - ModuleItem, LetStmt, ExprStmt, // macro calls are parsed as expression statements */ } - enum StmtOrSemi {Stmt, Semi} enum LeftDelimiter { LParen, LBrack, LCurly } enum RightDelimiter { RParen, RBrack, RCurly } @@ -825,10 +822,5 @@ pub(crate) const AST_SRC: AstSrc = AstSrc { RecordFieldDefList, TupleFieldDefList, } - - enum AttrOrComment { - Attr, - Comment - } }, }; diff --git a/xtask/src/codegen/gen_syntax.rs b/xtask/src/codegen/gen_syntax.rs index 2dfb68371..6dae93aa2 100644 --- a/xtask/src/codegen/gen_syntax.rs +++ b/xtask/src/codegen/gen_syntax.rs @@ -146,14 +146,23 @@ fn generate_ast(kinds: KindsSrc<'_>, grammar: AstSrc<'_>) -> Result { FieldSrc::Many(_) => { quote! { pub fn #method_name(&self) -> AstChildren<#ty> { - AstChildren::new(&self.syntax) + support::children(&self.syntax) } } } FieldSrc::Optional(_) | FieldSrc::Shorthand => { - quote! { - pub fn #method_name(&self) -> Option<#ty> { - AstChildren::new(&self.syntax).next() + let is_token = element_kinds_map[&ty.to_string()].has_tokens; + if is_token { + quote! { + pub fn #method_name(&self) -> Option<#ty> { + support::token(&self.syntax) + } + } + } else { + quote! { + pub fn #method_name(&self) -> Option<#ty> { + support::child(&self.syntax) + } } } } @@ -205,6 +214,48 @@ fn generate_ast(kinds: KindsSrc<'_>, grammar: AstSrc<'_>) -> Result { quote!(impl ast::#trait_name for #name {}) }); + let element_kinds = &element_kinds_map[&en.name.to_string()]; + assert!( + element_kinds.has_nodes ^ element_kinds.has_tokens, + "{}: {:#?}", + name, + element_kinds + ); + let specific_ast_trait = { + let (ast_trait, syntax_type) = if element_kinds.has_tokens { + (quote!(AstToken), quote!(SyntaxToken)) + } else { + (quote!(AstNode), quote!(SyntaxNode)) + }; + + quote! { + impl #ast_trait for #name { + fn can_cast(kind: SyntaxKind) -> bool { + match kind { + #(#kinds)|* => true, + _ => false, + } + } + fn cast(syntax: #syntax_type) -> Option { + let res = match syntax.kind() { + #( + #kinds => #name::#variants(#variants { syntax }), + )* + _ => return None, + }; + Some(res) + } + fn syntax(&self) -> &#syntax_type { + match self { + #( + #name::#variants(it) => &it.syntax, + )* + } + } + } + } + }; + quote! { #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum #name { @@ -225,30 +276,8 @@ fn generate_ast(kinds: KindsSrc<'_>, grammar: AstSrc<'_>) -> Result { } } - impl AstNode for #name { - fn can_cast(kind: SyntaxKind) -> bool { - match kind { - #(#kinds)|* => true, - _ => false, - } - } - fn cast(syntax: SyntaxNode) -> Option { - let res = match syntax.kind() { - #( - #kinds => #name::#variants(#variants { syntax }), - )* - _ => return None, - }; - Some(res) - } - fn syntax(&self) -> &SyntaxNode { - match self { - #( - #name::#variants(it) => &it.syntax, - )* - } - } - } + #specific_ast_trait + #(#traits)* } }); @@ -268,7 +297,7 @@ fn generate_ast(kinds: KindsSrc<'_>, grammar: AstSrc<'_>) -> Result { #[allow(unused_imports)] use crate::{ SyntaxNode, SyntaxToken, SyntaxElement, NodeOrToken, SyntaxKind::{self, *}, - ast::{self, AstNode, AstToken, AstChildren}, + ast::{self, AstNode, AstToken, AstChildren, support}, }; #(#tokens)* -- cgit v1.2.3