From ecf47c4fb14104699ca6abe0a6aa364f0daa76fe Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 11 Apr 2017 17:21:39 +0200 Subject: [PATCH] [java] explicit module cycle compilation error (IDEA-168811) --- .../jps/incremental/java/JavaBuilder.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 39923a633995..93cc88482eb8 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -78,6 +78,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.Executor; import java.util.concurrent.Future; +import java.util.stream.Collectors; /** * @author Eugene Zhuravlev @@ -222,7 +223,8 @@ public class JavaBuilder extends ModuleLevelBuilder { return true; }); - boolean hasModules = false; + + int javaModulesCount = 0; if ((!filesToCompile.isEmpty() || dirtyFilesHolder.hasRemovedFiles()) && JpsJavaSdkType.parseVersion(getLanguageLevel(ContainerUtil.getFirstItem(chunk.getModules()))) >= 9) { // at the moment, there is no incremental compilation for module-info files, so they should be rebuilt on every change @@ -231,7 +233,7 @@ public class JavaBuilder extends ModuleLevelBuilder { File moduleInfoFile = index.getModuleInfoFile(target.getModule(), target.isTests()); if (moduleInfoFile != null) { filesToCompile.add(moduleInfoFile); - hasModules = true; + javaModulesCount++; } } } @@ -243,7 +245,14 @@ public class JavaBuilder extends ModuleLevelBuilder { } } - return compile(context, chunk, dirtyFilesHolder, filesToCompile, outputConsumer, compilingTool, hasModules); + if (javaModulesCount > 1) { + String prefix = "Cannot compile a module cycle with multiple module-info.java files: "; + String message = chunk.getModules().stream().map(JpsModule::getName).collect(Collectors.joining(", ", prefix, "")); + context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, message)); + return ExitCode.ABORT; + } + + return compile(context, chunk, dirtyFilesHolder, filesToCompile, outputConsumer, compilingTool, javaModulesCount > 0); } catch (BuildDataCorruptedException | PersistentEnumeratorBase.CorruptedException | ProjectBuildException e) { throw e;