@@ -3,7 +3,7 @@ use std::{fs, path::PathBuf};
3
3
4
4
pub mod codegen;
5
5
mod flags;
6
- use codegen:: grammar:: ast_src:: { AstNodeSrc , AstSrc } ;
6
+ use codegen:: grammar:: ast_src:: { AstNodeSrc , AstSrc , Field } ;
7
7
use std:: collections:: { BTreeMap , BTreeSet } ;
8
8
use std:: env;
9
9
use ungrammar:: Grammar ;
@@ -94,7 +94,13 @@ fn write_schema(
94
94
}
95
95
96
96
empty = false ;
97
- if field. tp == "string" {
97
+ if field. tp == "predicate" {
98
+ writeln ! (
99
+ buf,
100
+ " {}: predicate" ,
101
+ property_name( & node. name, & field. name) ,
102
+ ) ?;
103
+ } else if field. tp == "string" {
98
104
writeln ! (
99
105
buf,
100
106
" {}: optional[string]" ,
@@ -131,6 +137,21 @@ struct FieldInfo {
131
137
}
132
138
fn get_fields ( node : & AstNodeSrc ) -> Vec < FieldInfo > {
133
139
let mut result = Vec :: new ( ) ;
140
+ let predicates = [
141
+ "async" , "auto" , "const" , "default" , "gen" , "move" , "mut" , "raw" , "ref" , "static" , "try" ,
142
+ "unsafe" ,
143
+ ] ;
144
+ for field in & node. fields {
145
+ if let Field :: Token ( name) = field {
146
+ if predicates. contains ( & name. as_str ( ) ) {
147
+ result. push ( FieldInfo {
148
+ name : format ! ( "is_{name}" ) ,
149
+ tp : "predicate" . to_string ( ) ,
150
+ is_many : false ,
151
+ } ) ;
152
+ }
153
+ }
154
+ }
134
155
135
156
match node. name . as_str ( ) {
136
157
"Name" | "NameRef" | "Lifetime" => {
@@ -480,7 +501,14 @@ impl Translator {{
480
501
let type_name = & field. tp ;
481
502
let struct_field_name = & field. name ;
482
503
let class_field_name = property_name ( & node. name , & field. name ) ;
483
- if field. tp == "string" {
504
+ if field. tp == "predicate" {
505
+ writeln ! (
506
+ buf,
507
+ " let {} = node.{}_token().is_some();" ,
508
+ class_field_name,
509
+ & struct_field_name[ 3 ..] ,
510
+ ) ?;
511
+ } else if field. tp == "string" {
484
512
writeln ! (
485
513
buf,
486
514
" let {} = node.try_get_text();" ,
0 commit comments