| 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 /// Enum for the visit methods added in [ResolvedVisitor]. | 7 /// Enum for the visit methods added in [ResolvedVisitor]. |
| 8 // TODO(johnniwinther): Remove this. | 8 // TODO(johnniwinther): Remove this. |
| 9 enum ResolvedKind { | 9 enum ResolvedKind { |
| 10 ASSERT, | 10 ASSERT, |
| 11 TYPE_LITERAL, | 11 TYPE_LITERAL, |
| 12 SUPER, | 12 SUPER, |
| 13 OPERATOR, | 13 OPERATOR, |
| 14 TYPE_PREFIX, | 14 TYPE_PREFIX, |
| 15 GETTER, | 15 GETTER, |
| 16 STATIC, | 16 STATIC, |
| 17 CLOSURE, | 17 CLOSURE, |
| 18 DYNAMIC, | 18 DYNAMIC, |
| 19 ERROR, | 19 ERROR, |
| 20 SEND_SET, |
| 21 NEW, |
| 20 } | 22 } |
| 21 | 23 |
| 22 /// Abstract interface for a [ResolvedVisitor]. | 24 /// Abstract interface for a [ResolvedVisitor]. |
| 23 // TODO(johnniwinther): Remove this. | 25 // TODO(johnniwinther): Remove this. |
| 24 abstract class ResolvedKindVisitor<R> { | 26 abstract class ResolvedKindVisitor<R> { |
| 25 R visitSuperSend(Send node); | 27 R visitSuperSend(Send node); |
| 26 R visitOperatorSend(Send node); | 28 R visitOperatorSend(Send node); |
| 27 R visitGetterSend(Send node); | 29 R visitGetterSend(Send node); |
| 28 R visitClosureSend(Send node); | 30 R visitClosureSend(Send node); |
| 29 R visitDynamicSend(Send node); | 31 R visitDynamicSend(Send node); |
| 30 R visitStaticSend(Send node); | 32 R visitStaticSend(Send node); |
| 33 R handleSendSet(SendSet node); |
| 34 R handleNewExpression(NewExpression node); |
| 31 | 35 |
| 32 /// Visitor callback for a type literal. | 36 /// Visitor callback for a type literal. |
| 33 R visitTypeLiteralSend(Send node); | 37 R visitTypeLiteralSend(Send node); |
| 34 | 38 |
| 35 /// Visitor callback for the class prefix of a static access, like `Foo` in | 39 /// Visitor callback for the class prefix of a static access, like `Foo` in |
| 36 /// `Foo.staticField`. | 40 /// `Foo.staticField`. |
| 37 // TODO(johnniwinther): Remove this when not needed by the dart backend. | 41 // TODO(johnniwinther): Remove this when not needed by the dart backend. |
| 38 R visitTypePrefixSend(Send node); | 42 R visitTypePrefixSend(Send node); |
| 39 | 43 |
| 40 R visitAssertSend(Send node); | 44 R visitAssertSend(Send node); |
| 41 | 45 |
| 42 internalError(Spannable node, String reason); | 46 internalError(Spannable node, String reason); |
| 43 } | 47 } |
| 44 | 48 |
| 45 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor | 49 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor |
| 46 /// method. | 50 /// method. |
| 47 class ResolvedKindComputer implements ResolvedKindVisitor { | 51 class ResolvedKindComputer implements ResolvedKindVisitor { |
| 48 const ResolvedKindComputer(); | 52 const ResolvedKindComputer(); |
| 49 | 53 |
| 50 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; | 54 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; |
| 51 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; | 55 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; |
| 52 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; | 56 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; |
| 53 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; | 57 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; |
| 54 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; | 58 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; |
| 55 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; | 59 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; |
| 56 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; | 60 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; |
| 57 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; | 61 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; |
| 58 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; | 62 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; |
| 63 ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET; |
| 64 ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW; |
| 59 internalError(Spannable node, String reason) => ResolvedKind.ERROR; | 65 internalError(Spannable node, String reason) => ResolvedKind.ERROR; |
| 60 } | 66 } |
| 61 | 67 |
| 62 abstract class ResolvedVisitor<R> | 68 abstract class ResolvedVisitor<R> |
| 63 implements Visitor<R>, ResolvedKindVisitor<R> {} | 69 implements Visitor<R>, ResolvedKindVisitor<R> {} |
| 64 | 70 |
| 65 abstract class BaseResolvedVisitor<R> extends Visitor<R> | 71 abstract class BaseResolvedVisitor<R> extends Visitor<R> |
| 66 implements ResolvedVisitor<R> { | 72 implements ResolvedVisitor<R> { |
| 67 | 73 |
| 68 TreeElements elements; | 74 TreeElements elements; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 } | 129 } |
| 124 | 130 |
| 125 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart | 131 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart |
| 126 // backend. | 132 // backend. |
| 127 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> { | 133 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> { |
| 128 OldResolvedVisitor(TreeElements elements) : super(elements); | 134 OldResolvedVisitor(TreeElements elements) : super(elements); |
| 129 | 135 |
| 130 R visitSend(Send node) { | 136 R visitSend(Send node) { |
| 131 return _oldDispatch(node, this); | 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 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> | 149 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> |
| 136 with SendResolverMixin, | 150 with SendResolverMixin, |
| 137 GetBulkMixin<R, dynamic>, | 151 GetBulkMixin<R, dynamic>, |
| 138 SetBulkMixin<R, dynamic>, | 152 SetBulkMixin<R, dynamic>, |
| 139 ErrorBulkMixin<R, dynamic>, | 153 ErrorBulkMixin<R, dynamic>, |
| 140 InvokeBulkMixin<R, dynamic>, | 154 InvokeBulkMixin<R, dynamic>, |
| 141 IndexSetBulkMixin<R, dynamic>, | 155 IndexSetBulkMixin<R, dynamic>, |
| 142 CompoundBulkMixin<R, dynamic>, | 156 CompoundBulkMixin<R, dynamic>, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 if (sendStructure != null) { | 192 if (sendStructure != null) { |
| 179 var arg = sendVisitor == _resolvedKindDispatcher | 193 var arg = sendVisitor == _resolvedKindDispatcher |
| 180 ? kindVisitor : sendStructure; | 194 ? kindVisitor : sendStructure; |
| 181 return sendStructure.dispatch(sendVisitor, node, arg); | 195 return sendStructure.dispatch(sendVisitor, node, arg); |
| 182 } else { | 196 } else { |
| 183 return kindVisitor.visitStaticSend(node); | 197 return kindVisitor.visitStaticSend(node); |
| 184 } | 198 } |
| 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 R visitSend(Send node) { | 215 R visitSend(Send node) { |
| 189 ResolvedKind oldKind; | 216 assert(checkResolvedKind( |
| 190 ResolvedKind newKind; | 217 node, |
| 191 assert(invariant(node, () { | 218 _oldDispatch(node, const ResolvedKindComputer()), |
| 192 oldKind = _oldDispatch(node, const ResolvedKindComputer()); | 219 _newDispatch(node, const ResolvedKindComputer(), |
| 193 newKind = _newDispatch( | 220 _resolvedKindDispatcher))); |
| 194 node, const ResolvedKindComputer(), _resolvedKindDispatcher); | |
| 195 return oldKind == newKind; | |
| 196 }, message: () => '$oldKind != $newKind')); | |
| 197 return _newDispatch(node, this, this); | 221 return _newDispatch(node, this, this); |
| 198 } | 222 } |
| 199 | 223 |
| 200 @override | 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 |
| 250 @override |
| 201 R apply(Node node, arg) { | 251 R apply(Node node, arg) { |
| 202 return visitNode(node); | 252 return visitNode(node); |
| 203 } | 253 } |
| 204 | 254 |
| 205 @override | 255 @override |
| 206 R bulkHandleNode( | 256 R bulkHandleNode( |
| 207 Node node, | 257 Node node, |
| 208 String message, | 258 String message, |
| 209 SendStructure sendStructure) { | 259 SemanticSendStructure structure) { |
| 210 return sendStructure.dispatch(_semanticDispatcher, node, this); | 260 return structure.dispatch(_semanticDispatcher, node, this); |
| 211 } | 261 } |
| 212 } | 262 } |
| 213 | 263 |
| 214 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding | 264 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding |
| 215 /// visit methods in [ResolvedVisitor]. | 265 /// visit methods in [ResolvedVisitor]. |
| 216 class ResolvedSemanticDispatcher<R> extends Object | 266 class ResolvedSemanticDispatcher<R> extends Object |
| 217 with GetBulkMixin<R, ResolvedKindVisitor<R>>, | 267 with GetBulkMixin<R, ResolvedKindVisitor<R>>, |
| 218 SetBulkMixin<R, ResolvedKindVisitor<R>>, | 268 SetBulkMixin<R, ResolvedKindVisitor<R>>, |
| 219 InvokeBulkMixin<R, ResolvedKindVisitor<R>>, | 269 InvokeBulkMixin<R, ResolvedKindVisitor<R>>, |
| 220 PrefixBulkMixin<R, ResolvedKindVisitor<R>>, | 270 PrefixBulkMixin<R, ResolvedKindVisitor<R>>, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 232 R apply(Node node, ResolvedKindVisitor<R> visitor) { | 282 R apply(Node node, ResolvedKindVisitor<R> visitor) { |
| 233 return visitor.internalError( | 283 return visitor.internalError( |
| 234 node, "ResolvedSemanticDispatcher.apply unsupported."); | 284 node, "ResolvedSemanticDispatcher.apply unsupported."); |
| 235 } | 285 } |
| 236 | 286 |
| 237 @override | 287 @override |
| 238 R bulkHandleNode( | 288 R bulkHandleNode( |
| 239 Node node, | 289 Node node, |
| 240 String message, | 290 String message, |
| 241 ResolvedKindVisitor<R> visitor) { | 291 ResolvedKindVisitor<R> visitor) { |
| 242 // Set, Compound, IndexSet, and NewExpression are not handled by | |
| 243 // [ResolvedVisitor]. | |
| 244 return bulkHandleError(node, visitor); | 292 return bulkHandleError(node, visitor); |
| 245 } | 293 } |
| 246 | 294 |
| 247 R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) { | 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 @override | 304 @override |
| 252 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) { | 305 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) { |
| 253 return visitor.visitGetterSend(node); | 306 return visitor.visitGetterSend(node); |
| 254 } | 307 } |
| 255 | 308 |
| 256 @override | 309 @override |
| 257 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) { | 310 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) { |
| 258 // Most invokes are static. | 311 // Most invokes are static. |
| 259 return visitor.visitStaticSend(node); | 312 return visitor.visitStaticSend(node); |
| 260 } | 313 } |
| 261 | 314 |
| 262 @override | 315 @override |
| 263 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) { | 316 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) { |
| 264 return visitor.visitOperatorSend(node); | 317 return visitor.handleSendSet(node); |
| 265 } | 318 } |
| 266 | 319 |
| 267 @override | 320 @override |
| 268 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) { | 321 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) { |
| 269 return visitor.visitOperatorSend(node); | 322 return visitor.handleSendSet(node); |
| 270 } | 323 } |
| 271 | 324 |
| 272 @override | 325 @override |
| 273 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) { | 326 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) { |
| 327 if (node.asSendSet() != null) { |
| 328 return visitor.handleSendSet(node); |
| 329 } |
| 274 return visitor.visitSuperSend(node); | 330 return visitor.visitSuperSend(node); |
| 275 } | 331 } |
| 276 | 332 |
| 277 @override | 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 |
| 353 @override |
| 278 R errorInvalidAssert( | 354 R errorInvalidAssert( |
| 279 Send node, | 355 Send node, |
| 280 NodeList arguments, | 356 NodeList arguments, |
| 281 ResolvedKindVisitor<R> visitor) { | 357 ResolvedKindVisitor<R> visitor) { |
| 282 return visitor.visitAssertSend(node); | 358 return visitor.visitAssertSend(node); |
| 283 } | 359 } |
| 284 | 360 |
| 285 @override | 361 @override |
| 286 R errorLocalFunctionPostfix( | 362 R errorLocalFunctionPostfix( |
| 287 Send node, | 363 Send node, |
| 288 LocalFunctionElement function, | 364 LocalFunctionElement function, |
| 289 op.IncDecOperator operator, | 365 op.IncDecOperator operator, |
| 290 ResolvedKindVisitor<R> visitor) { | 366 ResolvedKindVisitor<R> visitor) { |
| 291 return visitor.visitOperatorSend(node); | 367 return visitor.handleSendSet(node); |
| 292 } | 368 } |
| 293 | 369 |
| 294 @override | 370 @override |
| 295 R errorLocalFunctionPrefix( | 371 R errorLocalFunctionPrefix( |
| 296 Send node, | 372 Send node, |
| 297 LocalFunctionElement function, | 373 LocalFunctionElement function, |
| 298 op.IncDecOperator operator, | 374 op.IncDecOperator operator, |
| 299 ResolvedKindVisitor<R> visitor) { | 375 ResolvedKindVisitor<R> visitor) { |
| 300 return visitor.visitOperatorSend(node); | 376 return visitor.handleSendSet(node); |
| 301 } | 377 } |
| 302 | 378 |
| 303 @override | 379 @override |
| 304 R errorStaticSetterGet( | 380 R errorStaticSetterGet( |
| 305 Send node, | 381 Send node, |
| 306 FunctionElement setter, | 382 FunctionElement setter, |
| 307 ResolvedKindVisitor<R> visitor) { | 383 ResolvedKindVisitor<R> visitor) { |
| 308 return visitor.visitGetterSend(node); | 384 return visitor.visitGetterSend(node); |
| 309 } | 385 } |
| 310 | 386 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 } | 472 } |
| 397 return visitor.visitStaticSend(node); | 473 return visitor.visitStaticSend(node); |
| 398 } | 474 } |
| 399 | 475 |
| 400 @override | 476 @override |
| 401 R errorUnresolvedPostfix( | 477 R errorUnresolvedPostfix( |
| 402 Send node, | 478 Send node, |
| 403 Element element, | 479 Element element, |
| 404 op.IncDecOperator operator, | 480 op.IncDecOperator operator, |
| 405 ResolvedKindVisitor<R> visitor) { | 481 ResolvedKindVisitor<R> visitor) { |
| 406 if (node.isSuperCall) { | 482 return visitor.handleSendSet(node); |
| 407 return visitor.visitSuperSend(node); | |
| 408 } | |
| 409 return visitor.visitOperatorSend(node); | |
| 410 } | 483 } |
| 411 | 484 |
| 412 @override | 485 @override |
| 413 R errorUnresolvedPrefix( | 486 R errorUnresolvedPrefix( |
| 414 Send node, | 487 Send node, |
| 415 Element element, | 488 Element element, |
| 416 op.IncDecOperator operator, | 489 op.IncDecOperator operator, |
| 417 ResolvedKindVisitor<R> visitor) { | 490 ResolvedKindVisitor<R> visitor) { |
| 418 if (node.isSuperCall) { | 491 return visitor.handleSendSet(node); |
| 419 return visitor.visitSuperSend(node); | |
| 420 } | |
| 421 return visitor.visitOperatorSend(node); | |
| 422 } | 492 } |
| 423 | 493 |
| 424 @override | 494 @override |
| 425 R errorUnresolvedSuperBinary( | 495 R errorUnresolvedSuperBinary( |
| 426 Send node, | 496 Send node, |
| 427 Element element, | 497 Element element, |
| 428 op.BinaryOperator operator, | 498 op.BinaryOperator operator, |
| 429 Node argument, | 499 Node argument, |
| 430 ResolvedKindVisitor<R> visitor) { | 500 ResolvedKindVisitor<R> visitor) { |
| 431 return visitor.visitSuperSend(node); | 501 return visitor.visitSuperSend(node); |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 | 768 |
| 699 @override | 769 @override |
| 700 R errorUnresolvedSuperIndex( | 770 R errorUnresolvedSuperIndex( |
| 701 Send node, | 771 Send node, |
| 702 Element function, | 772 Element function, |
| 703 Node index, | 773 Node index, |
| 704 ResolvedKindVisitor<R> visitor) { | 774 ResolvedKindVisitor<R> visitor) { |
| 705 return visitor.visitSuperSend(node); | 775 return visitor.visitSuperSend(node); |
| 706 } | 776 } |
| 707 } | 777 } |
| OLD | NEW |