| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
| 4 | 4 |
| 5 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import "../elements/resolution_types.dart" | 7 import "../elements/resolution_types.dart" |
| 8 show ResolutionDartType, ResolutionInterfaceType; | 8 show ResolutionDartType, ResolutionInterfaceType; |
| 9 import "../elements/elements.dart" | 9 import "../elements/elements.dart" |
| 10 show | 10 show |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 import "kernel.dart" show Kernel; | 23 import "kernel.dart" show Kernel; |
| 24 | 24 |
| 25 abstract class UnresolvedVisitor { | 25 abstract class UnresolvedVisitor { |
| 26 Kernel get kernel; | 26 Kernel get kernel; |
| 27 | 27 |
| 28 // Implemented in KernelVisitor | 28 // Implemented in KernelVisitor |
| 29 AstElement get currentElement; | 29 AstElement get currentElement; |
| 30 bool get isVoidContext; | 30 bool get isVoidContext; |
| 31 ir.Arguments buildArguments(NodeList arguments); | 31 ir.Arguments buildArguments(NodeList arguments); |
| 32 ir.TreeNode visitForValue(Expression node); | 32 ir.TreeNode visitForValue(Expression node); |
| 33 void associateCompoundComponents(Accessor accessor, Node node); |
| 33 | 34 |
| 34 // TODO(ahe): Delete this method. | 35 // TODO(ahe): Delete this method. |
| 35 ir.InvalidExpression handleUnresolved(Node node); | 36 ir.InvalidExpression handleUnresolved(Node node); |
| 36 | 37 |
| 37 /// Similar to [Kernel.functionToIr] but returns null if [function] is a | 38 /// Similar to [Kernel.functionToIr] but returns null if [function] is a |
| 38 /// synthetic function created for error recovery. | 39 /// synthetic function created for error recovery. |
| 39 ir.Member possiblyErroneousFunctionToIr(FunctionElement function) { | 40 ir.Member possiblyErroneousFunctionToIr(FunctionElement function) { |
| 40 return kernel.isSyntheticError(function) | 41 return kernel.isSyntheticError(function) |
| 41 ? null | 42 ? null |
| 42 : kernel.functionToIr(function); | 43 : kernel.functionToIr(function); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 [ir.Procedure exceptionBuilder]) { | 118 [ir.Procedure exceptionBuilder]) { |
| 118 // TODO(asgerf): We should remove this fallback, but in some cases we do | 119 // TODO(asgerf): We should remove this fallback, but in some cases we do |
| 119 // not get sufficient information to determine exactly what kind of | 120 // not get sufficient information to determine exactly what kind of |
| 120 // setter it is. | 121 // setter it is. |
| 121 exceptionBuilder ??= kernel.getGenericNoSuchMethodBuilder(); | 122 exceptionBuilder ??= kernel.getGenericNoSuchMethodBuilder(); |
| 122 return buildThrowNoSuchMethodError(exceptionBuilder, new ir.NullLiteral(), | 123 return buildThrowNoSuchMethodError(exceptionBuilder, new ir.NullLiteral(), |
| 123 name, new ir.Arguments(<ir.Expression>[argument])); | 124 name, new ir.Arguments(<ir.Expression>[argument])); |
| 124 } | 125 } |
| 125 | 126 |
| 126 ir.Expression buildThrowUnresolvedSuperGetter(String name) { | 127 ir.Expression buildThrowUnresolvedSuperGetter(String name) { |
| 128 // TODO(sra): This is incorrect when the superclass defines noSuchMethod. |
| 127 return buildThrowNoSuchMethodError(kernel.getUnresolvedSuperGetterBuilder(), | 129 return buildThrowNoSuchMethodError(kernel.getUnresolvedSuperGetterBuilder(), |
| 128 new ir.ThisExpression(), name, new ir.Arguments.empty()); | 130 new ir.ThisExpression(), name, new ir.Arguments.empty()); |
| 129 } | 131 } |
| 130 | 132 |
| 131 ir.Expression buildThrowUnresolvedSuperSetter( | 133 ir.Expression buildThrowUnresolvedSuperSetter( |
| 132 String name, ir.Expression argument) { | 134 String name, ir.Expression argument) { |
| 133 return buildThrowNoSuchMethodError( | 135 return buildThrowNoSuchMethodError( |
| 134 kernel.getUnresolvedSuperSetterBuilder(), | 136 kernel.getUnresolvedSuperSetterBuilder(), |
| 135 new ir.ThisExpression(), | 137 new ir.ThisExpression(), |
| 136 name, | 138 name, |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 Node rhs, | 264 Node rhs, |
| 263 _) { | 265 _) { |
| 264 return buildThrowUnresolvedSetter('${node.selector}', visitForValue(rhs), | 266 return buildThrowUnresolvedSetter('${node.selector}', visitForValue(rhs), |
| 265 kernel.getUnresolvedStaticSetterBuilder()); | 267 kernel.getUnresolvedStaticSetterBuilder()); |
| 266 } | 268 } |
| 267 | 269 |
| 268 ir.Expression visitUnresolvedStaticSetterPostfix(Send node, | 270 ir.Expression visitUnresolvedStaticSetterPostfix(Send node, |
| 269 MethodElement getter, Element element, IncDecOperator operator, _) { | 271 MethodElement getter, Element element, IncDecOperator operator, _) { |
| 270 var accessor = new ClassStaticAccessor( | 272 var accessor = new ClassStaticAccessor( |
| 271 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 273 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
| 272 return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName), | 274 var result = accessor.buildPostfixIncrement( |
| 275 new ir.Name(operator.selectorName), |
| 273 voidContext: isVoidContext); | 276 voidContext: isVoidContext); |
| 277 associateCompoundComponents(accessor, node); |
| 278 return result; |
| 274 } | 279 } |
| 275 | 280 |
| 276 ir.Expression visitUnresolvedStaticSetterPrefix(Send node, | 281 ir.Expression visitUnresolvedStaticSetterPrefix(Send node, |
| 277 MethodElement getter, Element element, IncDecOperator operator, _) { | 282 MethodElement getter, Element element, IncDecOperator operator, _) { |
| 278 var accessor = new ClassStaticAccessor( | 283 var accessor = new ClassStaticAccessor( |
| 279 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 284 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
| 280 return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName), | 285 var result = accessor.buildPrefixIncrement( |
| 286 new ir.Name(operator.selectorName), |
| 281 voidContext: isVoidContext); | 287 voidContext: isVoidContext); |
| 288 associateCompoundComponents(accessor, node); |
| 289 return result; |
| 282 } | 290 } |
| 283 | 291 |
| 284 ir.Expression visitUnresolvedStaticSetterSetIfNull( | 292 ir.Expression visitUnresolvedStaticSetterSetIfNull( |
| 285 Send node, MethodElement getter, Element element, Node rhs, _) { | 293 Send node, MethodElement getter, Element element, Node rhs, _) { |
| 286 var accessor = new ClassStaticAccessor( | 294 var accessor = new ClassStaticAccessor( |
| 287 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 295 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
| 288 return accessor.buildNullAwareAssignment(visitForValue(rhs), null, | 296 return accessor.buildNullAwareAssignment(visitForValue(rhs), null, |
| 289 voidContext: isVoidContext); | 297 voidContext: isVoidContext); |
| 290 } | 298 } |
| 291 | 299 |
| 292 ir.Expression visitUnresolvedSuperBinary( | 300 ir.Expression visitUnresolvedSuperBinary( |
| 293 Send node, Element element, BinaryOperator operator, Node argument, _) { | 301 Send node, Element element, BinaryOperator operator, Node argument, _) { |
| 302 // TODO(sra): This is incorrect when the superclass defines noSuchMethod. |
| 294 return buildThrowNoSuchMethodError( | 303 return buildThrowNoSuchMethodError( |
| 295 kernel.getUnresolvedSuperMethodBuilder(), | 304 kernel.getUnresolvedSuperMethodBuilder(), |
| 296 new ir.ThisExpression(), | 305 new ir.ThisExpression(), |
| 297 operator.selectorName, | 306 operator.selectorName, |
| 298 new ir.Arguments(<ir.Expression>[visitForValue(argument)])); | 307 new ir.Arguments(<ir.Expression>[visitForValue(argument)])); |
| 299 } | 308 } |
| 300 | 309 |
| 301 ir.Expression visitUnresolvedSuperCompound( | 310 ir.Expression visitUnresolvedSuperCompound( |
| 302 Send node, Element element, AssignmentOperator operator, Node rhs, _) { | 311 Send node, Element element, AssignmentOperator operator, Node rhs, _) { |
| 303 return buildThrowUnresolvedSuperGetter('${node.selector}'); | 312 return buildThrowUnresolvedSuperGetter('${node.selector}'); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 | 523 |
| 515 ir.Expression visitUnresolvedTopLevelSetterCompound( | 524 ir.Expression visitUnresolvedTopLevelSetterCompound( |
| 516 Send node, | 525 Send node, |
| 517 MethodElement getter, | 526 MethodElement getter, |
| 518 Element element, | 527 Element element, |
| 519 AssignmentOperator operator, | 528 AssignmentOperator operator, |
| 520 Node rhs, | 529 Node rhs, |
| 521 _) { | 530 _) { |
| 522 var accessor = new TopLevelStaticAccessor( | 531 var accessor = new TopLevelStaticAccessor( |
| 523 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 532 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
| 524 return accessor.buildCompoundAssignment( | 533 var result = accessor.buildCompoundAssignment( |
| 525 new ir.Name(operator.selectorName), visitForValue(rhs), | 534 new ir.Name(operator.selectorName), visitForValue(rhs), |
| 526 voidContext: isVoidContext); | 535 voidContext: isVoidContext); |
| 536 associateCompoundComponents(accessor, node); |
| 537 return result; |
| 527 } | 538 } |
| 528 | 539 |
| 529 ir.Expression visitUnresolvedTopLevelSetterPostfix(Send node, | 540 ir.Expression visitUnresolvedTopLevelSetterPostfix(Send node, |
| 530 MethodElement getter, Element element, IncDecOperator operator, _) { | 541 MethodElement getter, Element element, IncDecOperator operator, _) { |
| 531 var accessor = new TopLevelStaticAccessor( | 542 var accessor = new TopLevelStaticAccessor( |
| 532 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 543 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
| 533 return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName), | 544 var result = accessor.buildPostfixIncrement( |
| 545 new ir.Name(operator.selectorName), |
| 534 voidContext: isVoidContext); | 546 voidContext: isVoidContext); |
| 547 associateCompoundComponents(accessor, node); |
| 548 return result; |
| 535 } | 549 } |
| 536 | 550 |
| 537 ir.Expression visitUnresolvedTopLevelSetterPrefix(Send node, | 551 ir.Expression visitUnresolvedTopLevelSetterPrefix(Send node, |
| 538 MethodElement getter, Element element, IncDecOperator operator, _) { | 552 MethodElement getter, Element element, IncDecOperator operator, _) { |
| 539 var accessor = new TopLevelStaticAccessor( | 553 var accessor = new TopLevelStaticAccessor( |
| 540 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 554 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
| 541 return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName), | 555 var result = accessor.buildPrefixIncrement( |
| 556 new ir.Name(operator.selectorName), |
| 542 voidContext: isVoidContext); | 557 voidContext: isVoidContext); |
| 558 associateCompoundComponents(accessor, node); |
| 559 return result; |
| 543 } | 560 } |
| 544 | 561 |
| 545 ir.Expression visitUnresolvedTopLevelSetterSetIfNull( | 562 ir.Expression visitUnresolvedTopLevelSetterSetIfNull( |
| 546 Send node, MethodElement getter, Element element, Node rhs, _) { | 563 Send node, MethodElement getter, Element element, Node rhs, _) { |
| 547 var accessor = new TopLevelStaticAccessor( | 564 var accessor = new TopLevelStaticAccessor( |
| 548 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 565 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
| 549 return accessor.buildNullAwareAssignment(visitForValue(rhs), null, | 566 return accessor.buildNullAwareAssignment(visitForValue(rhs), null, |
| 550 voidContext: isVoidContext); | 567 voidContext: isVoidContext); |
| 551 } | 568 } |
| 552 | 569 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 567 return buildUnresolvedSuperIndexAccessor(index, element) | 584 return buildUnresolvedSuperIndexAccessor(index, element) |
| 568 .buildNullAwareAssignment(visitForValue(rhs), null); | 585 .buildNullAwareAssignment(visitForValue(rhs), null); |
| 569 } | 586 } |
| 570 | 587 |
| 571 ir.Expression visitUnresolvedSuperSet( | 588 ir.Expression visitUnresolvedSuperSet( |
| 572 Send node, Element element, Node rhs, _) { | 589 Send node, Element element, Node rhs, _) { |
| 573 return buildThrowUnresolvedSuperSetter( | 590 return buildThrowUnresolvedSuperSetter( |
| 574 '${node.selector}', visitForValue(rhs)); | 591 '${node.selector}', visitForValue(rhs)); |
| 575 } | 592 } |
| 576 } | 593 } |
| OLD | NEW |