blob: 183bf12425523ab4fab6e2fa3c6fe070eb0c8333 [file] [log] [blame]
/*
* 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;
}
}