| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 library dart2js.kernel.env; | 5 library dart2js.kernel.env; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
| 8 import 'package:kernel/clone.dart'; | 8 import 'package:kernel/clone.dart'; |
| 9 import 'package:kernel/type_algebra.dart'; | 9 import 'package:kernel/type_algebra.dart'; |
| 10 | 10 |
| (...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 | 558 |
| 559 @override | 559 @override |
| 560 ConstructorData copy() { | 560 ConstructorData copy() { |
| 561 return new ConstructorDataImpl(node, functionNode, definition); | 561 return new ConstructorDataImpl(node, functionNode, definition); |
| 562 } | 562 } |
| 563 } | 563 } |
| 564 | 564 |
| 565 abstract class FieldData extends MemberData { | 565 abstract class FieldData extends MemberData { |
| 566 DartType getFieldType(KernelToElementMap elementMap); | 566 DartType getFieldType(KernelToElementMap elementMap); |
| 567 | 567 |
| 568 ConstantExpression getFieldConstant( | 568 ConstantExpression getFieldConstantExpression( |
| 569 KernelToElementMapBase elementMap, FieldEntity field); | 569 KernelToElementMapBase elementMap); |
| 570 |
| 571 /// Return the [ConstantValue] the initial value of [field] or `null` if |
| 572 /// the initializer is not a constant expression. |
| 573 ConstantValue getFieldConstantValue(KernelToElementMapBase elementMap); |
| 574 |
| 575 bool hasConstantFieldInitializer(KernelToElementMapBase elementMap); |
| 576 |
| 577 ConstantValue getConstantFieldInitializer(KernelToElementMapBase elementMap); |
| 570 } | 578 } |
| 571 | 579 |
| 572 class FieldDataImpl extends MemberDataImpl implements FieldData { | 580 class FieldDataImpl extends MemberDataImpl implements FieldData { |
| 573 DartType _type; | 581 DartType _type; |
| 574 ConstantExpression _constant; | 582 bool _isConstantComputed = false; |
| 583 ConstantValue _constantValue; |
| 584 ConstantExpression _constantExpression; |
| 575 | 585 |
| 576 FieldDataImpl(ir.Field node, MemberDefinition definition) | 586 FieldDataImpl(ir.Field node, MemberDefinition definition) |
| 577 : super(node, definition); | 587 : super(node, definition); |
| 578 | 588 |
| 579 ir.Field get node => super.node; | 589 ir.Field get node => super.node; |
| 580 | 590 |
| 581 DartType getFieldType(covariant KernelToElementMapBase elementMap) { | 591 DartType getFieldType(covariant KernelToElementMapBase elementMap) { |
| 582 return _type ??= elementMap.getDartType(node.type); | 592 return _type ??= elementMap.getDartType(node.type); |
| 583 } | 593 } |
| 584 | 594 |
| 585 ConstantExpression getFieldConstant( | 595 ConstantExpression getFieldConstantExpression( |
| 586 KernelToElementMapBase elementMap, FieldEntity field) { | 596 KernelToElementMapBase elementMap) { |
| 587 if (_constant == null) { | 597 if (_constantExpression == null) { |
| 588 if (node.isConst) { | 598 if (node.isConst) { |
| 589 _constant = new Constantifier(elementMap).visit(node.initializer); | 599 _constantExpression = |
| 600 new Constantifier(elementMap).visit(node.initializer); |
| 590 } else { | 601 } else { |
| 591 failedAt( | 602 failedAt( |
| 592 field, | 603 definition.member, |
| 593 "Unexpected field $field in " | 604 "Unexpected field ${definition.member} in " |
| 594 "FieldDataImpl.getFieldConstant"); | 605 "FieldDataImpl.getFieldConstant"); |
| 595 } | 606 } |
| 596 } | 607 } |
| 597 return _constant; | 608 return _constantExpression; |
| 598 } | 609 } |
| 599 | 610 |
| 600 @override | 611 @override |
| 612 ConstantValue getFieldConstantValue(KernelToElementMapBase elementMap) { |
| 613 if (!_isConstantComputed) { |
| 614 _constantValue = elementMap.getConstantValue(node.initializer, |
| 615 requireConstant: node.isConst, implicitNull: !node.isConst); |
| 616 _isConstantComputed = true; |
| 617 } |
| 618 return _constantValue; |
| 619 } |
| 620 |
| 621 @override |
| 622 bool hasConstantFieldInitializer(KernelToElementMapBase elementMap) { |
| 623 return getFieldConstantValue(elementMap) != null; |
| 624 } |
| 625 |
| 626 @override |
| 627 ConstantValue getConstantFieldInitializer(KernelToElementMapBase elementMap) { |
| 628 ConstantValue value = getFieldConstantValue(elementMap); |
| 629 assert( |
| 630 value != null, |
| 631 failedAt(definition.member, |
| 632 "Field ${definition.member} doesn't have a constant initial value.")
); |
| 633 return value; |
| 634 } |
| 635 |
| 636 @override |
| 601 FieldData copy() { | 637 FieldData copy() { |
| 602 return new FieldDataImpl(node, definition); | 638 return new FieldDataImpl(node, definition); |
| 603 } | 639 } |
| 604 } | 640 } |
| 605 | 641 |
| 606 class TypedefData { | 642 class TypedefData { |
| 607 final ir.Typedef node; | 643 final ir.Typedef node; |
| 608 final TypedefEntity element; | 644 final TypedefEntity element; |
| 609 final TypedefType rawType; | 645 final TypedefType rawType; |
| 610 | 646 |
| 611 TypedefData(this.node, this.element, this.rawType); | 647 TypedefData(this.node, this.element, this.rawType); |
| 612 } | 648 } |
| OLD | NEW |