Index: pkg/compiler/lib/src/js_backend/backend.dart |
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart |
index 536d6c91100ac3cb0cdf1b04b0bfa4a35656fc8c..0238e431d934e50cc463ca748e08b1dcb51c0e3e 100644 |
--- a/pkg/compiler/lib/src/js_backend/backend.dart |
+++ b/pkg/compiler/lib/src/js_backend/backend.dart |
@@ -319,13 +319,6 @@ class JavaScriptBackend { |
final OptimizerHintsForTests optimizerHints; |
- /// Set of classes that need to be considered for reflection although not |
- /// otherwise visible during resolution. |
- Iterable<ClassEntity> get classesRequiredForReflection { |
- // TODO(herhut): Clean this up when classes needed for rti are tracked. |
- return [commonElements.closureClass, commonElements.jsIndexableClass]; |
- } |
- |
FunctionCompiler functionCompiler; |
CodeEmitterTask emitter; |
@@ -466,6 +459,7 @@ class JavaScriptBackend { |
_nativeDataResolver = new NativeDataResolverImpl(compiler), |
_rtiNeedBuilder = |
compiler.frontendStrategy.createRuntimeTypesNeedBuilder() { |
+ CommonElements commonElements = compiler.frontendStrategy.commonElements; |
_target = new JavaScriptBackendTarget(this); |
impacts = new BackendImpacts(compiler.options, commonElements); |
_mirrorsData = compiler.frontendStrategy.createMirrorsDataBuilder(); |
@@ -497,8 +491,6 @@ class JavaScriptBackend { |
DiagnosticReporter get reporter => compiler.reporter; |
- CommonElements get commonElements => compiler.commonElements; |
- |
Resolution get resolution => compiler.resolution; |
Target get target => _target; |
@@ -628,7 +620,7 @@ class JavaScriptBackend { |
} |
MethodElement resolveExternalFunction(MethodElement element) { |
- if (isForeign(element)) { |
+ if (isForeign(compiler.frontendStrategy.commonElements, element)) { |
return element; |
} |
if (_nativeDataResolver.isJsInteropMember(element)) { |
@@ -644,12 +636,12 @@ class JavaScriptBackend { |
}); |
} |
- bool isForeign(Element element) => |
+ bool isForeign(CommonElements commonElements, Element element) => |
element.library == commonElements.foreignLibrary; |
- bool isBackendLibrary(LibraryElement library) { |
+ bool isBackendLibrary(CommonElements commonElements, LibraryElement library) { |
return library == commonElements.interceptorsLibrary || |
- library == compiler.commonElements.jsHelperLibrary; |
+ library == commonElements.jsHelperLibrary; |
} |
Namer determineNamer( |
@@ -685,16 +677,6 @@ class JavaScriptBackend { |
!mirrorsData.invokedReflectively(method); |
} |
- /// Maps compile-time classes to their runtime class. The runtime class is |
- /// always a superclass or the class itself. |
- ClassElement getRuntimeClass(ClassElement class_) { |
- if (class_.isSubclassOf(commonElements.jsIntClass)) |
- return commonElements.jsIntClass; |
- if (class_.isSubclassOf(commonElements.jsArrayClass)) |
- return commonElements.jsArrayClass; |
- return class_; |
- } |
- |
bool operatorEqHandlesNullArgument(FunctionEntity operatorEqfunction) { |
return specialOperatorEqClasses.contains(operatorEqfunction.enclosingClass); |
} |
@@ -702,7 +684,7 @@ class JavaScriptBackend { |
void validateInterceptorImplementsAllObjectMethods( |
ClassEntity interceptorClass) { |
if (interceptorClass == null) return; |
- ClassEntity objectClass = commonElements.objectClass; |
+ ClassEntity objectClass = compiler.commonElements.objectClass; |
compiler.elementEnvironment.forEachClassMember(objectClass, |
(_, MemberEntity member) { |
if (member.isConstructor) return; |
@@ -725,14 +707,16 @@ class JavaScriptBackend { |
// TODO(johnniwinther): Avoid the compiler.elementEnvironment.getThisType |
// calls. Currently needed to ensure resolution of the classes for various |
// queries in native behavior computation, inference and codegen. |
- compiler.elementEnvironment.getThisType(commonElements.jsArrayClass); |
compiler.elementEnvironment |
- .getThisType(commonElements.jsExtendableArrayClass); |
+ .getThisType(compiler.commonElements.jsArrayClass); |
+ compiler.elementEnvironment |
+ .getThisType(compiler.commonElements.jsExtendableArrayClass); |
validateInterceptorImplementsAllObjectMethods( |
- commonElements.jsInterceptorClass); |
+ compiler.commonElements.jsInterceptorClass); |
// The null-interceptor must also implement *all* methods. |
- validateInterceptorImplementsAllObjectMethods(commonElements.jsNullClass); |
+ validateInterceptorImplementsAllObjectMethods( |
+ compiler.commonElements.jsNullClass); |
} |
/// Called when the resolution queue has been closed. |
@@ -746,7 +730,8 @@ class JavaScriptBackend { |
ClosedWorld closedWorld, ClosedWorldRefiner closedWorldRefiner) { |
for (MemberEntity entity |
in compiler.enqueuer.resolution.processedEntities) { |
- processAnnotations(entity, closedWorldRefiner); |
+ processAnnotations( |
+ closedWorld.commonElements, entity, closedWorldRefiner); |
} |
mirrorsDataBuilder.computeMembersNeededForReflection( |
compiler.enqueuer.resolution.worldBuilder, closedWorld); |
@@ -794,6 +779,7 @@ class JavaScriptBackend { |
ResolutionEnqueuer createResolutionEnqueuer( |
CompilerTask task, Compiler compiler) { |
+ CommonElements commonElements = compiler.frontendStrategy.commonElements; |
_nativeBasicData = |
nativeBasicDataBuilder.close(compiler.elementEnvironment); |
_nativeResolutionEnqueuer = new native.NativeResolutionEnqueuer( |
@@ -862,6 +848,7 @@ class JavaScriptBackend { |
/// Creates an [Enqueuer] for code generation specific to this backend. |
CodegenEnqueuer createCodegenEnqueuer( |
CompilerTask task, Compiler compiler, ClosedWorld closedWorld) { |
+ CommonElements commonElements = closedWorld.commonElements; |
_typeVariableCodegenAnalysis = new TypeVariableCodegenAnalysis( |
compiler.elementEnvironment, this, commonElements, mirrorsData); |
_lookupMapAnalysis = new LookupMapAnalysis( |
@@ -921,7 +908,7 @@ class JavaScriptBackend { |
return const WorldImpact(); |
} |
if (element.isConstructor && |
- element.enclosingClass == commonElements.jsNullClass) { |
+ element.enclosingClass == closedWorld.commonElements.jsNullClass) { |
// Work around a problem compiling JSNull's constructor. |
return const WorldImpact(); |
} |
@@ -945,7 +932,8 @@ class JavaScriptBackend { |
native.NativeEnqueuer get nativeCodegenEnqueuer => _nativeCodegenEnqueuer; |
- ClassElement defaultSuperclass(ClassElement element) { |
+ ClassElement defaultSuperclass( |
+ CommonElements commonElements, ClassElement element) { |
if (nativeBasicData.isJsInteropClass(element)) { |
return commonElements.jsJavaScriptObjectClass; |
} |
@@ -1008,7 +996,7 @@ class JavaScriptBackend { |
* Returns [:true:] if the checking of [type] is performed directly on the |
* object and not on an interceptor. |
*/ |
- bool hasDirectCheckFor(DartType type) { |
+ bool hasDirectCheckFor(CommonElements commonElements, DartType type) { |
if (!type.isInterfaceType) return false; |
InterfaceType interfaceType = type; |
ClassEntity element = interfaceType.element; |
@@ -1046,7 +1034,8 @@ class JavaScriptBackend { |
/// This method is called when all new libraries loaded through |
/// [LibraryLoader.loadLibrary] has been loaded and their imports/exports |
/// have been computed. |
- void onLibrariesLoaded(LoadedLibraries loadedLibraries) { |
+ void onLibrariesLoaded( |
+ CommonElements commonElements, LoadedLibraries loadedLibraries) { |
if (loadedLibraries.containsLibrary(Uris.dart_core)) { |
assert(loadedLibraries.containsLibrary(Uris.dart_core)); |
assert(loadedLibraries.containsLibrary(Uris.dart__interceptors)); |
@@ -1067,17 +1056,17 @@ class JavaScriptBackend { |
/// [WorldImpact] of enabled backend features is returned. |
WorldImpact onCodegenStart( |
ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder) { |
- _oneShotInterceptorData = |
- new OneShotInterceptorData(closedWorld.interceptorData, commonElements); |
+ _oneShotInterceptorData = new OneShotInterceptorData( |
+ closedWorld.interceptorData, closedWorld.commonElements); |
_namer = determineNamer(closedWorld, codegenWorldBuilder); |
tracer = new Tracer(closedWorld, namer, compiler); |
_rtiEncoder = _namer.rtiEncoder = new RuntimeTypesEncoderImpl( |
- namer, compiler.elementEnvironment, commonElements); |
+ namer, compiler.elementEnvironment, closedWorld.commonElements); |
emitter.createEmitter(namer, closedWorld, codegenWorldBuilder); |
_codegenImpactTransformer = new CodegenImpactTransformer( |
compiler.options, |
compiler.elementEnvironment, |
- commonElements, |
+ closedWorld.commonElements, |
impacts, |
checkedModeHelpers, |
closedWorld.nativeData, |
@@ -1118,8 +1107,8 @@ class JavaScriptBackend { |
/// Process backend specific annotations. |
// TODO(johnniwinther): Merge this with [AnnotationProcessor] and use |
// [ElementEnvironment.getMemberMetadata] in [AnnotationProcessor]. |
- void processAnnotations( |
- MemberEntity element, ClosedWorldRefiner closedWorldRefiner) { |
+ void processAnnotations(CommonElements commonElements, MemberEntity element, |
+ ClosedWorldRefiner closedWorldRefiner) { |
if (element is MemberElement && element.isMalformed) { |
// Elements that are marked as malformed during parsing or resolution |
// might be registered here. These should just be ignored. |
@@ -1206,12 +1195,6 @@ class JavaScriptBackend { |
} |
} |
- MethodElement helperForBadMain() => commonElements.badMain; |
- |
- MethodElement helperForMissingMain() => commonElements.missingMain; |
- |
- MethodElement helperForMainArity() => commonElements.mainHasTooManyParameters; |
- |
/// Enable deferred loading. Returns `true` if the backend supports deferred |
/// loading. |
bool enableDeferredLoadingIfSupported(Spannable node) => true; |
@@ -1220,7 +1203,8 @@ class JavaScriptBackend { |
/// supported by the backend. |
bool enableCodegenWithErrorsIfSupported(Spannable node) => true; |
- jsAst.Expression rewriteAsync(MethodElement element, jsAst.Expression code) { |
+ jsAst.Expression rewriteAsync(CommonElements commonElements, |
+ MethodElement element, jsAst.Expression code) { |
AsyncRewriterBase rewriter = null; |
jsAst.Name name = namer.methodPropertyName(element); |
switch (element.asyncMarker) { |
@@ -1341,6 +1325,9 @@ class JavaScriptBackendTarget extends Target { |
JavaScriptBackendTarget(this._backend); |
+ CommonElements get _commonElements => |
+ _backend.compiler.frontendStrategy.commonElements; |
+ |
@override |
bool isTargetSpecificLibrary(LibraryElement element) { |
return _backend.isTargetSpecificLibrary(element); |
@@ -1364,12 +1351,12 @@ class JavaScriptBackendTarget extends Target { |
@override |
bool isDefaultNoSuchMethod(MethodElement element) { |
- return _backend.commonElements.isDefaultNoSuchMethodImplementation(element); |
+ return _commonElements.isDefaultNoSuchMethodImplementation(element); |
} |
@override |
ClassElement defaultSuperclass(ClassElement element) { |
- return _backend.defaultSuperclass(element); |
+ return _backend.defaultSuperclass(_commonElements, element); |
} |
@override |
@@ -1377,7 +1364,8 @@ class JavaScriptBackendTarget extends Target { |
_backend.nativeBasicData.isNativeClass(element); |
@override |
- bool isForeign(Element element) => _backend.isForeign(element); |
+ bool isForeign(Element element) => |
+ _backend.isForeign(_commonElements, element); |
} |
class SuperMemberData { |