com.google.dart.java2dart.engine.MainEngine.java Source code

Java tutorial

Introduction

Here is the source code for com.google.dart.java2dart.engine.MainEngine.java

Source

/*
 * 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.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
import com.google.dart.engine.ast.ASTNode;
import com.google.dart.engine.ast.CompilationUnit;
import com.google.dart.engine.ast.CompilationUnitMember;
import com.google.dart.engine.ast.SimpleIdentifier;
import com.google.dart.engine.ast.Statement;
import com.google.dart.engine.ast.TypeName;
import com.google.dart.engine.ast.visitor.RecursiveASTVisitor;
import com.google.dart.engine.utilities.io.PrintStringWriter;
import com.google.dart.java2dart.Context;
import com.google.dart.java2dart.processor.BeautifySemanticProcessor;
import com.google.dart.java2dart.processor.CollectionSemanticProcessor;
import com.google.dart.java2dart.processor.ConstructorSemanticProcessor;
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.SemanticProcessor;
import com.google.dart.java2dart.util.JavaUtils;
import com.google.dart.java2dart.util.ToFormattedSourceVisitor;

import static com.google.dart.java2dart.util.ASTFactory.exportDirective;
import static com.google.dart.java2dart.util.ASTFactory.identifier;
import static com.google.dart.java2dart.util.ASTFactory.importDirective;
import static com.google.dart.java2dart.util.ASTFactory.importHideCombinator;
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.lang3.StringUtils;
import org.eclipse.jdt.core.dom.ITypeBinding;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

/**
 * Translates some parts of "com.google.dart.engine" project.
 */
