From cf82f894dee6930fd86727065ed68d08209ffbcc Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 9 Mar 2015 11:05:56 +0100 Subject: [PATCH] don't use joint groovy compilation when there are files excluded from stub generation in that module (IDEA-137381) --- .../jps/incremental/groovy/GreclipseBuilder.java | 3 ++- .../jps/incremental/groovy/GroovyBuilder.java | 12 +++++++----- .../jps/incremental/groovy/InProcessGroovyc.java | 7 +++++-- .../groovy/compiler/GroovyCompilerTest.groovy | 14 +++++++++++++- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java index 3f898a2b5eb5..28ea493f513f 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java @@ -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 toCompile = GroovyBuilder.collectChangedFiles(context, dirtyFilesHolder, false, true); + final List toCompile = GroovyBuilder.collectChangedFiles(context, dirtyFilesHolder, false, true, Ref.create(false)); if (toCompile.isEmpty()) { return ExitCode.NOTHING_DONE; } diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java index dbfa1b132fe2..810d79a529a5 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java @@ -94,7 +94,8 @@ public class GroovyBuilder extends ModuleLevelBuilder { try { JpsGroovySettings settings = JpsGroovySettings.getSettings(context.getProjectDescriptor().getProject()); - final List toCompile = collectChangedFiles(context, dirtyFilesHolder, myForStubs, false); + Ref hasStubExcludes = Ref.create(false); + final List 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 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> compiled = processCompiledFiles(context, chunk, generationOutputs, compilerOutput, parser.getSuccessfullyCompiled()); @@ -154,7 +155,7 @@ public class GroovyBuilder extends ModuleLevelBuilder { ModuleChunk chunk, JpsGroovySettings settings, Map finalOutputs, - String compilerOutput, List toCompile) throws Exception { + String compilerOutput, List 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 collectChangedFiles(CompileContext context, DirtyFilesHolder dirtyFilesHolder, - final boolean forStubs, final boolean forEclipse) + final boolean forStubs, final boolean forEclipse, final Ref 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; } diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java index 854d1826d74b..566ffcb39dd4 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java @@ -54,9 +54,11 @@ class InProcessGroovyc implements GroovycFlavor { private static SoftReference> ourParentLoaderCache; private static final UrlClassLoader.CachePool ourLoaderCachePool = UrlClassLoader.createCachePool(); private final Collection myOutputs; + private final boolean myHasStubExcludes; - InProcessGroovyc(Collection outputs) { + InProcessGroovyc(Collection 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 mailbox = forStubs && SystemProperties.getBooleanProperty("groovyc.joint.compilation", true) + boolean jointPossible = forStubs && !myHasStubExcludes; + final LinkedBlockingQueue mailbox = jointPossible && SystemProperties.getBooleanProperty("groovyc.joint.compilation", true) ? new LinkedBlockingQueue() : null; final JointCompilationClassLoader loader = createCompilationClassLoader(compilationClassPath); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy index 67a038d3c02b..4564d78c20c2 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy @@ -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)) }