@@ -65,6 +65,9 @@ pub fn syntax_kind_mod() -> proc_macro2::TokenStream {
65
65
66
66
let mut enum_variants: Vec < TokenStream > = Vec :: new ( ) ;
67
67
let mut from_kw_match_arms: Vec < TokenStream > = Vec :: new ( ) ;
68
+ let mut is_kw_match_arms: Vec < TokenStream > = Vec :: new ( ) ;
69
+
70
+ let mut is_trivia_match_arms: Vec < TokenStream > = Vec :: new ( ) ;
68
71
69
72
// collect keywords
70
73
for kw in & all_keywords {
@@ -78,18 +81,30 @@ pub fn syntax_kind_mod() -> proc_macro2::TokenStream {
78
81
from_kw_match_arms. push ( quote ! {
79
82
#kw => Some ( SyntaxKind :: #kind_ident)
80
83
} ) ;
84
+ is_kw_match_arms. push ( quote ! {
85
+ SyntaxKind :: #kind_ident => true
86
+ } ) ;
81
87
}
82
88
83
89
// collect extra keywords
84
90
EXTRA . iter ( ) . for_each ( |& name| {
85
91
let variant_name = format_ident ! ( "{}" , name) ;
86
92
enum_variants. push ( quote ! { #variant_name } ) ;
93
+
94
+ if name == "COMMENT" {
95
+ is_trivia_match_arms. push ( quote ! {
96
+ SyntaxKind :: #variant_name => true
97
+ } ) ;
98
+ }
87
99
} ) ;
88
100
89
101
// collect whitespace variants
90
102
WHITESPACE . iter ( ) . for_each ( |& name| {
91
103
let variant_name = format_ident ! ( "{}" , name) ;
92
104
enum_variants. push ( quote ! { #variant_name } ) ;
105
+ is_trivia_match_arms. push ( quote ! {
106
+ SyntaxKind :: #variant_name => true
107
+ } ) ;
93
108
} ) ;
94
109
95
110
// collect punctuations
@@ -119,6 +134,20 @@ pub fn syntax_kind_mod() -> proc_macro2::TokenStream {
119
134
_ => None
120
135
}
121
136
}
137
+
138
+ pub fn is_keyword( & self ) -> bool {
139
+ match self {
140
+ #( #is_kw_match_arms) , * ,
141
+ _ => false
142
+ }
143
+ }
144
+
145
+ pub fn is_trivia( & self ) -> bool {
146
+ match self {
147
+ #( #is_trivia_match_arms) , * ,
148
+ _ => false
149
+ }
150
+ }
122
151
}
123
152
}
124
153
}
0 commit comments