| 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 495 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   506  |   506  | 
|   507   ir.Member _getMemberNode(covariant IndexedMember member) { |   507   ir.Member _getMemberNode(covariant IndexedMember member) { | 
|   508     return _memberData[member.memberIndex].node; |   508     return _memberData[member.memberIndex].node; | 
|   509   } |   509   } | 
|   510  |   510  | 
|   511   ir.Class _getClassNode(covariant IndexedClass cls) { |   511   ir.Class _getClassNode(covariant IndexedClass cls) { | 
|   512     return _classEnvs[cls.classIndex].cls; |   512     return _classEnvs[cls.classIndex].cls; | 
|   513   } |   513   } | 
|   514 } |   514 } | 
|   515  |   515  | 
|   516 /// Mixin that implements the abstract methods in [KernelToElementMapBase] by |   516 /// Mixin that implements the abstract methods in [KernelToElementMapBase]. | 
|   517 /// creating K-model elements. |   517 abstract class ElementCreatorMixin { | 
|   518 abstract class KElementCreatorMixin { |  | 
|   519   ProgramEnv get _env; |   518   ProgramEnv get _env; | 
|   520   List<LibraryEntity> get _libraryList; |   519   List<LibraryEntity> get _libraryList; | 
|   521   List<LibraryEnv> get _libraryEnvs; |   520   List<LibraryEnv> get _libraryEnvs; | 
|   522   List<ClassEntity> get _classList; |   521   List<ClassEntity> get _classList; | 
|   523   List<ClassEnv> get _classEnvs; |   522   List<ClassEnv> get _classEnvs; | 
|   524   List<MemberEntity> get _memberList; |   523   List<MemberEntity> get _memberList; | 
|   525   List<MemberData> get _memberData; |   524   List<MemberData> get _memberData; | 
|   526  |   525  | 
|   527   Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; |   526   Map<ir.Library, IndexedLibrary> _libraryMap = <ir.Library, IndexedLibrary>{}; | 
|   528   Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; |   527   Map<ir.Class, IndexedClass> _classMap = <ir.Class, IndexedClass>{}; | 
|   529   Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = |   528   Map<ir.TypeParameter, TypeVariableEntity> _typeVariableMap = | 
|   530       <ir.TypeParameter, KTypeVariable>{}; |   529       <ir.TypeParameter, TypeVariableEntity>{}; | 
|   531   Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; |   530   Map<ir.Member, IndexedConstructor> _constructorMap = | 
|   532   Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; |   531       <ir.Member, IndexedConstructor>{}; | 
|   533   Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; |   532   Map<ir.Procedure, IndexedFunction> _methodMap = | 
|   534   Map<ir.TreeNode, KLocalFunction> _localFunctionMap = |   533       <ir.Procedure, IndexedFunction>{}; | 
|   535       <ir.TreeNode, KLocalFunction>{}; |   534   Map<ir.Field, IndexedField> _fieldMap = <ir.Field, IndexedField>{}; | 
 |   535   Map<ir.TreeNode, Local> _localFunctionMap = <ir.TreeNode, Local>{}; | 
|   536  |   536  | 
|   537   Name getName(ir.Name node); |   537   Name getName(ir.Name node); | 
|   538   FunctionType getFunctionType(ir.FunctionNode node); |   538   FunctionType getFunctionType(ir.FunctionNode node); | 
|   539   MemberEntity getMember(ir.Member node); |   539   MemberEntity getMember(ir.Member node); | 
|   540  |   540  | 
|   541   Iterable<LibraryEntity> get _libraries { |   541   Iterable<LibraryEntity> get _libraries { | 
|   542     if (_env.length != _libraryMap.length) { |   542     if (_env.length != _libraryMap.length) { | 
|   543       // Create a [KLibrary] for each library. |   543       // Create a [KLibrary] for each library. | 
|   544       _env.forEachLibrary((LibraryEnv env) { |   544       _env.forEachLibrary((LibraryEnv env) { | 
|   545         _getLibrary(env.library, env); |   545         _getLibrary(env.library, env); | 
|   546       }); |   546       }); | 
|   547     } |   547     } | 
|   548     return _libraryMap.values; |   548     return _libraryMap.values; | 
|   549   } |   549   } | 
|   550  |   550  | 
|   551   LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]) { |   551   LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]) { | 
|   552     return _libraryMap.putIfAbsent(node, () { |   552     return _libraryMap.putIfAbsent(node, () { | 
|   553       Uri canonicalUri = node.importUri; |   553       Uri canonicalUri = node.importUri; | 
|   554       _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri)); |   554       _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri)); | 
|   555       String name = node.name; |   555       String name = node.name; | 
|   556       if (name == null) { |   556       if (name == null) { | 
|   557         // Use the file name as script name. |   557         // Use the file name as script name. | 
|   558         String path = canonicalUri.path; |   558         String path = canonicalUri.path; | 
|   559         name = path.substring(path.lastIndexOf('/') + 1); |   559         name = path.substring(path.lastIndexOf('/') + 1); | 
|   560       } |   560       } | 
|   561       LibraryEntity library = |   561       LibraryEntity library = | 
|   562           new KLibrary(_libraryMap.length, name, canonicalUri); |   562           createLibrary(_libraryMap.length, name, canonicalUri); | 
|   563       _libraryList.add(library); |   563       _libraryList.add(library); | 
|   564       return library; |   564       return library; | 
|   565     }); |   565     }); | 
|   566   } |   566   } | 
|   567  |   567  | 
|   568   ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) { |   568   ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) { | 
|   569     return _classMap.putIfAbsent(node, () { |   569     return _classMap.putIfAbsent(node, () { | 
|   570       KLibrary library = _getLibrary(node.enclosingLibrary); |   570       KLibrary library = _getLibrary(node.enclosingLibrary); | 
|   571       if (classEnv == null) { |   571       if (classEnv == null) { | 
|   572         classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); |   572         classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); | 
|   573       } |   573       } | 
|   574       _classEnvs.add(classEnv); |   574       _classEnvs.add(classEnv); | 
|   575       ClassEntity cls = new KClass(library, _classMap.length, node.name, |   575       ClassEntity cls = createClass(library, _classMap.length, node.name, | 
|   576           isAbstract: node.isAbstract); |   576           isAbstract: node.isAbstract); | 
|   577       _classList.add(cls); |   577       _classList.add(cls); | 
|   578       return cls; |   578       return cls; | 
|   579     }); |   579     }); | 
|   580   } |   580   } | 
|   581  |   581  | 
|   582   TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { |   582   TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { | 
|   583     return _typeVariableMap.putIfAbsent(node, () { |   583     return _typeVariableMap.putIfAbsent(node, () { | 
|   584       if (node.parent is ir.Class) { |   584       if (node.parent is ir.Class) { | 
|   585         ir.Class cls = node.parent; |   585         ir.Class cls = node.parent; | 
|   586         int index = cls.typeParameters.indexOf(node); |   586         int index = cls.typeParameters.indexOf(node); | 
|   587         return new KTypeVariable(_getClass(cls), node.name, index); |   587         return createTypeVariable(_getClass(cls), node.name, index); | 
|   588       } |   588       } | 
|   589       if (node.parent is ir.FunctionNode) { |   589       if (node.parent is ir.FunctionNode) { | 
|   590         ir.FunctionNode func = node.parent; |   590         ir.FunctionNode func = node.parent; | 
|   591         int index = func.typeParameters.indexOf(node); |   591         int index = func.typeParameters.indexOf(node); | 
|   592         if (func.parent is ir.Constructor) { |   592         if (func.parent is ir.Constructor) { | 
|   593           ir.Constructor constructor = func.parent; |   593           ir.Constructor constructor = func.parent; | 
|   594           ir.Class cls = constructor.enclosingClass; |   594           ir.Class cls = constructor.enclosingClass; | 
|   595           return _getTypeVariable(cls.typeParameters[index]); |   595           return _getTypeVariable(cls.typeParameters[index]); | 
|   596         } |   596         } | 
|   597         if (func.parent is ir.Procedure) { |   597         if (func.parent is ir.Procedure) { | 
|   598           ir.Procedure procedure = func.parent; |   598           ir.Procedure procedure = func.parent; | 
|   599           if (procedure.kind == ir.ProcedureKind.Factory) { |   599           if (procedure.kind == ir.ProcedureKind.Factory) { | 
|   600             ir.Class cls = procedure.enclosingClass; |   600             ir.Class cls = procedure.enclosingClass; | 
|   601             return _getTypeVariable(cls.typeParameters[index]); |   601             return _getTypeVariable(cls.typeParameters[index]); | 
|   602           } else { |   602           } else { | 
|   603             return new KTypeVariable(_getMethod(procedure), node.name, index); |   603             return createTypeVariable(_getMethod(procedure), node.name, index); | 
|   604           } |   604           } | 
|   605         } |   605         } | 
|   606       } |   606       } | 
|   607       throw new UnsupportedError('Unsupported type parameter type node $node.'); |   607       throw new UnsupportedError('Unsupported type parameter type node $node.'); | 
|   608     }); |   608     }); | 
|   609   } |   609   } | 
|   610  |   610  | 
|   611   ConstructorEntity _getConstructor(ir.Member node) { |   611   ConstructorEntity _getConstructor(ir.Member node) { | 
|   612     return _constructorMap.putIfAbsent(node, () { |   612     return _constructorMap.putIfAbsent(node, () { | 
|   613       int memberIndex = _memberData.length; |   613       int memberIndex = _memberData.length; | 
|   614       KConstructor constructor; |   614       KConstructor constructor; | 
|   615       KClass enclosingClass = _getClass(node.enclosingClass); |   615       KClass enclosingClass = _getClass(node.enclosingClass); | 
|   616       Name name = getName(node.name); |   616       Name name = getName(node.name); | 
|   617       bool isExternal = node.isExternal; |   617       bool isExternal = node.isExternal; | 
|   618  |   618  | 
|   619       ir.FunctionNode functionNode; |   619       ir.FunctionNode functionNode; | 
|   620       if (node is ir.Constructor) { |   620       if (node is ir.Constructor) { | 
|   621         functionNode = node.function; |   621         functionNode = node.function; | 
|   622         constructor = new KGenerativeConstructor(memberIndex, enclosingClass, |   622         constructor = createGenerativeConstructor(memberIndex, enclosingClass, | 
|   623             name, _getParameterStructure(functionNode), |   623             name, _getParameterStructure(functionNode), | 
|   624             isExternal: isExternal, isConst: node.isConst); |   624             isExternal: isExternal, isConst: node.isConst); | 
|   625       } else if (node is ir.Procedure) { |   625       } else if (node is ir.Procedure) { | 
|   626         functionNode = node.function; |   626         functionNode = node.function; | 
|   627         bool isFromEnvironment = isExternal && |   627         bool isFromEnvironment = isExternal && | 
|   628             name.text == 'fromEnvironment' && |   628             name.text == 'fromEnvironment' && | 
|   629             const ['int', 'bool', 'String'].contains(enclosingClass.name); |   629             const ['int', 'bool', 'String'].contains(enclosingClass.name); | 
|   630         constructor = new KFactoryConstructor(memberIndex, enclosingClass, name, |   630         constructor = createFactoryConstructor(memberIndex, enclosingClass, | 
|   631             _getParameterStructure(functionNode), |   631             name, _getParameterStructure(functionNode), | 
|   632             isExternal: isExternal, |   632             isExternal: isExternal, | 
|   633             isConst: node.isConst, |   633             isConst: node.isConst, | 
|   634             isFromEnvironmentConstructor: isFromEnvironment); |   634             isFromEnvironmentConstructor: isFromEnvironment); | 
|   635       } else { |   635       } else { | 
|   636         // TODO(johnniwinther): Convert `node.location` to a [SourceSpan]. |   636         // TODO(johnniwinther): Convert `node.location` to a [SourceSpan]. | 
|   637         throw new SpannableAssertionFailure( |   637         throw new SpannableAssertionFailure( | 
|   638             NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}."); |   638             NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}."); | 
|   639       } |   639       } | 
|   640       _memberData.add(new ConstructorData(node, functionNode)); |   640       _memberData.add(new ConstructorData(node, functionNode)); | 
|   641       _memberList.add(constructor); |   641       _memberList.add(constructor); | 
|   642       return constructor; |   642       return constructor; | 
|   643     }); |   643     }); | 
|   644   } |   644   } | 
|   645  |   645  | 
|   646   FunctionEntity _getMethod(ir.Procedure node) { |   646   FunctionEntity _getMethod(ir.Procedure node) { | 
|   647     return _methodMap.putIfAbsent(node, () { |   647     return _methodMap.putIfAbsent(node, () { | 
|   648       int memberIndex = _memberData.length; |   648       int memberIndex = _memberData.length; | 
|   649       LibraryEntity library; |   649       LibraryEntity library; | 
|   650       ClassEntity enclosingClass; |   650       ClassEntity enclosingClass; | 
|   651       if (node.enclosingClass != null) { |   651       if (node.enclosingClass != null) { | 
|   652         enclosingClass = _getClass(node.enclosingClass); |   652         enclosingClass = _getClass(node.enclosingClass); | 
|   653         library = enclosingClass.library; |   653         library = enclosingClass.library; | 
|   654       } else { |   654       } else { | 
|   655         library = _getLibrary(node.enclosingLibrary); |   655         library = _getLibrary(node.enclosingLibrary); | 
|   656       } |   656       } | 
|   657       Name name = getName(node.name); |   657       Name name = getName(node.name); | 
|   658       bool isStatic = node.isStatic; |   658       bool isStatic = node.isStatic; | 
|   659       bool isExternal = node.isExternal; |   659       bool isExternal = node.isExternal; | 
|   660       bool isAbstract = node.isAbstract; |   660       bool isAbstract = node.isAbstract; | 
|   661       KFunction function; |   661       IndexedFunction function; | 
|   662       AsyncMarker asyncMarker; |   662       AsyncMarker asyncMarker; | 
|   663       switch (node.function.asyncMarker) { |   663       switch (node.function.asyncMarker) { | 
|   664         case ir.AsyncMarker.Async: |   664         case ir.AsyncMarker.Async: | 
|   665           asyncMarker = AsyncMarker.ASYNC; |   665           asyncMarker = AsyncMarker.ASYNC; | 
|   666           break; |   666           break; | 
|   667         case ir.AsyncMarker.AsyncStar: |   667         case ir.AsyncMarker.AsyncStar: | 
|   668           asyncMarker = AsyncMarker.ASYNC_STAR; |   668           asyncMarker = AsyncMarker.ASYNC_STAR; | 
|   669           break; |   669           break; | 
|   670         case ir.AsyncMarker.Sync: |   670         case ir.AsyncMarker.Sync: | 
|   671           asyncMarker = AsyncMarker.SYNC; |   671           asyncMarker = AsyncMarker.SYNC; | 
|   672           break; |   672           break; | 
|   673         case ir.AsyncMarker.SyncStar: |   673         case ir.AsyncMarker.SyncStar: | 
|   674           asyncMarker = AsyncMarker.SYNC_STAR; |   674           asyncMarker = AsyncMarker.SYNC_STAR; | 
|   675           break; |   675           break; | 
|   676         case ir.AsyncMarker.SyncYielding: |   676         case ir.AsyncMarker.SyncYielding: | 
|   677           throw new UnsupportedError( |   677           throw new UnsupportedError( | 
|   678               "Async marker ${node.function.asyncMarker} is not supported."); |   678               "Async marker ${node.function.asyncMarker} is not supported."); | 
|   679       } |   679       } | 
|   680       switch (node.kind) { |   680       switch (node.kind) { | 
|   681         case ir.ProcedureKind.Factory: |   681         case ir.ProcedureKind.Factory: | 
|   682           throw new UnsupportedError("Cannot create method from factory."); |   682           throw new UnsupportedError("Cannot create method from factory."); | 
|   683         case ir.ProcedureKind.Getter: |   683         case ir.ProcedureKind.Getter: | 
|   684           function = new KGetter( |   684           function = createGetter( | 
|   685               memberIndex, library, enclosingClass, name, asyncMarker, |   685               memberIndex, library, enclosingClass, name, asyncMarker, | 
|   686               isStatic: isStatic, |   686               isStatic: isStatic, | 
|   687               isExternal: isExternal, |   687               isExternal: isExternal, | 
|   688               isAbstract: isAbstract); |   688               isAbstract: isAbstract); | 
|   689           break; |   689           break; | 
|   690         case ir.ProcedureKind.Method: |   690         case ir.ProcedureKind.Method: | 
|   691         case ir.ProcedureKind.Operator: |   691         case ir.ProcedureKind.Operator: | 
|   692           function = new KMethod(memberIndex, library, enclosingClass, name, |   692           function = createMethod(memberIndex, library, enclosingClass, name, | 
|   693               _getParameterStructure(node.function), asyncMarker, |   693               _getParameterStructure(node.function), asyncMarker, | 
|   694               isStatic: isStatic, |   694               isStatic: isStatic, | 
|   695               isExternal: isExternal, |   695               isExternal: isExternal, | 
|   696               isAbstract: isAbstract); |   696               isAbstract: isAbstract); | 
|   697           break; |   697           break; | 
|   698         case ir.ProcedureKind.Setter: |   698         case ir.ProcedureKind.Setter: | 
|   699           assert(asyncMarker == AsyncMarker.SYNC); |   699           assert(asyncMarker == AsyncMarker.SYNC); | 
|   700           function = new KSetter( |   700           function = createSetter( | 
|   701               memberIndex, library, enclosingClass, getName(node.name).setter, |   701               memberIndex, library, enclosingClass, name.setter, | 
|   702               isStatic: isStatic, |   702               isStatic: isStatic, | 
|   703               isExternal: isExternal, |   703               isExternal: isExternal, | 
|   704               isAbstract: isAbstract); |   704               isAbstract: isAbstract); | 
|   705           break; |   705           break; | 
|   706       } |   706       } | 
|   707       _memberData.add(new FunctionData(node, node.function)); |   707       _memberData.add(new FunctionData(node, node.function)); | 
|   708       _memberList.add(function); |   708       _memberList.add(function); | 
|   709       return function; |   709       return function; | 
|   710     }); |   710     }); | 
|   711   } |   711   } | 
|   712  |   712  | 
|   713   FieldEntity _getField(ir.Field node) { |   713   FieldEntity _getField(ir.Field node) { | 
|   714     return _fieldMap.putIfAbsent(node, () { |   714     return _fieldMap.putIfAbsent(node, () { | 
|   715       int memberIndex = _memberData.length; |   715       int memberIndex = _memberData.length; | 
|   716       LibraryEntity library; |   716       LibraryEntity library; | 
|   717       ClassEntity enclosingClass; |   717       ClassEntity enclosingClass; | 
|   718       if (node.enclosingClass != null) { |   718       if (node.enclosingClass != null) { | 
|   719         enclosingClass = _getClass(node.enclosingClass); |   719         enclosingClass = _getClass(node.enclosingClass); | 
|   720         library = enclosingClass.library; |   720         library = enclosingClass.library; | 
|   721       } else { |   721       } else { | 
|   722         library = _getLibrary(node.enclosingLibrary); |   722         library = _getLibrary(node.enclosingLibrary); | 
|   723       } |   723       } | 
|   724       Name name = getName(node.name); |   724       Name name = getName(node.name); | 
|   725       bool isStatic = node.isStatic; |   725       bool isStatic = node.isStatic; | 
|   726       _memberData.add(new FieldData(node)); |   726       _memberData.add(new FieldData(node)); | 
|   727       FieldEntity field = new KField(memberIndex, library, enclosingClass, name, |   727       FieldEntity field = createField( | 
 |   728           memberIndex, library, enclosingClass, name, | 
|   728           isStatic: isStatic, |   729           isStatic: isStatic, | 
|   729           isAssignable: node.isMutable, |   730           isAssignable: node.isMutable, | 
|   730           isConst: node.isConst); |   731           isConst: node.isConst); | 
|   731       _memberList.add(field); |   732       _memberList.add(field); | 
|   732       return field; |   733       return field; | 
|   733     }); |   734     }); | 
|   734   } |   735   } | 
|   735  |   736  | 
|   736   ParameterStructure _getParameterStructure(ir.FunctionNode node) { |   737   ParameterStructure _getParameterStructure(ir.FunctionNode node) { | 
|   737     // TODO(johnniwinther): Cache the computed function type. |   738     // TODO(johnniwinther): Cache the computed function type. | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|   748       MemberEntity memberContext; |   749       MemberEntity memberContext; | 
|   749       Entity executableContext; |   750       Entity executableContext; | 
|   750       ir.TreeNode parent = node.parent; |   751       ir.TreeNode parent = node.parent; | 
|   751       while (parent != null) { |   752       while (parent != null) { | 
|   752         if (parent is ir.Member) { |   753         if (parent is ir.Member) { | 
|   753           executableContext = memberContext = getMember(parent); |   754           executableContext = memberContext = getMember(parent); | 
|   754           break; |   755           break; | 
|   755         } |   756         } | 
|   756         if (parent is ir.FunctionDeclaration || |   757         if (parent is ir.FunctionDeclaration || | 
|   757             parent is ir.FunctionExpression) { |   758             parent is ir.FunctionExpression) { | 
|   758           KLocalFunction localFunction = _getLocalFunction(parent); |   759           Local localFunction = _getLocalFunction(parent); | 
|   759           executableContext = localFunction; |   760           executableContext = localFunction; | 
|   760           memberContext = localFunction.memberContext; |   761           memberContext = localFunction.memberContext; | 
|   761           break; |   762           break; | 
|   762         } |   763         } | 
|   763         parent = parent.parent; |   764         parent = parent.parent; | 
|   764       } |   765       } | 
|   765       String name; |   766       String name; | 
|   766       FunctionType functionType; |   767       FunctionType functionType; | 
|   767       if (node is ir.FunctionDeclaration) { |   768       if (node is ir.FunctionDeclaration) { | 
|   768         name = node.variable.name; |   769         name = node.variable.name; | 
|   769         functionType = getFunctionType(node.function); |   770         functionType = getFunctionType(node.function); | 
|   770       } else if (node is ir.FunctionExpression) { |   771       } else if (node is ir.FunctionExpression) { | 
|   771         functionType = getFunctionType(node.function); |   772         functionType = getFunctionType(node.function); | 
|   772       } |   773       } | 
|   773       return new KLocalFunction( |   774       return createLocalFunction( | 
|   774           name, memberContext, executableContext, functionType); |   775           name, memberContext, executableContext, functionType); | 
|   775     }); |   776     }); | 
|   776   } |   777   } | 
 |   778  | 
 |   779   IndexedLibrary createLibrary(int libraryIndex, String name, Uri canonicalUri); | 
 |   780  | 
 |   781   IndexedClass createClass(LibraryEntity library, int classIndex, String name, | 
 |   782       {bool isAbstract}); | 
 |   783  | 
 |   784   TypeVariableEntity createTypeVariable( | 
 |   785       Entity typeDeclaration, String name, int index); | 
 |   786  | 
 |   787   IndexedConstructor createGenerativeConstructor( | 
 |   788       int memberIndex, | 
 |   789       ClassEntity enclosingClass, | 
 |   790       Name name, | 
 |   791       ParameterStructure parameterStructure, | 
 |   792       {bool isExternal, | 
 |   793       bool isConst}); | 
 |   794  | 
 |   795   IndexedConstructor createFactoryConstructor( | 
 |   796       int memberIndex, | 
 |   797       ClassEntity enclosingClass, | 
 |   798       Name name, | 
 |   799       ParameterStructure parameterStructure, | 
 |   800       {bool isExternal, | 
 |   801       bool isConst, | 
 |   802       bool isFromEnvironmentConstructor}); | 
 |   803  | 
 |   804   IndexedFunction createGetter(int memberIndex, LibraryEntity library, | 
 |   805       ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker, | 
 |   806       {bool isStatic, bool isExternal, bool isAbstract}); | 
 |   807  | 
 |   808   IndexedFunction createMethod( | 
 |   809       int memberIndex, | 
 |   810       LibraryEntity library, | 
 |   811       ClassEntity enclosingClass, | 
 |   812       Name name, | 
 |   813       ParameterStructure parameterStructure, | 
 |   814       AsyncMarker asyncMarker, | 
 |   815       {bool isStatic, | 
 |   816       bool isExternal, | 
 |   817       bool isAbstract}); | 
 |   818  | 
 |   819   IndexedFunction createSetter(int memberIndex, LibraryEntity library, | 
 |   820       ClassEntity enclosingClass, Name name, | 
 |   821       {bool isStatic, bool isExternal, bool isAbstract}); | 
 |   822  | 
 |   823   IndexedField createField(int memberIndex, LibraryEntity library, | 
 |   824       ClassEntity enclosingClass, Name name, | 
 |   825       {bool isStatic, bool isAssignable, bool isConst}); | 
 |   826  | 
 |   827   Local createLocalFunction(String name, MemberEntity memberContext, | 
 |   828       Entity executableContext, FunctionType functionType); | 
 |   829 } | 
 |   830  | 
 |   831 /// Completes the [ElementCreatorMixin] by creating K-model elements. | 
 |   832 abstract class KElementCreatorMixin implements ElementCreatorMixin { | 
 |   833   IndexedLibrary createLibrary( | 
 |   834       int libraryIndex, String name, Uri canonicalUri) { | 
 |   835     return new KLibrary(libraryIndex, name, canonicalUri); | 
 |   836   } | 
 |   837  | 
 |   838   IndexedClass createClass(LibraryEntity library, int classIndex, String name, | 
 |   839       {bool isAbstract}) { | 
 |   840     return new KClass(library, classIndex, name, isAbstract: isAbstract); | 
 |   841   } | 
 |   842  | 
 |   843   TypeVariableEntity createTypeVariable( | 
 |   844       Entity typeDeclaration, String name, int index) { | 
 |   845     return new KTypeVariable(typeDeclaration, name, index); | 
 |   846   } | 
 |   847  | 
 |   848   IndexedConstructor createGenerativeConstructor( | 
 |   849       int memberIndex, | 
 |   850       ClassEntity enclosingClass, | 
 |   851       Name name, | 
 |   852       ParameterStructure parameterStructure, | 
 |   853       {bool isExternal, | 
 |   854       bool isConst}) { | 
 |   855     return new KGenerativeConstructor( | 
 |   856         memberIndex, enclosingClass, name, parameterStructure, | 
 |   857         isExternal: isExternal, isConst: isConst); | 
 |   858   } | 
 |   859  | 
 |   860   IndexedConstructor createFactoryConstructor( | 
 |   861       int memberIndex, | 
 |   862       ClassEntity enclosingClass, | 
 |   863       Name name, | 
 |   864       ParameterStructure parameterStructure, | 
 |   865       {bool isExternal, | 
 |   866       bool isConst, | 
 |   867       bool isFromEnvironmentConstructor}) { | 
 |   868     return new KFactoryConstructor( | 
 |   869         memberIndex, enclosingClass, name, parameterStructure, | 
 |   870         isExternal: isExternal, | 
 |   871         isConst: isConst, | 
 |   872         isFromEnvironmentConstructor: isFromEnvironmentConstructor); | 
 |   873   } | 
 |   874  | 
 |   875   IndexedFunction createGetter(int memberIndex, LibraryEntity library, | 
 |   876       ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker, | 
 |   877       {bool isStatic, bool isExternal, bool isAbstract}) { | 
 |   878     return new KGetter(memberIndex, library, enclosingClass, name, asyncMarker, | 
 |   879         isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); | 
 |   880   } | 
 |   881  | 
 |   882   IndexedFunction createMethod( | 
 |   883       int memberIndex, | 
 |   884       LibraryEntity library, | 
 |   885       ClassEntity enclosingClass, | 
 |   886       Name name, | 
 |   887       ParameterStructure parameterStructure, | 
 |   888       AsyncMarker asyncMarker, | 
 |   889       {bool isStatic, | 
 |   890       bool isExternal, | 
 |   891       bool isAbstract}) { | 
 |   892     return new KMethod(memberIndex, library, enclosingClass, name, | 
 |   893         parameterStructure, asyncMarker, | 
 |   894         isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); | 
 |   895   } | 
 |   896  | 
 |   897   IndexedFunction createSetter(int memberIndex, LibraryEntity library, | 
 |   898       ClassEntity enclosingClass, Name name, | 
 |   899       {bool isStatic, bool isExternal, bool isAbstract}) { | 
 |   900     return new KSetter(memberIndex, library, enclosingClass, name, | 
 |   901         isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); | 
 |   902   } | 
 |   903  | 
 |   904   IndexedField createField(int memberIndex, LibraryEntity library, | 
 |   905       ClassEntity enclosingClass, Name name, | 
 |   906       {bool isStatic, bool isAssignable, bool isConst}) { | 
 |   907     return new KField(memberIndex, library, enclosingClass, name, | 
 |   908         isStatic: isStatic, isAssignable: isAssignable, isConst: isConst); | 
 |   909   } | 
 |   910  | 
 |   911   Local createLocalFunction(String name, MemberEntity memberContext, | 
 |   912       Entity executableContext, FunctionType functionType) { | 
 |   913     return new KLocalFunction( | 
 |   914         name, memberContext, executableContext, functionType); | 
 |   915   } | 
|   777 } |   916 } | 
|   778  |   917  | 
|   779 /// Implementation of [KernelToElementMapForImpact] that only supports world |   918 /// Implementation of [KernelToElementMapForImpact] that only supports world | 
|   780 /// impact computation. |   919 /// impact computation. | 
|   781 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when |   920 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when | 
|   782 // [JsStrategy] is the default. |   921 // [JsStrategy] is the default. | 
|   783 abstract class KernelToElementMapForImpactImpl |   922 abstract class KernelToElementMapForImpactImpl | 
|   784     implements |   923     implements | 
|   785         KernelToElementMapBase, |   924         KernelToElementMapBase, | 
|   786         KernelToElementMapForImpact, |   925         KernelToElementMapForImpact, | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|   814 } |   953 } | 
|   815  |   954  | 
|   816 /// Implementation of [KernelToElementMapForImpact] that only supports world |   955 /// Implementation of [KernelToElementMapForImpact] that only supports world | 
|   817 /// impact computation. |   956 /// impact computation. | 
|   818 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when |   957 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when | 
|   819 // [JsStrategy] is the default. |   958 // [JsStrategy] is the default. | 
|   820 class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase |   959 class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase | 
|   821     with |   960     with | 
|   822         KernelToElementMapForImpactMixin, |   961         KernelToElementMapForImpactMixin, | 
|   823         KernelToElementMapForImpactImpl, |   962         KernelToElementMapForImpactImpl, | 
 |   963         ElementCreatorMixin, | 
