blob: 96e973386b7a18c986f1cdb3efcc7d4f2f0d72cf [file] [log] [blame]
/*
* Copyright 2013 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.dev.cfg.CombinedResourceOracle;
import com.google.gwt.dev.cfg.ImmutableLibraryGroup;
import com.google.gwt.dev.cfg.LibraryGroup;
import com.google.gwt.dev.cfg.LibraryGroupBuildResourceOracle;
import com.google.gwt.dev.cfg.LibraryGroupPublicResourceOracle;
import com.google.gwt.dev.cfg.LibraryWriter;
import com.google.gwt.dev.cfg.ModuleDef;
import com.google.gwt.dev.cfg.NullLibraryWriter;
import com.google.gwt.dev.javac.CombinedCompilationErrorsIndex;
import com.google.gwt.dev.javac.CompilationErrorsIndex;
import com.google.gwt.dev.javac.CompilationErrorsIndexImpl;
import com.google.gwt.dev.javac.MemoryUnitCache;
import com.google.gwt.dev.javac.UnitCache;
import com.google.gwt.dev.resource.ResourceOracle;
import com.google.gwt.dev.util.TinyCompileSummary;
import com.google.gwt.thirdparty.guava.common.collect.Sets;
import java.util.Set;
/**
* Contains most global read-only compiler state and makes it easily accessible to the far flung
* reaches of the compiler call graph without the constant accumulation of more and more function
* parameters.
*/
public class CompilerContext {
/**
* CompilerContext builder.
*/
public static class Builder {
private ResourceOracle buildResourceOracle;
private boolean compileMonolithic = true;
private MinimalRebuildCache minimalRebuildCache = new MinimalRebuildCache();
private CompilationErrorsIndex globalCompilationErrorsIndex;
private CompilationErrorsIndex libraryCompilationErrorsIndex;
private LibraryGroup libraryGroup = new ImmutableLibraryGroup();
private LibraryWriter libraryWriter = new NullLibraryWriter();
private CompilationErrorsIndex localCompilationErrorsIndex;
private ModuleDef module;
private PrecompileTaskOptions options = new PrecompileTaskOptionsImpl();
private ResourceOracle publicResourceOracle;
private ResourceOracle sourceResourceOracle;
private UnitCache unitCache = new MemoryUnitCache();
public CompilerContext build() {
initializeResourceOracles();
initializeCompilationErrorIndexes();
CompilerContext compilerContext = new CompilerContext();
compilerContext.buildResourceOracle = buildResourceOracle;
compilerContext.minimalRebuildCache = minimalRebuildCache;
compilerContext.libraryWriter = libraryWriter;
compilerContext.libraryGroup = libraryGroup;
compilerContext.module = module;
compilerContext.compileMonolithic = compileMonolithic;
compilerContext.options = options;
compilerContext.publicResourceOracle = publicResourceOracle;
compilerContext.sourceResourceOracle = sourceResourceOracle;
compilerContext.localCompilationErrorsIndex = localCompilationErrorsIndex;
compilerContext.globalCompilationErrorsIndex = globalCompilationErrorsIndex;
compilerContext.unitCache = unitCache;
return compilerContext;
}
/**
* Sets whether compilation should proceed monolithically or separately.
*/
public Builder compileMonolithic(boolean compileMonolithic) {
this.compileMonolithic = compileMonolithic;
return this;
}
/**
* Sets the libraryGroup and uses it to set resource oracles as well.
*/
public Builder libraryGroup(LibraryGroup libraryGroup) {
this.libraryGroup = libraryGroup;
return this;
}
public Builder libraryWriter(LibraryWriter libraryWriter) {
this.libraryWriter = libraryWriter;
return this;
}
/**
* Sets the module and uses it to set resource oracles as well.
*/
public Builder module(ModuleDef module) {
this.module = module;
return this;
}
public Builder options(PrecompileTaskOptions options) {
this.options = options;
return this;
}
public Builder minimalRebuildCache(MinimalRebuildCache minimalRebuildCache) {
assert minimalRebuildCache != null;
this.minimalRebuildCache = minimalRebuildCache;
return this;
}
public Builder unitCache(UnitCache unitCache) {
this.unitCache = unitCache;
return this;
}
private void initializeCompilationErrorIndexes() {
localCompilationErrorsIndex = new CompilationErrorsIndexImpl();
libraryCompilationErrorsIndex = libraryGroup != null
? libraryGroup.getCompilationErrorsIndex() : new CompilationErrorsIndexImpl();
globalCompilationErrorsIndex = new CombinedCompilationErrorsIndex(localCompilationErrorsIndex,
libraryCompilationErrorsIndex);
}
/**
* Initialize source, build, and public resource oracles using the most complete currently
* available combination of moduleDef and libraryGroup.<br />
*
* When executing as part of a monolithic compilation there will likely only be a moduleDef
* available. That will result in sourcing resource oracles only from it, which is what
* monolithic compilation expects.<br />
*
* When executing as part of a separate compilation there will likely be both a moduleDef and
* libraryGroup available. That will result in sourcing resource oracles from a mixed
* combination, which is what separate compilation expects.
*/
private void initializeResourceOracles() {
if (libraryGroup != null) {
if (module != null) {
sourceResourceOracle = module.getSourceResourceOracle();
buildResourceOracle = new CombinedResourceOracle(
module.getBuildResourceOracle(), new LibraryGroupBuildResourceOracle(libraryGroup));
publicResourceOracle = new CombinedResourceOracle(
module.getPublicResourceOracle(), new LibraryGroupPublicResourceOracle(libraryGroup));
} else {
sourceResourceOracle = null;
buildResourceOracle = new LibraryGroupBuildResourceOracle(libraryGroup);
publicResourceOracle = new LibraryGroupPublicResourceOracle(libraryGroup);
}
} else {
if (module != null) {
sourceResourceOracle = module.getSourceResourceOracle();
buildResourceOracle = module.getBuildResourceOracle();
publicResourceOracle = module.getPublicResourceOracle();
} else {
sourceResourceOracle = null;
buildResourceOracle = null;
publicResourceOracle = null;
}
}
}
}
private ResourceOracle buildResourceOracle;
/**
* Whether compilation should proceed monolithically or separately. It is an example of a
* configuration property that is not assignable by command line args. If more of these accumulate
* they should be grouped together instead of floating free here.
*/
private boolean compileMonolithic = true;
private MinimalRebuildCache minimalRebuildCache = new MinimalRebuildCache();
private LibraryGroup libraryGroup = new ImmutableLibraryGroup();
private LibraryWriter libraryWriter = new NullLibraryWriter();
private CompilationErrorsIndex localCompilationErrorsIndex = new CompilationErrorsIndexImpl();
private CompilationErrorsIndex globalCompilationErrorsIndex = new CombinedCompilationErrorsIndex(
localCompilationErrorsIndex, new CompilationErrorsIndexImpl());
private ModuleDef module;
// TODO(stalcup): split this into module parsing, precompilation, compilation, and linking option
// sets.
private PrecompileTaskOptions options = new PrecompileTaskOptionsImpl();
private ResourceOracle publicResourceOracle;
private ResourceOracle sourceResourceOracle;
private TinyCompileSummary tinyCompileSummary = new TinyCompileSummary();
private UnitCache unitCache = new MemoryUnitCache();
public ResourceOracle getBuildResourceOracle() {
return buildResourceOracle;
}
public MinimalRebuildCache getMinimalRebuildCache() {
return minimalRebuildCache;
}
/**
* Returns the immutable compilation errors index that provides a combined view of compilation
* errors for both the current compile as well as previously compiled libraries.
*/
public CompilationErrorsIndex getGlobalCompilationErrorsIndex() {
return globalCompilationErrorsIndex;
}
public LibraryGroup getLibraryGroup() {
return libraryGroup;
}
public LibraryWriter getLibraryWriter() {
return libraryWriter;
}
/**
* Returns the mutable index of compilation errors for the current compile.
*/
public CompilationErrorsIndex getLocalCompilationErrorsIndex() {
return localCompilationErrorsIndex;
}
public ModuleDef getModule() {
return module;
}
public PrecompileTaskOptions getOptions() {
return options;
}
/**
* Returns the set of source names of rebound types that have been processed by the given
* Generator.
*/
public Set<String> getProcessedReboundTypeSourceNames(String generatorName) {
Set<String> processedReboundTypeSourceNames = Sets.newHashSet();
processedReboundTypeSourceNames.addAll(
getLibraryWriter().getProcessedReboundTypeSourceNames(generatorName));
processedReboundTypeSourceNames.addAll(
getLibraryGroup().getProcessedReboundTypeSourceNames(generatorName));
return processedReboundTypeSourceNames;
}
public ResourceOracle getPublicResourceOracle() {
return publicResourceOracle;
}
/**
* Returns the set of source names of types for which GWT.create() rebind has been requested. The
* types may or may not yet have been processed by some Generators.
*/
public Set<String> getReboundTypeSourceNames() {
Set<String> reboundTypeSourceNames = Sets.newHashSet();
reboundTypeSourceNames.addAll(getLibraryWriter().getReboundTypeSourceNames());
reboundTypeSourceNames.addAll(getLibraryGroup().getReboundTypeSourceNames());
return reboundTypeSourceNames;
}
public ResourceOracle getSourceResourceOracle() {
return sourceResourceOracle;
}
public TinyCompileSummary getTinyCompileSummary() {
return tinyCompileSummary;
}
public UnitCache getUnitCache() {
return unitCache;
}
public boolean shouldCompileMonolithic() {
return compileMonolithic;
}
}