include exported dependencies in build target configuration fingerprint => recompile build target on indirect dependency change (IDEA-188330)

This commit is contained in:
Eugene Zhuravlev
2018-03-16 14:23:23 +01:00
parent 82a1645ca2
commit de54d378ab
9 changed files with 92 additions and 42 deletions
@@ -0,0 +1,6 @@
Compiling files:
moduleA/src/qqq/MainA.java
End of files
Compiling files:
moduleB/src/ppp/MainB.java
End of files
@@ -0,0 +1,7 @@
package ppp;
public class MainB {
public static void main(String[] args) {
ppp.Util.perform(10);
}
}
@@ -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<JavaSourceRoot
}
final JpsModule module = getModule();
JpsJavaDependenciesEnumerator enumerator = JpsJavaExtensionService.dependencies(module).compileOnly();
JpsJavaDependenciesEnumerator enumerator = JpsJavaExtensionService.dependencies(module).compileOnly().recursively().exportedOnly();
if (!isTests()) {
enumerator = enumerator.productionOnly();
}
@@ -26,6 +26,7 @@ import org.jetbrains.jps.builders.impl.logging.ProjectBuilderLoggerBase;
import org.jetbrains.jps.builders.logging.BuildLoggingManager;
import org.jetbrains.jps.cmdline.ProjectDescriptor;
import org.jetbrains.jps.model.JpsDummyElement;
import org.jetbrains.jps.model.JpsModuleRootModificationUtil;
import org.jetbrains.jps.model.java.JavaSourceRootType;
import org.jetbrains.jps.model.java.JpsJavaExtensionService;
import org.jetbrains.jps.model.java.JpsJavaLibraryType;
@@ -38,12 +39,15 @@ import org.jetbrains.jps.util.JpsPathUtil;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
* @author db
* @since 26.07.11
*/
public abstract class IncrementalTestCase extends JpsBuildTestCase {
private static final String MODULE_DIR_PREFIX = "module";
private final String groupName;
private File baseDir;
private File workDir;
@@ -221,6 +225,34 @@ public abstract class IncrementalTestCase extends JpsBuildTestCase {
module.addSourceRoot(getUrl(testRootRelativePath), JavaSourceRootType.TEST_SOURCE);
}
protected Map<String, JpsModule> 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<String, JpsModule> modules = new HashMap<>();
final List<String> 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;
@@ -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<String, JpsModule> modules = new HashMap<>();
final List<String> 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;
}
}
}
}
@@ -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<JpsDummyElement> 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<String, JpsModule> 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");