| 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 |