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

Unified Diff: pkg/compiler/lib/src/kernel/element_map_impl.dart

Issue 2969013002: Support creating elements from IR nodes in JsKernelToElementMap (Closed)
Patch Set: Updated cf. comments 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/js_model/js_strategy.dart ('k') | pkg/compiler/lib/src/kernel/kelements.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/element_map_impl.dart
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 4af0821c12d2487c597e9162f5e0e62ba8d35430..5d45001458ce004c198c493d10a818e050236a9e 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -513,9 +513,8 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin {
}
}
-/// Mixin that implements the abstract methods in [KernelToElementMapBase] by
-/// creating K-model elements.
-abstract class KElementCreatorMixin {
+/// Mixin that implements the abstract methods in [KernelToElementMapBase].
+abstract class ElementCreatorMixin {
ProgramEnv get _env;
List<LibraryEntity> get _libraryList;
List<LibraryEnv> get _libraryEnvs;
@@ -524,15 +523,16 @@ abstract class KElementCreatorMixin {
List<MemberEntity> get _memberList;
List<MemberData> get _memberData;
- Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{};
- Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{};
- Map<ir.TypeParameter, KTypeVariable> _typeVariableMap =
- <ir.TypeParameter, KTypeVariable>{};
- Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{};
- Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{};
- Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{};
- Map<ir.TreeNode, KLocalFunction> _localFunctionMap =
- <ir.TreeNode, KLocalFunction>{};
+ Map<ir.Library, IndexedLibrary> _libraryMap = <ir.Library, IndexedLibrary>{};
+ Map<ir.Class, IndexedClass> _classMap = <ir.Class, IndexedClass>{};
+ Map<ir.TypeParameter, TypeVariableEntity> _typeVariableMap =
+ <ir.TypeParameter, TypeVariableEntity>{};
+ Map<ir.Member, IndexedConstructor> _constructorMap =
+ <ir.Member, IndexedConstructor>{};
+ Map<ir.Procedure, IndexedFunction> _methodMap =
+ <ir.Procedure, IndexedFunction>{};
+ Map<ir.Field, IndexedField> _fieldMap = <ir.Field, IndexedField>{};
+ Map<ir.TreeNode, Local> _localFunctionMap = <ir.TreeNode, Local>{};
Name getName(ir.Name node);
FunctionType getFunctionType(ir.FunctionNode node);
@@ -559,7 +559,7 @@ abstract class KElementCreatorMixin {
name = path.substring(path.lastIndexOf('/') + 1);
}
LibraryEntity library =
- new KLibrary(_libraryMap.length, name, canonicalUri);
+ createLibrary(_libraryMap.length, name, canonicalUri);
_libraryList.add(library);
return library;
});
@@ -572,7 +572,7 @@ abstract class KElementCreatorMixin {
classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name);
}
_classEnvs.add(classEnv);
- ClassEntity cls = new KClass(library, _classMap.length, node.name,
+ ClassEntity cls = createClass(library, _classMap.length, node.name,
isAbstract: node.isAbstract);
_classList.add(cls);
return cls;
@@ -584,7 +584,7 @@ abstract class KElementCreatorMixin {
if (node.parent is ir.Class) {
ir.Class cls = node.parent;
int index = cls.typeParameters.indexOf(node);
- return new KTypeVariable(_getClass(cls), node.name, index);
+ return createTypeVariable(_getClass(cls), node.name, index);
}
if (node.parent is ir.FunctionNode) {
ir.FunctionNode func = node.parent;
@@ -600,7 +600,7 @@ abstract class KElementCreatorMixin {
ir.Class cls = procedure.enclosingClass;
return _getTypeVariable(cls.typeParameters[index]);
} else {
- return new KTypeVariable(_getMethod(procedure), node.name, index);
+ return createTypeVariable(_getMethod(procedure), node.name, index);
}
}
}
@@ -619,7 +619,7 @@ abstract class KElementCreatorMixin {
ir.FunctionNode functionNode;
if (node is ir.Constructor) {
functionNode = node.function;
- constructor = new KGenerativeConstructor(memberIndex, enclosingClass,
+ constructor = createGenerativeConstructor(memberIndex, enclosingClass,
name, _getParameterStructure(functionNode),
isExternal: isExternal, isConst: node.isConst);
} else if (node is ir.Procedure) {
@@ -627,8 +627,8 @@ abstract class KElementCreatorMixin {
bool isFromEnvironment = isExternal &&
name.text == 'fromEnvironment' &&
const ['int', 'bool', 'String'].contains(enclosingClass.name);
- constructor = new KFactoryConstructor(memberIndex, enclosingClass, name,
- _getParameterStructure(functionNode),
+ constructor = createFactoryConstructor(memberIndex, enclosingClass,
+ name, _getParameterStructure(functionNode),
isExternal: isExternal,
isConst: node.isConst,
isFromEnvironmentConstructor: isFromEnvironment);
@@ -658,7 +658,7 @@ abstract class KElementCreatorMixin {
bool isStatic = node.isStatic;
bool isExternal = node.isExternal;
bool isAbstract = node.isAbstract;
- KFunction function;
+ IndexedFunction function;
AsyncMarker asyncMarker;
switch (node.function.asyncMarker) {
case ir.AsyncMarker.Async:
@@ -681,7 +681,7 @@ abstract class KElementCreatorMixin {
case ir.ProcedureKind.Factory:
throw new UnsupportedError("Cannot create method from factory.");
case ir.ProcedureKind.Getter:
- function = new KGetter(
+ function = createGetter(
memberIndex, library, enclosingClass, name, asyncMarker,
isStatic: isStatic,
isExternal: isExternal,
@@ -689,7 +689,7 @@ abstract class KElementCreatorMixin {
break;
case ir.ProcedureKind.Method:
case ir.ProcedureKind.Operator:
- function = new KMethod(memberIndex, library, enclosingClass, name,
+ function = createMethod(memberIndex, library, enclosingClass, name,
_getParameterStructure(node.function), asyncMarker,
isStatic: isStatic,
isExternal: isExternal,
@@ -697,8 +697,8 @@ abstract class KElementCreatorMixin {
break;
case ir.ProcedureKind.Setter:
assert(asyncMarker == AsyncMarker.SYNC);
- function = new KSetter(
- memberIndex, library, enclosingClass, getName(node.name).setter,
+ function = createSetter(
+ memberIndex, library, enclosingClass, name.setter,
isStatic: isStatic,
isExternal: isExternal,
isAbstract: isAbstract);
@@ -724,7 +724,8 @@ abstract class KElementCreatorMixin {
Name name = getName(node.name);
bool isStatic = node.isStatic;
_memberData.add(new FieldData(node));
- FieldEntity field = new KField(memberIndex, library, enclosingClass, name,
+ FieldEntity field = createField(
+ memberIndex, library, enclosingClass, name,
isStatic: isStatic,
isAssignable: node.isMutable,
isConst: node.isConst);
@@ -755,7 +756,7 @@ abstract class KElementCreatorMixin {
}
if (parent is ir.FunctionDeclaration ||
parent is ir.FunctionExpression) {
- KLocalFunction localFunction = _getLocalFunction(parent);
+ Local localFunction = _getLocalFunction(parent);
executableContext = localFunction;
memberContext = localFunction.memberContext;
break;
@@ -770,10 +771,148 @@ abstract class KElementCreatorMixin {
} else if (node is ir.FunctionExpression) {
functionType = getFunctionType(node.function);
}
- return new KLocalFunction(
+ return createLocalFunction(
name, memberContext, executableContext, functionType);
});
}
+
+ IndexedLibrary createLibrary(int libraryIndex, String name, Uri canonicalUri);
+
+ IndexedClass createClass(LibraryEntity library, int classIndex, String name,
+ {bool isAbstract});
+
+ TypeVariableEntity createTypeVariable(
+ Entity typeDeclaration, String name, int index);
+
+ IndexedConstructor createGenerativeConstructor(
+ int memberIndex,
+ ClassEntity enclosingClass,
+ Name name,
+ ParameterStructure parameterStructure,
+ {bool isExternal,
+ bool isConst});
+
+ IndexedConstructor createFactoryConstructor(
+ int memberIndex,
+ ClassEntity enclosingClass,
+ Name name,
+ ParameterStructure parameterStructure,
+ {bool isExternal,
+ bool isConst,
+ bool isFromEnvironmentConstructor});
+
+ IndexedFunction createGetter(int memberIndex, LibraryEntity library,
+ ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker,
+ {bool isStatic, bool isExternal, bool isAbstract});
+
+ IndexedFunction createMethod(
+ int memberIndex,
+ LibraryEntity library,
+ ClassEntity enclosingClass,
+ Name name,
+ ParameterStructure parameterStructure,
+ AsyncMarker asyncMarker,
+ {bool isStatic,
+ bool isExternal,
+ bool isAbstract});
+
+ IndexedFunction createSetter(int memberIndex, LibraryEntity library,
+ ClassEntity enclosingClass, Name name,
+ {bool isStatic, bool isExternal, bool isAbstract});
+
+ IndexedField createField(int memberIndex, LibraryEntity library,
+ ClassEntity enclosingClass, Name name,
+ {bool isStatic, bool isAssignable, bool isConst});
+
+ Local createLocalFunction(String name, MemberEntity memberContext,
+ Entity executableContext, FunctionType functionType);
+}
+
+/// Completes the [ElementCreatorMixin] by creating K-model elements.
+abstract class KElementCreatorMixin implements ElementCreatorMixin {
+ IndexedLibrary createLibrary(
+ int libraryIndex, String name, Uri canonicalUri) {
+ return new KLibrary(libraryIndex, name, canonicalUri);
+ }
+
+ IndexedClass createClass(LibraryEntity library, int classIndex, String name,
+ {bool isAbstract}) {
+ return new KClass(library, classIndex, name, isAbstract: isAbstract);
+ }
+
+ TypeVariableEntity createTypeVariable(
+ Entity typeDeclaration, String name, int index) {
+ return new KTypeVariable(typeDeclaration, name, index);
+ }
+
+ IndexedConstructor createGenerativeConstructor(
+ int memberIndex,
+ ClassEntity enclosingClass,
+ Name name,
+ ParameterStructure parameterStructure,
+ {bool isExternal,
+ bool isConst}) {
+ return new KGenerativeConstructor(
+ memberIndex, enclosingClass, name, parameterStructure,
+ isExternal: isExternal, isConst: isConst);
+ }
+
+ IndexedConstructor createFactoryConstructor(
+ int memberIndex,
+ ClassEntity enclosingClass,
+ Name name,
+ ParameterStructure parameterStructure,
+ {bool isExternal,
+ bool isConst,
+ bool isFromEnvironmentConstructor}) {
+ return new KFactoryConstructor(
+ memberIndex, enclosingClass, name, parameterStructure,
+ isExternal: isExternal,
+ isConst: isConst,
+ isFromEnvironmentConstructor: isFromEnvironmentConstructor);
+ }
+
+ IndexedFunction createGetter(int memberIndex, LibraryEntity library,
+ ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker,
+ {bool isStatic, bool isExternal, bool isAbstract}) {
+ return new KGetter(memberIndex, library, enclosingClass, name, asyncMarker,
+ isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+ }
+
+ IndexedFunction createMethod(
+ int memberIndex,
+ LibraryEntity library,
+ ClassEntity enclosingClass,
+ Name name,
+ ParameterStructure parameterStructure,
+ AsyncMarker asyncMarker,
+ {bool isStatic,
+ bool isExternal,
+ bool isAbstract}) {
+ return new KMethod(memberIndex, library, enclosingClass, name,
+ parameterStructure, asyncMarker,
+ isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+ }
+
+ IndexedFunction createSetter(int memberIndex, LibraryEntity library,
+ ClassEntity enclosingClass, Name name,
+ {bool isStatic, bool isExternal, bool isAbstract}) {
+ return new KSetter(memberIndex, library, enclosingClass, name,
+ isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+ }
+
+ IndexedField createField(int memberIndex, LibraryEntity library,
+ ClassEntity enclosingClass, Name name,
+ {bool isStatic, bool isAssignable, bool isConst}) {
+ return new KField(memberIndex, library, enclosingClass, name,
+ isStatic: isStatic, isAssignable: isAssignable, isConst: isConst);
+ }
+
+ Local createLocalFunction(String name, MemberEntity memberContext,
+ Entity executableContext, FunctionType functionType) {
+ return new KLocalFunction(
+ name, memberContext, executableContext, functionType);
+ }
}
/// Implementation of [KernelToElementMapForImpact] that only supports world
@@ -821,6 +960,7 @@ class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase
with
KernelToElementMapForImpactMixin,
KernelToElementMapForImpactImpl,
+ ElementCreatorMixin,
KElementCreatorMixin {
KernelToElementMapForImpactImpl2(
DiagnosticReporter reporter, Environment environment)
@@ -831,7 +971,10 @@ class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase
/// IR nodes.
// TODO(johnniwinther): Use this in the JsStrategy
class KernelToElementMapForBuildingImpl extends KernelToElementMapBase
- with KernelToElementMapForBuildingMixin, KElementCreatorMixin
+ with
+ KernelToElementMapForBuildingMixin,
+ ElementCreatorMixin,
+ KElementCreatorMixin
implements KernelToWorldBuilder {
KernelToElementMapForBuildingImpl(
DiagnosticReporter reporter, Environment environment)
@@ -893,6 +1036,7 @@ class KernelToElementMapImpl extends KernelToElementMapForBuildingImpl
with
KernelToElementMapForImpactMixin,
KernelToElementMapForImpactImpl,
+ ElementCreatorMixin,
KElementCreatorMixin
implements KernelToElementMapForImpactImpl2 {
KernelToElementMapImpl(DiagnosticReporter reporter, Environment environment)
@@ -1533,18 +1677,22 @@ class JsToFrontendMapImpl extends JsToFrontendMapBase
}
class JsKernelToElementMap extends KernelToElementMapBase
- with KernelToElementMapForBuildingMixin, JsElementCreatorMixin
- implements KernelToWorldBuilder {
+ with
+ KernelToElementMapForBuildingMixin,
+ JsElementCreatorMixin,
+ // TODO(johnniwinther): Avoid mixin in [ElementCreatorMixin]. The
+ // codegen world should be a strict subset of the resolution world and
+ // creating elements for IR nodes should therefore not be needed.
+ // Currently some are created purely for testing (like
+ // `element == commonElements.foo`, where 'foo' might not be live).
+ // Others are created because we do a
+ // `elementEnvironment.forEachLibraryMember(...)` call on each emitted
+ // library.
+ ElementCreatorMixin
+ implements
+ KernelToWorldBuilder {
JsToFrontendMap _jsToFrontendMap;
- Map<ir.Library, JLibrary> _libraryMap = <ir.Library, JLibrary>{};
- Map<ir.Class, JClass> _classMap = <ir.Class, JClass>{};
- Map<ir.TypeParameter, JTypeVariable> _typeVariableMap =
- <ir.TypeParameter, JTypeVariable>{};
- Map<ir.Member, JConstructor> _constructorMap = <ir.Member, JConstructor>{};
- Map<ir.Procedure, JFunction> _methodMap = <ir.Procedure, JFunction>{};
- Map<ir.Field, JField> _fieldMap = <ir.Field, JField>{};
-
JsKernelToElementMap(DiagnosticReporter reporter, Environment environment,
KernelToElementMapForImpactImpl _elementMap)
: super(reporter, environment) {
@@ -1555,7 +1703,7 @@ class JsKernelToElementMap extends KernelToElementMapBase
libraryIndex++) {
LibraryEnv env = _elementMap._libraryEnvs[libraryIndex];
LibraryEntity oldLibrary = _elementMap._libraryList[libraryIndex];
- JLibrary newLibrary = createLibrary(oldLibrary);
+ LibraryEntity newLibrary = convertLibrary(oldLibrary);
_libraryMap[env.library] = newLibrary;
_libraryList.add(newLibrary);
_libraryEnvs.add(env);
@@ -1566,8 +1714,8 @@ class JsKernelToElementMap extends KernelToElementMapBase
ClassEnv env = _elementMap._classEnvs[classIndex];
ClassEntity oldClass = _elementMap._classList[classIndex];
IndexedLibrary oldLibrary = oldClass.library;
- JLibrary newLibrary = _libraryList[oldLibrary.libraryIndex];
- JClass newClass = createClass(newLibrary, oldClass);
+ LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex];
+ ClassEntity newClass = convertClass(newLibrary, oldClass);
_classMap[env.cls] = newClass;
_classList.add(newClass);
_classEnvs.add(env);
@@ -1579,10 +1727,10 @@ class JsKernelToElementMap extends KernelToElementMapBase
MemberEntity oldMember = _elementMap._memberList[memberIndex];
IndexedLibrary oldLibrary = oldMember.library;
IndexedClass oldClass = oldMember.enclosingClass;
- JLibrary newLibrary = _libraryList[oldLibrary.libraryIndex];
- JClass newClass =
+ LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex];
+ ClassEntity newClass =
oldClass != null ? _classList[oldClass.classIndex] : null;
- JMember newMember = createMember(newLibrary, newClass, oldMember);
+ IndexedMember newMember = convertMember(newLibrary, newClass, oldMember);
_memberList.add(newMember);
_memberData.add(data);
if (newMember.isField) {
@@ -1630,19 +1778,21 @@ class JsKernelToElementMap extends KernelToElementMapBase
throw new UnsupportedError("JsKernelToElementMap._getTypeVariable");
}
- @override
+ // TODO(johnniwinther): Reinsert these when [ElementCreatorMixin] is no longer
+ // mixed in.
+ /*@override
FieldEntity _getField(ir.Field node) {
FieldEntity field = _fieldMap[node];
assert(field != null, "No field entity for $node");
return field;
- }
+ }*/
- @override
+ /*@override
FunctionEntity _getMethod(ir.Procedure node) {
FunctionEntity function = _methodMap[node];
assert(function != null, "No function entity for $node");
return function;
- }
+ }*/
@override
ConstructorEntity _getConstructor(ir.Member node) {
« no previous file with comments | « pkg/compiler/lib/src/js_model/js_strategy.dart ('k') | pkg/compiler/lib/src/kernel/kelements.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698