/* * Copyright 2014 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.impl; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.linker.SymbolData; import com.google.gwt.core.ext.linker.impl.StandardSymbolData; import com.google.gwt.dev.CompilerContext; import com.google.gwt.dev.cfg.BindingProperties; import com.google.gwt.dev.cfg.BindingProperty; import com.google.gwt.dev.cfg.ConditionNone; import com.google.gwt.dev.cfg.ConfigurationProperties; import com.google.gwt.dev.cfg.ConfigurationProperty; import com.google.gwt.dev.cfg.PermutationProperties; import com.google.gwt.dev.javac.CompilationState; import com.google.gwt.dev.javac.CompilationStateBuilder; import com.google.gwt.dev.javac.testing.impl.MockJavaResource; import com.google.gwt.dev.jjs.JavaAstConstructor; import com.google.gwt.dev.jjs.ast.JProgram; import com.google.gwt.dev.jjs.impl.ResolveRuntimeTypeReferences.IntTypeMapper; import com.google.gwt.dev.jjs.impl.ResolveRuntimeTypeReferences.TypeOrder; import com.google.gwt.dev.js.ast.JsName; import com.google.gwt.dev.js.ast.JsNode; import com.google.gwt.dev.js.ast.JsProgram; import com.google.gwt.dev.util.Pair; import com.google.gwt.thirdparty.guava.common.collect.Lists; import java.util.Arrays; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** * Base class for all tests that require end to end compilation. */ public abstract class FullCompileTestBase extends JJSTestBase { // Compilation Configuration Properties. private BindingProperty[] orderedProps = null; private String[] orderedPropValues = null; private ConfigurationProperty[] configurationProperties = {}; protected JProgram jProgram = null; protected JsProgram jsProgram = null; @Override public void setUp() throws Exception { super.setUp(); // Stack mode is a required property. BindingProperty stackMode = new BindingProperty("compiler.stackMode"); stackMode.addDefinedValue(new ConditionNone(), "STRIP"); setProperties(new BindingProperty[]{stackMode}, new String[]{"STRIP"}, new ConfigurationProperty[]{}); jsProgram = new JsProgram(); } /** * Compiles a Java class <code>test.EntryPoint</code> and use the code splitter on it. */ protected Pair<JavaToJavaScriptMap, Set<JsNode>> compileSnippetToJS(final String code) throws UnableToCompleteException { sourceOracle.addOrReplace(new MockJavaResource("test.EntryPoint") { @Override public CharSequence getContent() { return code; } }); CompilerContext compilerContext = provideCompilerContext(); CompilationState state = CompilationStateBuilder.buildFrom(logger, compilerContext, sourceOracle.getResources(), getAdditionalTypeProviderDelegate()); ConfigurationProperties config = new ConfigurationProperties(Lists.newArrayList( configurationProperties)); jProgram = JavaAstConstructor.construct(logger, state, compilerContext, config, "test.EntryPoint", "com.google.gwt.lang.Exceptions"); jProgram.addEntryMethod(findMethod(jProgram, "onModuleLoad")); optimizeJava(); ComputeCastabilityInformation.exec(jProgram, false); ImplementCastsAndTypeChecks.exec(jProgram, false); ArrayNormalizer.exec(jProgram); TypeTightener.exec(jProgram); MethodCallTightener.exec(jProgram); IntTypeMapper typeMapper = new IntTypeMapper(); ResolveRuntimeTypeReferences.exec(jProgram, typeMapper, TypeOrder.FREQUENCY); Map<StandardSymbolData, JsName> symbolTable = new TreeMap<StandardSymbolData, JsName>(new SymbolData.ClassIdentComparator()); PermutationProperties props = new PermutationProperties(Arrays.asList( new BindingProperties(orderedProps, orderedPropValues, config) )); return GenerateJavaScriptAST.exec(logger, jProgram, jsProgram, compilerContext, typeMapper, symbolTable, props); } abstract protected void optimizeJava(); protected CompilerContext provideCompilerContext() { CompilerContext compilerContext = new CompilerContext.Builder().build(); compilerContext.getOptions().setSourceLevel(sourceLevel); return compilerContext; } public void setProperties(BindingProperty[] orderedProps, String[] orderedValues, ConfigurationProperty[] configurationProperties) { this.orderedProps = orderedProps; this.orderedPropValues = orderedValues; this.configurationProperties = configurationProperties; } }