OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.semantics_visitor; | 5 part of dart2js.semantics_visitor; |
6 | 6 |
7 enum SendStructureKind { | 7 enum SendStructureKind { |
8 GET, | 8 GET, |
9 SET, | 9 SET, |
10 INVOKE, | 10 INVOKE, |
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 return new ConstructorAccessSemantics( | 448 return new ConstructorAccessSemantics( |
449 ConstructorAccessKind.ABSTRACT, constructor, type); | 449 ConstructorAccessKind.ABSTRACT, constructor, type); |
450 } else { | 450 } else { |
451 return new ConstructorAccessSemantics( | 451 return new ConstructorAccessSemantics( |
452 ConstructorAccessKind.GENERATIVE, constructor, type); | 452 ConstructorAccessKind.GENERATIVE, constructor, type); |
453 } | 453 } |
454 } | 454 } |
455 | 455 |
456 NewStructure computeNewStructure(NewExpression node) { | 456 NewStructure computeNewStructure(NewExpression node) { |
457 if (node.isConst) { | 457 if (node.isConst) { |
458 return new ConstInvokeStructure(elements.getConstant(node)); | 458 ConstantExpression constant = elements.getConstant(node); |
| 459 if (constant is ConstructedConstantExpression) { |
| 460 return new ConstInvokeStructure(constant); |
| 461 } |
459 } | 462 } |
| 463 |
460 Element element = elements[node.send]; | 464 Element element = elements[node.send]; |
461 Selector selector = elements.getSelector(node.send); | 465 Selector selector = elements.getSelector(node.send); |
462 DartType type = elements.getType(node); | 466 DartType type = elements.getType(node); |
463 | 467 |
464 ConstructorAccessSemantics constructorAccessSemantics = | 468 ConstructorAccessSemantics constructorAccessSemantics; |
465 computeConstructorAccessSemantics(element, type); | 469 if (node.isConst) { |
| 470 // This is a non-constant constant constructor invocation, like |
| 471 // `const Const(method())`. |
| 472 constructorAccessSemantics = new ConstructorAccessSemantics( |
| 473 ConstructorAccessKind.ERRONEOUS, element, type); |
| 474 } else { |
| 475 constructorAccessSemantics = |
| 476 computeConstructorAccessSemantics(element, type); |
| 477 } |
466 return new NewInvokeStructure(constructorAccessSemantics, selector); | 478 return new NewInvokeStructure(constructorAccessSemantics, selector); |
467 } | 479 } |
468 } | 480 } |
469 | 481 |
470 abstract class DeclStructure<R, A> { | 482 abstract class DeclStructure<R, A> { |
471 final FunctionElement element; | 483 final FunctionElement element; |
472 | 484 |
473 DeclStructure(this.element); | 485 DeclStructure(this.element); |
474 | 486 |
475 /// Calls the matching visit method on [visitor] with [node] and [arg]. | 487 /// Calls the matching visit method on [visitor] with [node] and [arg]. |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 return internalError(node, "Unexpected variable $element."); | 778 return internalError(node, "Unexpected variable $element."); |
767 } | 779 } |
768 if (element.isConst) { | 780 if (element.isConst) { |
769 ConstantExpression constant = elements.getConstant(element.initializer); | 781 ConstantExpression constant = elements.getConstant(element.initializer); |
770 return new ConstantVariableStructure(kind, node, element, constant); | 782 return new ConstantVariableStructure(kind, node, element, constant); |
771 } else { | 783 } else { |
772 return new NonConstantVariableStructure(kind, node, element); | 784 return new NonConstantVariableStructure(kind, node, element); |
773 } | 785 } |
774 } | 786 } |
775 } | 787 } |
OLD | NEW |