| Index: pkg/compiler/lib/src/dart_backend/outputter.dart | 
| diff --git a/pkg/compiler/lib/src/dart_backend/outputter.dart b/pkg/compiler/lib/src/dart_backend/outputter.dart | 
| index 484bda298d61885beb97f75d175610b88ed8d115..ce9022afe009326af0e269327da520c675426c0f 100644 | 
| --- a/pkg/compiler/lib/src/dart_backend/outputter.dart | 
| +++ b/pkg/compiler/lib/src/dart_backend/outputter.dart | 
| @@ -8,7 +8,8 @@ typedef bool IsSafeToRemoveTypeDeclarations( | 
| Map<ClassElement, Iterable<Element>> classMembers); | 
| typedef void ElementCallback<E>(E element); | 
| typedef void ElementPostProcessFunction( | 
| -    AstElement element, ElementAst elementAst, | 
| +    AstElement element, | 
| +    ElementAst elementAst, | 
| ElementCallback<TypedefElement> typedefCallback, | 
| ElementCallback<ClassElement> classCallback); | 
| typedef ElementAst ComputeElementAstFunction(AstElement element); | 
| @@ -38,9 +39,9 @@ class DartOutputter { | 
|  | 
| // TODO(johnniwinther): Support recompilation. | 
| DartOutputter(this.reporter, this.outputProvider, | 
| -                {bool this.forceStripTypes: false, | 
| -                 bool this.enableMinification: false, | 
| -                 bool this.multiFile: false}); | 
| +      {bool this.forceStripTypes: false, | 
| +      bool this.enableMinification: false, | 
| +      bool this.multiFile: false}); | 
|  | 
| /// Generate Dart code for the program starting at [mainFunction]. | 
| /// | 
| @@ -57,8 +58,8 @@ class DartOutputter { | 
| /// [resolvedElements] in the generated output. | 
| /// | 
| /// Returns the total size of the generated code. | 
| -  int assembleProgram({ | 
| -      MirrorRenamer mirrorRenamer: const MirrorRenamer(), | 
| +  int assembleProgram( | 
| +      {MirrorRenamer mirrorRenamer: const MirrorRenamer(), | 
| Iterable<LibraryElement> libraries, | 
| Iterable<Element> instantiatedClasses, | 
| Iterable<Element> resolvedElements, | 
| @@ -70,7 +71,6 @@ class DartOutputter { | 
| ElementFilter shouldOutput, | 
| IsSafeToRemoveTypeDeclarations isSafeToRemoveTypeDeclarations, | 
| ElementSorter sortElements}) { | 
| - | 
| assert(invariant(NO_LOCATION_SPANNABLE, libraries != null, | 
| message: "'libraries' must be non-null.")); | 
| assert(invariant(NO_LOCATION_SPANNABLE, instantiatedClasses != null, | 
| @@ -83,8 +83,8 @@ class DartOutputter { | 
| message: "'computeElementAst' must be non-null.")); | 
| assert(invariant(NO_LOCATION_SPANNABLE, shouldOutput != null, | 
| message: "'shouldOutput' must be non-null.")); | 
| -    assert(invariant(NO_LOCATION_SPANNABLE, | 
| -        isSafeToRemoveTypeDeclarations != null, | 
| +    assert(invariant( | 
| +        NO_LOCATION_SPANNABLE, isSafeToRemoveTypeDeclarations != null, | 
| message: "'isSafeToRemoveTypeDeclarations' must be non-null.")); | 
|  | 
| if (sortElements == null) { | 
| @@ -96,29 +96,20 @@ class DartOutputter { | 
| }; | 
| } | 
|  | 
| -    libraryInfo = LibraryInfo.processLibraries( | 
| -        reporter, libraries, resolvedElements); | 
| +    libraryInfo = | 
| +        LibraryInfo.processLibraries(reporter, libraries, resolvedElements); | 
|  | 
| elementInfo = ElementInfoProcessor.createElementInfo( | 
| -        instantiatedClasses, | 
| -        resolvedElements, | 
| -        usedTypeLiterals, | 
| +        instantiatedClasses, resolvedElements, usedTypeLiterals, | 
| postProcessElementAst: postProcessElementAst, | 
| parseElementAst: computeElementAst, | 
| shouldOutput: shouldOutput, | 
| sortElements: sortElements); | 
|  | 
| PlaceholderCollector collector = collectPlaceholders( | 
| -        reporter, | 
| -        mirrorRenamer, | 
| -        mainFunction, | 
| -        libraryInfo, | 
| -        elementInfo); | 
| - | 
| -    renamer = createRenamer( | 
| -        collector, | 
| -        libraryInfo, | 
| -        elementInfo, | 
| +        reporter, mirrorRenamer, mainFunction, libraryInfo, elementInfo); | 
| + | 
| +    renamer = createRenamer(collector, libraryInfo, elementInfo, | 
| enableMinification: enableMinification, | 
| forceStripTypes: forceStripTypes, | 
| isSafeToRemoveTypeDeclarations: isSafeToRemoveTypeDeclarations); | 
| @@ -126,20 +117,13 @@ class DartOutputter { | 
| if (outputAst) { | 
| String code = astOutput(reporter, elementInfo); | 
| outputProvider("", "dart") | 
| -                 ..add(code) | 
| -                 ..close(); | 
| +        ..add(code) | 
| +        ..close(); | 
| return code.length; | 
| } else { | 
| output = new MainOutputGenerator(); | 
| -      return output.generateCode( | 
| -          libraryInfo, | 
| -          elementInfo, | 
| -          collector, | 
| -          renamer, | 
| -          mainFunction, | 
| -          outputUri, | 
| -          outputProvider, | 
| -          mirrorRenamer, | 
| +      return output.generateCode(libraryInfo, elementInfo, collector, renamer, | 
| +          mainFunction, outputUri, outputProvider, mirrorRenamer, | 
| multiFile: multiFile, | 
| forceStripTypes: forceStripTypes, | 
| enableMinification: enableMinification); | 
| @@ -171,17 +155,15 @@ class DartOutputter { | 
| return collector; | 
| } | 
|  | 
| -  static PlaceholderRenamer createRenamer( | 
| -      PlaceholderCollector collector, | 
| -      LibraryInfo libraryInfo, | 
| -      ElementInfo elementInfo, | 
| +  static PlaceholderRenamer createRenamer(PlaceholderCollector collector, | 
| +      LibraryInfo libraryInfo, ElementInfo elementInfo, | 
| {bool enableMinification: false, | 
| -       bool forceStripTypes: false, | 
| -       isSafeToRemoveTypeDeclarations}) { | 
| +      bool forceStripTypes: false, | 
| +      isSafeToRemoveTypeDeclarations}) { | 
| // Create renames. | 
| -    bool shouldCutDeclarationTypes = forceStripTypes | 
| -        || (enableMinification | 
| -            && isSafeToRemoveTypeDeclarations(elementInfo.classMembers)); | 
| +    bool shouldCutDeclarationTypes = forceStripTypes || | 
| +        (enableMinification && | 
| +            isSafeToRemoveTypeDeclarations(elementInfo.classMembers)); | 
|  | 
| PlaceholderRenamer placeholderRenamer = new PlaceholderRenamer( | 
| libraryInfo.fixedDynamicNames, | 
| @@ -194,8 +176,8 @@ class DartOutputter { | 
| return placeholderRenamer; | 
| } | 
|  | 
| -  static String astOutput(DiagnosticReporter reporter, | 
| -                          ElementInfo elementInfo) { | 
| +  static String astOutput( | 
| +      DiagnosticReporter reporter, ElementInfo elementInfo) { | 
| // TODO(antonm): Ideally XML should be a separate backend. | 
| // TODO(antonm): obey renames and minification, at least as an option. | 
| StringBuffer sb = new StringBuffer(); | 
| @@ -223,10 +205,8 @@ class LibraryInfo { | 
| final Map<Element, LibraryElement> reexportingLibraries; | 
| final List<LibraryElement> userLibraries; | 
|  | 
| -  LibraryInfo(this.fixedStaticNames, | 
| -              this.fixedDynamicNames, | 
| -              this.reexportingLibraries, | 
| -              this.userLibraries); | 
| +  LibraryInfo(this.fixedStaticNames, this.fixedDynamicNames, | 
| +      this.reexportingLibraries, this.userLibraries); | 
|  | 
| static LibraryInfo processLibraries( | 
| DiagnosticReporter reporter, | 
| @@ -235,7 +215,7 @@ class LibraryInfo { | 
| Set<String> fixedStaticNames = new Set<String>(); | 
| Set<String> fixedDynamicNames = new Set<String>(); | 
| Map<Element, LibraryElement> reexportingLibraries = | 
| -          <Element, LibraryElement>{}; | 
| +        <Element, LibraryElement>{}; | 
| List<LibraryElement> userLibraries = <LibraryElement>[]; | 
| // Conservatively traverse all platform libraries and collect member names. | 
| // TODO(antonm): ideally we should only collect names of used members, | 
| @@ -268,8 +248,7 @@ class LibraryInfo { | 
| }); | 
|  | 
| library.forEachExport((Element export) { | 
| -        if (!library.isInternalLibrary && | 
| -            export.library.isInternalLibrary) { | 
| +        if (!library.isInternalLibrary && export.library.isInternalLibrary) { | 
| // If an element of an internal library is reexported by a platform | 
| // library, we have to import the reexporting library instead of the | 
| // internal library, because the internal library is an | 
| @@ -300,17 +279,15 @@ class LibraryInfo { | 
| enumClassMap.putIfAbsent(cls.name, () => cls); | 
| if (existingEnumClass != cls) { | 
| reporter.reportError( | 
| -              reporter.createMessage( | 
| -                  cls, | 
| -                  MessageKind.GENERIC, | 
| -                  {'text': "Duplicate enum names are not supported " | 
| -                           "in dart2dart."}), | 
| -          <DiagnosticMessage>[ | 
| -              reporter.createMessage( | 
| -                  existingEnumClass, | 
| -                  MessageKind.GENERIC, | 
| -                  {'text': "This is the other declaration of '${cls.name}'."}), | 
| -          ]); | 
| +              reporter.createMessage(cls, MessageKind.GENERIC, { | 
| +                'text': "Duplicate enum names are not supported " | 
| +                    "in dart2dart." | 
| +              }), | 
| +              <DiagnosticMessage>[ | 
| +                reporter.createMessage(existingEnumClass, MessageKind.GENERIC, { | 
| +                  'text': "This is the other declaration of '${cls.name}'." | 
| +                }), | 
| +              ]); | 
| } | 
| } | 
| } | 
| @@ -321,8 +298,7 @@ class LibraryInfo { | 
| // that are invoked as functions. Make sure to not rename that. | 
| fixedDynamicNames.add('call'); | 
|  | 
| -    return new LibraryInfo( | 
| -        fixedStaticNames, fixedDynamicNames, | 
| +    return new LibraryInfo(fixedStaticNames, fixedDynamicNames, | 
| reexportingLibraries, userLibraries); | 
| } | 
| } | 
| @@ -333,10 +309,8 @@ class ElementInfo { | 
| final Map<ClassElement, Iterable<Element>> classMembers; | 
| final Iterable<ClassElement> emitNoMembersFor; | 
|  | 
| -  ElementInfo(this.elementAsts, | 
| -              this.topLevelElements, | 
| -              this.classMembers, | 
| -              this.emitNoMembersFor); | 
| +  ElementInfo(this.elementAsts, this.topLevelElements, this.classMembers, | 
| +      this.emitNoMembersFor); | 
| } | 
|  | 
| class ElementInfoProcessor implements ElementInfo { | 
| @@ -350,18 +324,16 @@ class ElementInfoProcessor implements ElementInfo { | 
| final ElementFilter shouldOutput; | 
|  | 
| ElementInfoProcessor( | 
| -      {this.postProcessElementAst, | 
| -       this.parseElementAst, | 
| -       this.shouldOutput}); | 
| +      {this.postProcessElementAst, this.parseElementAst, this.shouldOutput}); | 
|  | 
| static ElementInfo createElementInfo( | 
| Iterable<ClassElement> instantiatedClasses, | 
| Iterable<AstElement> resolvedElements, | 
| Iterable<ClassElement> usedTypeLiterals, | 
| {ElementPostProcessFunction postProcessElementAst, | 
| -       ComputeElementAstFunction parseElementAst, | 
| -       ElementFilter shouldOutput, | 
| -       ElementSorter sortElements}) { | 
| +      ComputeElementAstFunction parseElementAst, | 
| +      ElementFilter shouldOutput, | 
| +      ElementSorter sortElements}) { | 
| ElementInfoProcessor processor = new ElementInfoProcessor( | 
| postProcessElementAst: postProcessElementAst, | 
| parseElementAst: parseElementAst, | 
| @@ -371,10 +343,11 @@ class ElementInfoProcessor implements ElementInfo { | 
| sortElements: sortElements); | 
| } | 
|  | 
| -  ElementInfo process(Iterable<ClassElement> instantiatedClasses, | 
| -                      Iterable<AstElement> resolvedElements, | 
| -                      Iterable<ClassElement> usedTypeLiterals, | 
| -                      {ElementSorter sortElements}) { | 
| +  ElementInfo process( | 
| +      Iterable<ClassElement> instantiatedClasses, | 
| +      Iterable<AstElement> resolvedElements, | 
| +      Iterable<ClassElement> usedTypeLiterals, | 
| +      {ElementSorter sortElements}) { | 
| // Build all top level elements to emit and necessary class members. | 
| instantiatedClasses.where(shouldOutput).forEach(addClass); | 
| resolvedElements.where(shouldOutput).forEach(addMember); | 
| @@ -402,9 +375,8 @@ class ElementInfoProcessor implements ElementInfo { | 
|  | 
| void processElement(Element element, ElementAst elementAst) { | 
| if (postProcessElementAst != null) { | 
| -      postProcessElementAst(element, elementAst, | 
| -                            newTypedefElementCallback, | 
| -                            newClassElementCallback); | 
| +      postProcessElementAst(element, elementAst, newTypedefElementCallback, | 
| +          newClassElementCallback); | 
| } | 
| elementAsts[element] = elementAst; | 
| } | 
| @@ -459,7 +431,7 @@ class ElementInfoProcessor implements ElementInfo { | 
| /// [CompilerOutputProvider]. | 
| class MainOutputGenerator { | 
| final Map<ClassNode, List<Node>> memberNodes = | 
| -       new Map<ClassNode, List<Node>>(); | 
| +      new Map<ClassNode, List<Node>>(); | 
| final List<Node> topLevelNodes = <Node>[]; | 
|  | 
| /// Generates the code and returns the total size. | 
| @@ -473,8 +445,8 @@ class MainOutputGenerator { | 
| CompilerOutputProvider outputProvider, | 
| MirrorRenamer mirrorRenamer, | 
| {bool multiFile: false, | 
| -       bool forceStripTypes: false, | 
| -       bool enableMinification: false}) { | 
| +      bool forceStripTypes: false, | 
| +      bool enableMinification: false}) { | 
| for (Element element in elementInfo.topLevelElements) { | 
| topLevelNodes.add(elementInfo.elementAsts[element].ast); | 
| if (element.isClass) { | 
| @@ -490,8 +462,8 @@ class MainOutputGenerator { | 
| } | 
| } | 
|  | 
| -    mirrorRenamer.addRenames(placeholderRenamer.renames, | 
| -                             topLevelNodes, collector); | 
| +    mirrorRenamer.addRenames( | 
| +        placeholderRenamer.renames, topLevelNodes, collector); | 
|  | 
| Map<LibraryElement, String> outputPaths = new Map<LibraryElement, String>(); | 
| Map<LibraryElement, EmitterUnparser> unparsers = | 
| @@ -501,8 +473,7 @@ class MainOutputGenerator { | 
| EmitterUnparser mainUnparser = multiFile | 
| ? null | 
| : new EmitterUnparser(placeholderRenamer.renames, | 
| -            stripTypes: forceStripTypes, | 
| -            minify: enableMinification); | 
| +            stripTypes: forceStripTypes, minify: enableMinification); | 
|  | 
| if (multiFile) { | 
| // TODO(sigurdm): Factor handling of library-paths out from emitting. | 
| @@ -528,7 +499,7 @@ class MainOutputGenerator { | 
| } | 
|  | 
| /// Rewrites imports/exports to refer to the paths given in [outputPaths]. | 
| -      for(LibraryElement outputLibrary in libraryInfo.userLibraries) { | 
| +      for (LibraryElement outputLibrary in libraryInfo.userLibraries) { | 
| EmitterUnparser unparser = new EmitterUnparser( | 
| placeholderRenamer.renames, | 
| stripTypes: forceStripTypes, | 
| @@ -553,8 +524,8 @@ class MainOutputGenerator { | 
| } | 
| } | 
| } else { | 
| -      placeholderRenamer.platformImports.forEach( | 
| -          (LibraryElement library, String prefix) { | 
| +      placeholderRenamer.platformImports | 
| +          .forEach((LibraryElement library, String prefix) { | 
| assert(library.isPlatformLibrary && !library.isInternalLibrary); | 
| mainUnparser.unparseImportTag(library.canonicalUri.toString()); | 
| if (prefix != null) { | 
| @@ -562,7 +533,7 @@ class MainOutputGenerator { | 
| // it to avoid shadowing. | 
| // TODO(johnniwinther): Avoid prefix-less import if not needed. | 
| mainUnparser.unparseImportTag(library.canonicalUri.toString(), | 
| -                                        prefix: prefix); | 
| +              prefix: prefix); | 
| } | 
| }); | 
| } | 
| @@ -582,20 +553,20 @@ class MainOutputGenerator { | 
|  | 
| int totalSize = 0; | 
| if (multiFile) { | 
| -      for(LibraryElement outputLibrary in libraryInfo.userLibraries) { | 
| +      for (LibraryElement outputLibrary in libraryInfo.userLibraries) { | 
| // TODO(sigurdm): Make the unparser output directly into the buffer | 
| // instead of caching in `.result`. | 
| String code = unparsers[outputLibrary].result; | 
| totalSize += code.length; | 
| outputProvider(outputPaths[outputLibrary], "dart") | 
| -             ..add(code) | 
| -             ..close(); | 
| +          ..add(code) | 
| +          ..close(); | 
| } | 
| } else { | 
| String code = mainUnparser.result; | 
| outputProvider("", "dart") | 
| -           ..add(code) | 
| -           ..close(); | 
| +        ..add(code) | 
| +        ..close(); | 
|  | 
| totalSize = code.length; | 
| } | 
|  |