/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.java2dart.engine; import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.Files; import com.google.dart.engine.AnalysisEngine; import com.google.dart.engine.ast.AsExpression; import com.google.dart.engine.ast.AstNode; import com.google.dart.engine.ast.ClassDeclaration; import com.google.dart.engine.ast.CompilationUnit; import com.google.dart.engine.ast.CompilationUnitMember; import com.google.dart.engine.ast.Expression; import com.google.dart.engine.ast.FunctionDeclaration; import com.google.dart.engine.ast.ImplementsClause; import com.google.dart.engine.ast.NodeList; import com.google.dart.engine.ast.ParenthesizedExpression; import com.google.dart.engine.ast.SimpleStringLiteral; import com.google.dart.engine.ast.Statement; import com.google.dart.engine.ast.TypeName; import com.google.dart.engine.ast.visitor.NodeLocator; import com.google.dart.engine.ast.visitor.RecursiveAstVisitor; import com.google.dart.engine.context.AnalysisContext; import com.google.dart.engine.context.AnalysisErrorInfo; import com.google.dart.engine.context.AnalysisResult; import com.google.dart.engine.context.ChangeSet; import com.google.dart.engine.error.AnalysisError; import com.google.dart.engine.error.HintCode; import com.google.dart.engine.sdk.DirectoryBasedDartSdk; import com.google.dart.engine.source.DartUriResolver; import com.google.dart.engine.source.FileBasedSource; import com.google.dart.engine.source.FileUriResolver; import com.google.dart.engine.source.PackageUriResolver; import com.google.dart.engine.source.Source; import com.google.dart.engine.source.SourceFactory; import com.google.dart.engine.utilities.io.PrintStringWriter; import com.google.dart.java2dart.Context; import com.google.dart.java2dart.SyntaxTranslator; import com.google.dart.java2dart.processor.BeautifySemanticProcessor; import com.google.dart.java2dart.processor.CollectionSemanticProcessor; import com.google.dart.java2dart.processor.GuavaSemanticProcessor; import com.google.dart.java2dart.processor.IOSemanticProcessor; import com.google.dart.java2dart.processor.JUnitSemanticProcessor; import com.google.dart.java2dart.processor.ObjectSemanticProcessor; import com.google.dart.java2dart.processor.PropertySemanticProcessor; import com.google.dart.java2dart.processor.RenameConstructorsSemanticProcessor; import com.google.dart.java2dart.processor.SemanticProcessor; import com.google.dart.java2dart.processor.TypeSemanticProcessor; import com.google.dart.java2dart.processor.UniqueMemberNamesSemanticProcessor; import com.google.dart.java2dart.util.ToFormattedSourceVisitor; import static com.google.dart.java2dart.util.AstFactory.exportDirective; import static com.google.dart.java2dart.util.AstFactory.importDirective; import static com.google.dart.java2dart.util.AstFactory.importShowCombinator; import static com.google.dart.java2dart.util.AstFactory.libraryDirective; import static com.google.dart.java2dart.util.TokenFactory.token; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Translates some parts of "com.google.dart.engine" project. */ public class MainEngine { static class Edit { public final int offset; public final int length; public final String replacement; public Edit(int offset, int length, String replacement) { this.offset = offset; this.length = length; this.replacement = replacement; } @Override public String toString() { return (offset < 0 ? "(" : "X(") + "offset: " + offset + ", length " + length + ", replacement :>" + replacement + "<:)"; } } /** * Default package src location (can be overridden) */ private static String src_package = "package:analysis_engine/src/"; private static final Context context = new Context(); private static File engineFolder; private static File engineTestFolder; private static CompilationUnit dartUnit; private static List<CompilationUnitMember> movedMembers = Lists.newArrayList(); private static final String HEADER = "// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file\n" + "// for details. All rights reserved. Use of this source code is governed by a\n" + "// BSD-style license that can be found in the LICENSE file.\n" + "\n" + "// This code was auto-generated, is not intended to be edited, and is subject to\n" + "// significant change. Please see the README file for more information.\n\n"; public static void main(String[] args) throws Exception { if (args.length != 2 && args.length != 3) { System.out.println("Usage: java2dart <target-src-folder> <target-test-folder> [src-package]"); System.exit(0); } String targetFolder = args[0]; String targetTestFolder = args[1]; if (args.length == 3) { System.out.println("Overrriding default src package to: " + src_package); src_package = args[2]; } System.out.println("Generating files into " + targetFolder); new File(targetFolder).mkdirs(); // engineFolder = new File("../../../tools/plugins/com.google.dart.engine/src"); engineTestFolder = new File("../../../tools/plugins/com.google.dart.engine_test/src"); engineFolder = engineFolder.getCanonicalFile(); // configure Context context.addClasspathFile(new File("../../../../third_party/guava/r13/guava-13.0.1.jar")); context.addClasspathFile(new File("../../../../third_party/junit/v4_8_2/junit.jar")); context.addSourceFolder(engineFolder); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/utilities/ast")); // instrumentation context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/instrumentation/Instrumentation.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/instrumentation/InstrumentationBuilder.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/instrumentation/InstrumentationLevel.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/instrumentation/InstrumentationLogger.java")); // other context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/sdk")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/sdk")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/source")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/source/LineInfo.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/source/SourceRange.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/dart/ParameterKind.java")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/ast")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/ast/visitor")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/constant")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/element")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/error")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/html/ast")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/html/ast/visitor")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/html/parser")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/html/scanner")); // context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/index")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/parser")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/resolver")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/scanner")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/type")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/builder")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/cache")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/constant")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/element")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/error")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/hint")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/html/angular")); context.removeSourceFile(new File( engineFolder, "com/google/dart/engine/internal/html/angular/AngularDartIndexContributor.java")); context.removeSourceFile(new File( engineFolder, "com/google/dart/engine/internal/html/angular/AngularHtmlIndexContributor.java")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/html/polymer")); // context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/index")); // context.removeSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/index/file")); // context.removeSourceFiles(new File( // engineFolder, // "com/google/dart/engine/internal/index/structure/btree")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/object")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/parser")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/resolver")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/scope")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/task")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/type")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/verifier")); context.addSourceFile(new File(engineFolder, "com/google/dart/engine/AnalysisEngine.java")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/utilities/logging")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/context")); context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/context")); // utilities/general context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/general/TimeCounter.java")); // utilities/collection context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/collection/BooleanArray.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/collection/DirectedGraph.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/collection/ListUtilities.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/collection/MapIterator.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/collection/MultipleMapIterator.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/collection/SingleMapIterator.java")); context.addSourceFile(new File( engineFolder, "com/google/dart/engine/utilities/collection/TokenMap.java")); // Tests context.addSourceFile(new File( engineTestFolder, "com/google/dart/engine/utilities/io/FileUtilities2.java")); context.addSourceFile(new File(engineTestFolder, "com/google/dart/engine/EngineTestCase.java")); context.addSourceFile(new File( engineTestFolder, "com/google/dart/engine/error/GatheringErrorListener.java")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/ast")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/constant")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/context")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/element")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/error")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/html")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal")); context.removeSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/index")); context.removeSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/search")); // context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/element")); // context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/type")); // context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/resolver")); // context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/scope")); // context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/context")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/parser")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/resolver")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/scanner")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/sdk")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/source")); context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/utilities")); // configure properties context.addNotProperty("Lcom/google/dart/engine/parser/Parser;.isFunctionDeclaration()"); context.addNotProperty("Lcom/google/dart/engine/parser/Parser;.isInitializedVariableDeclaration()"); context.addNotProperty("Lcom/google/dart/engine/parser/Parser;.isSwitchMember()"); // translate into single CompilationUnit dartUnit = context.translate(); // run processors { List<SemanticProcessor> PROCESSORS = ImmutableList.of( new TypeSemanticProcessor(context), new ObjectSemanticProcessor(context), new CollectionSemanticProcessor(context), new IOSemanticProcessor(context), new PropertySemanticProcessor(context), new GuavaSemanticProcessor(context), new JUnitSemanticProcessor(context), new EngineAnnotationProcessor(context), new EngineExceptionProcessor(context), new UniqueMemberNamesSemanticProcessor(context), new RenameConstructorsSemanticProcessor(context), new EngineSemanticProcessor(context), new EngineInstanceOfProcessor(context), new BeautifySemanticProcessor(context)); for (SemanticProcessor processor : PROCESSORS) { processor.process(dartUnit); } } // run this again, because we may introduce conflicts when convert methods to getters/setters context.ensureUniqueClassMemberNames(); context.applyLocalVariableSemanticChanges(dartUnit); EngineSemanticProcessor.rewriteReflectionFieldsWithDirect(context, dartUnit); rewriteErrorCodePatterns(dartUnit); // dump as several libraries Files.copy(new File("resources/interner.dart"), new File(targetFolder + "/interner.dart")); Files.copy(new File("resources/java_core.dart"), new File(targetFolder + "/java_core.dart")); Files.copy(new File("resources/java_io.dart"), new File(targetFolder + "/java_io.dart")); Files.copy(new File("resources/java_junit.dart"), new File(targetFolder + "/java_junit.dart")); Files.copy(new File("resources/java_engine.dart"), new File(targetFolder + "/java_engine.dart")); Files.copy(new File("resources/java_engine_io.dart"), new File(targetFolder + "/java_engine_io.dart")); Files.copy(new File("resources/all_test.dart"), new File(targetTestFolder + "/all_test.dart")); { CompilationUnit library = buildInstrumentationLibrary(); Files.write( getFormattedSource(library), new File(targetFolder + "/instrumentation.dart"), Charsets.UTF_8); } { CompilationUnit library = buildUtilitiesCollectionLibrary(); File file = new File(targetFolder + "/utilities_collection.dart"); Files.write(getFormattedSource(library), file, Charsets.UTF_8); Files.append( Files.toString(new File("resources/utilities_collection_include.dart"), Charsets.UTF_8), file, Charsets.UTF_8); } { CompilationUnit library = buildUtilitiesGeneralLibrary(); removeClass(library, "TimeCounter"); removeClass(library, "TimeCounter_TimeCounterHandle"); String source = getFormattedSource(library); source += makeSource( "/**", " * Helper for measuring how much time is spent doing some operation.", " */", "class TimeCounter {", " static final int NANOS_PER_MILLI = 1000 * 1000;", " static final int NANOS_PER_MICRO = 1000;", " static TimeCounter _current = null;", " final Stopwatch _sw = new Stopwatch();", "", " /**", " * @return the number of milliseconds spent between [start] and [stop].", " */", " int get result => _sw.elapsedMilliseconds;", "", " /**", " * Starts counting time.", " *", " * @return the [TimeCounterHandle] that should be used to stop counting.", " */", " TimeCounter_TimeCounterHandle start() {", " return new TimeCounter_TimeCounterHandle(this);", " }", "}", "", "/**", " * The handle object that should be used to stop and update counter.", " */", "class TimeCounter_TimeCounterHandle {", " final TimeCounter _counter;", " int _startMicros;", " TimeCounter _prev;", "", " TimeCounter_TimeCounterHandle(this._counter) {", " // if there is some counter running, pause it", " _prev = TimeCounter._current;", " if (_prev != null) {", " _prev._sw.stop();", " }", " TimeCounter._current = _counter;", " // start this counter", " _startMicros = _counter._sw.elapsedMicroseconds;", " _counter._sw.start();", " }", "", " /**", " * Stops counting time and updates counter.", " */", " int stop() {", " _counter._sw.stop();", " int elapsed = (_counter._sw.elapsedMicroseconds - _startMicros) *", " TimeCounter.NANOS_PER_MICRO;", " // restore previous counter and resume it", " TimeCounter._current = _prev;", " if (_prev != null) {", " _prev._sw.start();", " }", " // done", " return elapsed;", " }", "}", ""); Files.write(source, new File(targetFolder + "/utilities_general.dart"), Charsets.UTF_8); } { CompilationUnit library = buildSourceLibrary(); Files.write( getFormattedSource(library), new File(targetFolder + "/source.dart"), Charsets.UTF_8); } { CompilationUnit library = buildSourceIoLibrary(); String code = getFormattedSource(library); code = replaceSourceFragment( code, "bool isOpaque = uri.isOpaque()", "bool isOpaque = uri.isAbsolute && !uri.path.startsWith('/')"); Files.write(code, new File(targetFolder + "/source_io.dart"), Charsets.UTF_8); } { CompilationUnit library = buildErrorLibrary(); String source = getFormattedSource(library); source = replaceSourceFragment(source, "JavaString.format(", "formatList("); Files.write(source, new File(targetFolder + "/error.dart"), Charsets.UTF_8); } { CompilationUnit library = buildScannerLibrary(); Files.write( getFormattedSource(library), new File(targetFolder + "/scanner.dart"), Charsets.UTF_8); } { CompilationUnit library = buildHtmlLibrary(); String source = getFormattedSource(library); Files.write(source, new File(targetFolder + "/html.dart"), Charsets.UTF_8); } { CompilationUnit library = buildUtilitiesDartLibrary(); File astFile = new File(targetFolder + "/utilities_dart.dart"); Files.write(getFormattedSource(library), astFile, Charsets.UTF_8); } { CompilationUnit library = buildAstLibrary(); File astFile = new File(targetFolder + "/ast.dart"); String source = getFormattedSource(library); source = source.replace("AngularCompilationUnitBuilder.getElement(node, offset);", "null;"); source = source.replace("PolymerCompilationUnitBuilder.getElement(node, offset);", "null;"); Files.write(source, astFile, Charsets.UTF_8); Files.append( Files.toString(new File("resources/ast_include.dart"), Charsets.UTF_8), astFile, Charsets.UTF_8); } { CompilationUnit library = buildParserLibrary(); // generate "methodTable_Parser" StringWriter methodWriter = new StringWriter(); EngineSemanticProcessor.replaceReflection_generateParserTable(context, new PrintWriter( methodWriter), dartUnit); // write File libraryFile = new File(targetFolder + "/parser.dart"); Files.write(getFormattedSource(library), libraryFile, Charsets.UTF_8); Files.append(methodWriter.toString(), libraryFile, Charsets.UTF_8); Files.append( Files.toString(new File("resources/parser_include.dart"), Charsets.UTF_8), libraryFile, Charsets.UTF_8); } { CompilationUnit library = buildSdkLibrary(); Files.write(getFormattedSource(library), new File(targetFolder + "/sdk.dart"), Charsets.UTF_8); } { CompilationUnit library = buildSdkIoLibrary(); Files.write( getFormattedSource(library), new File(targetFolder + "/sdk_io.dart"), Charsets.UTF_8); } { CompilationUnit library = buildConstantLibrary(); String source = getFormattedSource(library); Files.write(source, new File(targetFolder + "/constant.dart"), Charsets.UTF_8); } { CompilationUnit library = buildElementLibrary(); Files.write( getFormattedSource(library), new File(targetFolder + "/element.dart"), Charsets.UTF_8); } { CompilationUnit library = buildElementHandleLibrary(); File elementHandleFile = new File(targetFolder + "/element_handle.dart"); Files.write(getFormattedSource(library), elementHandleFile, Charsets.UTF_8); Files.append( Files.toString(new File("resources/element_handle_include.dart"), Charsets.UTF_8), elementHandleFile, Charsets.UTF_8); } { CompilationUnit library = buildResolverLibrary(); String source = getFormattedSource(library); source = replaceSourceFragmentRE( source, "Object visitImportDirective\\(ImportDirective directive\\) \\{\n.*?checkForPackageImportContainsDotDot.*?return null;", makeSource("Object visitImportDirective(ImportDirective directive) {", " return null;")); source = replaceSourceFragment( source, "fullName.replaceAll(new String.fromCharCode(JavaFile.separatorChar), '/')", "fullName.replaceAll(r'\\', '/')"); Files.write(source, new File(targetFolder + "/resolver.dart"), Charsets.UTF_8); } { CompilationUnit library = buildEngineLibrary(); String source = getFormattedSource(library); // TODO(scheglov) restore NgRepeatProcessor source = replaceSourceFragment( source, "_processors.add(NgRepeatProcessor.INSTANCE);", "// _processors.add(NgRepeatProcessor.INSTANCE);"); Files.write(source, new File(targetFolder + "/engine.dart"), Charsets.UTF_8); } // Testing { CompilationUnit library = buildTestingTokenFactoryLibrary(); Files.write(getFormattedSource(library), new File(targetFolder + "/testing/token_factory.dart"), Charsets.UTF_8); } { CompilationUnit library = buildTestingAstFactoryLibrary(); Files.write( getFormattedSource(library), new File(targetFolder + "/testing/ast_factory.dart"), Charsets.UTF_8); } { CompilationUnit library = buildTestingElementFactoryLibrary(); Files.write(getFormattedSource(library), new File(targetFolder + "/testing/element_factory.dart"), Charsets.UTF_8); } // Tests { CompilationUnit library = buildTestSupportLibrary(); File testSupportFile = new File(targetTestFolder + "/test_support.dart"); Files.write(getFormattedSource(library), testSupportFile, Charsets.UTF_8); Files.append( Files.toString(new File("resources/test_support_include.dart"), Charsets.UTF_8), testSupportFile, Charsets.UTF_8); } { CompilationUnit library = buildScannerTestLibrary(); String source = getFormattedSource(library); source = replaceSourceFragment(source, "${OSUtilities.LINE_SEPARATOR}", "\\n"); Files.write(source, new File(targetTestFolder + "/scanner_test.dart"), Charsets.UTF_8); } { CompilationUnit library = buildParserTestLibrary(); EngineSemanticProcessor.replaceReflection_invokeParserMethodImpl(library); File libraryFile = new File(targetTestFolder + "/parser_test.dart"); Files.write(getFormattedSource(library), libraryFile, Charsets.UTF_8); } { CompilationUnit library = buildAstTestLibrary(); File astFile = new File(targetTestFolder + "/ast_test.dart"); Files.write(getFormattedSource(library), astFile, Charsets.UTF_8); } { CompilationUnit library = buildElementTestLibrary(); Files.write( getFormattedSource(library), new File(targetTestFolder + "/element_test.dart"), Charsets.UTF_8); } { CompilationUnit library = buildEngineTestLibrary(); String source = getFormattedSource(library); source = getCommentedSource(source); source += "\n\nmain() {\n}\n"; Files.write(source, new File(targetTestFolder + "/engine_test.dart"), Charsets.UTF_8); } { CompilationUnit library = buildResolverTestLibrary(); String source = getFormattedSource(library); // TODO(scheglov) restore this test once TestSource is not file based source = replaceSourceFragment( source, "AnalysisDeltaTest.dartSuite();", "//AnalysisDeltaTest.dartSuite();"); source = replaceSourceFragment(source, "on AssertionFailedError catch", "catch"); Files.write(source, new File(targetTestFolder + "/resolver_test.dart"), Charsets.UTF_8); } { CompilationUnit library = buildUtilitiesTestLibrary(); Files.write( getFormattedSource(library), new File(targetTestFolder + "/utilities_test.dart"), Charsets.UTF_8); } { for (CompilationUnitMember member : movedMembers) { dartUnit.getDeclarations().remove(member); } String source = getFormattedSource(dartUnit); source = getCommentedSource(source); Files.write(source, new File(targetTestFolder + "/all_the_rest.dart"), Charsets.UTF_8); } { String projectFolder = new File(targetFolder).getParentFile().getParentFile().getParent(); fixUnnecessaryCastHints(projectFolder); } System.out.println("Translation complete"); } private static void addNotRemovedCompiationUnitEntries(CompilationUnit targetUnit, List<CompilationUnitMember> members) { for (CompilationUnitMember member : members) { // may be removed if (isRemoved(member)) { continue; } // OK, add this member moveMemberToUnit(targetUnit, member); } } private static void applyEdits(File file, List<Edit> edits) throws IOException { // sort in descending order Collections.sort(edits, new Comparator<Edit>() { @Override public int compare(Edit o1, Edit o2) { return o2.offset - o1.offset; } }); // apply to file String content = Files.toString(file, Charsets.UTF_8); for (Edit edit : edits) { content = content.substring(0, edit.offset) + edit.replacement + content.substring(edit.offset + edit.length); } Files.write(content, file, Charsets.UTF_8); } private static CompilationUnit buildAstLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "ast")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add( importDirective("source.dart", null, importShowCombinator("LineInfo", "Source"))); unit.getDirectives().add(importDirective("scanner.dart", null)); unit.getDirectives().add( importDirective("engine.dart", null, importShowCombinator("AnalysisEngine"))); unit.getDirectives().add(importDirective("utilities_dart.dart", null)); unit.getDirectives().add( importDirective("utilities_collection.dart", null, importShowCombinator("TokenMap"))); unit.getDirectives().add(importDirective("element.dart", null)); unit.getDirectives().add(importDirective("constant.dart", null)); unit.getDirectives().add(importDirective("parser.dart", null)); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); if (isEnginePath(file, "ast/") || isEnginePath(file, "utilities/ast/")) { moveMemberToUnit(unit, member); } } return unit; } private static CompilationUnit buildAstTestLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "ast_test")); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_engine.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_junit.dart", null)); unit.getDirectives().add( importDirective(src_package + "java_engine.dart", null, importShowCombinator("Predicate"))); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); unit.getDirectives().add(importDirective(src_package + "ast.dart", null)); unit.getDirectives().add(importDirective("package:unittest/unittest.dart", "_ut")); unit.getDirectives().add( importDirective("parser_test.dart", null, importShowCombinator("ParserTestCase"))); unit.getDirectives().add(importDirective("test_support.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/ast_factory.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/token_factory.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "ast/AstFactory.java")) { continue; } // TODO(scheglov) I've asked Phil to remove ResolverTestCase dependency if (isEngineTestPath(file, "ast/visitor/ElementLocatorTest.java")) { continue; } if (isEngineTestPath(file, "ast/")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } // TODO(scheglov) remove ElementLocatorTest, it depends on ResolverTestCase { for (Iterator<Statement> I = mainStatements.iterator(); I.hasNext();) { Statement statement = I.next(); if (statement.toSource().contains("ElementLocatorTest")) { I.remove(); } } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static CompilationUnit buildConstantLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "constant")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add( importDirective("java_engine.dart", null, importShowCombinator("ObjectUtilities"))); unit.getDirectives().add(importDirective("source.dart", null, importShowCombinator("Source"))); unit.getDirectives().add(importDirective("error.dart", null)); unit.getDirectives().add( importDirective("scanner.dart", null, importShowCombinator("Token", "TokenType"))); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add(importDirective("element.dart", null)); unit.getDirectives().add( importDirective("resolver.dart", null, importShowCombinator("TypeProvider"))); unit.getDirectives().add( importDirective( "engine.dart", null, importShowCombinator("AnalysisEngine", "RecordingErrorListener"))); unit.getDirectives().add( importDirective("utilities_dart.dart", null, importShowCombinator("ParameterKind"))); unit.getDirectives().add(importDirective("utilities_collection.dart", null)); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); if (isEnginePath(file, "constant/") || isEnginePath(file, "internal/constant/") || isEnginePath(file, "internal/object/")) { moveMemberToUnit(unit, member); } } return unit; } private static CompilationUnit buildElementHandleLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "element_handle")); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add(importDirective("element.dart", null)); unit.getDirectives().add(importDirective("engine.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("utilities_dart.dart", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); if (isEnginePath(file, "internal/element/handle/")) { moveMemberToUnit(unit, member); } } return unit; } private static CompilationUnit buildElementLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "element")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add(importDirective("utilities_collection.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("scanner.dart", null, importShowCombinator("Keyword"))); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add(importDirective("sdk.dart", null, importShowCombinator("DartSdk"))); unit.getDirectives().add( importDirective("html.dart", null, importShowCombinator("XmlAttributeNode", "XmlTagNode"))); unit.getDirectives().add( importDirective( "engine.dart", null, importShowCombinator("AnalysisContext", "AnalysisEngine", "AnalysisException"))); unit.getDirectives().add( importDirective("constant.dart", null, importShowCombinator("EvaluationResultImpl"))); unit.getDirectives().add(importDirective("resolver.dart", null)); unit.getDirectives().add(importDirective("utilities_dart.dart", null)); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); if (isEnginePath(file, "internal/element/handle/")) { continue; } if (isEnginePath(file, "element/") || isEnginePath(file, "type/") || isEnginePath(file, "internal/element/") || isEnginePath(file, "internal/type/")) { moveMemberToUnit(unit, member); } } return unit; } private static CompilationUnit buildElementTestLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "element_test")); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_junit.dart", null)); unit.getDirectives().add(importDirective(src_package + "source_io.dart", null)); unit.getDirectives().add(importDirective(src_package + "ast.dart", null)); unit.getDirectives().add(importDirective(src_package + "element.dart", null)); unit.getDirectives().add( importDirective( src_package + "engine.dart", null, importShowCombinator("AnalysisContext", "AnalysisContextImpl"))); unit.getDirectives().add(importDirective("package:unittest/unittest.dart", "_ut")); unit.getDirectives().add(importDirective("test_support.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/ast_factory.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/element_factory.dart", null)); unit.getDirectives().add( importDirective( "resolver_test.dart", null, importShowCombinator("TestTypeProvider", "AnalysisContextHelper"))); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "element/ElementFactory.java")) { continue; } if (isEngineTestPath(file, "element/") || isEngineTestPath(file, "internal/element/") || isEngineTestPath(file, "internal/type/")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static CompilationUnit buildEngineLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add(importDirective("utilities_collection.dart", null)); unit.getDirectives().add(importDirective("utilities_general.dart", null)); unit.getDirectives().add(importDirective("instrumentation.dart", null)); unit.getDirectives().add(importDirective("error.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("scanner.dart", null)); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add( importDirective("parser.dart", null, importShowCombinator("Parser", "IncrementalParser"))); unit.getDirectives().add(importDirective("sdk.dart", null, importShowCombinator("DartSdk"))); unit.getDirectives().add(importDirective("constant.dart", null)); unit.getDirectives().add(importDirective("element.dart", null)); unit.getDirectives().add(importDirective("resolver.dart", null)); unit.getDirectives().add(importDirective("html.dart", "ht")); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); // ignore, part of index if (isEnginePath(file, "internal/html/angular/AngularDartIndexContributor.java") || isEnginePath(file, "internal/html/angular/AngularHtmlIndexContributor.java")) { continue; } // add if (isEnginePath(file, "AnalysisEngine.java") || isEnginePath(file, "utilities/logging/") || isEnginePath(file, "context/") || isEnginePath(file, "internal/cache/") || isEnginePath(file, "internal/context/") || isEnginePath(file, "internal/html/angular") || isEnginePath(file, "internal/html/polymer") || isEnginePath(file, "internal/task/")) { moveMemberToUnit(unit, member); } } // TODO(scheglov) restore NgRepeatProcessor { removeClass(unit, "NgRepeatProcessor"); } EngineSemanticProcessor.useImportPrefix( context, unit, "ht", new String[] {"com.google.dart.engine.html."}, false); return unit; } private static CompilationUnit buildEngineTestLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "engine_test")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective(src_package + "ast.dart", null)); unit.getDirectives().add(importDirective(src_package + "element.dart", null)); unit.getDirectives().add(importDirective(src_package + "engine.dart", null)); unit.getDirectives().add(importDirective(src_package + "error.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_engine.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_engine_io.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_io.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_junit.dart", null)); unit.getDirectives().add(importDirective(src_package + "parser.dart", null)); unit.getDirectives().add(importDirective(src_package + "resolver.dart", null)); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); unit.getDirectives().add(importDirective(src_package + "source_io.dart", null)); unit.getDirectives().add(importDirective("package:unittest/unittest.dart", "_ut")); unit.getDirectives().add(importDirective(src_package + "testing/ast_factory.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/element_factory.dart", null)); unit.getDirectives().add(importDirective("resolver_test.dart", null)); unit.getDirectives().add(importDirective("test_support.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "internal/cache/") || isEngineTestPath(file, "internal/context/") || isEngineTestPath(file, "internal/task/")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { if (isRemoved(unitMember)) { continue; } boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static CompilationUnit buildErrorLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "error")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("scanner.dart", null, importShowCombinator("Token"))); unit.getDirectives().add(importDirective("ast.dart", null, importShowCombinator("AstNode"))); unit.getDirectives().add(importDirective("element.dart", null)); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "error/") || isEnginePath(file, "internal/error/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildHtmlLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "html")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add( importDirective("error.dart", null, importShowCombinator("AnalysisErrorListener"))); unit.getDirectives().add( importDirective( "scanner.dart", "sc", importShowCombinator("Scanner", "SubSequenceReader", "Token"))); unit.getDirectives().add(importDirective("parser.dart", null, importShowCombinator("Parser"))); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add(importDirective("element.dart", null)); unit.getDirectives().add( importDirective( "engine.dart", null, importShowCombinator("AnalysisEngine", "AngularHtmlUnitResolver", "ExpressionVisitor"))); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "html/scanner/") || isEnginePath(file, "html/ast/") || isEnginePath(file, "html/parser/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } EngineSemanticProcessor.useImportPrefix( context, unit, "sc", new String[] {"com.google.dart.engine.scanner."}, false); return unit; } private static CompilationUnit buildInstrumentationLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "instrumentation")); unit.getDirectives().add(importDirective("java_core.dart", null)); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "utilities/instrumentation/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildParserLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "parser")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add(importDirective("instrumentation.dart", null)); unit.getDirectives().add(importDirective("error.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("scanner.dart", null)); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add(importDirective("utilities_dart.dart", null)); unit.getDirectives().add( importDirective( "engine.dart", null, importShowCombinator("AnalysisEngine", "AnalysisOptionsImpl"))); unit.getDirectives().add( importDirective("utilities_collection.dart", null, importShowCombinator("TokenMap"))); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); if (isEnginePath(file, "parser/") || isEnginePath(file, "internal/parser/") || file.getName().equals("ToFormattedSourceVisitor.java")) { moveMemberToUnit(unit, member); } } return unit; } private static CompilationUnit buildParserTestLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "parser_test")); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_junit.dart", null)); unit.getDirectives().add(importDirective(src_package + "error.dart", null)); unit.getDirectives().add( importDirective(src_package + "source.dart", null, importShowCombinator("Source"))); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); unit.getDirectives().add(importDirective(src_package + "ast.dart", null)); unit.getDirectives().add(importDirective(src_package + "parser.dart", null)); unit.getDirectives().add(importDirective(src_package + "element.dart", null)); unit.getDirectives().add(importDirective(src_package + "utilities_dart.dart", null)); unit.getDirectives().add(importDirective("package:unittest/unittest.dart", "_ut")); unit.getDirectives().add(importDirective("test_support.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/ast_factory.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/element_factory.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/token_factory.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "parser/")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static CompilationUnit buildResolverLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "resolver")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add(importDirective("instrumentation.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("error.dart", null)); unit.getDirectives().add(importDirective("scanner.dart", "sc")); unit.getDirectives().add(importDirective("utilities_dart.dart", null)); unit.getDirectives().add(importDirective("utilities_general.dart", null)); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add( importDirective("parser.dart", null, importShowCombinator("Parser", "ParserErrorCode"))); unit.getDirectives().add( importDirective("sdk.dart", null, importShowCombinator("DartSdk", "SdkLibrary"))); unit.getDirectives().add(importDirective("element.dart", null)); unit.getDirectives().add(importDirective("html.dart", "ht")); unit.getDirectives().add(importDirective("engine.dart", null)); unit.getDirectives().add(importDirective("constant.dart", null)); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); if (isEnginePath(file, "resolver/") || isEnginePath(file, "internal/resolver/") || isEnginePath(file, "internal/builder/") || isEnginePath(file, "internal/hint/") || isEnginePath(file, "internal/scope/") || isEnginePath(file, "internal/verifier/")) { moveMemberToUnit(unit, member); } } EngineSemanticProcessor.useImportPrefix( context, unit, "sc", new String[] {"com.google.dart.engine.scanner."}, false); EngineSemanticProcessor.useImportPrefix( context, unit, "ht", new String[] {"com.google.dart.engine.html."}, false); // done return unit; } private static CompilationUnit buildResolverTestLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "resolver_test")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_junit.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_engine.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_engine_io.dart", null)); unit.getDirectives().add(importDirective(src_package + "source_io.dart", null)); unit.getDirectives().add(importDirective(src_package + "error.dart", null)); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); unit.getDirectives().add(importDirective(src_package + "ast.dart", null)); unit.getDirectives().add( importDirective(src_package + "parser.dart", null, importShowCombinator("ParserErrorCode"))); unit.getDirectives().add(importDirective(src_package + "element.dart", null)); unit.getDirectives().add(importDirective(src_package + "resolver.dart", null)); unit.getDirectives().add(importDirective(src_package + "engine.dart", null)); unit.getDirectives().add(importDirective(src_package + "utilities_dart.dart", null)); unit.getDirectives().add(importDirective(src_package + "sdk.dart", null)); unit.getDirectives().add( importDirective( src_package + "sdk_io.dart", null, importShowCombinator("DirectoryBasedDartSdk"))); unit.getDirectives().add(importDirective("package:unittest/unittest.dart", "_ut")); unit.getDirectives().add(importDirective("test_support.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/ast_factory.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/element_factory.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "context/") || isEngineTestPath(file, "resolver/") || isEngineTestPath(file, "internal/resolver/") || isEngineTestPath(file, "internal/scope/")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { if (isRemoved(unitMember)) { continue; } boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static CompilationUnit buildScannerLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "scanner")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("error.dart", null)); unit.getDirectives().add(importDirective("instrumentation.dart", null)); unit.getDirectives().add( importDirective("utilities_collection.dart", null, importShowCombinator("TokenMap"))); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "scanner/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildScannerTestLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "scanner_test")); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_junit.dart", null)); unit.getDirectives().add(importDirective(src_package + "source.dart", null)); unit.getDirectives().add(importDirective(src_package + "error.dart", null)); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); unit.getDirectives().add( importDirective( src_package + "utilities_collection.dart", null, importShowCombinator("TokenMap"))); unit.getDirectives().add(importDirective("package:unittest/unittest.dart", "_ut")); unit.getDirectives().add(importDirective("test_support.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "scanner/TokenFactory.java")) { continue; } if (isEngineTestPath(file, "scanner/")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static CompilationUnit buildSdkIoLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "sdk", "io")); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_io.dart", null)); unit.getDirectives().add(importDirective("java_engine_io.dart", null)); unit.getDirectives().add(importDirective("source_io.dart", null)); unit.getDirectives().add(importDirective("error.dart", null)); unit.getDirectives().add(importDirective("scanner.dart", null)); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add(importDirective("parser.dart", null)); unit.getDirectives().add(importDirective("sdk.dart", null)); unit.getDirectives().add(importDirective("engine.dart", null)); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); // non-IO part if (isEnginePath(file, "sdk/DartSdk") || isEnginePath(file, "sdk/SdkLibrary") || isEnginePath(file, "internal/sdk/SdkLibraryImpl") || isEnginePath(file, "internal/sdk/LibraryMap") || isEnginePath(file, "internal/sdk/LibraryBuilder")) { continue; } // IO part if (isEnginePath(file, "sdk/") || isEnginePath(file, "internal/sdk/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildSdkLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "sdk")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add( importDirective( "source.dart", null, importShowCombinator("ContentCache", "Source", "UriKind"))); unit.getDirectives().add(importDirective("ast.dart", null)); unit.getDirectives().add( importDirective("engine.dart", null, importShowCombinator("AnalysisContext"))); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); List<CompilationUnitMember> members = entry.getValue(); { for (Iterator<CompilationUnitMember> iter = members.iterator(); iter.hasNext();) { CompilationUnitMember member = iter.next(); if (member instanceof ClassDeclaration && ((ClassDeclaration) member).getName().getName().endsWith( "SdkLibrariesReader_LibraryBuilder")) { moveMemberToUnit(unit, member); iter.remove(); continue; } } } if (isEnginePath(file, "sdk/DartSdk") || isEnginePath(file, "sdk/SdkLibrary") || isEnginePath(file, "internal/sdk/SdkLibraryImpl") || isEnginePath(file, "internal/sdk/LibraryMap")) { addNotRemovedCompiationUnitEntries(unit, members); } } return unit; } private static CompilationUnit buildSourceIoLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "source", "io")); unit.getDirectives().add(importDirective("source.dart", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("java_io.dart", null)); unit.getDirectives().add(importDirective("utilities_general.dart", null)); unit.getDirectives().add(importDirective("instrumentation.dart", null)); unit.getDirectives().add(importDirective("engine.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); unit.getDirectives().add(exportDirective("source.dart")); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "source/Source.java") || isEnginePath(file, "source/ContentCache.java") || isEnginePath(file, "source/DartUriResolver.java") || isEnginePath(file, "source/NonExistingSource.java") || isEnginePath(file, "source/SourceFactory.java") || isEnginePath(file, "source/SourceContainer.java") || isEnginePath(file, "source/SourceKind.java") || isEnginePath(file, "source/UriKind.java") || isEnginePath(file, "source/UriResolver.java") || isEnginePath(file, "utilities/source/")) { continue; } if (isEnginePath(file, "source/ExplicitPackageUriResolver.java")) { continue; } if (isEnginePath(file, "source/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildSourceLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "source")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("sdk.dart", null, importShowCombinator("DartSdk"))); unit.getDirectives().add(importDirective("engine.dart", null)); unit.getDirectives().add(importDirective("java_engine.dart", null)); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "source/Source.java") || isEnginePath(file, "source/ContentCache.java") || isEnginePath(file, "source/DartUriResolver.java") || isEnginePath(file, "source/LocalSourcePredicate.java") || isEnginePath(file, "source/NonExistingSource.java") || isEnginePath(file, "source/SourceFactory.java") || isEnginePath(file, "source/SourceContainer.java") || isEnginePath(file, "source/SourceKind.java") || isEnginePath(file, "source/UriKind.java") || isEnginePath(file, "source/UriResolver.java") || isEnginePath(file, "utilities/source/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildTestingAstFactoryLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "testing", "ast_factory")); unit.getDirectives().add(importDirective(src_package + "utilities_dart.dart", null)); unit.getDirectives().add(importDirective(src_package + "ast.dart", null)); unit.getDirectives().add(importDirective(src_package + "element.dart", null)); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); unit.getDirectives().add(importDirective(src_package + "testing/token_factory.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "ast/AstFactory.java")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } return unit; } private static CompilationUnit buildTestingElementFactoryLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "testing", "element_factory")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "utilities_dart.dart", null)); unit.getDirectives().add(importDirective(src_package + "ast.dart", null)); unit.getDirectives().add(importDirective(src_package + "constant.dart", null)); unit.getDirectives().add(importDirective(src_package + "source.dart", null)); unit.getDirectives().add(importDirective(src_package + "element.dart", null)); unit.getDirectives().add(importDirective(src_package + "engine.dart", null)); unit.getDirectives().add(importDirective(src_package + "resolver.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "element/ElementFactory.java")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } return unit; } private static CompilationUnit buildTestingTokenFactoryLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "testing", "token_factory")); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "scanner/TokenFactory.java")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } return unit; } private static CompilationUnit buildTestSupportLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "test_support")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective(src_package + "java_core.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_junit.dart", null)); unit.getDirectives().add(importDirective(src_package + "java_engine.dart", null)); unit.getDirectives().add(importDirective(src_package + "source.dart", null)); unit.getDirectives().add(importDirective(src_package + "error.dart", null)); unit.getDirectives().add(importDirective(src_package + "scanner.dart", null)); unit.getDirectives().add( importDirective( src_package + "ast.dart", null, importShowCombinator("AstNode", "NodeLocator"))); unit.getDirectives().add(importDirective(src_package + "element.dart", null)); unit.getDirectives().add(importDirective(src_package + "engine.dart", null)); unit.getDirectives().add(importDirective("package:unittest/unittest.dart", "_ut")); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "error/TestAll.java") || isEngineTestPath(file, "error/ErrorSeverityTest.java") || isEngineTestPath(file, "error/TodoCodeTest.java")) { continue; } if (isEngineTestPath(file, "error/") || isEngineTestPath(file, "EngineTestCase.java")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static CompilationUnit buildUtilitiesCollectionLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "utilities", "collection")); unit.getDirectives().add(importDirective("dart:collection", null)); unit.getDirectives().add(importDirective("java_core.dart", null)); unit.getDirectives().add(importDirective("scanner.dart", null, importShowCombinator("Token"))); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "utilities/collection/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildUtilitiesDartLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "utilities", "dart")); unit.getDirectives().add(importDirective("java_core.dart", null)); for (CompilationUnitMember member : dartUnit.getDeclarations()) { File file = context.getMemberToFile().get(member); if (isEnginePath(file, "utilities/dart/ParameterKind")) { moveMemberToUnit(unit, member); } } return unit; } private static CompilationUnit buildUtilitiesGeneralLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "utilities", "general")); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEnginePath(file, "utilities/general/")) { addNotRemovedCompiationUnitEntries(unit, entry.getValue()); } } return unit; } private static CompilationUnit buildUtilitiesTestLibrary() throws Exception { CompilationUnit unit = new CompilationUnit(null, null, null, null, null); unit.getDirectives().add(libraryDirective("engine", "utilities_test")); List<Statement> mainStatements = Lists.newArrayList(); for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) { File file = entry.getKey(); if (isEngineTestPath(file, "utilities/")) { List<CompilationUnitMember> unitMembers = entry.getValue(); for (CompilationUnitMember unitMember : unitMembers) { boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember); if (!isTestSuite) { moveMemberToUnit(unit, unitMember); } } } } EngineSemanticProcessor.addMain(unit, mainStatements); return unit; } private static void fixUnnecessaryCastHints(String projectPath) throws Exception { System.out.println(); System.out.println("Removing unnecessary casts."); AnalysisContext context = AnalysisEngine.getInstance().createAnalysisContext(); DirectoryBasedDartSdk sdk = DirectoryBasedDartSdk.getDefaultSdk(); SourceFactory sourceFactory = new SourceFactory( new DartUriResolver(sdk), new FileUriResolver(), new PackageUriResolver(new File(projectPath + "/packages"))); context.setSourceFactory(sourceFactory); // prepare sources List<Source> sources = Lists.newArrayList(); Map<Source, File> sourceToFile = Maps.newHashMap(); for (File file : FileUtils.listFiles( new File(projectPath + "/lib/src/generated"), new String[] {"dart"}, true)) { if (file.getAbsolutePath().contains("/packages/")) { continue; } FileBasedSource source = new FileBasedSource(file); sources.add(source); sourceToFile.put(source, file); } for (File file : FileUtils.listFiles( new File(projectPath + "/test/generated"), new String[] {"dart"}, true)) { if (file.getAbsolutePath().contains("/packages/")) { continue; } FileBasedSource source = new FileBasedSource(file); sources.add(source); sourceToFile.put(source, file); } // add sources to AnalysisContext { ChangeSet changeSet = new ChangeSet(); for (Source source : sources) { changeSet.addedSource(source); } context.applyChanges(changeSet); } System.out.println(sources.size() + " sources to analyze."); // perform analysis while (true) { AnalysisResult analysisResult = context.performAnalysisTask(); if (analysisResult.getChangeNotices() == null) { break; } } System.out.println("Analysis done."); // process errors for (Source source : sources) { CompilationUnit unit = context.parseCompilationUnit(source); List<Edit> edits = Lists.newArrayList(); AnalysisErrorInfo errorInfo = context.getErrors(source); AnalysisError[] errors = errorInfo.getErrors(); for (AnalysisError error : errors) { if (error.getErrorCode() == HintCode.UNNECESSARY_CAST) { AstNode node = new NodeLocator(error.getOffset()).searchWithin(unit); AsExpression asExpression = node.getAncestor(AsExpression.class); if (asExpression != null) { // remove "as" and its enclosing () AstNode enclosing = asExpression; if (enclosing.getParent() instanceof ParenthesizedExpression) { enclosing = enclosing.getParent(); } // add Edit Expression expr = asExpression.getExpression(); int enOffset = enclosing.getOffset(); int exEnd = expr.getEnd(); edits.add(new Edit(enOffset, expr.getOffset() - enOffset, "")); edits.add(new Edit(exEnd, enclosing.getEnd() - exEnd, "")); } } } // apply edits to file File file = sourceToFile.get(source); applyEdits(file, edits); } System.out.println("Edits applied."); System.out.println(); } private static String getCommentedSource(String source) { String[] lines = StringUtils.split(source, '\n'); for (int i = 0; i < lines.length; i++) { String line = lines[i]; lines[i] = "// " + line; } return StringUtils.join(lines, "\n"); } /** * @return the formatted Dart source dump of the given {@link AstNode}. */ private static String getFormattedSource(CompilationUnit unit) { PrintStringWriter writer = new PrintStringWriter(); writer.append(HEADER); sortUnitMembersByName(unit); unit.accept(new ToFormattedSourceVisitor(writer)); String source = writer.toString(); source = removeTrailingWhitespaces(source); return source; } /** * @param enginePackage the sub-package in <code>com/google/dart/engine</code>. * @return <code>true</code> if given {@link File} is located in sub-package of Engine project. */ private static boolean isEnginePath(File file, String enginePackage) { return file.getAbsolutePath().startsWith( engineFolder.getAbsolutePath() + "/com/google/dart/engine/" + enginePackage); } /** * @param enginePackage the sub-package in <code>com/google/dart/engine</code>. * @return <code>true</code> if given {@link File} is located in sub-package of Engine project. */ private static boolean isEngineTestPath(File file, String enginePackage) { return file.getAbsolutePath().startsWith( engineTestFolder.getAbsolutePath() + "/com/google/dart/engine/" + enginePackage); } private static boolean isRemoved(CompilationUnitMember member) { CompilationUnit memberUnit = (CompilationUnit) member.getParent(); return memberUnit == null || !memberUnit.getDeclarations().contains(member); } private static String makeSource(String... lines) { return Joiner.on("\n").join(lines); } private static void moveMemberToUnit(CompilationUnit newUnit, CompilationUnitMember member) { movedMembers.add(member); newUnit.getDeclarations().add(member); } /** * Removes {@link ClassDeclaration} with the given name. */ private static void removeClass(CompilationUnit unit, String name) { NodeList<CompilationUnitMember> declarations = unit.getDeclarations(); for (Iterator<CompilationUnitMember> iter = declarations.iterator(); iter.hasNext();) { CompilationUnitMember member = iter.next(); if (member instanceof ClassDeclaration) { ClassDeclaration classDeclaration = (ClassDeclaration) member; if (classDeclaration.getName().getName().equals(name)) { iter.remove(); } } } } /** * Removes trailing spaces from the given Dart source. */ private static String removeTrailingWhitespaces(String source) { String[] lines = StringUtils.splitPreserveAllTokens(source, '\n'); for (int i = 0; i < lines.length; i++) { lines[i] = StringUtils.stripEnd(lines[i], null); } return StringUtils.join(lines, "\n"); } /** * Replaces the fragment of the source specified by the RE pattern with the given source. * * @param source the source to replace fragment in * @param pattern the fragment to replace * @param replacement the source to replace fragment with * @return the source with the replacement fragment */ private static String replaceSourceFragment(String source, String pattern, String replacement) { int index = source.indexOf(pattern); if (index == -1) { throw new IllegalArgumentException("Not found: " + pattern); } return StringUtils.replace(source, pattern, replacement); } /** * Replaces the fragment of the source specified by the RE pattern with the given source. * * @param source the source to replace fragment in * @param pattern the regular expression describing fragment * @param replacement the source to replace fragment with * @return the source with the replacement fragment */ private static String replaceSourceFragmentRE(String source, String pattern, String replacement) { Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE | Pattern.DOTALL).matcher(source); if (!matcher.find()) { throw new IllegalArgumentException("Not found: " + pattern); } return matcher.replaceFirst(replacement); } /** * Rewrites errors from the Java.format() style to the MessageFormat style. */ private static void rewriteErrorCodePatterns(CompilationUnit unit) { unit.accept(new RecursiveAstVisitor<Void>() { @Override public Void visitClassDeclaration(ClassDeclaration node) { ImplementsClause implementsClause = node.getImplementsClause(); if (implementsClause != null) { NodeList<TypeName> interfaces = implementsClause.getInterfaces(); if (interfaces.size() == 1 && interfaces.get(0).getName().getName().equals("ErrorCode")) { return super.visitClassDeclaration(node); } } return null; } @Override public Void visitSimpleStringLiteral(SimpleStringLiteral node) { int index = 0; int lastPatternEnd = 0; String content = node.getValue(); String newContent = ""; Pattern pattern = Pattern.compile("(%.)"); Matcher matcher = pattern.matcher(content); while (matcher.find()) { newContent += content.substring(lastPatternEnd, matcher.start()); newContent += "{" + index + "}"; index++; lastPatternEnd = matcher.end(); } newContent += content.substring(lastPatternEnd); if (newContent.equals(content)) { return null; } String lexeme = "\"" + newContent.replace("\\", "\\\\").replace("\"", "\\\"").replace("$", "\\$") + "\""; SyntaxTranslator.replaceNode(node.getParent(), node, new SimpleStringLiteral( token(lexeme), newContent)); return super.visitSimpleStringLiteral(node); } }); } private static void sortUnitMembersByName(CompilationUnit unit) { Collections.sort(unit.getDeclarations(), new Comparator<CompilationUnitMember>() { @Override public int compare(CompilationUnitMember o1, CompilationUnitMember o2) { String name1 = getName(o1); String name2 = getName(o2); return name1.compareTo(name2); } private String getName(CompilationUnitMember member) { if (member instanceof ClassDeclaration) { return ((ClassDeclaration) member).getName().getName(); } if (member instanceof FunctionDeclaration) { return ((FunctionDeclaration) member).getName().getName(); } throw new UnsupportedOperationException(member.toSource()); } }); } }