/* * Copyright 2011 Google Inc. * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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.gwt.dev.jjs; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.dev.CompilerContext; import com.google.gwt.dev.NullRebuildCache; import com.google.gwt.dev.PrecompileTaskOptions; import com.google.gwt.dev.cfg.ConfigurationProperties; import com.google.gwt.dev.javac.CompilationState; import com.google.gwt.dev.javac.StandardGeneratorContext; import com.google.gwt.dev.jdt.RebindPermutationOracle; import com.google.gwt.dev.jjs.ast.JProgram; import com.google.gwt.dev.jjs.ast.JTypeOracle.StandardTypes; import com.google.gwt.dev.jjs.impl.AssertionNormalizer; import com.google.gwt.dev.jjs.impl.AssertionRemover; import com.google.gwt.dev.jjs.impl.FixAssignmentsToUnboxOrCast; import com.google.gwt.dev.jjs.impl.ImplementClassLiteralsAsFields; import com.google.gwt.dev.jjs.impl.UnifyAst; import com.google.gwt.dev.jjs.impl.codesplitter.CodeSplitters; import com.google.gwt.dev.jjs.impl.codesplitter.ReplaceRunAsyncs; import com.google.gwt.dev.js.ast.JsProgram; /** * Constructs a full Java AST from source. */ public class AstConstructor { public static JProgram construct(TreeLogger logger, final CompilationState state, PrecompileTaskOptions options, ConfigurationProperties config) throws UnableToCompleteException { CompilerContext compilerContext = new CompilerContext.Builder().options(options) .minimalRebuildCache(new NullRebuildCache()).build(); return construct(logger, state, compilerContext, config); } /** * Construct an simple AST representing an entire {@link CompilationState}. * Does not support deferred binding. Implementation mostly copied from * {@link JavaToJavaScriptCompiler}. */ public static JProgram construct(TreeLogger logger, final CompilationState state, CompilerContext compilerContext, ConfigurationProperties config) throws UnableToCompleteException { InternalCompilerException.preload(); PrecompilationContext precompilationContext = new PrecompilationContext( new RebindPermutationOracle() { @Override public void clear() { } @Override public String[] getAllPossibleRebindAnswers(TreeLogger logger, String sourceTypeName) throws UnableToCompleteException { return new String[0]; } @Override public CompilationState getCompilationState() { return state; } @Override public StandardGeneratorContext getGeneratorContext() { return null; } }); JProgram jprogram = new JProgram(compilerContext.getMinimalRebuildCache()); JsProgram jsProgram = new JsProgram(); UnifyAst unifyAst = new UnifyAst(logger, compilerContext, jprogram, jsProgram, precompilationContext); unifyAst.buildEverything(); // Compute all super type/sub type info jprogram.typeOracle.computeBeforeAST(StandardTypes.createFrom(jprogram), jprogram.getDeclaredTypes(), jprogram.getModuleDeclaredTypes()); // (3) Perform Java AST normalizations. FixAssignmentsToUnboxOrCast.exec(jprogram); /* * TODO: If we defer this until later, we could maybe use the results of the * assertions to enable more optimizations. */ if (compilerContext.getOptions().isEnableAssertions()) { // Turn into assertion checking calls. AssertionNormalizer.exec(jprogram); } else { // Remove all assert statements. AssertionRemover.exec(jprogram); } if (compilerContext.getOptions().isRunAsyncEnabled()) { ReplaceRunAsyncs.exec(logger, jprogram); if (config != null) { CodeSplitters.pickInitialLoadSequence(logger, jprogram, config); } } ImplementClassLiteralsAsFields.exec(jprogram, true); return jprogram; } }