From 69eea9214c170d22264b16de4c4df533add54ecf Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 6 Apr 2017 16:29:23 +0200 Subject: [PATCH] IDEA-170487 Resource validation in groovy should stop processing dependent module if errors are found plus cleanup --- .../incremental/groovy/GreclipseBuilder.java | 2 +- .../groovy/GroovycOutputParser.java | 1 - .../incremental/groovy/JpsGroovycRunner.java | 23 +++++++++++-------- .../compiler/GroovyResourceCheckerTest.groovy | 14 +++++++++++ 4 files changed, 29 insertions(+), 11 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 01a53ffdf0a6..8fd0a18f1a40 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 @@ -117,7 +117,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder { if (!useGreclipse(context)) return ModuleLevelBuilder.ExitCode.NOTHING_DONE; try { - final List toCompile = myHelper.collectChangedFiles(context, dirtyFilesHolder, false, true, Ref.create(false)); + List toCompile = myHelper.collectChangedFiles(context, dirtyFilesHolder, false, Ref.create(false)); if (toCompile.isEmpty()) { return ExitCode.NOTHING_DONE; } diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOutputParser.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOutputParser.java index 36bebb7eb622..4c10de3099e1 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOutputParser.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOutputParser.java @@ -21,7 +21,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java index 767528729bff..9e261cb37686 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/JpsGroovycRunner.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; @@ -36,11 +37,8 @@ import org.jetbrains.jps.builders.FileProcessor; import org.jetbrains.jps.builders.java.JavaBuilderUtil; import org.jetbrains.jps.builders.java.dependencyView.Callbacks; import org.jetbrains.jps.builders.storage.SourceToOutputMapping; -import org.jetbrains.jps.incremental.Builder; -import org.jetbrains.jps.incremental.CompileContext; +import org.jetbrains.jps.incremental.*; import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode; -import org.jetbrains.jps.incremental.ProjectBuildException; -import org.jetbrains.jps.incremental.Utils; import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.model.JpsDummyElement; @@ -72,12 +70,13 @@ public abstract class JpsGroovycRunner dirtyFilesHolder, Builder builder, GroovyOutputConsumer outputConsumer) throws ProjectBuildException { + List messages; long start = 0; try { JpsGroovySettings settings = JpsGroovySettings.getSettings(context.getProjectDescriptor().getProject()); Ref hasStubExcludes = Ref.create(false); - final List toCompile = collectChangedFiles(context, dirtyFilesHolder, myForStubs, false, hasStubExcludes); + final List toCompile = collectChangedFiles(context, dirtyFilesHolder, myForStubs, hasStubExcludes); if (toCompile.isEmpty()) { return ExitCode.NOTHING_DONE; } @@ -104,7 +103,8 @@ public abstract class JpsGroovycRunner message.getKind() == BuildMessage.Kind.ERROR)) { + throw new StopBuildException(); + } + + return ExitCode.OK; } protected void stubsGenerated(CompileContext context, Map generationOutputs, MultiMap compiled) { @@ -294,7 +299,7 @@ public abstract class JpsGroovycRunner collectChangedFiles(CompileContext context, DirtyFilesHolder dirtyFilesHolder, - final boolean forStubs, final boolean forEclipse, final Ref hasExcludes) + boolean forStubs, Ref hasExcludes) throws IOException { final JpsJavaCompilerConfiguration configuration = diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyResourceCheckerTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyResourceCheckerTest.groovy index f93bb6152008..649349f65b90 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyResourceCheckerTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyResourceCheckerTest.groovy @@ -77,4 +77,18 @@ class GroovyResourceCheckerTest extends GroovyCompilerTestCase { assertEmpty checkResources() } + void "test stop after errors in one module"() { + Module depModule = addModule("dependent", false) + ModuleRootModificationUtil.addDependency(depModule, myModule) + addGroovyLibrary(depModule) + PsiTestUtil.addSourceRoot(depModule, myFixture.tempDirFixture.findOrCreateDir('dependent/res'), JavaResourceRootType.RESOURCE) + + myFixture.addFileToProject('res/Util.groovy', '@groovy.transform.CompileStatic class C1 {{ println Xxx1.name }}') + myFixture.addFileToProject('dependent/res/Usage.groovy', '@groovy.transform.CompileStatic class C2 {{ println Xxx2.name }}') + + def messages = checkResources() + assert messages.find { it.message.contains('Xxx1') } + assert !messages.find { it.message.contains('Xxx2') } + } + }