IDEA-170487 Resource validation in groovy should stop processing dependent module if errors are found

plus cleanup
This commit is contained in:
peter
2017-04-06 16:30:26 +02:00
parent bd61b6bf7d
commit 69eea9214c
4 changed files with 29 additions and 11 deletions
@@ -117,7 +117,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder {
if (!useGreclipse(context)) return ModuleLevelBuilder.ExitCode.NOTHING_DONE;
try {
final List<File> toCompile = myHelper.collectChangedFiles(context, dirtyFilesHolder, false, true, Ref.create(false));
List<File> toCompile = myHelper.collectChangedFiles(context, dirtyFilesHolder, false, Ref.create(false));
if (toCompile.isEmpty()) {
return ExitCode.NOTHING_DONE;
}
@@ -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;
@@ -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<R extends BuildRootDescriptor, T extends
ModuleChunk chunk,
DirtyFilesHolder<R, T> dirtyFilesHolder,
Builder builder, GroovyOutputConsumer outputConsumer) throws ProjectBuildException {
List<CompilerMessage> messages;
long start = 0;
try {
JpsGroovySettings settings = JpsGroovySettings.getSettings(context.getProjectDescriptor().getProject());
Ref<Boolean> hasStubExcludes = Ref.create(false);
final List<File> toCompile = collectChangedFiles(context, dirtyFilesHolder, myForStubs, false, hasStubExcludes);
final List<File> toCompile = collectChangedFiles(context, dirtyFilesHolder, myForStubs, hasStubExcludes);
if (toCompile.isEmpty()) {
return ExitCode.NOTHING_DONE;
}
@@ -104,7 +103,8 @@ public abstract class JpsGroovycRunner<R extends BuildRootDescriptor, T extends
return ExitCode.CHUNK_REBUILD_REQUIRED;
}
for (CompilerMessage message : parser.getCompilerMessages()) {
messages = parser.getCompilerMessages();
for (CompilerMessage message : messages) {
context.processMessage(message);
}
@@ -114,7 +114,6 @@ public abstract class JpsGroovycRunner<R extends BuildRootDescriptor, T extends
else {
updateDependencies(context, toCompile, compiled, outputConsumer, builder);
}
return ExitCode.OK;
}
catch (Exception e) {
throw new ProjectBuildException(e);
@@ -124,6 +123,12 @@ public abstract class JpsGroovycRunner<R extends BuildRootDescriptor, T extends
LOG.debug(builder.getPresentableName() + " took " + (System.currentTimeMillis() - start) + " on " + chunk.getName());
}
}
if (ContainerUtil.exists(messages, message -> message.getKind() == BuildMessage.Kind.ERROR)) {
throw new StopBuildException();
}
return ExitCode.OK;
}
protected void stubsGenerated(CompileContext context, Map<T, String> generationOutputs, MultiMap<T, GroovycOutputParser.OutputItem> compiled) {
@@ -294,7 +299,7 @@ public abstract class JpsGroovycRunner<R extends BuildRootDescriptor, T extends
//todo honor package prefixes
File correctRoot = new File(srcTargetOutput);
File correctOutput = new File(correctRoot, FileUtil.getRelativePath(new File(compilerOutput), output));
File correctOutput = new File(correctRoot, ObjectUtils.assertNotNull(FileUtil.getRelativePath(new File(compilerOutput), output)));
FileUtil.rename(output, correctOutput);
return correctOutput.getPath();
@@ -308,7 +313,7 @@ public abstract class JpsGroovycRunner<R extends BuildRootDescriptor, T extends
List<File> collectChangedFiles(CompileContext context,
DirtyFilesHolder<R, T> dirtyFilesHolder,
final boolean forStubs, final boolean forEclipse, final Ref<Boolean> hasExcludes)
boolean forStubs, Ref<Boolean> hasExcludes)
throws IOException {
final JpsJavaCompilerConfiguration configuration =
@@ -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') }
}
}