@@ -108,6 +108,7 @@ enum RustAdt {
108
108
trait RuleWithFieldsMethods < Pat > {
109
109
fn rust_fields ( self , cx : & Context < Pat > ) -> RustFields ;
110
110
fn rust_adt ( self , cx : & Context < Pat > ) -> RustAdt ;
111
+ fn traverse_shape ( self , cx : & Context < Pat > , rust_fields : & RustFields ) -> Src ;
111
112
}
112
113
113
114
impl < Pat : RustInputPat > RuleWithFieldsMethods < Pat > for RuleWithFields {
@@ -224,6 +225,48 @@ impl<Pat: RustInputPat> RuleWithFieldsMethods<Pat> for RuleWithFields {
224
225
225
226
RustAdt :: Struct ( self . rust_fields ( cx) )
226
227
}
228
+
229
+ fn traverse_shape ( self , cx : & Context < Pat > , rust_fields : & RustFields ) -> Src {
230
+ let children = match & cx[ self . fields ] {
231
+ Fields :: Leaf ( None ) => return quote ! ( _) ,
232
+ Fields :: Leaf ( Some ( field) ) => {
233
+ let ( i, _, _) = rust_fields. get_full ( & field. name ) . unwrap ( ) ;
234
+ return quote ! ( #i) ;
235
+ }
236
+ Fields :: Aggregate ( children) => children,
237
+ } ;
238
+ let child = |rule, i| RuleWithFields {
239
+ rule,
240
+ fields : children
241
+ . get ( i)
242
+ . cloned ( )
243
+ . unwrap_or_else ( || cx. intern ( Fields :: Leaf ( None ) ) ) ,
244
+ } ;
245
+
246
+ match cx[ self . rule ] {
247
+ Rule :: Empty
248
+ | Rule :: Eat ( _)
249
+ | Rule :: Call ( _)
250
+ | Rule :: RepeatMany ( ..)
251
+ | Rule :: RepeatMore ( ..) => unreachable ! ( ) ,
252
+ Rule :: Concat ( [ left, right] ) => {
253
+ let left = child ( left, 0 ) . traverse_shape ( cx, rust_fields) ;
254
+ let right = child ( right, 1 ) . traverse_shape ( cx, rust_fields) ;
255
+ quote ! ( ( #left #right) )
256
+ }
257
+ Rule :: Or ( ref cases) => {
258
+ let cases_shape = cases
259
+ . iter ( )
260
+ . enumerate ( )
261
+ . map ( |( i, & rule) | child ( rule, i) . traverse_shape ( cx, rust_fields) ) ;
262
+ quote ! ( { _ @ #( #cases_shape) * } )
263
+ }
264
+ Rule :: Opt ( rule) => {
265
+ let shape = child ( rule, 0 ) . traverse_shape ( cx, rust_fields) ;
266
+ quote ! ( [ #shape] )
267
+ }
268
+ }
269
+ }
227
270
}
228
271
229
272
trait RuleMethods < Pat > : Sized {
@@ -848,70 +891,6 @@ impl<Pat: RustInputPat> RuleGenerateMethods<Pat> for IRule {
848
891
}
849
892
}
850
893
851
- trait RuleWithFieldsGenerateMethods < Pat > {
852
- fn generate_traverse_shape (
853
- self ,
854
- cx : & Context < Pat > ,
855
- rules : & mut RuleMap < ' _ > ,
856
- rust_fields : & RustFields ,
857
- ) -> Src ;
858
- }
859
-
860
- impl < Pat : RustInputPat > RuleWithFieldsGenerateMethods < Pat > for RuleWithFields {
861
- fn generate_traverse_shape (
862
- self ,
863
- cx : & Context < Pat > ,
864
- rules : & mut RuleMap < ' _ > ,
865
- rust_fields : & RustFields ,
866
- ) -> Src {
867
- let children = match & cx[ self . fields ] {
868
- Fields :: Leaf ( None ) => return quote ! ( _) ,
869
- Fields :: Leaf ( Some ( field) ) => {
870
- let ( i, _, _) = rust_fields. get_full ( & field. name ) . unwrap ( ) ;
871
- return quote ! ( #i) ;
872
- }
873
- Fields :: Aggregate ( children) => children,
874
- } ;
875
- let child = |rule, i| RuleWithFields {
876
- rule,
877
- fields : children
878
- . get ( i)
879
- . cloned ( )
880
- . unwrap_or_else ( || cx. intern ( Fields :: Leaf ( None ) ) ) ,
881
- } ;
882
-
883
- match cx[ self . rule ] {
884
- Rule :: Empty
885
- | Rule :: Eat ( _)
886
- | Rule :: Call ( _)
887
- | Rule :: RepeatMany ( ..)
888
- | Rule :: RepeatMore ( ..) => unreachable ! ( ) ,
889
- Rule :: Concat ( [ left, right] ) => {
890
- let left = child ( left, 0 ) . generate_traverse_shape ( cx, rules, rust_fields) ;
891
- let right = child ( right, 1 ) . generate_traverse_shape ( cx, rules, rust_fields) ;
892
- quote ! ( ( #left, #right) )
893
- }
894
- Rule :: Or ( ref cases) => {
895
- // HACK(eddyb) only collected to a `Vec` to avoid `rules` borrow conflicts.
896
- let cases_shape = cases
897
- . iter ( )
898
- . enumerate ( )
899
- . map ( |( i, & rule) | {
900
- child ( rule, i) . generate_traverse_shape ( cx, rules, rust_fields)
901
- } )
902
- . collect :: < Vec < _ > > ( ) ;
903
- let cases_node_kind = cases. iter ( ) . map ( |rule| rule. node_kind ( cx, rules) ) ;
904
- let cases_node_kind_src = cases_node_kind. map ( |kind| kind. to_src ( ) ) ;
905
- quote ! ( { _P; _ @ #( #cases_node_kind_src => #cases_shape, ) * } )
906
- }
907
- Rule :: Opt ( rule) => {
908
- let shape = child ( rule, 0 ) . generate_traverse_shape ( cx, rules, rust_fields) ;
909
- quote ! ( [ #shape] )
910
- }
911
- }
912
- }
913
- }
914
-
915
894
fn impl_parse_with < Pat > ( cx : & Context < Pat > , name : IStr ) -> Src
916
895
where
917
896
Pat : RustInputPat ,
@@ -1088,9 +1067,7 @@ where
1088
1067
. values ( )
1089
1068
. map ( |( v_rule, variant) | match variant {
1090
1069
RustVariant :: Newtype ( _) => quote ! ( _) ,
1091
- RustVariant :: StructLike ( v_fields) => {
1092
- v_rule. generate_traverse_shape ( cx, rules, v_fields)
1093
- }
1070
+ RustVariant :: StructLike ( v_fields) => v_rule. traverse_shape ( cx, v_fields) ,
1094
1071
} )
1095
1072
. collect :: < Vec < _ > > ( ) ;
1096
1073
let variants_expr = variants. iter ( ) . map ( |( & v_name, ( _, variant) ) | {
@@ -1113,7 +1090,7 @@ where
1113
1090
1114
1091
(
1115
1092
max_fields_len + 1 ,
1116
- quote ! ( { _P ; #max_fields_len @ #( #variants_kind_src => # variants_shape, ) * } ) ,
1093
+ quote ! ( { #max_fields_len @ #( #variants_shape) * } ) ,
1117
1094
quote ! (
1118
1095
match _r[ #max_fields_len] . unwrap( ) . kind {
1119
1096
#( #variants_kind_src => #variants_expr, ) *
@@ -1133,7 +1110,7 @@ where
1133
1110
1134
1111
(
1135
1112
fields. len ( ) ,
1136
- rule. generate_traverse_shape ( cx, rules , fields) ,
1113
+ rule. traverse_shape ( cx, fields) ,
1137
1114
quote ! (
1138
1115
#ident {
1139
1116
#( #fields_ident: #fields_expr) , *
@@ -1144,23 +1121,29 @@ where
1144
1121
}
1145
1122
} ;
1146
1123
1147
- quote ! ( impl <' a, ' i, I >
1148
- traverse:: FromShape <& ' a gll:: grammer:: forest:: ParseForest <' i, _G, I >, Node <' i, _G>>
1124
+ quote ! (
1125
+ impl <' i, I > _forest:: typed:: Shaped for #ident<' _, ' i, I >
1126
+ where I : gll:: grammer:: input:: Input ,
1127
+ {
1128
+ type Shape = _forest:: typed:: shape!( #shape) ;
1129
+ type State = [ usize ; <_forest:: typed:: shape!( #shape) as _forest:: typed:: ShapeStateLen >:: STATE_LEN ] ;
1130
+ }
1131
+ impl <' a, ' i, I >
1132
+ _forest:: typed:: FromShapeFields <' a, _forest:: ParseForest <' i, _G, I >, Node <' i, _G>>
1149
1133
for #ident<' a, ' i, I >
1150
1134
where I : gll:: grammer:: input:: Input ,
1151
1135
{
1152
- type Shape = traverse :: ty! ( #shape ) ;
1136
+ type Output = Self ;
1153
1137
type Fields = [ Option <Node <' i, _G>>; #total_fields] ;
1154
1138
1155
- const SHAPE : Self :: Shape = traverse:: new!( #shape) ;
1156
-
1157
- fn from_shape(
1158
- forest: & ' a gll:: grammer:: forest:: ParseForest <' i, _G, I >,
1139
+ fn from_shape_fields(
1140
+ forest: & ' a _forest:: ParseForest <' i, _G, I >,
1159
1141
_r: Self :: Fields ,
1160
1142
) -> Self {
1161
1143
#from_shape
1162
1144
}
1163
- } )
1145
+ }
1146
+ )
1164
1147
}
1165
1148
1166
1149
fn rule_debug_impl < Pat > ( cx : & Context < Pat > , name : IStr , rust_adt : & RustAdt ) -> Src {
@@ -1333,7 +1316,7 @@ fn declare_node_kind<Pat: RustInputPat>(
1333
1316
) *
1334
1317
}
1335
1318
1336
- impl gll :: grammer :: forest :: GrammarReflector for _G {
1319
+ impl _forest :: GrammarReflector for _G {
1337
1320
type NodeKind = _P;
1338
1321
1339
1322
fn node_shape( & self , kind: _P) -> NodeShape <_P> {
0 commit comments