@@ -3,7 +3,7 @@ use std::{fs, path::PathBuf};
33
44pub mod codegen;
55mod flags;
6- use codegen:: grammar:: ast_src:: { AstNodeSrc , AstSrc } ;
6+ use codegen:: grammar:: ast_src:: { AstNodeSrc , AstSrc , Field } ;
77use std:: collections:: { BTreeMap , BTreeSet } ;
88use std:: env;
99use ungrammar:: Grammar ;
@@ -94,7 +94,13 @@ fn write_schema(
9494 }
9595
9696 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" {
98104 writeln ! (
99105 buf,
100106 " {}: optional[string]" ,
@@ -131,6 +137,21 @@ struct FieldInfo {
131137}
132138fn get_fields ( node : & AstNodeSrc ) -> Vec < FieldInfo > {
133139 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+ }
134155
135156 match node. name . as_str ( ) {
136157 "Name" | "NameRef" | "Lifetime" => {
@@ -480,7 +501,14 @@ impl Translator {{
480501 let type_name = & field. tp ;
481502 let struct_field_name = & field. name ;
482503 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" {
484512 writeln ! (
485513 buf,
486514 " let {} = node.try_get_text();" ,
0 commit comments