|   824         KElementCreatorMixin { |   964         KElementCreatorMixin { | 
|   825   KernelToElementMapForImpactImpl2( |   965   KernelToElementMapForImpactImpl2( | 
|   826       DiagnosticReporter reporter, Environment environment) |   966       DiagnosticReporter reporter, Environment environment) | 
|   827       : super(reporter, environment); |   967       : super(reporter, environment); | 
|   828 } |   968 } | 
|   829  |   969  | 
|   830 /// Element builder used for creating elements and types corresponding to Kernel |   970 /// Element builder used for creating elements and types corresponding to Kernel | 
|   831 /// IR nodes. |   971 /// IR nodes. | 
|   832 // TODO(johnniwinther): Use this in the JsStrategy |   972 // TODO(johnniwinther): Use this in the JsStrategy | 
|   833 class KernelToElementMapForBuildingImpl extends KernelToElementMapBase |   973 class KernelToElementMapForBuildingImpl extends KernelToElementMapBase | 
|   834     with KernelToElementMapForBuildingMixin, KElementCreatorMixin |   974     with | 
 |   975         KernelToElementMapForBuildingMixin, | 
 |   976         ElementCreatorMixin, | 
 |   977         KElementCreatorMixin | 
|   835     implements KernelToWorldBuilder { |   978     implements KernelToWorldBuilder { | 
|   836   KernelToElementMapForBuildingImpl( |   979   KernelToElementMapForBuildingImpl( | 
|   837       DiagnosticReporter reporter, Environment environment) |   980       DiagnosticReporter reporter, Environment environment) | 
|   838       : super(reporter, environment); |   981       : super(reporter, environment); | 
|   839  |   982  | 
|   840   ConstantEnvironment get constantEnvironment => _constantEnvironment; |   983   ConstantEnvironment get constantEnvironment => _constantEnvironment; | 
|   841  |   984  | 
|   842   @override |   985   @override | 
|   843   ConstantValue getFieldConstantValue(ir.Field field) { |   986   ConstantValue getFieldConstantValue(ir.Field field) { | 
|   844     // TODO(johnniwinther): Cache the result in [FieldData]. |   987     // TODO(johnniwinther): Cache the result in [FieldData]. | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   886   } |  1029   } | 
|   887 } |  1030 } | 
|   888  |  1031  | 
|   889 /// [KernelToElementMap] implementation used for both world impact computation |  1032 /// [KernelToElementMap] implementation used for both world impact computation | 
|   890 /// and SSA building. |  1033 /// and SSA building. | 
|   891 // TODO(johnniwinther): Remove this when [JsStrategy] is the default. |  1034 // TODO(johnniwinther): Remove this when [JsStrategy] is the default. | 
|   892 class KernelToElementMapImpl extends KernelToElementMapForBuildingImpl |  1035 class KernelToElementMapImpl extends KernelToElementMapForBuildingImpl | 
|   893     with |  1036     with | 
|   894         KernelToElementMapForImpactMixin, |  1037         KernelToElementMapForImpactMixin, | 
|   895         KernelToElementMapForImpactImpl, |  1038         KernelToElementMapForImpactImpl, | 
 |  1039         ElementCreatorMixin, | 
|   896         KElementCreatorMixin |  1040         KElementCreatorMixin | 
|   897     implements KernelToElementMapForImpactImpl2 { |  1041     implements KernelToElementMapForImpactImpl2 { | 
|   898   KernelToElementMapImpl(DiagnosticReporter reporter, Environment environment) |  1042   KernelToElementMapImpl(DiagnosticReporter reporter, Environment environment) | 
|   899       : super(reporter, environment); |  1043       : super(reporter, environment); | 
|   900 } |  1044 } | 
|   901  |  1045  | 
|   902 class KernelElementEnvironment implements ElementEnvironment { |  1046 class KernelElementEnvironment implements ElementEnvironment { | 
|   903   final KernelToElementMapBase elementMap; |  1047   final KernelToElementMapBase elementMap; | 
|   904  |  1048  | 
|   905   KernelElementEnvironment(this.elementMap); |  1049   KernelElementEnvironment(this.elementMap); | 
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1526   MemberEntity toBackendMember(covariant IndexedMember member) { |  1670   MemberEntity toBackendMember(covariant IndexedMember member) { | 
|  1527     return _backend._memberList[member.memberIndex]; |  1671     return _backend._memberList[member.memberIndex]; | 
|  1528   } |  1672   } | 
|  1529  |  1673  | 
|  1530   MemberEntity toFrontendMember(covariant IndexedMember member) { |  1674   MemberEntity toFrontendMember(covariant IndexedMember member) { | 
|  1531     return _frontend._memberList[member.memberIndex]; |  1675     return _frontend._memberList[member.memberIndex]; | 
|  1532   } |  1676   } | 
|  1533 } |  1677 } | 
|  1534  |  1678  | 
|  1535 class JsKernelToElementMap extends KernelToElementMapBase |  1679 class JsKernelToElementMap extends KernelToElementMapBase | 
|  1536     with KernelToElementMapForBuildingMixin, JsElementCreatorMixin |  1680     with | 
|  1537     implements KernelToWorldBuilder { |  1681         KernelToElementMapForBuildingMixin, | 
 |  1682         JsElementCreatorMixin, | 
 |  1683         // TODO(johnniwinther): Avoid mixin in [ElementCreatorMixin]. The | 
 |  1684         // codegen world should be a strict subset of the resolution world and | 
 |  1685         // creating elements for IR nodes should therefore not be needed. | 
 |  1686         // Currently some are created purely for testing (like | 
 |  1687         // `element == commonElements.foo`, where 'foo' might not be live). | 
 |  1688         // Others are created because we do a | 
 |  1689         // `elementEnvironment.forEachLibraryMember(...)` call on each emitted | 
 |  1690         // library. | 
 |  1691         ElementCreatorMixin | 
 |  1692     implements | 
 |  1693         KernelToWorldBuilder { | 
|  1538   JsToFrontendMap _jsToFrontendMap; |  1694   JsToFrontendMap _jsToFrontendMap; | 
|  1539  |  1695  | 
|  1540   Map<ir.Library, JLibrary> _libraryMap = <ir.Library, JLibrary>{}; |  | 
|  1541   Map<ir.Class, JClass> _classMap = <ir.Class, JClass>{}; |  | 
|  1542   Map<ir.TypeParameter, JTypeVariable> _typeVariableMap = |  | 
|  1543       <ir.TypeParameter, JTypeVariable>{}; |  | 
|  1544   Map<ir.Member, JConstructor> _constructorMap = <ir.Member, JConstructor>{}; |  | 
|  1545   Map<ir.Procedure, JFunction> _methodMap = <ir.Procedure, JFunction>{}; |  | 
|  1546   Map<ir.Field, JField> _fieldMap = <ir.Field, JField>{}; |  | 
|  1547  |  | 
|  1548   JsKernelToElementMap(DiagnosticReporter reporter, Environment environment, |  1696   JsKernelToElementMap(DiagnosticReporter reporter, Environment environment, | 
|  1549       KernelToElementMapForImpactImpl _elementMap) |  1697       KernelToElementMapForImpactImpl _elementMap) | 
|  1550       : super(reporter, environment) { |  1698       : super(reporter, environment) { | 
|  1551     _jsToFrontendMap = new JsToFrontendMapImpl(_elementMap, this); |  1699     _jsToFrontendMap = new JsToFrontendMapImpl(_elementMap, this); | 
|  1552     _env.copyFrom(_elementMap._env); |  1700     _env.copyFrom(_elementMap._env); | 
|  1553     for (int libraryIndex = 0; |  1701     for (int libraryIndex = 0; | 
|  1554         libraryIndex < _elementMap._libraryEnvs.length; |  1702         libraryIndex < _elementMap._libraryEnvs.length; | 
|  1555         libraryIndex++) { |  1703         libraryIndex++) { | 
|  1556       LibraryEnv env = _elementMap._libraryEnvs[libraryIndex]; |  1704       LibraryEnv env = _elementMap._libraryEnvs[libraryIndex]; | 
|  1557       LibraryEntity oldLibrary = _elementMap._libraryList[libraryIndex]; |  1705       LibraryEntity oldLibrary = _elementMap._libraryList[libraryIndex]; | 
|  1558       JLibrary newLibrary = createLibrary(oldLibrary); |  1706       LibraryEntity newLibrary = convertLibrary(oldLibrary); | 
|  1559       _libraryMap[env.library] = newLibrary; |  1707       _libraryMap[env.library] = newLibrary; | 
|  1560       _libraryList.add(newLibrary); |  1708       _libraryList.add(newLibrary); | 
|  1561       _libraryEnvs.add(env); |  1709       _libraryEnvs.add(env); | 
|  1562     } |  1710     } | 
|  1563     for (int classIndex = 0; |  1711     for (int classIndex = 0; | 
|  1564         classIndex < _elementMap._classEnvs.length; |  1712         classIndex < _elementMap._classEnvs.length; | 
|  1565         classIndex++) { |  1713         classIndex++) { | 
|  1566       ClassEnv env = _elementMap._classEnvs[classIndex]; |  1714       ClassEnv env = _elementMap._classEnvs[classIndex]; | 
|  1567       ClassEntity oldClass = _elementMap._classList[classIndex]; |  1715       ClassEntity oldClass = _elementMap._classList[classIndex]; | 
|  1568       IndexedLibrary oldLibrary = oldClass.library; |  1716       IndexedLibrary oldLibrary = oldClass.library; | 
|  1569       JLibrary newLibrary = _libraryList[oldLibrary.libraryIndex]; |  1717       LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; | 
|  1570       JClass newClass = createClass(newLibrary, oldClass); |  1718       ClassEntity newClass = convertClass(newLibrary, oldClass); | 
|  1571       _classMap[env.cls] = newClass; |  1719       _classMap[env.cls] = newClass; | 
|  1572       _classList.add(newClass); |  1720       _classList.add(newClass); | 
|  1573       _classEnvs.add(env); |  1721       _classEnvs.add(env); | 
|  1574     } |  1722     } | 
|  1575     for (int memberIndex = 0; |  1723     for (int memberIndex = 0; | 
|  1576         memberIndex < _elementMap._memberData.length; |  1724         memberIndex < _elementMap._memberData.length; | 
|  1577         memberIndex++) { |  1725         memberIndex++) { | 
|  1578       MemberData data = _elementMap._memberData[memberIndex]; |  1726       MemberData data = _elementMap._memberData[memberIndex]; | 
|  1579       MemberEntity oldMember = _elementMap._memberList[memberIndex]; |  1727       MemberEntity oldMember = _elementMap._memberList[memberIndex]; | 
|  1580       IndexedLibrary oldLibrary = oldMember.library; |  1728       IndexedLibrary oldLibrary = oldMember.library; | 
|  1581       IndexedClass oldClass = oldMember.enclosingClass; |  1729       IndexedClass oldClass = oldMember.enclosingClass; | 
|  1582       JLibrary newLibrary = _libraryList[oldLibrary.libraryIndex]; |  1730       LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; | 
|  1583       JClass newClass = |  1731       ClassEntity newClass = | 
|  1584           oldClass != null ? _classList[oldClass.classIndex] : null; |  1732           oldClass != null ? _classList[oldClass.classIndex] : null; | 
|  1585       JMember newMember = createMember(newLibrary, newClass, oldMember); |  1733       IndexedMember newMember = convertMember(newLibrary, newClass, oldMember); | 
|  1586       _memberList.add(newMember); |  1734       _memberList.add(newMember); | 
|  1587       _memberData.add(data); |  1735       _memberData.add(data); | 
|  1588       if (newMember.isField) { |  1736       if (newMember.isField) { | 
|  1589         _fieldMap[data.node] = newMember; |  1737         _fieldMap[data.node] = newMember; | 
|  1590       } else if (newMember.isConstructor) { |  1738       } else if (newMember.isConstructor) { | 
|  1591         _constructorMap[data.node] = newMember; |  1739         _constructorMap[data.node] = newMember; | 
|  1592       } else { |  1740       } else { | 
|  1593         _methodMap[data.node] = newMember; |  1741         _methodMap[data.node] = newMember; | 
|  1594       } |  1742       } | 
|  1595     } |  1743     } | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|  1623     ClassEntity cls = _classMap[node]; |  1771     ClassEntity cls = _classMap[node]; | 
|  1624     assert(cls != null, "No class entity for $node"); |  1772     assert(cls != null, "No class entity for $node"); | 
|  1625     return cls; |  1773     return cls; | 
|  1626   } |  1774   } | 
|  1627  |  1775  | 
|  1628   @override |  1776   @override | 
|  1629   TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { |  1777   TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { | 
|  1630     throw new UnsupportedError("JsKernelToElementMap._getTypeVariable"); |  1778     throw new UnsupportedError("JsKernelToElementMap._getTypeVariable"); | 
|  1631   } |  1779   } | 
|  1632  |  1780  | 
|  1633   @override |  1781   // TODO(johnniwinther): Reinsert these when [ElementCreatorMixin] is no longer | 
 |  1782   // mixed in. | 
 |  1783   /*@override | 
|  1634   FieldEntity _getField(ir.Field node) { |  1784   FieldEntity _getField(ir.Field node) { | 
|  1635     FieldEntity field = _fieldMap[node]; |  1785     FieldEntity field = _fieldMap[node]; | 
|  1636     assert(field != null, "No field entity for $node"); |  1786     assert(field != null, "No field entity for $node"); | 
|  1637     return field; |  1787     return field; | 
|  1638   } |  1788   }*/ | 
|  1639  |  1789  | 
|  1640   @override |  1790   /*@override | 
|  1641   FunctionEntity _getMethod(ir.Procedure node) { |  1791   FunctionEntity _getMethod(ir.Procedure node) { | 
|  1642     FunctionEntity function = _methodMap[node]; |  1792     FunctionEntity function = _methodMap[node]; | 
|  1643     assert(function != null, "No function entity for $node"); |  1793     assert(function != null, "No function entity for $node"); | 
|  1644     return function; |  1794     return function; | 
|  1645   } |  1795   }*/ | 
|  1646  |  1796  | 
|  1647   @override |  1797   @override | 
|  1648   ConstructorEntity _getConstructor(ir.Member node) { |  1798   ConstructorEntity _getConstructor(ir.Member node) { | 
|  1649     ConstructorEntity constructor = _constructorMap[node]; |  1799     ConstructorEntity constructor = _constructorMap[node]; | 
|  1650     assert(constructor != null, "No constructor entity for $node"); |  1800     assert(constructor != null, "No constructor entity for $node"); | 
|  1651     return constructor; |  1801     return constructor; | 
|  1652   } |  1802   } | 
|  1653  |  1803  | 
|  1654   @override |  1804   @override | 
|  1655   ir.Member getMemberNode(MemberEntity member) { |  1805   ir.Member getMemberNode(MemberEntity member) { | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
|  1677     throw new UnsupportedError( |  1827     throw new UnsupportedError( | 
|  1678         "JsKernelToElementMap.getConstantFieldInitializer"); |  1828         "JsKernelToElementMap.getConstantFieldInitializer"); | 
|  1679   } |  1829   } | 
|  1680  |  1830  | 
|  1681   @override |  1831   @override | 
|  1682   bool hasConstantFieldInitializer(FieldEntity field) { |  1832   bool hasConstantFieldInitializer(FieldEntity field) { | 
|  1683     throw new UnsupportedError( |  1833     throw new UnsupportedError( | 
|  1684         "JsKernelToElementMap.hasConstantFieldInitializer"); |  1834         "JsKernelToElementMap.hasConstantFieldInitializer"); | 
|  1685   } |  1835   } | 
|  1686 } |  1836 } | 
| OLD | NEW |