Chromium Code Reviews| 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 |