com.google.dart.compiler.backend.dart.DartBackend.java Source code

Java tutorial

Introduction

Here is the source code for com.google.dart.compiler.backend.dart.DartBackend.java

Source

// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.google.dart.compiler.backend.dart;

import com.google.common.io.CharStreams;
import com.google.common.io.Closeables;
import com.google.dart.compiler.DartCompilerContext;
import com.google.dart.compiler.DartSource;
import com.google.dart.compiler.LibrarySource;
import com.google.dart.compiler.ast.DartToSourceVisitor;
import com.google.dart.compiler.ast.DartUnit;
import com.google.dart.compiler.ast.LibraryUnit;
import com.google.dart.compiler.backend.common.AbstractBackend;
import com.google.dart.compiler.resolver.CoreTypeProvider;
import com.google.dart.compiler.util.DefaultTextOutput;
import com.google.dart.compiler.util.TextOutput;

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Collection;

/**
 * A compiler backend that produces optimized Dart.
 */
public class DartBackend extends AbstractBackend {

    public static final String EXTENSION_DART = "opt.dart";
    public static final String EXTENSION_DART_SRC_MAP = "opt.dart.map";

    private static void packageLibs(Collection<LibraryUnit> libraries, Writer w, DartCompilerContext context)
            throws IOException {
        for (LibraryUnit libUnit : libraries) {
            for (DartUnit unit : libUnit.getUnits()) {
                DartSource src = unit.getSource();
                if (src != null) {
                    Reader r = context.getArtifactReader(src, "", EXTENSION_DART);
                    boolean failed = true;
                    try {
                        CharStreams.copy(r, w);
                        failed = false;
                    } finally {
                        Closeables.close(r, failed);
                    }
                }
            }
        }
    }

    @Override
    public boolean isOutOfDate(DartSource src, DartCompilerContext context) {
        return context.isOutOfDate(src, src, EXTENSION_DART);
    }

    @Override
    public void compileUnit(DartUnit unit, DartSource src, DartCompilerContext context,
            CoreTypeProvider typeProvider) throws IOException {
        // Generate Javascript output.
        TextOutput out = new DefaultTextOutput(false);
        DartToSourceVisitor srcGenerator = new DartToSourceVisitor(out);
        // TODO(johnlenz): Determine if we want to make source maps
        // optional.
        srcGenerator.generateSourceMap(true);
        srcGenerator.accept(unit);
        Writer w = context.getArtifactWriter(src, "", EXTENSION_DART);
        boolean failed = true;
        try {
            w.write(out.toString());
            failed = false;
        } finally {
            Closeables.close(w, failed);
        }
        // Write out the source map.
        w = context.getArtifactWriter(src, "", EXTENSION_DART_SRC_MAP);
        failed = true;
        try {
            srcGenerator.writeSourceMap(w, src.getName());
            failed = false;
        } finally {
            Closeables.close(w, failed);
        }
    }

    @Override
    public void packageApp(LibrarySource app, Collection<LibraryUnit> libraries, DartCompilerContext context,
            CoreTypeProvider typeProvider) throws IOException {
        Writer out = context.getArtifactWriter(app, "", EXTENSION_DART);
        boolean failed = true;
        try {
            // Emit the concatenated Javascript sources in dependency order.
            packageLibs(libraries, out, context);

            // Emit entry point call.
            // TODO: How does a dart app start?
            // out.write(app.getEntryMethod() + "();");
            failed = false;
        } finally {
            Closeables.close(out, failed);
        }
    }

    @Override
    public String getAppExtension() {
        return EXTENSION_DART;
    }

    @Override
    public String getSourceMapExtension() {
        return EXTENSION_DART_SRC_MAP;
    }
}