From 8ffa909b2c28c445c2b4d6906659d4fa963745f2 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 21 Jan 2013 12:55:13 +0100 Subject: [PATCH] duplicate class checks --- .../incremental/common/addDuplicateClass.log | 10 +++++++ .../common/addDuplicateClass/.idea/misc.xml | 13 ++++++++++ .../addDuplicateClass/.idea/modules.xml | 9 +++++++ .../addDuplicateClass/addDuplicateClass.iml | 14 ++++++++++ .../addDuplicateClass/src/pkg/Client.java | 6 +++++ .../addDuplicateClass/src/pkg/Constants.java | 4 +++ .../src2/pkg/Constants.java.new | 3 +++ .../java/dependencyView/Mappings.java | 26 +++++++++++++++++-- .../jps/incremental/fs/FilesDelta.java | 3 ++- .../org/jetbrains/ether/CommonTest.java | 4 +++ 10 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/compileServer/incremental/common/addDuplicateClass.log create mode 100644 java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/misc.xml create mode 100644 java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/modules.xml create mode 100644 java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/addDuplicateClass.iml create mode 100644 java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Client.java create mode 100644 java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Constants.java create mode 100644 java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src2/pkg/Constants.java.new diff --git a/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass.log b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass.log new file mode 100644 index 000000000000..39635f36edb8 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass.log @@ -0,0 +1,10 @@ +Compiling files: +src2/pkg/Constants.java +End of files +Cleaning output files: +out/production/addDuplicateClass/pkg/Constants.class +End of files +Compiling files: +src/pkg/Constants.java +src2/pkg/Constants.java +End of files diff --git a/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/misc.xml b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/misc.xml new file mode 100644 index 000000000000..9a249d2930c5 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + http://www.w3.org/1999/xhtml + + + + + + diff --git a/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/modules.xml b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/modules.xml new file mode 100644 index 000000000000..6c4ca79986a8 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/addDuplicateClass.iml b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/addDuplicateClass.iml new file mode 100644 index 000000000000..119c6ef0a879 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/addDuplicateClass.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Client.java b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Client.java new file mode 100644 index 000000000000..8d9b52bd6ff2 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Client.java @@ -0,0 +1,6 @@ +package pkg; +public class Client { + public static void main(String[] args) { + System.out.println(Constants.NUMBER); + } +} diff --git a/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Constants.java b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Constants.java new file mode 100644 index 000000000000..edc79841dffe --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src/pkg/Constants.java @@ -0,0 +1,4 @@ +package pkg; +public class Constants { + public static final Integer NUMBER = new Integer(10); +} diff --git a/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src2/pkg/Constants.java.new b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src2/pkg/Constants.java.new new file mode 100644 index 000000000000..0f9f6ffd7960 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/common/addDuplicateClass/src2/pkg/Constants.java.new @@ -0,0 +1,3 @@ +package pkg; +public class Constants { +} 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 5c402023c165..062cf1c95c63 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 @@ -1761,13 +1761,35 @@ public class Mappings { debug("End of removed classes processing."); } - private void processAddedClasses(final DiffState state) { + private void processAddedClasses(final DiffState state, File srcFile) { final Collection addedClasses = state.myClassDiff.added(); if (addedClasses.isEmpty()) { return; } debug("Processing added classes:"); + + if (!myEasyMode) { + // checking if this newly added class duplicates already existing one + for (ClassRepr c : addedClasses) { + if (!c.isLocal() && !c.isAnonymous() && isEmpty(c.getOuterClassName())) { + final File currentlyMappedTo = myClassToSourceFile.get(c.name); + if (currentlyMappedTo != null && !FileUtil.filesEqual(currentlyMappedTo, srcFile) && currentlyMappedTo.exists()) { + if (myFilter == null || myFilter.accept(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()); + myAffectedFiles.add(currentlyMappedTo); + myAffectedFiles.add(srcFile); + myCompiledFiles.remove(srcFile); // this will force sending the file to compilation again + return; // do not process this file because it should not be integrated + } + } + break; + } + } + } + for (final ClassRepr c : addedClasses) { debug("Class name: ", c.name); myDelta.addChangedClass(c.name); @@ -1898,7 +1920,7 @@ public class Mappings { } processRemovedClases(state); - processAddedClasses(state); + processAddedClasses(state, fileName); if (!myEasyMode) { calculateAffectedFiles(state); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/FilesDelta.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/FilesDelta.java index 79c6ab127ea7..689db8ac814f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/FilesDelta.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/FilesDelta.java @@ -134,7 +134,8 @@ final class FilesDelta { isMarkedDeleted = !myDeletedPaths.isEmpty() && myDeletedPaths.contains(FileUtil.toCanonicalPath(file.getPath())); } if (!isMarkedDeleted) { - return _addToRecompiled(root, file); + _addToRecompiled(root, file); + return true; } return false; } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java index 29fed9c6bbed..26f93b216c54 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/CommonTest.java @@ -101,4 +101,8 @@ public class CommonTest extends IncrementalTestCase { public void testAddClass() throws Exception { doTest(); } + + public void testAddDuplicateClass() throws Exception { + doTest(); + } }