1
+ use std:: collections:: HashMap ;
2
+
1
3
use itertools:: Itertools ;
4
+ use lazy_static:: lazy_static;
2
5
use proc_macro2:: TokenStream ;
3
6
use quote:: quote;
4
7
use syn:: { parse_quote, Attribute , Variant } ;
@@ -12,6 +15,23 @@ use super::generated_header;
12
15
13
16
pub struct ImplGetSpanGenerator ;
14
17
18
+ const EDGE_CASES : [ & str ; 1 ] = [ "BindingPattern" ] ;
19
+
20
+ fn edge_case ( it : & std:: cell:: Ref < RType > ) -> bool {
21
+ !it. ident ( ) . is_some_and ( |it| EDGE_CASES . contains ( & it. to_string ( ) . as_str ( ) ) )
22
+ }
23
+
24
+ fn edge_case_impls ( ) -> TokenStream {
25
+ quote ! {
26
+ endl!( ) ;
27
+ impl <' a> GetSpan for BindingPattern <' a> {
28
+ fn span( & self ) -> Span {
29
+ self . kind. span( )
30
+ }
31
+ }
32
+ }
33
+ }
34
+
15
35
impl Generator for ImplGetSpanGenerator {
16
36
fn name ( & self ) -> & ' static str {
17
37
"ImplGetSpanGenerator"
@@ -21,14 +41,19 @@ impl Generator for ImplGetSpanGenerator {
21
41
let impls: Vec < TokenStream > = ctx
22
42
. ty_table
23
43
. iter ( )
24
- . filter ( |it| it. borrow ( ) . visitable ( ) )
25
- . filter_map ( |maybe_kind| match & * maybe_kind. borrow ( ) {
26
- RType :: Enum ( it) => Some ( impl_enum ( it) ) ,
27
- RType :: Struct ( it) => Some ( impl_struct ( it) ) ,
28
- _ => None ,
44
+ . map ( |it| it. borrow ( ) )
45
+ . filter ( |it| it. visitable ( ) )
46
+ . filter ( |it| matches ! ( & * * it, RType :: Enum ( _) | RType :: Struct ( _) ) )
47
+ . filter ( edge_case)
48
+ . map ( |kind| match & * kind {
49
+ RType :: Enum ( it) => impl_enum ( it) ,
50
+ RType :: Struct ( it) => impl_struct ( it) ,
51
+ _ => unreachable ! ( "already filtered out!" ) ,
29
52
} )
30
53
. collect ( ) ;
31
54
55
+ let edge_impls = edge_case_impls ( ) ;
56
+
32
57
let header = generated_header ! ( ) ;
33
58
34
59
GeneratorOutput :: One ( quote ! {
@@ -40,6 +65,9 @@ impl Generator for ImplGetSpanGenerator {
40
65
use oxc_span:: { GetSpan , Span } ;
41
66
42
67
#( #impls) *
68
+
69
+ #edge_impls
70
+
43
71
} )
44
72
}
45
73
}
0 commit comments