public class MainEngine {
    /**
     * 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 File engineFolder2;
    private static CompilationUnit dartUnit;

    private static final String HEADER = "// 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");
        engineFolder2 = new File("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"));
        context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/utilities/instrumentation"));
        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/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/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/type"));
        context.addSourceFiles(new File(engineFolder, "com/google/dart/engine/internal/verifier"));
        context.addSourceFile(
                new File(engineFolder2, "com/google/dart/java2dart/util/ToFormattedSourceVisitor.java"));
        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"));
        // 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/scanner"));
        context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/parser"));
        context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/ast"));
        context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/element"));
        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/resolver"));
        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/context"));
        context.addSourceFiles(new File(engineTestFolder, "com/google/dart/engine/internal/context"));
        // configure renames
        context.addRename("Lcom/google/dart/engine/ast/IndexExpression;.(Lcom/google/dart/engine/ast/Expression;"
                + "Lcom/google/dart/engine/scanner/Token;Lcom/google/dart/engine/ast/Expression;"
                + "Lcom/google/dart/engine/scanner/Token;)", "forTarget");
        context.addRename("Lcom/google/dart/engine/ast/IndexExpression;.(Lcom/google/dart/engine/scanner/Token;"
                + "Lcom/google/dart/engine/scanner/Token;Lcom/google/dart/engine/ast/Expression;"
                + "Lcom/google/dart/engine/scanner/Token;)", "forCascade");
        context.addRename(
                "Lcom/google/dart/engine/html/ast/XmlTagNode;.becomeParentOf<T:Lcom/google/dart/engine/html/ast/XmlNode;>(Ljava/util/List<TT;>;Ljava/util/List<TT;>;)",
                "becomeParentOfEmpty");
        // translate into single CompilationUnit
        dartUnit = context.translate();
        // run processors
        {
            List<SemanticProcessor> PROCESSORS = ImmutableList.of(new ConstructorSemanticProcessor(context),
                    new ObjectSemanticProcessor(context), new CollectionSemanticProcessor(context),
                    new IOSemanticProcessor(context), new PropertySemanticProcessor(context),
                    new GuavaSemanticProcessor(context), new JUnitSemanticProcessor(context),
                    new BeautifySemanticProcessor(context), new EngineSemanticProcessor(context));
            for (SemanticProcessor processor : PROCESSORS) {
                processor.process(dartUnit);
            }
        }
        // run this again, because we may introduce conflicts when convert methods to getters/setters
        context.ensureUniqueClassMemberNames(dartUnit);
        context.ensureNoVariableNameReferenceFromInitializer(dartUnit);
        context.ensureMethodParameterDoesNotHide(dartUnit);
        // handle reflection
        EngineSemanticProcessor.rewriteReflectionFieldsWithDirect(context, dartUnit);
        // dump as several libraries
        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 = buildSourceLibrary();
            Files.write(getFormattedSource(library), new File(targetFolder + "/source.dart"), Charsets.UTF_8);
        }
        {
            CompilationUnit library = buildSourceIoLibrary();
            Files.write(getFormattedSource(library), new File(targetFolder + "/source_io.dart"), Charsets.UTF_8);
        }
        {
            CompilationUnit library = buildErrorLibrary();
            Files.write(getFormattedSource(library), 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();
            Files.write(getFormattedSource(library), 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");
            Files.write(getFormattedSource(library), astFile, Charsets.UTF_8);
            Files.append(Files.toString(new File("resources/ast_include.dart"), Charsets.UTF_8), astFile,
                    Charsets.UTF_8);
        }
        {
            CompilationUnit library = buildParserLibrary();
            Files.write(getFormattedSource(library), new File(targetFolder + "/parser.dart"), 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();
            Files.write(getFormattedSource(library), 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 = buildResolverLibrary();
            Files.write(getFormattedSource(library), new File(targetFolder + "/resolver.dart"), Charsets.UTF_8);
        }
        {
            CompilationUnit library = buildEngineLibrary();
            Files.write(getFormattedSource(library), new File(targetFolder + "/engine.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();
            Files.write(getFormattedSource(library), new File(targetTestFolder + "/scanner_test.dart"),
                    Charsets.UTF_8);
        }
        {
            CompilationUnit library = buildParserTestLibrary();
            // replace reflection methods
            StringWriter methodWriter = new StringWriter();
            EngineSemanticProcessor.replaceReflectionMethods(context, new PrintWriter(methodWriter), dartUnit);
            // write to file
            File libraryFile = new File(targetTestFolder + "/parser_test.dart");
            Files.write(getFormattedSource(library), libraryFile, Charsets.UTF_8);
            Files.append(methodWriter.toString(), 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 = buildResolverTestLibrary();
            Files.write(getFormattedSource(library), new File(targetTestFolder + "/resolver_test.dart"),
                    Charsets.UTF_8);
        }
        System.out.println("Translation complete");
    }

    private static void addNotRemovedCompiationUnitEntries(CompilationUnit targetUnit,
            List<CompilationUnitMember> members) {
        for (CompilationUnitMember member : members) {
            // may be removed
            CompilationUnit memberUnit = (CompilationUnit) member.getParent();
            if (memberUnit == null || !memberUnit.getDeclarations().contains(member)) {
                continue;
            }
            // OK, add this member
            targetUnit.getDeclarations().add(member);
        }
    }

    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("error.dart", null));
        unit.getDirectives().add(importDirective("source.dart", null, importShowCombinator("LineInfo")));
        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("element.dart", null, importHideCombinator(identifier("Annotation"))));
        for (CompilationUnitMember member : dartUnit.getDeclarations()) {
            File file = context.getMemberToFile().get(member);
            if (isEnginePath(file, "ast/") || isEnginePath(file, "utilities/ast/")) {
                unit.getDeclarations().add(member);
            }
        }
        EngineSemanticProcessor.generateConstructorWithNamedParametersInAST(context, unit);
        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("dart:collection", 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_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 + "ast.dart", null));
        unit.getDirectives().add(importDirective(src_package + "utilities_dart.dart", null));
        unit.getDirectives()
                .add(importDirective(src_package + "element.dart", null, importShowCombinator("ClassElement")));
        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("scanner_test.dart", null, importShowCombinator("TokenFactory")));
        List<Statement> mainStatements = Lists.newArrayList();
        for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) {
            File file = entry.getKey();
            // 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) {
                        unit.getDeclarations().add(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("java_core.dart", null));
        unit.getDirectives().add(importDirective("source.dart", null, importShowCombinator("Source")));
        unit.getDirectives().add(importDirective("error.dart", null,
                importShowCombinator("AnalysisError", "ErrorCode", "CompileTimeErrorCode")));
        unit.getDirectives().add(importDirective("scanner.dart", null, importShowCombinator("TokenType")));
        unit.getDirectives().add(importDirective("ast.dart", null));
        unit.getDirectives().add(importDirective("element.dart", null));
        unit.getDirectives().add(importDirective("engine.dart", null, importShowCombinator("AnalysisEngine")));
        for (CompilationUnitMember member : dartUnit.getDeclarations()) {
            File file = context.getMemberToFile().get(member);
            if (isEnginePath(file, "constant/") || isEnginePath(file, "internal/constant/")) {
                unit.getDeclarations().add(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("source.dart", null));
        unit.getDirectives().add(importDirective("scanner.dart", null, importShowCombinator("Keyword")));
        unit.getDirectives()
                .add(importDirective("ast.dart", null, importShowCombinator("Identifier", "LibraryIdentifier")));
        unit.getDirectives().add(importDirective("sdk.dart", null, importShowCombinator("DartSdk")));
        unit.getDirectives().add(importDirective("html.dart", null, importShowCombinator("XmlTagNode")));
        unit.getDirectives().add(importDirective("engine.dart", null, importShowCombinator("AnalysisContext")));
        unit.getDirectives()
                .add(importDirective("constant.dart", null, importShowCombinator("EvaluationResultImpl")));
        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/")) {
                unit.getDeclarations().add(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("dart:collection", null));
        unit.getDirectives().add(importDirective("dart:io", 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_junit.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 + "utilities_dart.dart", null));
        unit.getDirectives()
                .add(importDirective(src_package + "ast.dart", null, importHideCombinator("Annotation")));
        unit.getDirectives()
                .add(importDirective(src_package + "element.dart", null, importHideCombinator("Annotation")));
        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("scanner_test.dart", null, importShowCombinator("TokenFactory")));
        unit.getDirectives().add(importDirective("ast_test.dart", null, importShowCombinator("ASTFactory")));
        unit.getDirectives()
                .add(importDirective("resolver_test.dart", null, importShowCombinator("TestTypeProvider")));
        List<Statement> mainStatements = Lists.newArrayList();
        for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) {
            File file = entry.getKey();
            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) {
                        unit.getDeclarations().add(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, importShowCombinator("HasNextIterator")));
        unit.getDirectives().add(importDirective("dart:uri", null, importShowCombinator("Uri")));
        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,
                importShowCombinator("Token", "CharBufferScanner", "StringScanner")));
        unit.getDirectives().add(importDirective("ast.dart", null));
        unit.getDirectives().add(importDirective("parser.dart", null, importShowCombinator("Parser")));
        unit.getDirectives().add(importDirective("sdk.dart", null, importShowCombinator("DartSdk")));
        unit.getDirectives().add(importDirective("element.dart", null));
        unit.getDirectives().add(importDirective("resolver.dart", null));
        unit.getDirectives()
                .add(importDirective("html.dart", null,
                        importShowCombinator("XmlTagNode", "XmlAttributeNode", "RecursiveXmlVisitor", "HtmlScanner",
                                "HtmlScanResult", "HtmlParser", "HtmlParseResult", "HtmlUnit")));
        for (CompilationUnitMember member : dartUnit.getDeclarations()) {
            File file = context.getMemberToFile().get(member);
            if (isEnginePath(file, "AnalysisEngine.java") || isEnginePath(file, "utilities/logging/")
                    || isEnginePath(file, "context/") || isEnginePath(file, "internal/cache/")
                    || isEnginePath(file, "internal/context/")) {
                unit.getDeclarations().add(member);
            }
        }
        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("java_core.dart", null));
        unit.getDirectives().add(importDirective("source.dart", null));
        unit.getDirectives().add(importDirective("ast.dart", null, importShowCombinator("ASTNode")));
        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, "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));
        unit.getDirectives().add(importDirective("instrumentation.dart", null));
        unit.getDirectives().add(importDirective("element.dart", null, importShowCombinator("HtmlElementImpl")));
        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());
            }
        }
        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));
        for (CompilationUnitMember member : dartUnit.getDeclarations()) {
            File file = context.getMemberToFile().get(member);
            if (isEnginePath(file, "parser/") || isEnginePath(file, "internal/parser/")
                    || file.getName().equals("ToFormattedSourceVisitor.java")) {
                unit.getDeclarations().add(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("dart:collection", 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_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 + "ast.dart", null));
        unit.getDirectives().add(importDirective(src_package + "parser.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("scanner_test.dart", null, importShowCombinator("TokenFactory")));
        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) {
                        unit.getDeclarations().add(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("dart:uri", null, importShowCombinator("Uri")));
        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("ast.dart", null));
        unit.getDirectives()
                .add(importDirective("parser.dart", null, importShowCombinator("Parser", "ParserErrorCode")));
        unit.getDirectives().add(importDirective("sdk.dart", null, importShowCombinator("DartSdk")));
        unit.getDirectives().add(
                importDirective("element.dart", null, importHideCombinator("HideCombinator", "ShowCombinator")));
        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/scope/")
                    || isEnginePath(file, "internal/verifier/")) {
                unit.getDeclarations().add(member);
            }
        }
        // there is conflict between Hide/ShowCombinator classes in AST and Element, so tweak them
        unit.getDirectives().add(importDirective("element.dart", "__imp_combi",
                importShowCombinator("HideCombinator", "ShowCombinator")));
        unit.accept(new RecursiveASTVisitor<Void>() {
            @Override
            public Void visitTypeName(TypeName node) {
                ITypeBinding binding = context.getNodeTypeBinding(node);
                if (binding != null) {
                    String shortName = binding.getName();
                    shortName = StringUtils.substringBefore(shortName, "<");
                    if (JavaUtils.isTypeNamed(binding, "com.google.dart.engine.element.HideCombinator")
                            || JavaUtils.isTypeNamed(binding, "com.google.dart.engine.element.ShowCombinator")) {
                        ((SimpleIdentifier) node.getName()).setToken(token("__imp_combi." + shortName));
                    }
                }
                return super.visitTypeName(node);
            }
        });
        EngineSemanticProcessor.useImportPrefix(context, unit, "sc",
                new String[] { "com.google.dart.engine.scanner." });
        EngineSemanticProcessor.useImportPrefix(context, unit, "ht",
                new String[] { "com.google.dart.engine.html." });
        // 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_engine.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 + "error.dart", null));
        unit.getDirectives().add(importDirective(src_package + "scanner.dart", null));
        unit.getDirectives()
                .add(importDirective(src_package + "ast.dart", null, importHideCombinator("Annotation")));
        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 + "java_engine_io.dart", null));
        unit.getDirectives().add(importDirective(src_package + "sdk.dart", null, importShowCombinator("DartSdk")));
        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("ast_test.dart", null, importShowCombinator("ASTFactory")));
        unit.getDirectives()
                .add(importDirective("element_test.dart", null, importShowCombinator("ElementFactory")));
        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) {
                    boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember);
                    if (!isTestSuite) {
                        unit.getDeclarations().add(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));
        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("dart:collection", 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_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("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/")) {
                List<CompilationUnitMember> unitMembers = entry.getValue();
                for (CompilationUnitMember unitMember : unitMembers) {
                    boolean isTestSuite = EngineSemanticProcessor.gatherTestSuites(mainStatements, unitMember);
                    if (!isTestSuite) {
                        unit.getDeclarations().add(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"));
        unit.getDirectives().add(importDirective("dart:io", null));
        unit.getDirectives().add(importDirective("dart:uri", null));
        unit.getDirectives().add(importDirective("java_core.dart", null));
        unit.getDirectives().add(importDirective("java_io.dart", null));
        unit.getDirectives().add(importDirective("java_engine.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")) {
                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:uri", 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("ContentCache", "Source", "UriKind")));
        unit.getDirectives().add(importDirective("engine.dart", null, importShowCombinator("AnalysisContext")));
        for (Entry<File, List<CompilationUnitMember>> entry : context.getFileToMembers().entrySet()) {
            File file = entry.getKey();
            if (isEnginePath(file, "sdk/DartSdk") || isEnginePath(file, "sdk/SdkLibrary")
                    || isEnginePath(file, "internal/sdk/SdkLibraryImpl")
                    || isEnginePath(file, "internal/sdk/LibraryMap")) {
                addNotRemovedCompiationUnitEntries(unit, entry.getValue());
            }
        }
        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("dart:io", null));
        unit.getDirectives().add(importDirective("dart:uri", null));
        unit.getDirectives().add(importDirective("java_core.dart", null));
        unit.getDirectives().add(importDirective("java_io.dart", null));
        unit.getDirectives().add(importDirective("sdk.dart", null, importShowCombinator("DartSdk")));
        unit.getDirectives().add(
                importDirective("engine.dart", null, importShowCombinator("AnalysisContext", "AnalysisEngine")));
        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/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/")) {
                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:uri", 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, importShowCombinator("AnalysisContext")));
        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/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 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("dart:uri", 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_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 + "element.dart", null,
                importShowCombinator("InterfaceType", "MethodElement", "PropertyAccessorElement")));
        unit.getDirectives().add(importDirective(src_package + "engine.dart", null,
                importShowCombinator("AnalysisContext", "AnalysisContextImpl")));
        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/") || isEngineTestPath(file, "EngineTestCase.java")) {
                addNotRemovedCompiationUnitEntries(unit, entry.getValue());
            }
        }
        EngineSemanticProcessor.addMain(unit, mainStatements);
        return unit;
    }

    private static CompilationUnit buildUtilitiesDartLibrary() throws Exception {
        CompilationUnit unit = new CompilationUnit(null, null, null, null, null);
        unit.getDirectives().add(libraryDirective("engine", "utilities", "dart"));
        for (CompilationUnitMember member : dartUnit.getDeclarations()) {
            File file = context.getMemberToFile().get(member);
            if (isEnginePath(file, "utilities/dart/ParameterKind")) {
                unit.getDeclarations().add(member);
            }
        }
        return unit;
    }

    /**
     * @return the formatted Dart source dump of the given {@link ASTNode}.
     */
    private static String getFormattedSource(ASTNode node) {
        PrintStringWriter writer = new PrintStringWriter();
        writer.append(HEADER);
        node.accept(new ToFormattedSourceVisitor(writer));
        return writer.toString();
    }

    /**
     * @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);
    }
}