| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart2js; | 5 part of dart2js; |
| 6 | 6 |
| 7 abstract class ResolvedVisitor<R> extends Visitor<R> { | 7 /// Enum for the visit methods added in [ResolvedVisitor]. |
| 8 TreeElements elements; | 8 // TODO(johnniwinther): Remove this. |
| 9 | 9 enum ResolvedKind { |
| 10 ResolvedVisitor(this.elements); | 10 ASSERT, |
| 11 | 11 TYPE_LITERAL, |
| 12 R visitSend(Send node) { | 12 SUPER, |
| 13 Element element = elements[node]; | 13 OPERATOR, |
| 14 if (elements.isAssert(node)) { | 14 TYPE_PREFIX, |
| 15 return visitAssert(node); | 15 GETTER, |
| 16 } else if (elements.isTypeLiteral(node)) { | 16 STATIC, |
| 17 return visitTypeLiteralSend(node); | 17 CLOSURE, |
| 18 } else if (node.isSuperCall) { | 18 DYNAMIC, |
| 19 return visitSuperSend(node); | 19 ERROR, |
| 20 } else if (node.isOperator) { | 20 } |
| 21 return visitOperatorSend(node); | 21 |
| 22 } else if (node.isPropertyAccess) { | 22 /// Abstract interface for a [ResolvedVisitor]. |
| 23 if (!Elements.isUnresolved(element) && element.impliesType) { | 23 // TODO(johnniwinther): Remove this. |
| 24 return visitTypePrefixSend(node); | 24 abstract class ResolvedKindVisitor<R> { |
| 25 } else { | |
| 26 return visitGetterSend(node); | |
| 27 } | |
| 28 } else if (element != null && Initializers.isConstructorRedirect(node)) { | |
| 29 return visitStaticSend(node); | |
| 30 } else if (Elements.isClosureSend(node, element)) { | |
| 31 return visitClosureSend(node); | |
| 32 } else { | |
| 33 if (Elements.isUnresolved(element)) { | |
| 34 if (element == null) { | |
| 35 // Example: f() with 'f' unbound. | |
| 36 // This can only happen inside an instance method. | |
| 37 return visitDynamicSend(node); | |
| 38 } else { | |
| 39 return visitStaticSend(node); | |
| 40 } | |
| 41 } else if (element.isInstanceMember) { | |
| 42 // Example: f() with 'f' bound to instance method. | |
| 43 return visitDynamicSend(node); | |
| 44 } else if (!element.isInstanceMember) { | |
| 45 // Example: A.f() or f() with 'f' bound to a static function. | |
| 46 // Also includes new A() or new A.named() which is treated like a | |
| 47 // static call to a factory. | |
| 48 return visitStaticSend(node); | |
| 49 } else { | |
| 50 internalError("Cannot generate code for send", node: node); | |
| 51 return null; | |
| 52 } | |
| 53 } | |
| 54 } | |
| 55 | |
| 56 R visitSuperSend(Send node); | 25 R visitSuperSend(Send node); |
| 57 R visitOperatorSend(Send node); | 26 R visitOperatorSend(Send node); |
| 58 R visitGetterSend(Send node); | 27 R visitGetterSend(Send node); |
| 59 R visitClosureSend(Send node); | 28 R visitClosureSend(Send node); |
| 60 R visitDynamicSend(Send node); | 29 R visitDynamicSend(Send node); |
| 61 R visitStaticSend(Send node); | 30 R visitStaticSend(Send node); |
| 62 | 31 |
| 63 /// Visitor callback for a type literal. | 32 /// Visitor callback for a type literal. |
| 64 R visitTypeLiteralSend(Send node); | 33 R visitTypeLiteralSend(Send node); |
| 65 | 34 |
| 66 /// Visitor callback for the class prefix of a static access, like `Foo` in | 35 /// Visitor callback for the class prefix of a static access, like `Foo` in |
| 67 /// `Foo.staticField`. | 36 /// `Foo.staticField`. |
| 68 // TODO(johnniwinther): Remove this when not needed by the dart backend. | 37 // TODO(johnniwinther): Remove this when not needed by the dart backend. |
| 69 R visitTypePrefixSend(Send node); | 38 R visitTypePrefixSend(Send node); |
| 70 | 39 |
| 71 R visitAssert(Send node); | 40 R visitAssertSend(Send node); |
| 72 | 41 |
| 73 void internalError(String reason, {Node node}); | 42 internalError(Spannable node, String reason); |
| 43 } |
| 44 |
| 45 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor |
| 46 /// method. |
| 47 class ResolvedKindComputer implements ResolvedKindVisitor { |
| 48 const ResolvedKindComputer(); |
| 49 |
| 50 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; |
| 51 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; |
| 52 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; |
| 53 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; |
| 54 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; |
| 55 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; |
| 56 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; |
| 57 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; |
| 58 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; |
| 59 internalError(Spannable node, String reason) => ResolvedKind.ERROR; |
| 60 } |
| 61 |
| 62 abstract class ResolvedVisitor<R> |
| 63 implements Visitor<R>, ResolvedKindVisitor<R> {} |
| 64 |
| 65 abstract class BaseResolvedVisitor<R> extends Visitor<R> |
| 66 implements ResolvedVisitor<R> { |
| 67 |
| 68 TreeElements elements; |
| 69 |
| 70 BaseResolvedVisitor(this.elements); |
| 71 |
| 72 /// Dispatch using the old [ResolvedVisitor] logic. |
| 73 // TODO(johnniwinther): Remove this. |
| 74 _oldDispatch(Send node, ResolvedKindVisitor visitor) { |
| 75 Element element = elements[node]; |
| 76 if (elements.isAssert(node)) { |
| 77 return visitor.visitAssertSend(node); |
| 78 } else if (elements.isTypeLiteral(node)) { |
| 79 return visitor.visitTypeLiteralSend(node); |
| 80 } else if (node.isSuperCall) { |
| 81 return visitor.visitSuperSend(node); |
| 82 } else if (node.isOperator) { |
| 83 return visitor.visitOperatorSend(node); |
| 84 } else if (node.isPropertyAccess) { |
| 85 if (!Elements.isUnresolved(element) && element.impliesType) { |
| 86 return visitor.visitTypePrefixSend(node); |
| 87 } else { |
| 88 return visitor.visitGetterSend(node); |
| 89 } |
| 90 } else if (element != null && Initializers.isConstructorRedirect(node)) { |
| 91 return visitor.visitStaticSend(node); |
| 92 } else if (Elements.isClosureSend(node, element)) { |
| 93 return visitor.visitClosureSend(node); |
| 94 } else { |
| 95 if (Elements.isUnresolved(element)) { |
| 96 if (element == null) { |
| 97 // Example: f() with 'f' unbound. |
| 98 // This can only happen inside an instance method. |
| 99 return visitor.visitDynamicSend(node); |
| 100 } else { |
| 101 return visitor.visitStaticSend(node); |
| 102 } |
| 103 } else if (element.isInstanceMember) { |
| 104 // Example: f() with 'f' bound to instance method. |
| 105 return visitor.visitDynamicSend(node); |
| 106 } else if (!element.isInstanceMember) { |
| 107 // Example: A.f() or f() with 'f' bound to a static function. |
| 108 // Also includes new A() or new A.named() which is treated like a |
| 109 // static call to a factory. |
| 110 return visitor.visitStaticSend(node); |
| 111 } else { |
| 112 return visitor.internalError(node, "Cannot generate code for send"); |
| 113 } |
| 114 } |
| 115 } |
| 116 |
| 117 internalError(Spannable node, String reason); |
| 74 | 118 |
| 75 R visitNode(Node node) { | 119 R visitNode(Node node) { |
| 76 internalError("Unhandled node", node: node); | 120 internalError(node, "Unhandled node"); |
| 77 return null; | 121 return null; |
| 78 } | 122 } |
| 79 } | 123 } |
| 124 |
| 125 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart |
| 126 // backend. |
| 127 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> { |
| 128 OldResolvedVisitor(TreeElements elements) : super(elements); |
| 129 |
| 130 R visitSend(Send node) { |
| 131 return _oldDispatch(node, this); |
| 132 } |
| 133 } |
| 134 |
| 135 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> |
| 136 with SendResolverMixin, |
| 137 GetBulkMixin<R, dynamic>, |
| 138 SetBulkMixin<R, dynamic>, |
| 139 ErrorBulkMixin<R, dynamic>, |
| 140 InvokeBulkMixin<R, dynamic>, |
| 141 IndexSetBulkMixin<R, dynamic>, |
| 142 CompoundBulkMixin<R, dynamic>, |
| 143 UnaryBulkMixin<R, dynamic>, |
| 144 BaseBulkMixin<R, dynamic>, |
| 145 BinaryBulkMixin<R, dynamic>, |
| 146 PrefixBulkMixin<R, dynamic>, |
| 147 PostfixBulkMixin<R, dynamic> { |
| 148 |
| 149 final ResolvedSemanticDispatcher<R> _semanticDispatcher = |
| 150 new ResolvedSemanticDispatcher<R>(); |
| 151 |
| 152 final ResolvedSemanticDispatcher<ResolvedKind> _resolvedKindDispatcher = |
| 153 new ResolvedSemanticDispatcher<ResolvedKind>(); |
| 154 |
| 155 NewResolvedVisitor(TreeElements elements) : super(elements); |
| 156 |
| 157 /// Dispatch using the new [SemanticSendVisitor] logic. |
| 158 _newDispatch(Send node, |
| 159 ResolvedKindVisitor kindVisitor, |
| 160 SemanticSendVisitor sendVisitor) { |
| 161 Element element = elements[node]; |
| 162 if (element != null && element.isConstructor) { |
| 163 if (node.isSuperCall) { |
| 164 return kindVisitor.visitSuperSend(node); |
| 165 } else { |
| 166 return kindVisitor.visitStaticSend(node); |
| 167 } |
| 168 } else if (element != null && element.isPrefix) { |
| 169 return kindVisitor.visitGetterSend(node); |
| 170 } else if (!elements.isTypeLiteral(node) && |
| 171 node.isPropertyAccess && |
| 172 !Elements.isUnresolved(element) && |
| 173 element.impliesType) { |
| 174 return kindVisitor.visitTypePrefixSend(node); |
| 175 } else { |
| 176 SendStructure sendStructure = computeSendStructure(node); |
| 177 if (sendStructure != null) { |
| 178 var arg = sendVisitor == _resolvedKindDispatcher |
| 179 ? kindVisitor : sendStructure; |
| 180 return sendStructure.dispatch(sendVisitor, node, arg); |
| 181 } else { |
| 182 return kindVisitor.visitStaticSend(node); |
| 183 } |
| 184 } |
| 185 } |
| 186 |
| 187 R visitSend(Send node) { |
| 188 ResolvedKind oldKind; |
| 189 ResolvedKind newKind; |
| 190 assert(invariant(node, () { |
| 191 oldKind = _oldDispatch(node, const ResolvedKindComputer()); |
| 192 newKind = _newDispatch( |
| 193 node, const ResolvedKindComputer(), _resolvedKindDispatcher); |
| 194 return oldKind == newKind; |
| 195 }, message: () => '$oldKind != $newKind')); |
| 196 return _newDispatch(node, this, this); |
| 197 } |
| 198 |
| 199 @override |
| 200 R apply(Node node, arg) { |
| 201 return visitNode(node); |
| 202 } |
| 203 |
| 204 @override |
| 205 R bulkHandleNode( |
| 206 Node node, |
| 207 String message, |
| 208 SendStructure sendStructure) { |
| 209 return sendStructure.dispatch(_semanticDispatcher, node, this); |
| 210 } |
| 211 } |
| 212 |
| 213 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding |
| 214 /// visit methods in [ResolvedVisitor]. |
| 215 class ResolvedSemanticDispatcher<R> extends Object |
| 216 with GetBulkMixin<R, ResolvedKindVisitor<R>>, |
| 217 SetBulkMixin<R, ResolvedKindVisitor<R>>, |
| 218 InvokeBulkMixin<R, ResolvedKindVisitor<R>>, |
| 219 PrefixBulkMixin<R, ResolvedKindVisitor<R>>, |
| 220 PostfixBulkMixin<R, ResolvedKindVisitor<R>>, |
| 221 SuperBulkMixin<R, ResolvedKindVisitor<R>>, |
| 222 CompoundBulkMixin<R, ResolvedKindVisitor<R>>, |
| 223 IndexSetBulkMixin<R, ResolvedKindVisitor<R>>, |
| 224 ErrorBulkMixin<R, ResolvedKindVisitor<R>> |
| 225 implements SemanticSendVisitor<R, ResolvedKindVisitor<R>> { |
| 226 |
| 227 ResolvedSemanticDispatcher(); |
| 228 |
| 229 @override |
| 230 R apply(Node node, ResolvedKindVisitor<R> visitor) { |
| 231 return visitor.internalError( |
| 232 node, "ResolvedSemanticDispatcher.apply unsupported."); |
| 233 } |
| 234 |
| 235 @override |
| 236 R bulkHandleNode( |
| 237 Node node, |
| 238 String message, |
| 239 ResolvedKindVisitor<R> visitor) { |
| 240 // Set, Compound and IndexSet are not handled by [ResolvedVisitor]. |
| 241 return bulkHandleError(node, visitor); |
| 242 } |
| 243 |
| 244 R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) { |
| 245 return visitor.internalError(node, "No resolved kind for node."); |
| 246 } |
| 247 |
| 248 @override |
| 249 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) { |
| 250 return visitor.visitGetterSend(node); |
| 251 } |
| 252 |
| 253 @override |
| 254 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) { |
| 255 // Most invokes are static. |
| 256 return visitor.visitStaticSend(node); |
| 257 } |
| 258 |
| 259 @override |
| 260 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) { |
| 261 return visitor.visitOperatorSend(node); |
| 262 } |
| 263 |
| 264 @override |
| 265 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) { |
| 266 return visitor.visitOperatorSend(node); |
| 267 } |
| 268 |
| 269 @override |
| 270 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) { |
| 271 return visitor.visitSuperSend(node); |
| 272 } |
| 273 |
| 274 @override |
| 275 R errorInvalidAssert( |
| 276 Send node, |
| 277 NodeList arguments, |
| 278 ResolvedKindVisitor<R> visitor) { |
| 279 return visitor.visitAssertSend(node); |
| 280 } |
| 281 |
| 282 @override |
| 283 R errorLocalFunctionPostfix( |
| 284 Send node, |
| 285 LocalFunctionElement function, |
| 286 op.IncDecOperator operator, |
| 287 ResolvedKindVisitor<R> visitor) { |
| 288 return visitor.visitOperatorSend(node); |
| 289 } |
| 290 |
| 291 @override |
| 292 R errorLocalFunctionPrefix( |
| 293 Send node, |
| 294 LocalFunctionElement function, |
| 295 op.IncDecOperator operator, |
| 296 ResolvedKindVisitor<R> visitor) { |
| 297 return visitor.visitOperatorSend(node); |
| 298 } |
| 299 |
| 300 @override |
| 301 R errorStaticSetterGet( |
| 302 Send node, |
| 303 FunctionElement setter, |
| 304 ResolvedKindVisitor<R> visitor) { |
| 305 return visitor.visitGetterSend(node); |
| 306 } |
| 307 |
| 308 @override |
| 309 R errorStaticSetterInvoke( |
| 310 Send node, |
| 311 FunctionElement setter, |
| 312 NodeList arguments, |
| 313 Selector selector, |
| 314 ResolvedKindVisitor<R> visitor) { |
| 315 return visitor.visitStaticSend(node); |
| 316 } |
| 317 |
| 318 @override |
| 319 R errorSuperSetterGet( |
| 320 Send node, |
| 321 FunctionElement setter, |
| 322 ResolvedKindVisitor<R> visitor) { |
| 323 return visitor.visitGetterSend(node); |
| 324 } |
| 325 |
| 326 @override |
| 327 R errorSuperSetterInvoke( |
| 328 Send node, |
| 329 FunctionElement setter, |
| 330 NodeList arguments, |
| 331 Selector selector, |
| 332 ResolvedKindVisitor<R> visitor) { |
| 333 return visitor.visitSuperSend(node); |
| 334 } |
| 335 |
| 336 @override |
| 337 R errorTopLevelSetterGet( |
| 338 Send node, |
| 339 FunctionElement setter, |
| 340 ResolvedKindVisitor<R> visitor) { |
| 341 return visitor.visitGetterSend(node); |
| 342 } |
| 343 |
| 344 @override |
| 345 R errorTopLevelSetterInvoke( |
| 346 Send node, |
| 347 FunctionElement setter, |
| 348 NodeList arguments, |
| 349 Selector selector, |
| 350 ResolvedKindVisitor<R> visitor) { |
| 351 return visitor.visitStaticSend(node); |
| 352 } |
| 353 |
| 354 @override |
| 355 R errorUndefinedBinaryExpression( |
| 356 Send node, |
| 357 Node left, |
| 358 Operator operator, |
| 359 Node right, |
| 360 ResolvedKindVisitor<R> visitor) { |
| 361 return visitor.visitOperatorSend(node); |
| 362 } |
| 363 |
| 364 @override |
| 365 R errorUndefinedUnaryExpression( |
| 366 Send node, |
| 367 Operator operator, |
| 368 Node expression, |
| 369 ResolvedKindVisitor<R> visitor) { |
| 370 return visitor.visitOperatorSend(node); |
| 371 } |
| 372 |
| 373 @override |
| 374 R errorUnresolvedGet( |
| 375 Send node, |
| 376 Element element, |
| 377 ResolvedKindVisitor<R> visitor) { |
| 378 if (node.isSuperCall) { |
| 379 return visitor.visitSuperSend(node); |
| 380 } |
| 381 return visitor.visitGetterSend(node); |
| 382 } |
| 383 |
| 384 @override |
| 385 R errorUnresolvedInvoke( |
| 386 Send node, |
| 387 Element element, |
| 388 NodeList arguments, |
| 389 Selector selector, |
| 390 ResolvedKindVisitor<R> visitor) { |
| 391 if (node.isSuperCall) { |
| 392 return visitor.visitSuperSend(node); |
| 393 } |
| 394 return visitor.visitStaticSend(node); |
| 395 } |
| 396 |
| 397 @override |
| 398 R errorUnresolvedPostfix( |
| 399 Send node, |
| 400 Element element, |
| 401 op.IncDecOperator operator, |
| 402 ResolvedKindVisitor<R> visitor) { |
| 403 if (node.isSuperCall) { |
| 404 return visitor.visitSuperSend(node); |
| 405 } |
| 406 return visitor.visitOperatorSend(node); |
| 407 } |
| 408 |
| 409 @override |
| 410 R errorUnresolvedPrefix( |
| 411 Send node, |
| 412 Element element, |
| 413 op.IncDecOperator operator, |
| 414 ResolvedKindVisitor<R> visitor) { |
| 415 if (node.isSuperCall) { |
| 416 return visitor.visitSuperSend(node); |
| 417 } |
| 418 return visitor.visitOperatorSend(node); |
| 419 } |
| 420 |
| 421 @override |
| 422 R errorUnresolvedSuperBinary( |
| 423 Send node, |
| 424 Element element, |
| 425 op.BinaryOperator operator, |
| 426 Node argument, |
| 427 ResolvedKindVisitor<R> visitor) { |
| 428 return visitor.visitSuperSend(node); |
| 429 } |
| 430 |
| 431 @override |
| 432 R errorUnresolvedSuperUnary( |
| 433 Send node, |
| 434 op.UnaryOperator operator, |
| 435 Element element, |
| 436 ResolvedKindVisitor<R> visitor) { |
| 437 return visitor.visitSuperSend(node); |
| 438 } |
| 439 |
| 440 @override |
| 441 R visitAs( |
| 442 Send node, |
| 443 Node expression, |
| 444 DartType type, |
| 445 ResolvedKindVisitor<R> visitor) { |
| 446 return visitor.visitOperatorSend(node); |
| 447 } |
| 448 |
| 449 @override |
| 450 R visitAssert( |
| 451 Send node, |
| 452 Node expression, |
| 453 ResolvedKindVisitor<R> visitor) { |
| 454 return visitor.visitAssertSend(node); |
| 455 } |
| 456 |
| 457 @override |
| 458 R visitBinary( |
| 459 Send node, |
| 460 Node left, |
| 461 op.BinaryOperator operator, |
| 462 Node right, |
| 463 ResolvedKindVisitor<R> visitor) { |
| 464 return visitor.visitOperatorSend(node); |
| 465 } |
| 466 |
| 467 @override |
| 468 R visitEquals( |
| 469 Send node, |
| 470 Node left, |
| 471 Node right, |
| 472 ResolvedKindVisitor<R> visitor) { |
| 473 return visitor.visitOperatorSend(node); |
| 474 } |
| 475 |
| 476 @override |
| 477 R visitIs( |
| 478 Send node, |
| 479 Node expression, |
| 480 DartType type, |
| 481 ResolvedKindVisitor<R> visitor) { |
| 482 return visitor.visitOperatorSend(node); |
| 483 } |
| 484 |
| 485 @override |
| 486 R visitIsNot( |
| 487 Send node, |
| 488 Node expression, |
| 489 DartType type, |
| 490 ResolvedKindVisitor<R> visitor) { |
| 491 return visitor.visitOperatorSend(node); |
| 492 } |
| 493 |
| 494 @override |
| 495 R visitLogicalAnd( |
| 496 Send node, |
| 497 Node left, |
| 498 Node right, |
| 499 ResolvedKindVisitor<R> visitor) { |
| 500 return visitor.visitOperatorSend(node); |
| 501 } |
| 502 |
| 503 @override |
| 504 R visitLogicalOr( |
| 505 Send node, |
| 506 Node left, |
| 507 Node right, |
| 508 ResolvedKindVisitor<R> visitor) { |
| 509 return visitor.visitOperatorSend(node); |
| 510 } |
| 511 |
| 512 @override |
| 513 R visitNot( |
| 514 Send node, |
| 515 Node expression, |
| 516 ResolvedKindVisitor<R> visitor) { |
| 517 return visitor.visitOperatorSend(node); |
| 518 } |
| 519 |
| 520 @override |
| 521 R visitNotEquals( |
| 522 Send node, |
| 523 Node left, |
| 524 Node right, |
| 525 ResolvedKindVisitor<R> visitor) { |
| 526 return visitor.visitOperatorSend(node); |
| 527 } |
| 528 |
| 529 @override |
| 530 R visitUnary( |
| 531 Send node, |
| 532 op.UnaryOperator operator, |
| 533 Node expression, |
| 534 ResolvedKindVisitor<R> visitor) { |
| 535 return visitor.visitOperatorSend(node); |
| 536 } |
| 537 |
| 538 @override |
| 539 R visitDynamicPropertyInvoke( |
| 540 Send node, |
| 541 Node receiver, |
| 542 NodeList arguments, |
| 543 Selector selector, |
| 544 ResolvedKindVisitor<R> visitor) { |
| 545 return visitor.visitDynamicSend(node); |
| 546 } |
| 547 |
| 548 @override |
| 549 R visitThisPropertyInvoke( |
| 550 Send node, |
| 551 NodeList arguments, |
| 552 Selector selector, |
| 553 ResolvedKindVisitor<R> visitor) { |
| 554 return visitor.visitDynamicSend(node); |
| 555 } |
| 556 |
| 557 @override |
| 558 R visitExpressionInvoke( |
| 559 Send node, |
| 560 Node receiver, |
| 561 NodeList arguments, |
| 562 Selector selector, |
| 563 ResolvedKindVisitor<R> visitor) { |
| 564 return visitor.visitClosureSend(node); |
| 565 } |
| 566 |
| 567 @override |
| 568 R visitParameterInvoke( |
| 569 Send node, |
| 570 ParameterElement parameter, |
| 571 NodeList arguments, |
| 572 Selector selector, |
| 573 ResolvedKindVisitor<R> visitor) { |
| 574 return visitor.visitClosureSend(node); |
| 575 } |
| 576 |
| 577 @override |
| 578 R visitLocalVariableInvoke( |
| 579 Send node, |
| 580 LocalVariableElement variable, |
| 581 NodeList arguments, |
| 582 Selector selector, |
| 583 ResolvedKindVisitor<R> visitor) { |
| 584 return visitor.visitClosureSend(node); |
| 585 } |
| 586 |
| 587 @override |
| 588 R visitLocalFunctionInvoke( |
| 589 Send node, |
| 590 LocalFunctionElement function, |
| 591 NodeList arguments, |
| 592 Selector selector, |
| 593 ResolvedKindVisitor<R> visitor) { |
| 594 return visitor.visitClosureSend(node); |
| 595 } |
| 596 |
| 597 @override |
| 598 R visitThisInvoke( |
| 599 Send node, |
| 600 NodeList arguments, |
| 601 Selector selector, |
| 602 ResolvedKindVisitor<R> visitor) { |
| 603 return visitor.visitClosureSend(node); |
| 604 } |
| 605 |
| 606 @override |
| 607 R visitClassTypeLiteralGet( |
| 608 Send node, |
| 609 TypeConstantExpression constant, |
| 610 ResolvedKindVisitor<R> visitor) { |
| 611 return visitor.visitTypeLiteralSend(node); |
| 612 } |
| 613 |
| 614 @override |
| 615 R visitTypedefTypeLiteralGet( |
| 616 Send node, |
| 617 TypeConstantExpression constant, |
| 618 ResolvedKindVisitor<R> visitor) { |
| 619 return visitor.visitTypeLiteralSend(node); |
| 620 } |
| 621 |
| 622 @override |
| 623 R visitDynamicTypeLiteralGet( |
| 624 Send node, |
| 625 TypeConstantExpression constant, |
| 626 ResolvedKindVisitor<R> visitor) { |
| 627 return visitor.visitTypeLiteralSend(node); |
| 628 } |
| 629 |
| 630 @override |
| 631 R visitTypeVariableTypeLiteralGet( |
| 632 Send node, |
| 633 TypeVariableElement element, |
| 634 ResolvedKindVisitor<R> visitor) { |
| 635 return visitor.visitTypeLiteralSend(node); |
| 636 } |
| 637 |
| 638 @override |
| 639 R visitClassTypeLiteralInvoke( |
| 640 Send node, |
| 641 TypeConstantExpression constant, |
| 642 NodeList arguments, |
| 643 Selector selector, |
| 644 ResolvedKindVisitor<R> visitor) { |
| 645 return visitor.visitTypeLiteralSend(node); |
| 646 } |
| 647 |
| 648 @override |
| 649 R visitTypedefTypeLiteralInvoke( |
| 650 Send node, |
| 651 TypeConstantExpression constant, |
| 652 NodeList arguments, |
| 653 Selector selector, |
| 654 ResolvedKindVisitor<R> visitor) { |
| 655 return visitor.visitTypeLiteralSend(node); |
| 656 } |
| 657 |
| 658 @override |
| 659 R visitDynamicTypeLiteralInvoke( |
| 660 Send node, |
| 661 TypeConstantExpression constant, |
| 662 NodeList arguments, |
| 663 Selector selector, |
| 664 ResolvedKindVisitor<R> visitor) { |
| 665 return visitor.visitTypeLiteralSend(node); |
| 666 } |
| 667 |
| 668 @override |
| 669 R visitTypeVariableTypeLiteralInvoke( |
| 670 Send node, |
| 671 TypeVariableElement element, |
| 672 NodeList arguments, |
| 673 Selector selector, |
| 674 ResolvedKindVisitor<R> visitor) { |
| 675 return visitor.visitTypeLiteralSend(node); |
| 676 } |
| 677 |
| 678 @override |
| 679 R visitIndex( |
| 680 Send node, |
| 681 Node receiver, |
| 682 Node index, |
| 683 ResolvedKindVisitor<R> visitor) { |
| 684 return visitor.visitOperatorSend(node); |
| 685 } |
| 686 |
| 687 @override |
| 688 R visitSuperIndex( |
| 689 Send node, |
| 690 FunctionElement function, |
| 691 Node index, |
| 692 ResolvedKindVisitor<R> visitor) { |
| 693 return visitor.visitSuperSend(node); |
| 694 } |
| 695 |
| 696 @override |
| 697 R errorUnresolvedSuperIndex( |
| 698 Send node, |
| 699 Element function, |
| 700 Node index, |
| 701 ResolvedKindVisitor<R> visitor) { |
| 702 return visitor.visitSuperSend(node); |
| 703 } |
| 704 } |
| OLD | NEW |