@@ -474,10 +474,10 @@ use ra_ap_syntax::ast::{{
474474use ra_ap_syntax::{{ast, AstNode}};
475475
476476impl Translator<'_> {{
477- fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Label<generated::Expr> {{
477+ fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Option< Label<generated::Expr> > {{
478478 match node {{
479- ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).into( ),
480- ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).into( ),
479+ ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into ),
480+ ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).map(Into::into ),
481481 }}
482482 }}\n "
483483 ) ?;
@@ -487,7 +487,7 @@ impl Translator<'_> {{
487487
488488 writeln ! (
489489 buf,
490- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
490+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
491491 to_lower_snake_case( type_name) ,
492492 type_name,
493493 class_name
@@ -496,7 +496,7 @@ impl Translator<'_> {{
496496 for variant in & node. variants {
497497 writeln ! (
498498 buf,
499- " ast::{}::{}(inner) => self.emit_{}(inner).into( )," ,
499+ " ast::{}::{}(inner) => self.emit_{}(inner).map(Into::into )," ,
500500 type_name,
501501 variant,
502502 to_lower_snake_case( variant)
@@ -512,7 +512,7 @@ impl Translator<'_> {{
512512
513513 writeln ! (
514514 buf,
515- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
515+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
516516 to_lower_snake_case( type_name) ,
517517 type_name,
518518 class_name
@@ -522,6 +522,15 @@ impl Translator<'_> {{
522522 continue ;
523523 }
524524
525+ if field. name == "attrs" {
526+ // special case: this means the node type implements `HasAttrs`, and we want to
527+ // check whether it was not excluded by a `cfg` attribute
528+ writeln ! (
529+ buf,
530+ " if self.should_be_excluded(&node) {{ return None; }}"
531+ ) ?;
532+ }
533+
525534 let type_name = & field. tp ;
526535 let struct_field_name = & field. name ;
527536 let class_field_name = property_name ( & node. name , & field. name ) ;
@@ -541,15 +550,15 @@ impl Translator<'_> {{
541550 } else if field. is_many {
542551 writeln ! (
543552 buf,
544- " let {} = node.{}().map (|x| self.emit_{}(x)).collect();" ,
553+ " let {} = node.{}().filter_map (|x| self.emit_{}(x)).collect();" ,
545554 class_field_name,
546555 struct_field_name,
547556 to_lower_snake_case( type_name)
548557 ) ?;
549558 } else {
550559 writeln ! (
551560 buf,
552- " let {} = node.{}().map (|x| self.emit_{}(x));" ,
561+ " let {} = node.{}().and_then (|x| self.emit_{}(x));" ,
553562 class_field_name,
554563 struct_field_name,
555564 to_lower_snake_case( type_name)
@@ -581,7 +590,7 @@ impl Translator<'_> {{
581590 buf,
582591 " self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens());"
583592 ) ?;
584- writeln ! ( buf, " label" ) ?;
593+ writeln ! ( buf, " Some( label) " ) ?;
585594
586595 writeln ! ( buf, " }}\n " ) ?;
587596 }
0 commit comments