@@ -38,7 +38,7 @@ type fieldSet struct {
38
38
Dynamic []* adt.DynamicField
39
39
40
40
// excluded are all literal fields that already exist.
41
- Bulk []bulkField
41
+ Bulk []* adt. BulkOptionalField
42
42
43
43
Additional []adt.Expr
44
44
IsOpen bool // has a ...
@@ -80,12 +80,6 @@ type FieldInfo struct {
80
80
Optional []adt.Node
81
81
}
82
82
83
- type bulkField struct {
84
- check fieldMatcher
85
- expr adt.Node // *adt.BulkOptionalField // Conjunct
86
- additional bool // used with ...
87
- }
88
-
89
83
func (o * fieldSet ) Accept (c * adt.OpContext , f adt.Feature ) bool {
90
84
if len (o .Additional ) > 0 {
91
85
return true
@@ -100,7 +94,7 @@ func (o *fieldSet) Accept(c *adt.OpContext, f adt.Feature) bool {
100
94
}
101
95
}
102
96
for _ , b := range o .Bulk {
103
- if b . check . Match (c , o .env , f ) {
97
+ if matchBulk (c , o .env , b , f ) {
104
98
return true
105
99
}
106
100
}
@@ -136,15 +130,13 @@ outer:
136
130
bulkEnv .Cycles = nil
137
131
138
132
// match bulk optional fields / pattern properties
139
- for _ , f := range o .Bulk {
140
- if matched && f .additional {
141
- continue
142
- }
143
- if f . check . Match (c , o .env , arc .Label ) {
133
+ for _ , b := range o .Bulk {
134
+ // if matched && f.additional {
135
+ // continue
136
+ // }
137
+ if matchBulk (c , o .env , b , arc .Label ) {
144
138
matched = true
145
- if f .expr != nil {
146
- arc .AddConjunct (adt .MakeConjunct (& bulkEnv , f .expr , o .id ))
147
- }
139
+ arc .AddConjunct (adt .MakeConjunct (& bulkEnv , b , o .id ))
148
140
}
149
141
}
150
142
if matched {
@@ -190,18 +182,10 @@ func (o *fieldSet) AddDynamic(c *adt.OpContext, x *adt.DynamicField) {
190
182
}
191
183
192
184
func (o * fieldSet ) AddBulk (c * adt.OpContext , x * adt.BulkOptionalField ) {
193
- v , ok := c .Evaluate (o .env , x .Filter )
194
- if ! ok {
195
- // TODO: handle dynamically
196
- return
197
- }
198
-
199
- if m := o .getMatcher (c , v ); m != nil {
200
- o .Bulk = append (o .Bulk , bulkField {m , x , false })
201
- }
185
+ o .Bulk = append (o .Bulk , x )
202
186
}
203
187
204
- func ( o * fieldSet ) getMatcher (c * adt.OpContext , v adt.Value ) fieldMatcher {
188
+ func getMatcher (c * adt.OpContext , env * adt. Environment , v adt.Value ) fieldMatcher {
205
189
switch f := v .(type ) {
206
190
case * adt.Top :
207
191
return typeMatcher (adt .TopKind )
@@ -210,8 +194,22 @@ func (o *fieldSet) getMatcher(c *adt.OpContext, v adt.Value) fieldMatcher {
210
194
return typeMatcher (f .K )
211
195
212
196
default :
213
- return o .newPatternMatcher (c , v )
197
+ return newPatternMatcher (c , env , v )
198
+ }
199
+ }
200
+
201
+ func matchBulk (c * adt.OpContext , env * adt.Environment , x * adt.BulkOptionalField , f adt.Feature ) bool {
202
+ v , ok := c .Evaluate (env , x .Filter )
203
+ if ! ok {
204
+ // TODO: handle dynamically
205
+ return false
206
+ }
207
+
208
+ m := getMatcher (c , env , v )
209
+ if m == nil {
210
+ return false
214
211
}
212
+ return m .Match (c , env , f )
215
213
}
216
214
217
215
func (o * fieldSet ) AddEllipsis (c * adt.OpContext , x * adt.Ellipsis ) {
@@ -272,7 +270,7 @@ func (m patternMatcher) Match(c *adt.OpContext, env *adt.Environment, f adt.Feat
272
270
return b == nil
273
271
}
274
272
275
- func ( o * fieldSet ) newPatternMatcher (ctx * adt.OpContext , x adt.Value ) fieldMatcher {
276
- c := adt .MakeRootConjunct (o . env , x )
273
+ func newPatternMatcher (ctx * adt.OpContext , env * adt. Environment , x adt.Value ) fieldMatcher {
274
+ c := adt .MakeRootConjunct (env , x )
277
275
return patternMatcher (c )
278
276
}
0 commit comments