/* * Copyright 2015 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; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.linker.ArtifactSet; import com.google.gwt.core.ext.linker.PrecompilationMetricsArtifact; import com.google.gwt.dev.cfg.BindingProperties; import com.google.gwt.dev.cfg.BindingProperty; import com.google.gwt.dev.cfg.ConfigurationProperties; import com.google.gwt.dev.cfg.ModuleDef; import com.google.gwt.dev.cfg.PropertyCombinations; import com.google.gwt.dev.cfg.Rule; import com.google.gwt.dev.javac.CompilationState; import com.google.gwt.dev.javac.StandardGeneratorContext; import com.google.gwt.dev.jdt.RebindOracle; import com.google.gwt.dev.jdt.RebindPermutationOracle; import com.google.gwt.dev.jjs.PrecompilationContext; import com.google.gwt.dev.shell.StandardRebindOracle; import com.google.gwt.dev.util.Util; import com.google.gwt.dev.util.log.speedtracer.CompilerEventType; import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger; import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event; import com.google.gwt.thirdparty.guava.common.collect.Sets; import java.util.Deque; import java.util.Set; /** * Creates the context encapsulating necessary data for precompile. */ class PrecompilationContextCreator { static PrecompilationContext create(CompilerContext compilerContext, final CompilationState compilationState, PropertyCombinations propertyCombinations, String[] entryPoints, String[] additionalRootTypes, PrecompilationMetricsArtifact precompilationMetricsArtifact) { ModuleDef module = compilerContext.getModule(); final ArtifactSet generatorArtifacts = new ArtifactSet(); final Permutation[] permutations = new Permutation[propertyCombinations.size()]; final RebindOracle[] rebindOracles = new RebindOracle[propertyCombinations.size()]; final StandardGeneratorContext generatorContext = new StandardGeneratorContext(compilerContext, compilationState, generatorArtifacts, true); BindingProperty[] orderedProperties = propertyCombinations.getOrderedProperties(); ConfigurationProperties configurationProperties = new ConfigurationProperties(module); Deque<Rule> rules = module.getRules(); for (int i = 0; i < propertyCombinations.size(); ++i) { BindingProperties bindingProperties = new BindingProperties(orderedProperties, propertyCombinations.getOrderedPropertyValues(i), configurationProperties); rebindOracles[i] = new StandardRebindOracle(bindingProperties.toPropertyOracle(), rules, generatorContext); permutations[i] = new Permutation(i, bindingProperties); } RebindPermutationOracle rebindPermutationOracle = new RebindPermutationOracle() { @Override public void clear() { generatorContext.clear(); } @Override public String[] getAllPossibleRebindAnswers(TreeLogger logger, String requestTypeName) throws UnableToCompleteException { String msg = "Computing all possible rebind results for '" + requestTypeName + "'"; logger = logger.branch(TreeLogger.DEBUG, msg, null); Set<String> answers = Sets.newHashSet(); Event getAllRebindsEvent = SpeedTracerLogger.start(CompilerEventType.GET_ALL_REBINDS); for (int i = 0; i < permutations.length; ++i) { String resultTypeName = rebindOracles[i].rebind(logger, requestTypeName); answers.add(resultTypeName); // Record the correct answer into each permutation. permutations[i].putRebindAnswer(requestTypeName, resultTypeName); } String[] result = Util.toArray(String.class, answers); getAllRebindsEvent.end(); return result; } @Override public CompilationState getCompilationState() { return compilationState; } @Override public StandardGeneratorContext getGeneratorContext() { return generatorContext; } }; return new PrecompilationContext(rebindPermutationOracle, entryPoints, additionalRootTypes, permutations, generatorArtifacts, precompilationMetricsArtifact); } }