@@ -474,10 +474,10 @@ use ra_ap_syntax::ast::{{
474
474
use ra_ap_syntax::{{ast, AstNode}};
475
475
476
476
impl 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> > {{
478
478
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 ),
481
481
}}
482
482
}}\n "
483
483
) ?;
@@ -487,7 +487,7 @@ impl Translator<'_> {{
487
487
488
488
writeln ! (
489
489
buf,
490
- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
490
+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
491
491
to_lower_snake_case( type_name) ,
492
492
type_name,
493
493
class_name
@@ -496,7 +496,7 @@ impl Translator<'_> {{
496
496
for variant in & node. variants {
497
497
writeln ! (
498
498
buf,
499
- " ast::{}::{}(inner) => self.emit_{}(inner).into( )," ,
499
+ " ast::{}::{}(inner) => self.emit_{}(inner).map(Into::into )," ,
500
500
type_name,
501
501
variant,
502
502
to_lower_snake_case( variant)
@@ -512,7 +512,7 @@ impl Translator<'_> {{
512
512
513
513
writeln ! (
514
514
buf,
515
- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
515
+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
516
516
to_lower_snake_case( type_name) ,
517
517
type_name,
518
518
class_name
@@ -522,6 +522,15 @@ impl Translator<'_> {{
522
522
continue ;
523
523
}
524
524
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
+
525
534
let type_name = & field. tp ;
526
535
let struct_field_name = & field. name ;
527
536
let class_field_name = property_name ( & node. name , & field. name ) ;
@@ -541,15 +550,15 @@ impl Translator<'_> {{
541
550
} else if field. is_many {
542
551
writeln ! (
543
552
buf,
544
- " let {} = node.{}().map (|x| self.emit_{}(x)).collect();" ,
553
+ " let {} = node.{}().filter_map (|x| self.emit_{}(x)).collect();" ,
545
554
class_field_name,
546
555
struct_field_name,
547
556
to_lower_snake_case( type_name)
548
557
) ?;
549
558
} else {
550
559
writeln ! (
551
560
buf,
552
- " let {} = node.{}().map (|x| self.emit_{}(x));" ,
561
+ " let {} = node.{}().and_then (|x| self.emit_{}(x));" ,
553
562
class_field_name,
554
563
struct_field_name,
555
564
to_lower_snake_case( type_name)
@@ -581,7 +590,7 @@ impl Translator<'_> {{
581
590
buf,
582
591
" self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens());"
583
592
) ?;
584
- writeln ! ( buf, " label" ) ?;
593
+ writeln ! ( buf, " Some( label) " ) ?;
585
594
586
595
writeln ! ( buf, " }}\n " ) ?;
587
596
}
0 commit comments