Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(569)

Side by Side Diff: pkg/compiler/lib/src/kernel/element_map_impl.dart

Issue 2970673004: Handle static fields in js_model/model_test (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_model/js_strategy.dart ('k') | pkg/compiler/lib/src/universe/element_world_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698