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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 DartTypeConverter _typeConverter; | 67 DartTypeConverter _typeConverter; |
68 KernelConstantEnvironment _constantEnvironment; | 68 KernelConstantEnvironment _constantEnvironment; |
69 _KernelDartTypes _types; | 69 _KernelDartTypes _types; |
70 | 70 |
71 /// Library environment. Used for fast lookup. | 71 /// Library environment. Used for fast lookup. |
72 ProgramEnv _env = new ProgramEnv(); | 72 ProgramEnv _env = new ProgramEnv(); |
73 | 73 |
74 List<LibraryEntity> _libraryList = <LibraryEntity>[]; | 74 List<LibraryEntity> _libraryList = <LibraryEntity>[]; |
75 List<ClassEntity> _classList = <ClassEntity>[]; | 75 List<ClassEntity> _classList = <ClassEntity>[]; |
76 List<MemberEntity> _memberList = <MemberEntity>[]; | 76 List<MemberEntity> _memberList = <MemberEntity>[]; |
| 77 List<TypeVariableEntity> _typeVariableList = <TypeVariableEntity>[]; |
77 | 78 |
78 /// List of library environments by `IndexedLibrary.libraryIndex`. This is | 79 /// List of library environments by `IndexedLibrary.libraryIndex`. This is |
79 /// used for fast lookup into library classes and members. | 80 /// used for fast lookup into library classes and members. |
80 List<LibraryEnv> _libraryEnvs = <LibraryEnv>[]; | 81 List<LibraryEnv> _libraryEnvs = <LibraryEnv>[]; |
81 | 82 |
82 /// List of class environments by `IndexedClass.classIndex`. This is used for | 83 /// List of class environments by `IndexedClass.classIndex`. This is used for |
83 /// fast lookup into class members. | 84 /// fast lookup into class members. |
84 List<ClassEnv> _classEnvs = <ClassEnv>[]; | 85 List<ClassEnv> _classEnvs = <ClassEnv>[]; |
85 | 86 |
86 /// List of class data by `IndexedClass.classIndex`. This is used for | 87 /// List of class data by `IndexedClass.classIndex`. This is used for |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 /// creating K-model elements. | 521 /// creating K-model elements. |
521 abstract class ElementCreatorMixin { | 522 abstract class ElementCreatorMixin { |
522 ProgramEnv get _env; | 523 ProgramEnv get _env; |
523 List<LibraryEntity> get _libraryList; | 524 List<LibraryEntity> get _libraryList; |
524 List<LibraryEnv> get _libraryEnvs; | 525 List<LibraryEnv> get _libraryEnvs; |
525 List<ClassEntity> get _classList; | 526 List<ClassEntity> get _classList; |
526 List<ClassEnv> get _classEnvs; | 527 List<ClassEnv> get _classEnvs; |
527 List<ClassData> get _classData; | 528 List<ClassData> get _classData; |
528 List<MemberEntity> get _memberList; | 529 List<MemberEntity> get _memberList; |
529 List<MemberData> get _memberData; | 530 List<MemberData> get _memberData; |
| 531 List<TypeVariableEntity> get _typeVariableList; |
530 | 532 |
531 Map<ir.Library, IndexedLibrary> _libraryMap = <ir.Library, IndexedLibrary>{}; | 533 Map<ir.Library, IndexedLibrary> _libraryMap = <ir.Library, IndexedLibrary>{}; |
532 Map<ir.Class, IndexedClass> _classMap = <ir.Class, IndexedClass>{}; | 534 Map<ir.Class, IndexedClass> _classMap = <ir.Class, IndexedClass>{}; |
533 Map<ir.TypeParameter, TypeVariableEntity> _typeVariableMap = | 535 Map<ir.TypeParameter, IndexedTypeVariable> _typeVariableMap = |
534 <ir.TypeParameter, TypeVariableEntity>{}; | 536 <ir.TypeParameter, IndexedTypeVariable>{}; |
535 Map<ir.Member, IndexedConstructor> _constructorMap = | 537 Map<ir.Member, IndexedConstructor> _constructorMap = |
536 <ir.Member, IndexedConstructor>{}; | 538 <ir.Member, IndexedConstructor>{}; |
537 Map<ir.Procedure, IndexedFunction> _methodMap = | 539 Map<ir.Procedure, IndexedFunction> _methodMap = |
538 <ir.Procedure, IndexedFunction>{}; | 540 <ir.Procedure, IndexedFunction>{}; |
539 Map<ir.Field, IndexedField> _fieldMap = <ir.Field, IndexedField>{}; | 541 Map<ir.Field, IndexedField> _fieldMap = <ir.Field, IndexedField>{}; |
540 Map<ir.TreeNode, Local> _localFunctionMap = <ir.TreeNode, Local>{}; | 542 Map<ir.TreeNode, Local> _localFunctionMap = <ir.TreeNode, Local>{}; |
541 | 543 |
542 Name getName(ir.Name node); | 544 Name getName(ir.Name node); |
543 FunctionType getFunctionType(ir.FunctionNode node); | 545 FunctionType getFunctionType(ir.FunctionNode node); |
544 MemberEntity getMember(ir.Member node); | 546 MemberEntity getMember(ir.Member node); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 ClassEntity cls = createClass(library, _classMap.length, node.name, | 583 ClassEntity cls = createClass(library, _classMap.length, node.name, |
582 isAbstract: node.isAbstract); | 584 isAbstract: node.isAbstract); |
583 _classList.add(cls); | 585 _classList.add(cls); |
584 return cls; | 586 return cls; |
585 }); | 587 }); |
586 } | 588 } |
587 | 589 |
588 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { | 590 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { |
589 return _typeVariableMap.putIfAbsent(node, () { | 591 return _typeVariableMap.putIfAbsent(node, () { |
590 if (node.parent is ir.Class) { | 592 if (node.parent is ir.Class) { |
| 593 int typeVariableIndex = _typeVariableList.length; |
591 ir.Class cls = node.parent; | 594 ir.Class cls = node.parent; |
592 int index = cls.typeParameters.indexOf(node); | 595 int index = cls.typeParameters.indexOf(node); |
593 return createTypeVariable(_getClass(cls), node.name, index); | 596 TypeVariableEntity typeVariable = createTypeVariable( |
| 597 typeVariableIndex, _getClass(cls), node.name, index); |
| 598 _typeVariableList.add(typeVariable); |
| 599 return typeVariable; |
594 } | 600 } |
595 if (node.parent is ir.FunctionNode) { | 601 if (node.parent is ir.FunctionNode) { |
596 ir.FunctionNode func = node.parent; | 602 ir.FunctionNode func = node.parent; |
597 int index = func.typeParameters.indexOf(node); | 603 int index = func.typeParameters.indexOf(node); |
598 if (func.parent is ir.Constructor) { | 604 if (func.parent is ir.Constructor) { |
599 ir.Constructor constructor = func.parent; | 605 ir.Constructor constructor = func.parent; |
600 ir.Class cls = constructor.enclosingClass; | 606 ir.Class cls = constructor.enclosingClass; |
601 return _getTypeVariable(cls.typeParameters[index]); | 607 return _getTypeVariable(cls.typeParameters[index]); |
602 } | 608 } |
603 if (func.parent is ir.Procedure) { | 609 if (func.parent is ir.Procedure) { |
604 ir.Procedure procedure = func.parent; | 610 ir.Procedure procedure = func.parent; |
605 if (procedure.kind == ir.ProcedureKind.Factory) { | 611 if (procedure.kind == ir.ProcedureKind.Factory) { |
606 ir.Class cls = procedure.enclosingClass; | 612 ir.Class cls = procedure.enclosingClass; |
607 return _getTypeVariable(cls.typeParameters[index]); | 613 return _getTypeVariable(cls.typeParameters[index]); |
608 } else { | 614 } else { |
609 return createTypeVariable(_getMethod(procedure), node.name, index); | 615 int typeVariableIndex = _typeVariableList.length; |
| 616 TypeVariableEntity typeVariable = createTypeVariable( |
| 617 typeVariableIndex, _getMethod(procedure), node.name, index); |
| 618 _typeVariableList.add(typeVariable); |
| 619 return typeVariable; |
610 } | 620 } |
611 } | 621 } |
612 } | 622 } |
613 throw new UnsupportedError('Unsupported type parameter type node $node.'); | 623 throw new UnsupportedError('Unsupported type parameter type node $node.'); |
614 }); | 624 }); |
615 } | 625 } |
616 | 626 |
617 ConstructorEntity _getConstructor(ir.Member node) { | 627 ConstructorEntity _getConstructor(ir.Member node) { |
618 return _constructorMap.putIfAbsent(node, () { | 628 return _constructorMap.putIfAbsent(node, () { |
619 int memberIndex = _memberData.length; | 629 int memberIndex = _memberData.length; |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 name, memberContext, executableContext, functionType); | 791 name, memberContext, executableContext, functionType); |
782 }); | 792 }); |
783 } | 793 } |
784 | 794 |
785 IndexedLibrary createLibrary(int libraryIndex, String name, Uri canonicalUri); | 795 IndexedLibrary createLibrary(int libraryIndex, String name, Uri canonicalUri); |
786 | 796 |
787 IndexedClass createClass(LibraryEntity library, int classIndex, String name, | 797 IndexedClass createClass(LibraryEntity library, int classIndex, String name, |
788 {bool isAbstract}); | 798 {bool isAbstract}); |
789 | 799 |
790 TypeVariableEntity createTypeVariable( | 800 TypeVariableEntity createTypeVariable( |
791 Entity typeDeclaration, String name, int index); | 801 int typeVariableIndex, Entity typeDeclaration, String name, int index); |
792 | 802 |
793 IndexedConstructor createGenerativeConstructor( | 803 IndexedConstructor createGenerativeConstructor( |
794 int memberIndex, | 804 int memberIndex, |
795 ClassEntity enclosingClass, | 805 ClassEntity enclosingClass, |
796 Name name, | 806 Name name, |
797 ParameterStructure parameterStructure, | 807 ParameterStructure parameterStructure, |
798 {bool isExternal, | 808 {bool isExternal, |
799 bool isConst}); | 809 bool isConst}); |
800 | 810 |
801 IndexedConstructor createFactoryConstructor( | 811 IndexedConstructor createFactoryConstructor( |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
839 int libraryIndex, String name, Uri canonicalUri) { | 849 int libraryIndex, String name, Uri canonicalUri) { |
840 return new KLibrary(libraryIndex, name, canonicalUri); | 850 return new KLibrary(libraryIndex, name, canonicalUri); |
841 } | 851 } |
842 | 852 |
843 IndexedClass createClass(LibraryEntity library, int classIndex, String name, | 853 IndexedClass createClass(LibraryEntity library, int classIndex, String name, |
844 {bool isAbstract}) { | 854 {bool isAbstract}) { |
845 return new KClass(library, classIndex, name, isAbstract: isAbstract); | 855 return new KClass(library, classIndex, name, isAbstract: isAbstract); |
846 } | 856 } |
847 | 857 |
848 TypeVariableEntity createTypeVariable( | 858 TypeVariableEntity createTypeVariable( |
849 Entity typeDeclaration, String name, int index) { | 859 int typeVariableIndex, Entity typeDeclaration, String name, int index) { |
850 return new KTypeVariable(typeDeclaration, name, index); | 860 return new KTypeVariable(typeVariableIndex, typeDeclaration, name, index); |
851 } | 861 } |
852 | 862 |
853 IndexedConstructor createGenerativeConstructor( | 863 IndexedConstructor createGenerativeConstructor( |
854 int memberIndex, | 864 int memberIndex, |
855 ClassEntity enclosingClass, | 865 ClassEntity enclosingClass, |
856 Name name, | 866 Name name, |
857 ParameterStructure parameterStructure, | 867 ParameterStructure parameterStructure, |
858 {bool isExternal, | 868 {bool isExternal, |
859 bool isConst}) { | 869 bool isConst}) { |
860 return new KGenerativeConstructor( | 870 return new KGenerativeConstructor( |
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 return _frontend._classList[cls.classIndex]; | 1691 return _frontend._classList[cls.classIndex]; |
1682 } | 1692 } |
1683 | 1693 |
1684 MemberEntity toBackendMember(covariant IndexedMember member) { | 1694 MemberEntity toBackendMember(covariant IndexedMember member) { |
1685 return _backend._memberList[member.memberIndex]; | 1695 return _backend._memberList[member.memberIndex]; |
1686 } | 1696 } |
1687 | 1697 |
1688 MemberEntity toFrontendMember(covariant IndexedMember member) { | 1698 MemberEntity toFrontendMember(covariant IndexedMember member) { |
1689 return _frontend._memberList[member.memberIndex]; | 1699 return _frontend._memberList[member.memberIndex]; |
1690 } | 1700 } |
| 1701 |
| 1702 TypeVariableEntity toBackendTypeVariable( |
| 1703 covariant IndexedTypeVariable typeVariable) { |
| 1704 return _backend._typeVariableList[typeVariable.typeVariableIndex]; |
| 1705 } |
| 1706 |
| 1707 TypeVariableEntity toFrontendTypeVariable( |
| 1708 covariant IndexedTypeVariable typeVariable) { |
| 1709 return _frontend._typeVariableList[typeVariable.typeVariableIndex]; |
| 1710 } |
1691 } | 1711 } |
1692 | 1712 |
1693 class JsKernelToElementMap extends KernelToElementMapBase | 1713 class JsKernelToElementMap extends KernelToElementMapBase |
1694 with | 1714 with |
1695 KernelToElementMapForBuildingMixin, | 1715 KernelToElementMapForBuildingMixin, |
1696 KernelToElementMapForBuildingFromBaseMixin, | 1716 KernelToElementMapForBuildingFromBaseMixin, |
1697 JsElementCreatorMixin, | 1717 JsElementCreatorMixin, |
1698 // TODO(johnniwinther): Avoid mixin in [ElementCreatorMixin]. The | 1718 // TODO(johnniwinther): Avoid mixin in [ElementCreatorMixin]. The |
1699 // codegen world should be a strict subset of the resolution world and | 1719 // codegen world should be a strict subset of the resolution world and |
1700 // creating elements for IR nodes should therefore not be needed. | 1720 // creating elements for IR nodes should therefore not be needed. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1751 _memberList.add(newMember); | 1771 _memberList.add(newMember); |
1752 _memberData.add(data.copy()); | 1772 _memberData.add(data.copy()); |
1753 if (newMember.isField) { | 1773 if (newMember.isField) { |
1754 _fieldMap[data.node] = newMember; | 1774 _fieldMap[data.node] = newMember; |
1755 } else if (newMember.isConstructor) { | 1775 } else if (newMember.isConstructor) { |
1756 _constructorMap[data.node] = newMember; | 1776 _constructorMap[data.node] = newMember; |
1757 } else { | 1777 } else { |
1758 _methodMap[data.node] = newMember; | 1778 _methodMap[data.node] = newMember; |
1759 } | 1779 } |
1760 } | 1780 } |
| 1781 for (int typeVariableIndex = 0; |
| 1782 typeVariableIndex < _elementMap._typeVariableList.length; |
| 1783 typeVariableIndex++) { |
| 1784 TypeVariableEntity oldTypeVariable = |
| 1785 _elementMap._typeVariableList[typeVariableIndex]; |
| 1786 Entity newTypeDeclaration; |
| 1787 if (oldTypeVariable.typeDeclaration is ClassEntity) { |
| 1788 IndexedClass cls = oldTypeVariable.typeDeclaration; |
| 1789 newTypeDeclaration = _classList[cls.classIndex]; |
| 1790 } else { |
| 1791 IndexedMember member = oldTypeVariable.typeDeclaration; |
| 1792 newTypeDeclaration = _memberList[member.memberIndex]; |
| 1793 } |
| 1794 TypeVariableEntity newTypeVariable = createTypeVariable(typeVariableIndex, |
| 1795 newTypeDeclaration, oldTypeVariable.name, oldTypeVariable.index); |
| 1796 _typeVariableList.add(newTypeVariable); |
| 1797 } |
1761 } | 1798 } |
1762 | 1799 |
1763 JsToFrontendMap get jsToFrontendMap => _jsToFrontendMap; | 1800 JsToFrontendMap get jsToFrontendMap => _jsToFrontendMap; |
1764 | 1801 |
1765 @override | 1802 @override |
1766 Spannable getSpannable(MemberEntity member, ir.Node node) { | 1803 Spannable getSpannable(MemberEntity member, ir.Node node) { |
1767 return _getSpannable(member, node); | 1804 return _getSpannable(member, node); |
1768 } | 1805 } |
1769 | 1806 |
1770 Iterable<LibraryEntity> get _libraries { | 1807 Iterable<LibraryEntity> get _libraries { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1816 @override | 1853 @override |
1817 ir.Member getMemberNode(MemberEntity member) { | 1854 ir.Member getMemberNode(MemberEntity member) { |
1818 return _getMemberNode(member); | 1855 return _getMemberNode(member); |
1819 } | 1856 } |
1820 | 1857 |
1821 @override | 1858 @override |
1822 ir.Class getClassNode(ClassEntity cls) { | 1859 ir.Class getClassNode(ClassEntity cls) { |
1823 return _getClassNode(cls); | 1860 return _getClassNode(cls); |
1824 } | 1861 } |
1825 } | 1862 } |
OLD | NEW |