don't use joint groovy compilation when there are files excluded from stub generation in that module (IDEA-137381)

This commit is contained in:
peter
2015-03-09 11:08:25 +01:00
parent 7891d2d7a5
commit cf82f894de
4 changed files with 27 additions and 9 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.jps.incremental.groovy;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ArrayUtil;
@@ -109,7 +110,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder {
if (!useGreclipse(context)) return ModuleLevelBuilder.ExitCode.NOTHING_DONE;
try {
final List<File> toCompile = GroovyBuilder.collectChangedFiles(context, dirtyFilesHolder, false, true);
final List<File> toCompile = GroovyBuilder.collectChangedFiles(context, dirtyFilesHolder, false, true, Ref.create(false));
if (toCompile.isEmpty()) {
return ExitCode.NOTHING_DONE;
}
@@ -94,7 +94,8 @@ public class GroovyBuilder extends ModuleLevelBuilder {
try {
JpsGroovySettings settings = JpsGroovySettings.getSettings(context.getProjectDescriptor().getProject());
final List<File> toCompile = collectChangedFiles(context, dirtyFilesHolder, myForStubs, false);
Ref<Boolean> hasStubExcludes = Ref.create(false);
final List<File> toCompile = collectChangedFiles(context, dirtyFilesHolder, myForStubs, false, hasStubExcludes);
if (toCompile.isEmpty()) {
return hasFilesToCompileForNextRound(context) ? ExitCode.ADDITIONAL_PASS_REQUIRED : ExitCode.NOTHING_DONE;
}
@@ -112,7 +113,7 @@ public class GroovyBuilder extends ModuleLevelBuilder {
Map<ModuleBuildTarget, String> generationOutputs = myForStubs ? getStubGenerationOutputs(chunk, context) : finalOutputs;
String compilerOutput = generationOutputs.get(chunk.representativeTarget());
GroovycOutputParser parser = runGroovycOrContinuation(context, chunk, settings, finalOutputs, compilerOutput, toCompile);
GroovycOutputParser parser = runGroovycOrContinuation(context, chunk, settings, finalOutputs, compilerOutput, toCompile, hasStubExcludes.get());
Map<ModuleBuildTarget, Collection<GroovycOutputParser.OutputItem>>
compiled = processCompiledFiles(context, chunk, generationOutputs, compilerOutput, parser.getSuccessfullyCompiled());
@@ -154,7 +155,7 @@ public class GroovyBuilder extends ModuleLevelBuilder {
ModuleChunk chunk,
JpsGroovySettings settings,
Map<ModuleBuildTarget, String> finalOutputs,
String compilerOutput, List<File> toCompile) throws Exception {
String compilerOutput, List<File> toCompile, boolean hasStubExcludes) throws Exception {
GroovycContinuation continuation = takeContinuation(context, chunk);
if (continuation != null) {
if (Utils.IS_TEST_MODE || LOG.isDebugEnabled()) {
@@ -192,7 +193,7 @@ public class GroovyBuilder extends ModuleLevelBuilder {
optimizeClassLoading ? StringUtil.join(classpath, File.pathSeparator) : ""
);
GroovycFlavor groovyc =
inProcess ? new InProcessGroovyc(finalOutputs.values()) : new ForkedGroovyc(optimizeClassLoading, chunk);
inProcess ? new InProcessGroovyc(finalOutputs.values(), hasStubExcludes) : new ForkedGroovyc(optimizeClassLoading, chunk);
GroovycOutputParser parser = new GroovycOutputParser(chunk, context);
@@ -402,7 +403,7 @@ public class GroovyBuilder extends ModuleLevelBuilder {
static List<File> collectChangedFiles(CompileContext context,
DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder,
final boolean forStubs, final boolean forEclipse)
final boolean forStubs, final boolean forEclipse, final Ref<Boolean> hasExcludes)
throws IOException {
final JpsJavaCompilerConfiguration configuration =
@@ -419,6 +420,7 @@ public class GroovyBuilder extends ModuleLevelBuilder {
if ((isGroovyFile(path) || forEclipse && path.endsWith(".java")) &&
!configuration.isResourceFile(file, sourceRoot.root)) {
if (forStubs && settings.isExcludedFromStubGeneration(file)) {
hasExcludes.set(true);
return true;
}
@@ -54,9 +54,11 @@ class InProcessGroovyc implements GroovycFlavor {
private static SoftReference<Pair<String, ClassLoader>> ourParentLoaderCache;
private static final UrlClassLoader.CachePool ourLoaderCachePool = UrlClassLoader.createCachePool();
private final Collection<String> myOutputs;
private final boolean myHasStubExcludes;
InProcessGroovyc(Collection<String> outputs) {
InProcessGroovyc(Collection<String> outputs, boolean hasStubExcludes) {
myOutputs = outputs;
myHasStubExcludes = hasStubExcludes;
}
@Override
@@ -65,7 +67,8 @@ class InProcessGroovyc implements GroovycFlavor {
final JpsGroovySettings settings,
final File tempFile,
final GroovycOutputParser parser) throws Exception {
final LinkedBlockingQueue<String> mailbox = forStubs && SystemProperties.getBooleanProperty("groovyc.joint.compilation", true)
boolean jointPossible = forStubs && !myHasStubExcludes;
final LinkedBlockingQueue<String> mailbox = jointPossible && SystemProperties.getBooleanProperty("groovyc.joint.compilation", true)
? new LinkedBlockingQueue<String>() : null;
final JointCompilationClassLoader loader = createCompilationClassLoader(compilationClassPath);
@@ -693,8 +693,20 @@ public class Main {
shouldFail { rebuild() }
}
public void "test compile groovy excluded from stub generation"() {
def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo {}')
myFixture.addFileToProject 'Bar.groovy', 'class Bar extends Foo {}'
excludeFromCompilation(GroovyCompilerConfiguration.getInstance(project).excludeFromStubGeneration, foo)
assertEmpty make()
}
private void excludeFromCompilation(PsiFile foo) {
final ExcludesConfiguration configuration = CompilerConfiguration.getInstance(project).getExcludedEntriesConfiguration()
excludeFromCompilation(CompilerConfiguration.getInstance(project).getExcludedEntriesConfiguration(), foo)
}
private excludeFromCompilation(ExcludesConfiguration configuration, PsiFile foo) {
configuration.addExcludeEntryDescription(new ExcludeEntryDescription(foo.virtualFile, false, true, testRootDisposable))
}