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 c17bba46eb92..0de487375e1d 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 @@ -101,7 +101,7 @@ public class Mappings { myLock = base.myLock; myIsDelta = true; myChangedClasses = new TIntHashSet(DEFAULT_SET_CAPACITY, DEFAULT_SET_LOAD_FACTOR); - myChangedFiles = new THashSet(FileUtil.FILE_HASHING_STRATEGY); + myChangedFiles = new THashSet(FileUtil.FILE_HASHING_STRATEGY); myDeletedClasses = new HashSet>(DEFAULT_SET_CAPACITY, DEFAULT_SET_LOAD_FACTOR); myAddedClasses = new HashSet(DEFAULT_SET_CAPACITY, DEFAULT_SET_LOAD_FACTOR); myDeltaIsTransient = base.myDeltaIsTransient; @@ -2003,51 +2003,60 @@ public class Mappings { debug("Begin of Differentiate:"); debug("Easy mode: ", myEasyMode); - processDisappearedClasses(); + try { + processDisappearedClasses(); - final List newClasses = new ArrayList(); - myDelta.mySourceFileToClasses.forEachEntry(new TObjectObjectProcedure>() { - @Override - public boolean execute(File fileName, Collection classes) { - newClasses.add(new FileClasses(fileName, classes)); - return true; - } - }); + final List newClasses = new ArrayList(); + myDelta.mySourceFileToClasses.forEachEntry(new TObjectObjectProcedure>() { + @Override + public boolean execute(File fileName, Collection classes) { + newClasses.add(new FileClasses(fileName, classes)); + return true; + } + }); - for (final FileClasses compiledFile : newClasses) { - final File fileName = compiledFile.myFileName; - final Set classes = compiledFile.myFileClasses; - final Set pastClasses = (Set)mySourceFileToClasses.get(fileName); - final DiffState state = new DiffState(Difference.make(pastClasses, classes)); - - if (!processChangedClasses(state)) { + for (final FileClasses compiledFile : newClasses) { + final File fileName = compiledFile.myFileName; + final Set classes = compiledFile.myFileClasses; + final Set pastClasses = (Set)mySourceFileToClasses.get(fileName); + final DiffState state = new DiffState(Difference.make(pastClasses, classes)); + + if (!processChangedClasses(state)) { + if (!myEasyMode) { + // turning non-incremental + return false; + } + } + + processRemovedClases(state, fileName); + processAddedClasses(state, fileName); + if (!myEasyMode) { - // turning non-incremental - return false; + calculateAffectedFiles(state); } } - processRemovedClases(state, fileName); - processAddedClasses(state, fileName); + debug("End of Differentiate."); - if (!myEasyMode) { - calculateAffectedFiles(state); + if (myEasyMode) { + return false; + } + + final Collection removed = myDelta.myRemovedFiles; + if (removed != null) { + for (final String r : removed) { + myAffectedFiles.remove(new File(r)); + } + } + return myDelayedWorks.doWork(myAffectedFiles); + } + finally { + if (myFilesToCompile != null) { + // if some class is associated with several sources, + // some of them may not have been compiled in this round, so such files should be considered unchanged + myDelta.myChangedFiles.retainAll(myFilesToCompile); } } - - debug("End of Differentiate."); - - if (myEasyMode) { - return false; - } - - final Collection removed = myDelta.myRemovedFiles; - if (removed != null) { - for (final String r : removed) { - myAffectedFiles.remove(new File(r)); - } - } - return myDelayedWorks.doWork(myAffectedFiles); } } }