diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange.log b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange.log new file mode 100644 index 000000000000..ec084368e36d --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange.log @@ -0,0 +1,6 @@ +Compiling files: +moduleA/src/qqq/MainA.java +End of files +Compiling files: +moduleB/src/ppp/MainB.java +End of files \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util.jar b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util.jar new file mode 100644 index 000000000000..daa8bf7739e9 Binary files /dev/null and b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util.jar differ diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util_new.jar b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util_new.jar new file mode 100644 index 000000000000..5424aaa03f91 Binary files /dev/null and b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util_new.jar differ diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/src/qqq/MainA.java b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/src/qqq/MainA.java new file mode 100644 index 000000000000..e1c4f64c5cfe --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/src/qqq/MainA.java @@ -0,0 +1,4 @@ +package qqq; + +public class MainA { +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleB/src/ppp/MainB.java b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleB/src/ppp/MainB.java new file mode 100644 index 000000000000..21477d71ff68 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleB/src/ppp/MainB.java @@ -0,0 +1,7 @@ +package ppp; + +public class MainB { + public static void main(String[] args) { + ppp.Util.perform(10); + } +} \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java index bebbc5ecae2d..5e0fe4da40fa 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java @@ -16,10 +16,8 @@ package org.jetbrains.jps.incremental; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.Consumer; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; -import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.ProjectPaths; @@ -42,7 +40,6 @@ import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsTypedModuleSourceRoot; import org.jetbrains.jps.service.JpsServiceManager; -import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; import java.io.PrintWriter; @@ -206,7 +203,7 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget setupModules() { + final File projectDir = getOrCreateProjectDir(); + final File[] moduleDirs = projectDir.listFiles((dir, name) -> name.startsWith(MODULE_DIR_PREFIX)); + + if (moduleDirs != null && moduleDirs.length > 0) { + final Map modules = new HashMap<>(); + final List moduleNames = new ArrayList<>(); + for (File moduleDir : moduleDirs) { + final String name = moduleDir.getName().substring(MODULE_DIR_PREFIX.length()); + final JpsModule m = addModule(name, moduleDir.getName() + "/src"); + modules.put(name, m); + moduleNames.add(name); + } + Collections.sort(moduleNames, Collections.reverseOrder()); + // set dependencies in alphabet reverse order + JpsModule from = null; + for (String name : moduleNames) { + final JpsModule mod = modules.get(name); + if (from != null) { + JpsModuleRootModificationUtil.addDependency(from, mod); + } + from = mod; + } + return modules; + } + return Collections.emptyMap(); + } + private static class StringProjectBuilderLogger extends ProjectBuilderLoggerBase { private final String myRoot; private final StringBuilder myLog; diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java b/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java index 5751ba912567..773904df79cb 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java @@ -4,19 +4,12 @@ package org.jetbrains.ether; import com.intellij.openapi.util.SystemInfo; import org.jetbrains.jps.builders.BuildResult; import org.jetbrains.jps.builders.CompileScopeTestBuilder; -import org.jetbrains.jps.model.JpsModuleRootModificationUtil; -import org.jetbrains.jps.model.module.JpsModule; - -import java.io.File; -import java.util.*; /** * @author Eugene Zhuravlev */ public class Java9Test extends IncrementalTestCase { - private static final String MODULE_DIR_PREFIX = "module"; - public Java9Test() { super("java9-features"); } @@ -29,6 +22,11 @@ public class Java9Test extends IncrementalTestCase { return super.shouldRunTest(); } + protected BuildResult doTestBuild(int makesCount) { + setupModules(); + return super.doTestBuild(makesCount); + } + public void testModuleInfoAdded() { // expected result: the whole target is recompiled after the module-info.java file was newly added // because necessary 'require' directives may be missing from the newly added module-info file @@ -101,35 +99,4 @@ public class Java9Test extends IncrementalTestCase { modify(1); doBuild(CompileScopeTestBuilder.make().allModules()).assertFailed(); } - - protected BuildResult doTestBuild(int makesCount) { - setupModules(); - return super.doTestBuild(makesCount); - } - - private void setupModules() { - final File projectDir = getOrCreateProjectDir(); - final File[] moduleDirs = projectDir.listFiles((dir, name) -> name.startsWith(MODULE_DIR_PREFIX)); - - if (moduleDirs != null && moduleDirs.length > 0) { - final Map modules = new HashMap<>(); - final List moduleNames = new ArrayList<>(); - for (File moduleDir : moduleDirs) { - final String name = moduleDir.getName().substring(MODULE_DIR_PREFIX.length()); - final JpsModule m = addModule(name, moduleDir.getName() + "/src"); - modules.put(name, m); - moduleNames.add(name); - } - Collections.sort(moduleNames, Collections.reverseOrder()); - // set dependencies in alphabet reverse order - JpsModule from = null; - for (String name : moduleNames) { - final JpsModule mod = modules.get(name); - if (from != null) { - JpsModuleRootModificationUtil.addDependency(from, mod); - } - from = mod; - } - } - } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java index 327f68b33a30..67f9319f9497 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java @@ -15,11 +15,18 @@ */ package org.jetbrains.ether; +import org.jetbrains.jps.model.JpsDummyElement; import org.jetbrains.jps.model.JpsModuleRootModificationUtil; import org.jetbrains.jps.model.java.JpsJavaDependencyScope; +import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsOrderRootType; +import org.jetbrains.jps.model.library.JpsTypedLibrary; import org.jetbrains.jps.model.module.JpsModule; +import java.io.File; +import java.util.Map; + /** * @author: db */ @@ -40,6 +47,36 @@ public class MarkDirtyTest extends IncrementalTestCase { doTestBuild(1).assertSuccessful(); } + protected boolean useCachedProjectDescriptorOnEachMake() { + return !"recompileTargetOnExportedLibraryChange".equals(getTestName(true)); + } + + protected void modify(int stage) { + if (stage == 0 && "recompileTargetOnExportedLibraryChange".equals(getTestName(true))) { + final JpsTypedLibrary library = myProject.getLibraryCollection().findLibrary("l", JpsJavaLibraryType.INSTANCE); + assertNotNull(library); + for (String url : library.getRootUrls(JpsOrderRootType.COMPILED)) { + library.removeUrl(url, JpsOrderRootType.COMPILED); + } + library.addRoot(new File(getAbsolutePath("moduleA/lib/util_new.jar")), JpsOrderRootType.COMPILED); + } + else { + super.modify(stage); + } + } + + public void testRecompileTargetOnExportedLibraryChange() { + setupInitialProject(); + final Map modules = setupModules(); + final JpsModule moduleA = modules.get("A"); + assertNotNull(moduleA); + + JpsLibrary library = addLibrary("moduleA/lib/util.jar"); + JpsModuleRootModificationUtil.addDependency(moduleA, library, JpsJavaDependencyScope.COMPILE, true); + + doTestBuild(1).assertSuccessful(); + } + public void testTransitiveRecompile() { JpsModule module = addModule(); addTestRoot(module, "testSrc");