diff --git a/pkg/compiler/lib/src/common/backend_api.dart b/pkg/compiler/lib/src/common/backend_api.dart index a33f1fdffbf..73e22cd4400 100644 --- a/pkg/compiler/lib/src/common/backend_api.dart +++ b/pkg/compiler/lib/src/common/backend_api.dart @@ -262,6 +262,10 @@ abstract class Backend extends Target { /// Returns true if this element needs reflection information at runtime. bool isAccessibleByReflection(Element element) => true; + /// Returns true if this member element needs reflection information at + /// runtime. + bool isMemberAccessibleByReflection(MemberElement element) => true; + /// Returns true if this element is covered by a mirrorsUsed annotation. /// /// Note that it might still be ok to tree shake the element away if no diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart index 40956cf3eed..681a6e06095 100644 --- a/pkg/compiler/lib/src/js_backend/backend.dart +++ b/pkg/compiler/lib/src/js_backend/backend.dart @@ -1991,6 +1991,10 @@ class JavaScriptBackend extends Backend { return membersNeededForReflection.contains(element); } + bool isMemberAccessibleByReflection(MemberElement element) { + return membersNeededForReflection.contains(element); + } + /** * Returns true if the element has to be resolved due to a mirrorsUsed * annotation. If we have insufficient mirrors used annotations, we only diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart index a452dd5b729..f0167e1aea3 100644 --- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart +++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart @@ -4,15 +4,11 @@ library dart2js.js_emitter.full_emitter.class_builder; -import '../../elements/elements.dart' - show - ClassElement, - Element; +import '../../elements/elements.dart' show Entity; +import '../../elements/entities.dart'; import '../../js/js.dart' as jsAst; import '../../js/js.dart' show js; -import '../../js_backend/js_backend.dart' - show - Namer; +import '../../js_backend/js_backend.dart' show Namer; /** * A data structure for collecting fragments of a class definition. @@ -25,13 +21,13 @@ class ClassBuilder { jsAst.Node functionType; List fieldMetadata; - final Element element; + final Entity element; final Namer namer; final bool isForActualClass; ClassBuilder(this.element, this.namer, this.isForActualClass); - ClassBuilder.forClass(ClassElement cls, this.namer) + ClassBuilder.forClass(ClassEntity cls, this.namer) : isForActualClass = true, element = cls; diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart index 3dfdbab20d7..c5d5181a020 100644 --- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart +++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart @@ -9,18 +9,10 @@ import '../../common/names.dart' show Names; import '../../elements/resolution_types.dart' show ResolutionDartType; import '../../deferred_load.dart' show OutputUnit; import '../../elements/elements.dart' - show - ClassElement, - Element, - FieldElement, - MemberElement, - Name; + show ClassElement, Element, FieldElement, MemberElement, Name; import '../../js/js.dart' as jsAst; import '../../js/js.dart' show js; -import '../../js_backend/js_backend.dart' - show - CompoundName, - Namer; +import '../../js_backend/js_backend.dart' show CompoundName, Namer; import '../../universe/selector.dart' show Selector; import '../../util/util.dart' show equalElements; import '../../world.dart' show ClosedWorld; diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart index a30e725f4c8..8d344ae8e4b 100644 --- a/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart +++ b/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart @@ -7,11 +7,11 @@ library dart2js.js_emitter.full_emitter.container_builder; import '../../constants/values.dart'; import '../../elements/elements.dart' show - Element, - Elements, - FunctionSignature, - MetadataAnnotation, - MethodElement; + Element, + Elements, + FunctionSignature, + MetadataAnnotation, + MethodElement; import '../../js/js.dart' as jsAst; import '../../js/js.dart' show js; import '../js_emitter.dart' hide Emitter, EmitterFactory; diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart index 1ef8573a122..516641db9cf 100644 --- a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart +++ b/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart @@ -5,10 +5,7 @@ library dart2js.js_emitter.full_emitter.interceptor_emitter; import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; -import '../../elements/elements.dart' - show - ClassElement, - MethodElement; +import '../../elements/entities.dart'; import '../../js/js.dart' as jsAst; import '../../js/js.dart' show js; import '../../world.dart' show ClosedWorld; @@ -22,14 +19,14 @@ class InterceptorEmitter extends CodeEmitterHelper { InterceptorEmitter(this.closedWorld); - void recordMangledNameOfMemberMethod(MethodElement member, jsAst.Name name) { + void recordMangledNameOfMemberMethod(MemberEntity member, jsAst.Name name) { if (backend.isInterceptedMethod(member)) { interceptorInvocationNames.add(name); } } jsAst.Expression buildGetInterceptorMethod( - jsAst.Name key, Set classes) { + jsAst.Name key, Set classes) { InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(compiler, namer, backend, closedWorld); jsAst.Expression function = @@ -46,11 +43,11 @@ class InterceptorEmitter extends CodeEmitterHelper { parts.add(js.comment('getInterceptor methods')); - Map> specializedGetInterceptors = + Map> specializedGetInterceptors = backend.specializedGetInterceptors; List names = specializedGetInterceptors.keys.toList()..sort(); for (jsAst.Name name in names) { - Set classes = specializedGetInterceptors[name]; + Set classes = specializedGetInterceptors[name]; parts.add(js.statement('#.# = #', [ namer.globalObjectFor(backend.helpers.interceptorsLibrary), name, diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart index c489cb579ee..472a2c7c5cd 100644 --- a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart +++ b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart @@ -4,16 +4,10 @@ library dart2js.js_emitter.full_emitter.nsm_emitter; -import '../../elements/elements.dart' - show - ClassElement, - MemberElement; +import '../../elements/entities.dart'; import '../../js/js.dart' as jsAst; import '../../js/js.dart' show js; -import '../../js_backend/js_backend.dart' - show - GetterName, - SetterName; +import '../../js_backend/js_backend.dart' show GetterName, SetterName; import '../../universe/selector.dart' show Selector; import '../../util/characters.dart' show $$, $A, $HASH, $Z, $a, $z; import '../../world.dart' show ClosedWorld; @@ -78,7 +72,7 @@ class NsmEmitter extends CodeEmitterHelper { if (reflectionName != null) { bool accessible = closedWorld.allFunctions .filter(selector, null) - .any((MemberElement e) => backend.isAccessibleByReflection(e)); + .any(backend.isMemberAccessibleByReflection); addProperty( namer.asName('+$reflectionName'), js(accessible ? '2' : '0')); } @@ -179,7 +173,7 @@ class NsmEmitter extends CodeEmitterHelper { } // Startup code that loops over the method names and puts handlers on the // Object class to catch noSuchMethod invocations. - ClassElement objectClass = compiler.commonElements.objectClass; + ClassEntity objectClass = compiler.commonElements.objectClass; jsAst.Expression createInvocationMirror = backend.emitter .staticFunctionAccess(backend.helpers.createInvocationMirror); if (useDiffEncoding) {