@@ -4,6 +4,7 @@ use std::{fs, path::PathBuf};
4
4
pub mod codegen;
5
5
mod flags;
6
6
use codegen:: grammar:: ast_src:: { AstNodeSrc , AstSrc , Field } ;
7
+ use itertools:: Itertools ;
7
8
use std:: collections:: { BTreeMap , BTreeSet } ;
8
9
use std:: env;
9
10
use ungrammar:: Grammar ;
@@ -475,10 +476,10 @@ use ra_ap_syntax::ast::{{
475
476
use ra_ap_syntax::{{ast, AstNode}};
476
477
477
478
impl 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> > {{
479
480
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 ),
482
483
}}
483
484
}}\n "
484
485
) ?;
@@ -488,7 +489,7 @@ impl Translator<'_> {{
488
489
489
490
writeln ! (
490
491
buf,
491
- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
492
+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
492
493
to_lower_snake_case( type_name) ,
493
494
type_name,
494
495
class_name
@@ -497,7 +498,7 @@ impl Translator<'_> {{
497
498
for variant in & node. variants {
498
499
writeln ! (
499
500
buf,
500
- " ast::{}::{}(inner) => self.emit_{}(inner).into( )," ,
501
+ " ast::{}::{}(inner) => self.emit_{}(inner).map(Into::into )," ,
501
502
type_name,
502
503
variant,
503
504
to_lower_snake_case( variant)
@@ -513,7 +514,7 @@ impl Translator<'_> {{
513
514
514
515
writeln ! (
515
516
buf,
516
- " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label<generated::{}> {{" ,
517
+ " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option< Label<generated::{}> > {{" ,
517
518
to_lower_snake_case( type_name) ,
518
519
type_name,
519
520
class_name
@@ -523,6 +524,15 @@ impl Translator<'_> {{
523
524
continue ;
524
525
}
525
526
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
+
526
536
let type_name = & field. tp ;
527
537
let struct_field_name = & field. name ;
528
538
let class_field_name = property_name ( & node. name , & field. name ) ;
@@ -542,15 +552,15 @@ impl Translator<'_> {{
542
552
} else if field. is_many {
543
553
writeln ! (
544
554
buf,
545
- " let {} = node.{}().map (|x| self.emit_{}(x)).collect();" ,
555
+ " let {} = node.{}().filter_map (|x| self.emit_{}(x)).collect();" ,
546
556
class_field_name,
547
557
struct_field_name,
548
558
to_lower_snake_case( type_name)
549
559
) ?;
550
560
} else {
551
561
writeln ! (
552
562
buf,
553
- " let {} = node.{}().map (|x| self.emit_{}(x));" ,
563
+ " let {} = node.{}().and_then (|x| self.emit_{}(x));" ,
554
564
class_field_name,
555
565
struct_field_name,
556
566
to_lower_snake_case( type_name)
@@ -582,7 +592,7 @@ impl Translator<'_> {{
582
592
buf,
583
593
" self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens());"
584
594
) ?;
585
- writeln ! ( buf, " label" ) ?;
595
+ writeln ! ( buf, " Some( label) " ) ?;
586
596
587
597
writeln ! ( buf, " }}\n " ) ?;
588
598
}
0 commit comments