From bdb47353499fe86e230294543609f2c4ba815b45 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 5 Dec 2014 13:20:44 +0100 Subject: [PATCH] if compiled class is associated with multiple sources, correctly update class data for not compiled associated sources --- .../java/dependencyView/Mappings.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) 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 be43de8349fb..9e0f18d2d9e7 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 @@ -2272,6 +2272,45 @@ public class Mappings { return true; } }); + + // some classes may be associated with multiple sources. + // In case some of these sources was not compiled, but the class was changed, we need to update + // sourceToClasses mapping for such sources to include the updated ClassRepr version of the changed class + final THashSet unchangedSources = new THashSet(FileUtil.FILE_HASHING_STRATEGY); + delta.mySourceFileToClasses.forEachEntry(new TObjectObjectProcedure>() { + @Override + public boolean execute(File source, Collection b) { + unchangedSources.add(source); + return true; + } + }); + unchangedSources.removeAll(delta.getChangedFiles()); + if (!unchangedSources.isEmpty()) { + unchangedSources.forEach(new TObjectProcedure() { + @Override + public boolean execute(File file) { + final Collection updatedClasses = delta.mySourceFileToClasses.get(file); + if (updatedClasses != null && !updatedClasses.isEmpty()) { + final List classesToAdd = new ArrayList(); + classesToAdd.addAll(updatedClasses); + Collection currentClasses = mySourceFileToClasses.get(file); + if (currentClasses != null) { + final TIntHashSet updatedClassNames = new TIntHashSet(); + for (ClassRepr aClass : updatedClasses) { + updatedClassNames.add(aClass.name); + } + for (ClassRepr aClass : currentClasses) { + if (!updatedClassNames.contains(aClass.name)) { + classesToAdd.add(aClass); + } + } + } + mySourceFileToClasses.replace(file, classesToAdd); + } + return true; + } + }); + } } else { myClassToSubclasses.putAll(delta.myClassToSubclasses);