| Index: sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
|
| index d9a6f1bfb6f8d8f51b3a6eb7586029354e9e828e..95ee0d1edc556dded18368b2dc31b16183ca4af2 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
|
| @@ -129,6 +129,19 @@ class DartBackend extends Backend {
|
| // Right now, it is set by the tests.
|
| bool useMirrorHelperLibrary = false;
|
|
|
| + /// Initialized if the useMirrorHelperLibrary field is set.
|
| + MirrorRenamer mirrorRenamer;
|
| +
|
| + /// Initialized when dart:mirrors is loaded if the useMirrorHelperLibrary
|
| + /// field is set.
|
| + LibraryElement mirrorHelperLibrary;
|
| + /// Initialized when dart:mirrors is loaded if the useMirrorHelperLibrary
|
| + /// field is set.
|
| + FunctionElement mirrorHelperGetNameFunction;
|
| + /// Initialized when dart:mirrors is loaded if the useMirrorHelperLibrary
|
| + /// field is set.
|
| + Element mirrorHelperSymbolsMap;
|
| +
|
| Map<Element, TreeElements> get resolvedElements =>
|
| compiler.enqueuer.resolution.resolvedElements;
|
|
|
| @@ -264,15 +277,22 @@ class DartBackend extends Backend {
|
| fixedMemberNames.add('srcType');
|
| fixedMemberNames.add('dstType');
|
|
|
| + if (useMirrorHelperLibrary && compiler.mirrorsLibrary != null) {
|
| + mirrorRenamer = new MirrorRenamer(compiler, this);
|
| + } else {
|
| + useMirrorHelperLibrary = false;
|
| + }
|
| +
|
| /**
|
| * Tells whether we should output given element. Corelib classes like
|
| * Object should not be in the resulting code.
|
| */
|
| bool shouldOutput(Element element) {
|
| - return !identical(element.kind, ElementKind.VOID)
|
| + return (element.kind != ElementKind.VOID
|
| && isUserLibrary(element.getLibrary())
|
| && !element.isSynthesized
|
| - && element is !AbstractFieldElement;
|
| + && element is !AbstractFieldElement)
|
| + || element.getLibrary() == mirrorHelperLibrary;
|
| }
|
|
|
| final elementAsts = new Map<Element, ElementAst>();
|
| @@ -397,7 +417,12 @@ class DartBackend extends Backend {
|
| // some unused identifier.
|
| collector.unresolvedNodes.add(synthesizedIdentifier);
|
| makePlaceholders(element) {
|
| + bool oldUseHelper = useMirrorHelperLibrary;
|
| + useMirrorHelperLibrary = (useMirrorHelperLibrary
|
| + && element.getLibrary() != mirrorHelperLibrary);
|
| collector.collect(element);
|
| + useMirrorHelperLibrary = oldUseHelper;
|
| +
|
| if (element.isClass()) {
|
| classMembers[element].forEach(makePlaceholders);
|
| }
|
| @@ -450,8 +475,8 @@ class DartBackend extends Backend {
|
| }
|
| }
|
|
|
| - if (useMirrorHelperLibrary && compiler.mirrorsLibrary != null) {
|
| - MirrorRenamer.addMirrorHelperImport(imports);
|
| + if (useMirrorHelperLibrary) {
|
| + mirrorRenamer.addRenames(renames, topLevelNodes);
|
| }
|
|
|
| final unparser = new EmitterUnparser(renames);
|
| @@ -480,9 +505,33 @@ class DartBackend extends Backend {
|
|
|
| log(String message) => compiler.log('[DartBackend] $message');
|
|
|
| + void onLibraryLoaded(LibraryElement library, Uri uri) {
|
| + if (useMirrorHelperLibrary && library == compiler.mirrorsLibrary) {
|
| + mirrorHelperLibrary = compiler.scanBuiltinLibrary(
|
| + MirrorRenamer.MIRROR_HELPER_LIBRARY_NAME);
|
| + mirrorHelperGetNameFunction = mirrorHelperLibrary.find(
|
| + const SourceString(MirrorRenamer.MIRROR_HELPER_GET_NAME_FUNCTION));
|
| + mirrorHelperSymbolsMap = mirrorHelperLibrary.find(
|
| + const SourceString(MirrorRenamer.MIRROR_HELPER_SYMBOLS_MAP_NAME));
|
| + }
|
| + }
|
| +
|
| void registerStaticSend(Element element, Node node) {
|
| - if (useMirrorHelperLibrary && compiler.mirrorsLibrary != null) {
|
| - MirrorRenamer.handleStaticSend(renames, element, node, compiler);
|
| + if (useMirrorHelperLibrary) {
|
| + mirrorRenamer.registerStaticSend(element, node);
|
| + }
|
| + }
|
| +
|
| + void registerMirrorHelperElement(Element element, Node node) {
|
| + if (element.getLibrary() == mirrorHelperLibrary) {
|
| + mirrorRenamer.registerHelperElement(element, node);
|
| + }
|
| + }
|
| +
|
| + void registerStaticUse(Element element, Enqueuer enqueuer) {
|
| + if (useMirrorHelperLibrary &&
|
| + element == compiler.mirrorSystemGetNameFunction) {
|
| + enqueuer.addToWorkList(mirrorHelperGetNameFunction);
|
| }
|
| }
|
| }
|
|
|