@@ -4,6 +4,7 @@ use std::{fs, path::PathBuf};
44pub mod codegen;
55mod flags;
66use codegen:: grammar:: ast_src:: { AstNodeSrc , AstSrc , Field } ;
7+ use itertools:: Itertools ;
78use std:: collections:: { BTreeMap , BTreeSet } ;
89use std:: env;
910use ungrammar:: Grammar ;
@@ -475,10 +476,10 @@ use ra_ap_syntax::ast::{{
475476use ra_ap_syntax::{{ast, AstNode}};
476477
477478impl Translator<'_> {{
478- fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Label<generated::Expr> {{
479+ fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Option< Label<generated::Expr> > {{
479480 match node {{
480- ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).into( ),
481- ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).into( ),
481+ ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into ),
482+ ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).map(Into::into ),
482483 }}
483484 }}\n "
484485 ) ?;
@@ -488,7 +489,7 @@ impl Translator<'_> {{
488489
489490 writeln ! (
490491 buf,
491- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
492+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
492493 to_lower_snake_case( type_name) ,
493494 type_name,
494495 class_name
@@ -497,7 +498,7 @@ impl Translator<'_> {{
497498 for variant in & node. variants {
498499 writeln ! (
499500 buf,
500- " ast::{}::{}(inner) => self.emit_{}(inner).into( )," ,
501+ " ast::{}::{}(inner) => self.emit_{}(inner).map(Into::into )," ,
501502 type_name,
502503 variant,
503504 to_lower_snake_case( variant)
@@ -513,7 +514,7 @@ impl Translator<'_> {{
513514
514515 writeln ! (
515516 buf,
516- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
517+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
517518 to_lower_snake_case( type_name) ,
518519 type_name,
519520 class_name
@@ -523,6 +524,15 @@ impl Translator<'_> {{
523524 continue ;
524525 }
525526
527+ if field. name == "attrs" {
528+ // special case: this means the node type implements `HasAttrs`, and we want to
529+ // check whether it was not excluded by a `cfg` attribute
530+ writeln ! (
531+ buf,
532+ " if self.should_be_excluded(&node) {{ return None; }}"
533+ ) ?;
534+ }
535+
526536 let type_name = & field. tp ;
527537 let struct_field_name = & field. name ;
528538 let class_field_name = property_name ( & node. name , & field. name ) ;
@@ -542,15 +552,15 @@ impl Translator<'_> {{
542552 } else if field. is_many {
543553 writeln ! (
544554 buf,
545- " let {} = node.{}().map (|x| self.emit_{}(x)).collect();" ,
555+ " let {} = node.{}().filter_map (|x| self.emit_{}(x)).collect();" ,
546556 class_field_name,
547557 struct_field_name,
548558 to_lower_snake_case( type_name)
549559 ) ?;
550560 } else {
551561 writeln ! (
552562 buf,
553- " let {} = node.{}().map (|x| self.emit_{}(x));" ,
563+ " let {} = node.{}().and_then (|x| self.emit_{}(x));" ,
554564 class_field_name,
555565 struct_field_name,
556566 to_lower_snake_case( type_name)
@@ -582,7 +592,7 @@ impl Translator<'_> {{
582592 buf,
583593 " self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens());"
584594 ) ?;
585- writeln ! ( buf, " label" ) ?;
595+ writeln ! ( buf, " Some( label) " ) ?;
586596
587597 writeln ! ( buf, " }}\n " ) ?;
588598 }
0 commit comments