@@ -17,6 +17,8 @@ enum ResolvedKind {
17
17
CLOSURE ,
18
18
DYNAMIC ,
19
19
ERROR ,
20
+ SEND_SET ,
21
+ NEW ,
20
22
}
21
23
22
24
/// Abstract interface for a [ResolvedVisitor] .
@@ -28,6 +30,8 @@ abstract class ResolvedKindVisitor<R> {
28
30
R visitClosureSend (Send node);
29
31
R visitDynamicSend (Send node);
30
32
R visitStaticSend (Send node);
33
+ R handleSendSet (SendSet node);
34
+ R handleNewExpression (NewExpression node);
31
35
32
36
/// Visitor callback for a type literal.
33
37
R visitTypeLiteralSend (Send node);
@@ -56,6 +60,8 @@ class ResolvedKindComputer implements ResolvedKindVisitor {
56
60
ResolvedKind visitTypeLiteralSend (Send node) => ResolvedKind .TYPE_LITERAL ;
57
61
ResolvedKind visitTypePrefixSend (Send node) => ResolvedKind .TYPE_PREFIX ;
58
62
ResolvedKind visitAssertSend (Send node) => ResolvedKind .ASSERT ;
63
+ ResolvedKind handleSendSet (SendSet node) => ResolvedKind .SEND_SET ;
64
+ ResolvedKind handleNewExpression (NewExpression node) => ResolvedKind .NEW ;
59
65
internalError (Spannable node, String reason) => ResolvedKind .ERROR ;
60
66
}
61
67
@@ -130,6 +136,14 @@ abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> {
130
136
R visitSend (Send node) {
131
137
return _oldDispatch (node, this );
132
138
}
139
+
140
+ R visitSendSet (SendSet node) {
141
+ return handleSendSet (node);
142
+ }
143
+
144
+ R visitNewExpression (NewExpression node) {
145
+ return handleNewExpression (node);
146
+ }
133
147
}
134
148
135
149
abstract class NewResolvedVisitor <R > extends BaseResolvedVisitor <R >
@@ -185,18 +199,54 @@ abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R>
185
199
}
186
200
}
187
201
202
+ bool checkResolvedKind (Node node,
203
+ ResolvedKind oldKind,
204
+ ResolvedKind newKind) {
205
+ return invariant (node, oldKind == newKind, message: '$oldKind != $newKind ' );
206
+ }
207
+
208
+ ResolvedKind computeResolvedKindFromStructure (
209
+ Node node, SemanticSendStructure structure) {
210
+ return structure.dispatch (
211
+ _resolvedKindDispatcher, node, const ResolvedKindComputer ());
212
+ }
213
+
214
+ @override
188
215
R visitSend (Send node) {
189
- ResolvedKind oldKind;
190
- ResolvedKind newKind;
191
- assert (invariant (node, () {
192
- oldKind = _oldDispatch (node, const ResolvedKindComputer ());
193
- newKind = _newDispatch (
194
- node, const ResolvedKindComputer (), _resolvedKindDispatcher);
195
- return oldKind == newKind;
196
- }, message: () => '$oldKind != $newKind ' ));
216
+ assert (checkResolvedKind (
217
+ node,
218
+ _oldDispatch (node, const ResolvedKindComputer ()),
219
+ _newDispatch (node, const ResolvedKindComputer (),
220
+ _resolvedKindDispatcher)));
197
221
return _newDispatch (node, this , this );
198
222
}
199
223
224
+ @override
225
+ R visitSendSet (Send node) {
226
+ SendStructure structure = computeSendStructure (node);
227
+ if (structure == null ) {
228
+ return internalError (node, 'No structure for $node ' );
229
+ } else {
230
+ assert (checkResolvedKind (node,
231
+ ResolvedKind .SEND_SET ,
232
+ computeResolvedKindFromStructure (node, structure)));
233
+ return structure.dispatch (this , node, structure);
234
+ }
235
+ }
236
+
237
+ @override
238
+ R visitNewExpression (NewExpression node) {
239
+ NewStructure structure = computeNewStructure (node);
240
+ if (structure == null ) {
241
+ return internalError (node, 'No structure for $node ' );
242
+ } else {
243
+ assert (checkResolvedKind (node,
244
+ ResolvedKind .NEW ,
245
+ computeResolvedKindFromStructure (node, structure)));
246
+ return structure.dispatch (this , node, structure);
247
+ }
248
+ }
249
+
200
250
@override
201
251
R apply (Node node, arg) {
202
252
return visitNode (node);
@@ -206,8 +256,8 @@ abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R>
206
256
R bulkHandleNode (
207
257
Node node,
208
258
String message,
209
- SendStructure sendStructure ) {
210
- return sendStructure .dispatch (_semanticDispatcher, node, this );
259
+ SemanticSendStructure structure ) {
260
+ return structure .dispatch (_semanticDispatcher, node, this );
211
261
}
212
262
}
213
263
@@ -239,13 +289,16 @@ class ResolvedSemanticDispatcher<R> extends Object
239
289
Node node,
240
290
String message,
241
291
ResolvedKindVisitor <R > visitor) {
242
- // Set, Compound, IndexSet, and NewExpression are not handled by
243
- // [ResolvedVisitor].
244
292
return bulkHandleError (node, visitor);
245
293
}
246
294
247
295
R bulkHandleError (Node node, ResolvedKindVisitor <R > visitor) {
248
- return visitor.internalError (node, "No resolved kind for node." );
296
+ if (node.asSendSet () != null ) {
297
+ return visitor.handleSendSet (node);
298
+ } else if (node.asNewExpression () != null ) {
299
+ return visitor.handleNewExpression (node);
300
+ }
301
+ return visitor.internalError (node, "No resolved kind for $node ." );
249
302
}
250
303
251
304
@override
@@ -261,19 +314,42 @@ class ResolvedSemanticDispatcher<R> extends Object
261
314
262
315
@override
263
316
R bulkHandlePrefix (Node node, ResolvedKindVisitor <R > visitor) {
264
- return visitor.visitOperatorSend (node);
317
+ return visitor.handleSendSet (node);
265
318
}
266
319
267
320
@override
268
321
R bulkHandlePostfix (Node node, ResolvedKindVisitor <R > visitor) {
269
- return visitor.visitOperatorSend (node);
322
+ return visitor.handleSendSet (node);
270
323
}
271
324
272
325
@override
273
326
R bulkHandleSuper (Node node, ResolvedKindVisitor <R > visitor) {
327
+ if (node.asSendSet () != null ) {
328
+ return visitor.handleSendSet (node);
329
+ }
274
330
return visitor.visitSuperSend (node);
275
331
}
276
332
333
+ @override
334
+ R bulkHandleSet (SendSet node, ResolvedKindVisitor <R > visitor) {
335
+ return visitor.handleSendSet (node);
336
+ }
337
+
338
+ @override
339
+ R bulkHandleCompound (SendSet node, ResolvedKindVisitor <R > visitor) {
340
+ return visitor.handleSendSet (node);
341
+ }
342
+
343
+ @override
344
+ R bulkHandleIndexSet (SendSet node, ResolvedKindVisitor <R > visitor) {
345
+ return visitor.handleSendSet (node);
346
+ }
347
+
348
+ @override
349
+ R bulkHandleNew (NewExpression node, ResolvedKindVisitor <R > visitor) {
350
+ return visitor.handleNewExpression (node);
351
+ }
352
+
277
353
@override
278
354
R errorInvalidAssert (
279
355
Send node,
0 commit comments