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.element_map; | 5 library dart2js.kernel.element_map; |
6 | 6 |
7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
8 | 8 |
9 import '../common.dart'; | 9 import '../common.dart'; |
10 import '../common/names.dart' show Identifiers; | 10 import '../common/names.dart' show Identifiers; |
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
965 with | 965 with |
966 KernelToElementMapForImpactMixin, | 966 KernelToElementMapForImpactMixin, |
967 KernelToElementMapForImpactImpl, | 967 KernelToElementMapForImpactImpl, |
968 ElementCreatorMixin, | 968 ElementCreatorMixin, |
969 KElementCreatorMixin { | 969 KElementCreatorMixin { |
970 KernelToElementMapForImpactImpl2( | 970 KernelToElementMapForImpactImpl2( |
971 DiagnosticReporter reporter, Environment environment) | 971 DiagnosticReporter reporter, Environment environment) |
972 : super(reporter, environment); | 972 : super(reporter, environment); |
973 } | 973 } |
974 | 974 |
975 /// Element builder used for creating elements and types corresponding to Kernel | 975 abstract class KernelToElementMapForBuildingFromBaseMixin |
Siggi Cherem (dart-lang)
2017/07/05 20:49:05
I think I lost you somewhere after Map...
Is the
Johnni Winther
2017/07/06 14:23:51
`FromBase` was an attempt. It's shared between tho
| |
976 /// IR nodes. | 976 implements KernelToElementMapForBuilding, KernelToElementMapBase { |
977 // TODO(johnniwinther): Use this in the JsStrategy | |
978 class KernelToElementMapForBuildingImpl extends KernelToElementMapBase | |
979 with | |
980 KernelToElementMapForBuildingMixin, | |
981 ElementCreatorMixin, | |
982 KElementCreatorMixin | |
983 implements KernelToWorldBuilder { | |
984 KernelToElementMapForBuildingImpl( | |
985 DiagnosticReporter reporter, Environment environment) | |
986 : super(reporter, environment); | |
987 | |
988 ConstantEnvironment get constantEnvironment => _constantEnvironment; | |
989 | |
990 @override | 977 @override |
991 ConstantValue getFieldConstantValue(ir.Field field) { | 978 ConstantValue getFieldConstantValue(ir.Field field) { |
992 // TODO(johnniwinther): Cache the result in [FieldData]. | 979 // TODO(johnniwinther): Cache the result in [FieldData]. |
993 return getConstantValue(field.initializer, | 980 return getConstantValue(field.initializer, |
994 requireConstant: field.isConst, implicitNull: !field.isConst); | 981 requireConstant: field.isConst, implicitNull: !field.isConst); |
995 } | 982 } |
996 | 983 |
997 ir.Library getKernelLibrary(KLibrary entity) => | 984 bool hasConstantFieldInitializer(covariant IndexedField field) { |
998 _libraryEnvs[entity.libraryIndex].library; | |
999 | |
1000 ir.Class getKernelClass(KClass entity) => _classEnvs[entity.classIndex].cls; | |
1001 | |
1002 bool hasConstantFieldInitializer(covariant KField field) { | |
1003 FieldData data = _memberData[field.memberIndex]; | 985 FieldData data = _memberData[field.memberIndex]; |
1004 return getFieldConstantValue(data.node) != null; | 986 return getFieldConstantValue(data.node) != null; |
1005 } | 987 } |
1006 | 988 |
1007 ConstantValue getConstantFieldInitializer(covariant KField field) { | 989 ConstantValue getConstantFieldInitializer(covariant IndexedField field) { |
1008 FieldData data = _memberData[field.memberIndex]; | 990 FieldData data = _memberData[field.memberIndex]; |
1009 ConstantValue value = getFieldConstantValue(data.node); | 991 ConstantValue value = getFieldConstantValue(data.node); |
1010 assert(value != null, | 992 assert(value != null, |
1011 failedAt(field, "Field $field doesn't have a constant initial value.")); | 993 failedAt(field, "Field $field doesn't have a constant initial value.")); |
1012 return value; | 994 return value; |
1013 } | 995 } |
1014 | 996 |
1015 void forEachParameter(covariant KFunction function, | 997 void forEachParameter(covariant IndexedFunction function, |
1016 void f(DartType type, String name, ConstantValue defaultValue)) { | 998 void f(DartType type, String name, ConstantValue defaultValue)) { |
1017 FunctionData data = _memberData[function.memberIndex]; | 999 FunctionData data = _memberData[function.memberIndex]; |
1018 data.forEachParameter(this, f); | 1000 data.forEachParameter(this, f); |
1019 } | 1001 } |
1002 } | |
1003 | |
1004 /// Element builder used for creating elements and types corresponding to Kernel | |
1005 /// IR nodes. | |
1006 // TODO(johnniwinther): Use this in the JsStrategy | |
1007 class KernelToElementMapForBuildingImpl extends KernelToElementMapBase | |
1008 with | |
1009 KernelToElementMapForBuildingMixin, | |
1010 KernelToElementMapForBuildingFromBaseMixin, | |
1011 ElementCreatorMixin, | |
1012 KElementCreatorMixin | |
1013 implements KernelToWorldBuilder { | |
1014 KernelToElementMapForBuildingImpl( | |
1015 DiagnosticReporter reporter, Environment environment) | |
1016 : super(reporter, environment); | |
1017 | |
1018 ConstantEnvironment get constantEnvironment => _constantEnvironment; | |
1019 | |
1020 ir.Library getKernelLibrary(KLibrary entity) => | |
1021 _libraryEnvs[entity.libraryIndex].library; | |
1022 | |
1023 ir.Class getKernelClass(KClass entity) => _classEnvs[entity.classIndex].cls; | |
1020 | 1024 |
1021 @override | 1025 @override |
1022 Spannable getSpannable(MemberEntity member, ir.Node node) { | 1026 Spannable getSpannable(MemberEntity member, ir.Node node) { |
1023 return _getSpannable(member, node); | 1027 return _getSpannable(member, node); |
1024 } | 1028 } |
1025 | 1029 |
1026 @override | 1030 @override |
1027 ir.Member getMemberNode(MemberEntity member) { | 1031 ir.Member getMemberNode(MemberEntity member) { |
1028 return _getMemberNode(member); | 1032 return _getMemberNode(member); |
1029 } | 1033 } |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1460 return elementMap._getAppliedMixin(cls); | 1464 return elementMap._getAppliedMixin(cls); |
1461 } | 1465 } |
1462 | 1466 |
1463 @override | 1467 @override |
1464 bool validateClass(ClassEntity cls) => true; | 1468 bool validateClass(ClassEntity cls) => true; |
1465 | 1469 |
1466 @override | 1470 @override |
1467 bool checkClass(ClassEntity cls) => true; | 1471 bool checkClass(ClassEntity cls) => true; |
1468 } | 1472 } |
1469 | 1473 |
1470 abstract class KernelClosedWorldMixin implements ClosedWorld { | 1474 abstract class KernelClosedWorldMixin implements ClosedWorldBase { |
1475 KernelToElementMapBase get elementMap; | |
1471 | 1476 |
1472 @override | 1477 @override |
1473 bool hasElementIn(ClassEntity cls, Selector selector, Entity element) { | 1478 bool hasElementIn(ClassEntity cls, Selector selector, Entity element) { |
1474 while (cls != null) { | 1479 while (cls != null) { |
1475 MemberEntity member = elementEnvironment | 1480 MemberEntity member = elementEnvironment |
1476 .lookupClassMember(cls, selector.name, setter: selector.isSetter); | 1481 .lookupClassMember(cls, selector.name, setter: selector.isSetter); |
1477 if (member != null && | 1482 if (member != null && |
1478 (!selector.memberName.isPrivate || | 1483 (!selector.memberName.isPrivate || |
1479 member.library == selector.library)) { | 1484 member.library == selector.library)) { |
1480 return member == element; | 1485 return member == element; |
1481 } | 1486 } |
1482 cls = elementEnvironment.getSuperClass(cls); | 1487 cls = elementEnvironment.getSuperClass(cls); |
1483 } | 1488 } |
1484 return false; | 1489 return false; |
1485 } | 1490 } |
1486 } | |
1487 | |
1488 class KernelClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin { | |
1489 final KernelToElementMapForImpactImpl _elementMap; | |
1490 | |
1491 KernelClosedWorld(this._elementMap, | |
1492 {ElementEnvironment elementEnvironment, | |
1493 DartTypes dartTypes, | |
1494 CommonElements commonElements, | |
1495 ConstantSystem constantSystem, | |
1496 NativeData nativeData, | |
1497 InterceptorData interceptorData, | |
1498 BackendUsage backendUsage, | |
1499 ResolutionWorldBuilder resolutionWorldBuilder, | |
1500 Set<ClassEntity> implementedClasses, | |
1501 Iterable<MemberEntity> liveInstanceMembers, | |
1502 Set<TypedefElement> allTypedefs, | |
1503 Map<ClassEntity, Set<ClassEntity>> mixinUses, | |
1504 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, | |
1505 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | |
1506 Map<ClassEntity, ClassSet> classSets}) | |
1507 : super( | |
1508 elementEnvironment, | |
1509 dartTypes, | |
1510 commonElements, | |
1511 constantSystem, | |
1512 nativeData, | |
1513 interceptorData, | |
1514 backendUsage, | |
1515 resolutionWorldBuilder, | |
1516 implementedClasses, | |
1517 liveInstanceMembers, | |
1518 allTypedefs, | |
1519 mixinUses, | |
1520 typesImplementedBySubclasses, | |
1521 classHierarchyNodes, | |
1522 classSets); | |
1523 | 1491 |
1524 @override | 1492 @override |
1525 bool hasConcreteMatch(ClassEntity cls, Selector selector, | 1493 bool hasConcreteMatch(ClassEntity cls, Selector selector, |
1526 {ClassEntity stopAtSuperclass}) { | 1494 {ClassEntity stopAtSuperclass}) { |
1527 throw new UnimplementedError('KernelClosedWorld.hasConcreteMatch'); | 1495 throw new UnimplementedError('KernelClosedWorldMixin.hasConcreteMatch'); |
1528 } | 1496 } |
1529 | 1497 |
1530 @override | 1498 @override |
1531 bool isNamedMixinApplication(ClassEntity cls) { | 1499 bool isNamedMixinApplication(ClassEntity cls) { |
1532 throw new UnimplementedError('KernelClosedWorld.isNamedMixinApplication'); | 1500 throw new UnimplementedError( |
1501 'KernelClosedWorldMixin.isNamedMixinApplication'); | |
1533 } | 1502 } |
1534 | 1503 |
1535 @override | 1504 @override |
1536 ClassEntity getAppliedMixin(ClassEntity cls) { | 1505 ClassEntity getAppliedMixin(ClassEntity cls) { |
1537 throw new UnimplementedError('KernelClosedWorld.getAppliedMixin'); | 1506 throw new UnimplementedError('KernelClosedWorldMixin.getAppliedMixin'); |
1538 } | 1507 } |
1539 | 1508 |
1540 @override | 1509 @override |
1541 Iterable<ClassEntity> getInterfaces(ClassEntity cls) { | 1510 Iterable<ClassEntity> getInterfaces(ClassEntity cls) { |
1542 throw new UnimplementedError('KernelClosedWorld.getInterfaces'); | 1511 throw new UnimplementedError('KernelClosedWorldMixin.getInterfaces'); |
1543 } | 1512 } |
1544 | 1513 |
1545 @override | 1514 @override |
1546 ClassEntity getSuperClass(ClassEntity cls) { | 1515 ClassEntity getSuperClass(ClassEntity cls) { |
1547 throw new UnimplementedError('KernelClosedWorld.getSuperClass'); | 1516 throw new UnimplementedError('KernelClosedWorldMixin.getSuperClass'); |
1548 } | 1517 } |
1549 | 1518 |
1550 @override | 1519 @override |
1551 int getHierarchyDepth(ClassEntity cls) { | 1520 int getHierarchyDepth(ClassEntity cls) { |
1552 return _elementMap._getHierarchyDepth(cls); | 1521 return elementMap._getHierarchyDepth(cls); |
1553 } | 1522 } |
1554 | 1523 |
1555 @override | 1524 @override |
1556 OrderedTypeSet getOrderedTypeSet(ClassEntity cls) { | 1525 OrderedTypeSet getOrderedTypeSet(ClassEntity cls) { |
1557 return _elementMap._getOrderedTypeSet(cls); | 1526 return elementMap._getOrderedTypeSet(cls); |
1558 } | 1527 } |
1559 | 1528 |
1560 @override | 1529 @override |
1561 bool checkInvariants(ClassEntity cls, {bool mustBeInstantiated: true}) => | 1530 bool checkInvariants(ClassEntity cls, {bool mustBeInstantiated: true}) => |
1562 true; | 1531 true; |
1563 | 1532 |
1564 @override | 1533 @override |
1565 bool checkClass(ClassEntity cls) => true; | 1534 bool checkClass(ClassEntity cls) => true; |
1566 | 1535 |
1567 @override | 1536 @override |
1568 bool checkEntity(Entity element) => true; | 1537 bool checkEntity(Entity element) => true; |
1538 } | |
1539 | |
1540 class KernelClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin { | |
1541 final KernelToElementMapForImpactImpl elementMap; | |
1542 | |
1543 KernelClosedWorld(this.elementMap, | |
1544 {ElementEnvironment elementEnvironment, | |
1545 DartTypes dartTypes, | |
1546 CommonElements commonElements, | |
1547 ConstantSystem constantSystem, | |
1548 NativeData nativeData, | |
1549 InterceptorData interceptorData, | |
1550 BackendUsage backendUsage, | |
1551 ResolutionWorldBuilder resolutionWorldBuilder, | |
1552 Set<ClassEntity> implementedClasses, | |
1553 Iterable<MemberEntity> liveInstanceMembers, | |
1554 Set<TypedefElement> allTypedefs, | |
1555 Map<ClassEntity, Set<ClassEntity>> mixinUses, | |
1556 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, | |
1557 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | |
1558 Map<ClassEntity, ClassSet> classSets}) | |
1559 : super( | |
1560 elementEnvironment, | |
1561 dartTypes, | |
1562 commonElements, | |
1563 constantSystem, | |
1564 nativeData, | |
1565 interceptorData, | |
1566 backendUsage, | |
1567 resolutionWorldBuilder, | |
1568 implementedClasses, | |
1569 liveInstanceMembers, | |
1570 allTypedefs, | |
1571 mixinUses, | |
1572 typesImplementedBySubclasses, | |
1573 classHierarchyNodes, | |
1574 classSets); | |
1569 | 1575 |
1570 @override | 1576 @override |
1571 void registerClosureClass(ClassElement cls) { | 1577 void registerClosureClass(ClassElement cls) { |
1572 throw new UnimplementedError('KernelClosedWorld.registerClosureClass'); | 1578 throw new UnimplementedError('KernelClosedWorld.registerClosureClass'); |
1573 } | 1579 } |
1574 } | 1580 } |
1575 | 1581 |
1576 // Interface for testing equivalence of Kernel-based entities. | 1582 // Interface for testing equivalence of Kernel-based entities. |
1577 class WorldDeconstructionForTesting { | 1583 class WorldDeconstructionForTesting { |
1578 final KernelToElementMapBase elementMap; | 1584 final KernelToElementMapBase elementMap; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1680 } | 1686 } |
1681 | 1687 |
1682 MemberEntity toFrontendMember(covariant IndexedMember member) { | 1688 MemberEntity toFrontendMember(covariant IndexedMember member) { |
1683 return _frontend._memberList[member.memberIndex]; | 1689 return _frontend._memberList[member.memberIndex]; |
1684 } | 1690 } |
1685 } | 1691 } |
1686 | 1692 |
1687 class JsKernelToElementMap extends KernelToElementMapBase | 1693 class JsKernelToElementMap extends KernelToElementMapBase |
1688 with | 1694 with |
1689 KernelToElementMapForBuildingMixin, | 1695 KernelToElementMapForBuildingMixin, |
1696 KernelToElementMapForBuildingFromBaseMixin, | |
1690 JsElementCreatorMixin, | 1697 JsElementCreatorMixin, |
1691 // TODO(johnniwinther): Avoid mixin in [ElementCreatorMixin]. The | 1698 // TODO(johnniwinther): Avoid mixin in [ElementCreatorMixin]. The |
1692 // codegen world should be a strict subset of the resolution world and | 1699 // codegen world should be a strict subset of the resolution world and |
1693 // creating elements for IR nodes should therefore not be needed. | 1700 // creating elements for IR nodes should therefore not be needed. |
1694 // Currently some are created purely for testing (like | 1701 // Currently some are created purely for testing (like |
1695 // `element == commonElements.foo`, where 'foo' might not be live). | 1702 // `element == commonElements.foo`, where 'foo' might not be live). |
1696 // Others are created because we do a | 1703 // Others are created because we do a |
1697 // `elementEnvironment.forEachLibraryMember(...)` call on each emitted | 1704 // `elementEnvironment.forEachLibraryMember(...)` call on each emitted |
1698 // library. | 1705 // library. |
1699 ElementCreatorMixin | 1706 ElementCreatorMixin |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1776 throw new UnsupportedError("JsKernelToElementMap.getLocalFunction"); | 1783 throw new UnsupportedError("JsKernelToElementMap.getLocalFunction"); |
1777 } | 1784 } |
1778 | 1785 |
1779 @override | 1786 @override |
1780 ClassEntity _getClass(ir.Class node, [ClassEnv env]) { | 1787 ClassEntity _getClass(ir.Class node, [ClassEnv env]) { |
1781 ClassEntity cls = _classMap[node]; | 1788 ClassEntity cls = _classMap[node]; |
1782 assert(cls != null, "No class entity for $node"); | 1789 assert(cls != null, "No class entity for $node"); |
1783 return cls; | 1790 return cls; |
1784 } | 1791 } |
1785 | 1792 |
1786 /*@override | |
1787 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { | |
1788 throw new UnsupportedError("JsKernelToElementMap._getTypeVariable"); | |
1789 }*/ | |
1790 | |
1791 // TODO(johnniwinther): Reinsert these when [ElementCreatorMixin] is no longer | 1793 // TODO(johnniwinther): Reinsert these when [ElementCreatorMixin] is no longer |
1792 // mixed in. | 1794 // mixed in. |
1793 /*@override | 1795 /*@override |
1794 FieldEntity _getField(ir.Field node) { | 1796 FieldEntity _getField(ir.Field node) { |
1795 FieldEntity field = _fieldMap[node]; | 1797 FieldEntity field = _fieldMap[node]; |
1796 assert(field != null, "No field entity for $node"); | 1798 assert(field != null, "No field entity for $node"); |
1797 return field; | 1799 return field; |
1798 }*/ | 1800 }*/ |
1799 | 1801 |
1800 /*@override | 1802 /*@override |
(...skipping 12 matching lines...) Expand all Loading... | |
1813 | 1815 |
1814 @override | 1816 @override |
1815 ir.Member getMemberNode(MemberEntity member) { | 1817 ir.Member getMemberNode(MemberEntity member) { |
1816 return _getMemberNode(member); | 1818 return _getMemberNode(member); |
1817 } | 1819 } |
1818 | 1820 |
1819 @override | 1821 @override |
1820 ir.Class getClassNode(ClassEntity cls) { | 1822 ir.Class getClassNode(ClassEntity cls) { |
1821 return _getClassNode(cls); | 1823 return _getClassNode(cls); |
1822 } | 1824 } |
1823 | |
1824 @override | |
1825 ConstantValue getFieldConstantValue(ir.Field field) { | |
1826 throw new UnsupportedError("JsKernelToElementMap.getFieldConstantValue"); | |
1827 } | |
1828 | |
1829 @override | |
1830 void forEachParameter(FunctionEntity function, | |
1831 void f(DartType type, String name, ConstantValue defaultValue)) { | |
1832 throw new UnsupportedError("JsKernelToElementMap.forEachParameter"); | |
1833 } | |
1834 | |
1835 @override | |
1836 ConstantValue getConstantFieldInitializer(FieldEntity field) { | |
1837 throw new UnsupportedError( | |
1838 "JsKernelToElementMap.getConstantFieldInitializer"); | |
1839 } | |
1840 | |
1841 @override | |
1842 bool hasConstantFieldInitializer(FieldEntity field) { | |
1843 throw new UnsupportedError( | |
1844 "JsKernelToElementMap.hasConstantFieldInitializer"); | |
1845 } | |
1846 } | 1825 } |
OLD | NEW |