From 7df61e39ce7e4412b8ab5948310550a1d712cd7a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 28 Nov 2014 19:02:56 +0300 Subject: [PATCH] Not marking whole target as dirty when it was already marked so. This should be cherry-picked into branch 139 as extra method variant --- .../constantChainMultiModule.log | 30 +++++++++++++++++++ .../moduleA/src/a/A.java | 5 ++++ .../moduleA/src/a/A.java.new | 5 ++++ .../moduleA/src/a/AA.java | 4 +++ .../moduleB/src/b/B.java | 5 ++++ .../moduleB/src/b/BB.java | 4 +++ .../moduleC/src/c/C.java | 5 ++++ .../moduleC/src/c/CC.java | 4 +++ .../jps/incremental/FSOperations.java | 28 +++++++++++++++++ .../jetbrains/ether/FieldPropertyTest.java | 12 ++++++++ 10 files changed, 102 insertions(+) create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule.log create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java.new create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/AA.java create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/B.java create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/BB.java create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/C.java create mode 100644 java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/CC.java diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule.log b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule.log new file mode 100644 index 000000000000..39556d871b98 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule.log @@ -0,0 +1,30 @@ +Cleaning output files: +out/production/moduleA/a/A.class +End of files +Compiling files: +moduleA/src/a/A.java +End of files +Cleaning output files: +out/production/moduleA/a/A.class +out/production/moduleA/a/AA.class +End of files +Compiling files: +moduleA/src/a/A.java +moduleA/src/a/AA.java +End of files +Cleaning output files: +out/production/moduleB/b/B.class +out/production/moduleB/b/BB.class +End of files +Compiling files: +moduleB/src/b/B.java +moduleB/src/b/BB.java +End of files +Cleaning output files: +out/production/moduleC/c/C.class +out/production/moduleC/c/CC.class +End of files +Compiling files: +moduleC/src/c/C.java +moduleC/src/c/CC.java +End of files diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java new file mode 100644 index 000000000000..1e8df0758ab9 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java @@ -0,0 +1,5 @@ +package a; + +public class A { + public static final int CONST = 100; +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java.new b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java.new new file mode 100644 index 000000000000..53ab9f0fb41e --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/A.java.new @@ -0,0 +1,5 @@ +package a; + +public class A { + public static final int CONST = 200; +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/AA.java b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/AA.java new file mode 100644 index 000000000000..2247fbc2e23e --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleA/src/a/AA.java @@ -0,0 +1,4 @@ +package a; + +public class AA { +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/B.java b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/B.java new file mode 100644 index 000000000000..1edd364b83fe --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/B.java @@ -0,0 +1,5 @@ +package b; + +public class B { + public static final int CONST = a.A.CONST * 2; +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/BB.java b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/BB.java new file mode 100644 index 000000000000..fcf7d334b15a --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleB/src/b/BB.java @@ -0,0 +1,4 @@ +package b; + +public class BB { +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/C.java b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/C.java new file mode 100644 index 000000000000..685533a9f299 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/C.java @@ -0,0 +1,5 @@ +package c; + +public class C { + public static final int CONST = b.B.CONST * 2; +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/CC.java b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/CC.java new file mode 100644 index 000000000000..bd19ffb37aee --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/fieldProperties/constantChainMultiModule/moduleC/src/c/CC.java @@ -0,0 +1,4 @@ +package c; + +public class CC { +} \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java index 5824d5b0a880..979ae3d68004 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java @@ -38,6 +38,7 @@ import org.jetbrains.jps.model.module.JpsModule; import java.io.File; import java.io.FileFilter; import java.io.IOException; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -47,6 +48,7 @@ import java.util.Set; */ public class FSOperations { public static final GlobalContextKey> ALL_OUTPUTS_KEY = GlobalContextKey.create("_all_project_output_dirs_"); + private static final GlobalContextKey>> TARGETS_COMPLETELY_MARKED_DIRTY = GlobalContextKey.create("_targets_completely_marked_dirty_"); /** * @param context @@ -162,6 +164,8 @@ public class FSOperations { } } + removeTargetsAlreadyMarkedDirty(context, dirtyTargets); + final Timestamps timestamps = context.getProjectDescriptor().timestamps.getStorage(); for (ModuleBuildTarget target : dirtyTargets) { markDirtyFiles(context, target, round, timestamps, true, null, filter); @@ -196,6 +200,10 @@ public class FSOperations { boolean forceMarkDirty, @Nullable THashSet currentFiles, @Nullable FileFilter filter) throws IOException { + if (filter == null && forceMarkDirty) { + addCompletelyMarkedDirtyTarget(context, target); + } + for (BuildRootDescriptor rd : context.getProjectDescriptor().getBuildRootIndex().getTargetRoots(target, context)) { if (!rd.getRootFile().exists() || //temp roots are managed by compilers themselves @@ -277,4 +285,24 @@ public class FSOperations { additionalDirs = null; } } + + private static void addCompletelyMarkedDirtyTarget(CompileContext context, BuildTarget target) { + synchronized (TARGETS_COMPLETELY_MARKED_DIRTY) { + Set> targetsCompletelyMarkedDirty = TARGETS_COMPLETELY_MARKED_DIRTY.get(context); + if (targetsCompletelyMarkedDirty == null) { + targetsCompletelyMarkedDirty = Collections.synchronizedSet(new HashSet>()); + TARGETS_COMPLETELY_MARKED_DIRTY.set(context, targetsCompletelyMarkedDirty); + } + targetsCompletelyMarkedDirty.add(target); + } + } + + private static void removeTargetsAlreadyMarkedDirty(CompileContext context, Set targetsSetToFilter) { + synchronized (TARGETS_COMPLETELY_MARKED_DIRTY) { + Set> targetsCompletelyMarkedDirty = TARGETS_COMPLETELY_MARKED_DIRTY.get(context); + if (targetsCompletelyMarkedDirty != null) { + targetsSetToFilter.removeAll(targetsCompletelyMarkedDirty); + } + } + } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java index eee819326541..1f8a4c38861a 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java @@ -15,6 +15,9 @@ */ package org.jetbrains.ether; +import org.jetbrains.jps.model.JpsModuleRootModificationUtil; +import org.jetbrains.jps.model.module.JpsModule; + /** * @author: db * Date: 23.09.11 @@ -36,6 +39,15 @@ public class FieldPropertyTest extends IncrementalTestCase { doTest(); } + public void testConstantChainMultiModule() throws Exception { + JpsModule moduleA = addModule("moduleA", "moduleA/src"); + JpsModule moduleB = addModule("moduleB", "moduleB/src"); + JpsModule moduleC = addModule("moduleC", "moduleC/src"); + JpsModuleRootModificationUtil.addDependency(moduleB, moduleA); + JpsModuleRootModificationUtil.addDependency(moduleC, moduleB); + doTestBuild(1).assertSuccessful(); + } + public void testConstantRemove() throws Exception { doTest(); }