diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 985ad7d5bf86..427496953f08 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -43,8 +43,17 @@ public class Mappings { private final TIntHashSet myChangedClasses; private final TIntHashSet myChangedFiles; + private final TIntHashSet myDeletedClasses; private final Object myLock; + private void addDeletedClass (final int it) { + assert (myDeletedClasses != null); + + myDeletedClasses.add(it); + + addChangedClass(it); + } + private void addChangedClass(final int it) { assert (myChangedClasses != null && myChangedFiles != null); myChangedClasses.add(it); @@ -58,6 +67,10 @@ public class Mappings { myIsDifferentiated = true; } + private TIntHashSet getDeletedClasses() { + return myDeletedClasses; + } + private TIntHashSet getChangedClasses() { return myChangedClasses; } @@ -129,6 +142,7 @@ public class Mappings { myPostPasses = new LinkedList(); myChangedClasses = new TIntHashSet(DEFAULT_SET_CAPACITY, DEFAULT_SET_LOAD_FACTOR); myChangedFiles = new TIntHashSet(DEFAULT_SET_CAPACITY, DEFAULT_SET_LOAD_FACTOR); + myDeletedClasses = new TIntHashSet(DEFAULT_SET_CAPACITY, DEFAULT_SET_LOAD_FACTOR); myDeltaIsTransient = base.myDeltaIsTransient; myRootDir = new File(FileUtil.toSystemIndependentName(base.myRootDir.getAbsolutePath()) + File.separatorChar + "delta"); myContext = base.myContext; @@ -144,6 +158,7 @@ public class Mappings { myPostPasses = new LinkedList(); myChangedClasses = null; myChangedFiles = null; + myDeletedClasses = null; myDeltaIsTransient = transientDelta; myRootDir = rootDir; createImplementation(); @@ -918,7 +933,7 @@ public class Mappings { } }); - for (FileClasses compiledFile : newClasses) { + for (final FileClasses compiledFile : newClasses) { final int fileName = compiledFile.fileName; final Set classes = compiledFile.fileClasses; final Set pastClasses = (Set)mySourceFileToClasses.get(fileName); @@ -931,7 +946,7 @@ public class Mappings { final Difference.Specifier classDiff = Difference.make(pastClasses, classes); debug("Processing changed classes:"); - for (Pair changed : classDiff.changed()) { + for (final Pair changed : classDiff.changed()) { final ClassRepr it = changed.first; final ClassRepr.Diff diff = (ClassRepr.Diff)changed.second; @@ -1024,7 +1039,7 @@ public class Mappings { .createAnnotationUsage(myContext, TypeRepr.createClassType(myContext, it.name), null, removedtargets)); } - for (MethodRepr m : diff.methods().added()) { + for (final MethodRepr m : diff.methods().added()) { if (!m.hasValue()) { debug("Added method with no default value: ", m.name); debug("Adding class usage to affected usages"); @@ -1079,7 +1094,7 @@ public class Mappings { final Collection lessSpecific = it.findMethods(u.lessSpecific(m)); - for (MethodRepr mm : lessSpecific) { + for (final MethodRepr mm : lessSpecific) { if (!mm.equals(m)) { debug("Found less specific method, affecting method usages"); u.affectMethodUsages(mm, propagated, mm.createUsage(myContext, it.name), affectedUsages, dependants); @@ -1087,7 +1102,7 @@ public class Mappings { } debug("Processing affected by specificity methods"); - for (Pair p : affectedMethods) { + for (final Pair p : affectedMethods) { final MethodRepr mm = p.first; final ClassRepr cc = p.second; @@ -1183,7 +1198,7 @@ public class Mappings { boolean clear = true; loop: - for (Pair overriden : overridenMethods) { + for (final Pair overriden : overridenMethods) { final MethodRepr mm = overriden.first; if (mm == myMockMethod || !mm.type.equals(m.type) || !empty(mm.signature) || !empty(m.signature)) { @@ -1219,7 +1234,7 @@ public class Mappings { boolean allAbstract = true; boolean visited = false; - for (Pair pp : overridenInS) { + for (final Pair pp : overridenInS) { final ClassRepr cc = pp.second; if (cc == myMockClass) { @@ -1259,7 +1274,7 @@ public class Mappings { debug("End of removed methods processing"); debug("Processing changed methods:"); - for (Pair mr : diff.methods().changed()) { + for (final Pair mr : diff.methods().changed()) { final MethodRepr m = mr.first; final MethodRepr.Diff d = (MethodRepr.Diff)mr.second; final boolean throwsChanged = (d.exceptions().added().size() > 0) || (d.exceptions().changed().size() > 0); @@ -1286,7 +1301,7 @@ public class Mappings { debug("Method became package-local, affecting method usages outside the package"); u.affectMethodUsages(m, propagated, m.createUsage(myContext, it.name), usages, dependants); - for (UsageRepr.Usage usage : usages) { + for (final UsageRepr.Usage usage : usages) { usageConstraints.put(usage, u.new InheritanceConstraint(it.name)); } @@ -1333,7 +1348,7 @@ public class Mappings { affectedUsages.addAll(usages); } - for (UsageRepr.Usage usage : usages) { + for (final UsageRepr.Usage usage : usages) { usageConstraints.put(usage, u.new InheritanceConstraint(it.name)); } } @@ -1396,7 +1411,7 @@ public class Mappings { final Collection> overridden = u.findOverridenFields(f, it); - for (Pair p : overridden) { + for (final Pair p : overridden) { final FieldRepr ff = p.first; final ClassRepr cc = p.second; @@ -1429,7 +1444,7 @@ public class Mappings { u.new NegationConstraint(u.new PackageConstraint(cc.getPackageName()))); } - for (UsageRepr.Usage usage : localUsages) { + for (final UsageRepr.Usage usage : localUsages) { usageConstraints.put(usage, constaint); } } @@ -1441,7 +1456,7 @@ public class Mappings { debug("End of added fields processing"); debug("Processing removed fields:"); - for (FieldRepr f : diff.fields().removed()) { + for (final FieldRepr f : diff.fields().removed()) { debug("Field: ", f.name); if ((f.access & Opcodes.ACC_PRIVATE) == 0 && (f.access & mask) == mask && f.hasValue()) { @@ -1458,7 +1473,7 @@ public class Mappings { debug("End of removed fields processing"); debug("Processing changed fields:"); - for (Pair f : diff.fields().changed()) { + for (final Pair f : diff.fields().changed()) { final Difference d = f.second; final FieldRepr field = f.first; @@ -1507,7 +1522,7 @@ public class Mappings { affectedUsages.addAll(usages); } - for (UsageRepr.Usage usage : usages) { + for (final UsageRepr.Usage usage : usages) { if ((d.addedModifiers() & Opcodes.ACC_PROTECTED) > 0) { usageConstraints.put(usage, u.new InheritanceConstraint(it.name)); } @@ -1525,8 +1540,8 @@ public class Mappings { debug("End of changed classes processing"); debug("Processing removed classes:"); - for (ClassRepr c : classDiff.removed()) { - delta.addChangedClass(c.name); + for (final ClassRepr c : classDiff.removed()) { + delta.addDeletedClass(c.name); self.appendDependents(c, dependants); debug("Adding usages of class ", c.name); affectedUsages.add(c.createUsage()); @@ -1534,7 +1549,7 @@ public class Mappings { debug("End of removed classes processing."); debug("Processing added classes:"); - for (ClassRepr c : classDiff.added()) { + for (final ClassRepr c : classDiff.added()) { delta.addChangedClass(c.name); final TIntHashSet depClasses = myClassToClassDependency.get(c.name); @@ -1573,7 +1588,7 @@ public class Mappings { filewise: - for (int depFile : dependentFiles.toArray()) { // todo: avoid toArray()? + for (final int depFile : dependentFiles.toArray()) { // todo: avoid toArray()? final File theFile = new File(myContext.getValue(depFile)); if (affectedFiles.contains(theFile) || compiledFiles.contains(theFile)) { @@ -1583,7 +1598,7 @@ public class Mappings { debug("Dependent file: ", depFile); final Collection depClusters = mySourceFileToUsages.get(depFile); if (depClusters != null) { - for (UsageRepr.Cluster depCluster : depClusters) { + for (final UsageRepr.Cluster depCluster : depClusters) { final Set depUsages = depCluster.getUsages(); if (depUsages == null) { continue; @@ -1603,7 +1618,7 @@ public class Mappings { } else { final TIntHashSet residenceClasses = depCluster.getResidence(usage); - for (int residentName : residenceClasses.toArray()) { + for (final int residentName : residenceClasses.toArray()) { if (constraint.checkResidence(residentName)) { debug("Added file with satisfied constraint"); affectedFiles.add(theFile); @@ -1617,8 +1632,8 @@ public class Mappings { if (annotationQuery.size() > 0) { final Collection annotationUsages = mySourceFileToAnnotationUsages.get(depFile); - for (UsageRepr.Usage usage : annotationUsages) { - for (UsageRepr.AnnotationUsage query : annotationQuery) { + for (final UsageRepr.Usage usage : annotationUsages) { + for (final UsageRepr.AnnotationUsage query : annotationQuery) { if (query.satisfies(usage)) { debug("Added file due to annotation query"); affectedFiles.add(theFile); @@ -1633,7 +1648,7 @@ public class Mappings { } if (removed != null) { - for (String r : removed) { + for (final String r : removed) { affectedFiles.remove(new File(r)); } } @@ -1649,26 +1664,26 @@ public class Mappings { delta.runPostPasses(); if (removed != null) { - for (String file : removed) { + for (final String file : removed) { final int key = myContext.get(file); final Set classes = (Set)mySourceFileToClasses.get(key); final Collection clusters = mySourceFileToUsages.get(key); if (classes != null) { - for (ClassRepr cr : classes) { + for (final ClassRepr cr : classes) { myClassToSubclasses.remove(cr.name); myClassToSourceFile.remove(cr.name); myClassToClassDependency.remove(cr.name); - for (int superSomething : cr.getSupers()) { + for (final int superSomething : cr.getSupers()) { myClassToSubclasses.removeFrom(superSomething, cr.name); } if (clusters != null) { - for (UsageRepr.Cluster cluster : clusters) { + for (final UsageRepr.Cluster cluster : clusters) { final Set usages = cluster.getUsages(); if (usages != null) { - for (UsageRepr.Usage u : usages) { + for (final UsageRepr.Usage u : usages) { if (u instanceof UsageRepr.ClassUsage) { final TIntHashSet residents = cluster.getResidence(u); @@ -1690,6 +1705,16 @@ public class Mappings { } if (delta.isDifferentiated()) { + delta.getDeletedClasses().forEach(new TIntProcedure() { + @Override + public boolean execute(int value) { + myClassToClassDependency.remove(value); + myClassToSubclasses.remove(value); + myClassToSourceFile.remove(value); + return true; + } + }); + delta.getChangedClasses().forEach(new TIntProcedure() { @Override public boolean execute(int c) { @@ -1795,11 +1820,11 @@ public class Mappings { private int[] getClassNames(Collection compiled) { final TIntHashSet classnames = new TIntHashSet(compiled.size()); - for (File c : compiled) { + for (final File c : compiled) { final int fileName = myContext.get(FileUtil.toSystemIndependentName(c.getAbsolutePath())); final Collection reprs = mySourceFileToClasses.get(fileName); if (reprs != null) { - for (ClassRepr repr : reprs) { + for (final ClassRepr repr : reprs) { classnames.add(repr.name); } } @@ -1843,11 +1868,11 @@ public class Mappings { myClassToSourceFile.put(repr.name, sourceFileNameS); mySourceFileToClasses.put(sourceFileNameS, repr); - for (int s : repr.getSupers()) { + for (final int s : repr.getSupers()) { myClassToSubclasses.put(s, repr.name); } - for (UsageRepr.Usage u : localUsages.getUsages()) { + for (final UsageRepr.Usage u : localUsages.getUsages()) { final int owner = u.getOwner(); if (owner != className) { @@ -1883,7 +1908,7 @@ public class Mappings { @Override public void registerImports(final String className, final Collection imports, Collection staticImports) { - for (String s : staticImports) { + for (final String s : staticImports) { int i = s.length() - 1; for (; s.charAt(i) != '.'; i--) ; imports.add(s.substring(0, i)); @@ -1982,6 +2007,4 @@ public class Mappings { }); return changed.get(); } - - }