From 4d13fc78262c364c9bde033e4fdc98899b61f3c4 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 25 Nov 2014 15:45:58 +0100 Subject: [PATCH] do not schedule unnecessary recompilation on duplicate-class check; fix data loss in classToSourceFile mapping after moving top-level class from one file to another file --- .../incremental/common/moveClassToAnotherRoot.log | 12 ++++++++++++ .../common/moveClassToAnotherRoot/.idea/misc.xml | 13 +++++++++++++ .../moveClassToAnotherRoot/.idea/modules.xml | 9 +++++++++ .../moveClassToAnotherRoot.iml | 14 ++++++++++++++ .../common/moveClassToAnotherRoot/src/pkg/A.java | 4 ++++ .../moveClassToAnotherRoot/src/pkg/A.java.remove | 0 .../moveClassToAnotherRoot/src/pkg/Client.java | 6 ++++++ .../moveClassToAnotherRoot/src2/pkg/A.java.new | 4 ++++ .../common/moveToplevelClassToAnotherFile.log | 9 +++++++++ .../moveToplevelClassToAnotherFile/src/pkg/A.java | 9 +++++++++ .../src/pkg/A.java.new | 5 +++++ .../moveToplevelClassToAnotherFile/src/pkg/B.java | 5 +++++ .../src/pkg/B.java.new | 9 +++++++++ .../jps/builders/java/dependencyView/Mappings.java | 11 +++++++++-- .../testSrc/org/jetbrains/ether/CommonTest.java | 8 ++++++++ 15 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot.log create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/misc.xml create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/modules.xml create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/moveClassToAnotherRoot.iml create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/A.java create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/A.java.remove create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/Client.java create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src2/pkg/A.java.new create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile.log create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java.new create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java create mode 100644 java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java.new diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot.log b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot.log new file mode 100644 index 000000000000..f16383a14224 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot.log @@ -0,0 +1,12 @@ +Cleaning output files: +out/production/moveClassToAnotherRoot/pkg/A.class +End of files +Compiling files: +src2/pkg/A.java +End of files +Cleaning output files: +out/production/moveClassToAnotherRoot/pkg/Client.class +End of files +Compiling files: +src/pkg/Client.java +End of files diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/misc.xml b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/misc.xml new file mode 100644 index 000000000000..9a249d2930c5 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + http://www.w3.org/1999/xhtml + + + + + + diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/modules.xml b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/modules.xml new file mode 100644 index 000000000000..867c25e6704a --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/moveClassToAnotherRoot.iml b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/moveClassToAnotherRoot.iml new file mode 100644 index 000000000000..119c6ef0a879 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/moveClassToAnotherRoot.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/A.java b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/A.java new file mode 100644 index 000000000000..23093a48b165 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/A.java @@ -0,0 +1,4 @@ +package pkg; +public class A { + public static void foo() {} +} diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/A.java.remove b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/A.java.remove new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/Client.java b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/Client.java new file mode 100644 index 000000000000..5147dd4705da --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src/pkg/Client.java @@ -0,0 +1,6 @@ +package pkg; +public class Client { + public static void main(String[] args) { + A.foo(); + } +} diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src2/pkg/A.java.new b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src2/pkg/A.java.new new file mode 100644 index 000000000000..23093a48b165 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToAnotherRoot/src2/pkg/A.java.new @@ -0,0 +1,4 @@ +package pkg; +public class A { + public static void foo() {} +} diff --git a/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile.log b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile.log new file mode 100644 index 000000000000..e799faeac6fa --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile.log @@ -0,0 +1,9 @@ +Cleaning output files: +out/production/MoveToplevelClassToAnotherFile/pkg/A.class +out/production/MoveToplevelClassToAnotherFile/pkg/B.class +out/production/MoveToplevelClassToAnotherFile/pkg/Local.class +End of files +Compiling files: +src/pkg/A.java +src/pkg/B.java +End of files diff --git a/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java new file mode 100644 index 000000000000..8e27924d3577 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java @@ -0,0 +1,9 @@ +package pkg; + +public class A { + +} + +class Local { + +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java.new b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java.new new file mode 100644 index 000000000000..da82dd784a15 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/A.java.new @@ -0,0 +1,5 @@ +package pkg; + +public class A { + +} diff --git a/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java new file mode 100644 index 000000000000..654872faff47 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java @@ -0,0 +1,5 @@ +package pkg; + +public class B { + +} diff --git a/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java.new b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java.new new file mode 100644 index 000000000000..ce93a37ef7c1 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/moveToplevelClassToAnotherFile/src/pkg/B.java.new @@ -0,0 +1,9 @@ +package pkg; + +public class B { + +} + +class Local { + +} \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java index c47c4c9e6ec4..c17bba46eb92 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java @@ -237,8 +237,15 @@ public class Mappings { private void runPostPasses() { final Set> deleted = myDeletedClasses; if (deleted != null) { + final TIntHashSet added = new TIntHashSet(); + for (ClassRepr aClass : myAddedClasses) { + added.add(aClass.name); + } for (Pair pair : deleted) { - myChangedClasses.remove(pair.first.name); + final int deletedClassName = pair.first.name; + if (!added.contains(deletedClassName)) { + myChangedClasses.remove(deletedClassName); + } } } for (Runnable pass = myPostPasses.poll(); pass != null; pass = myPostPasses.poll()) { @@ -1864,7 +1871,7 @@ public class Mappings { final Collection currentSources = myClassToSourceFile.get(c.name); final File currentlyMappedTo = currentSources != null && currentSources.size() == 1? currentSources.iterator().next() : null; // only check, if exactly one file is mapped - if (currentlyMappedTo != null && !FileUtil.filesEqual(currentlyMappedTo, srcFile) && currentlyMappedTo.exists() && myFilter.belongsToCurrentTargetChunk(currentlyMappedTo)) { + if (currentlyMappedTo != null && !myCompiledFiles.contains(currentlyMappedTo) && !FileUtil.filesEqual(currentlyMappedTo, srcFile) && currentlyMappedTo.exists() && myFilter.belongsToCurrentTargetChunk(currentlyMappedTo)) { // Same classes from different source files. // Schedule for recompilation both to make possible 'duplicate sources' error evident debug("Scheduling for recompilation duplicated sources: ", currentlyMappedTo.getPath() + "; " + srcFile.getPath()); diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java index 5373924c84b3..12b04ead7257 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java @@ -150,4 +150,12 @@ public class CommonTest extends IncrementalTestCase { doTestBuild(1).assertSuccessful(); } + public void testMoveToplevelClassToAnotherFile() throws Exception { + doTest(); + } + + public void testMoveClassToAnotherRoot() throws Exception { + doTest(); + } + }