From 677fc4783d00a994dc6783ef87e30e800254bc99 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 18 Jan 2012 21:02:52 +0400 Subject: [PATCH] Impelemnted efficient usage maplet fix (jps/incremental). --- .../ether/dependencyView/Mappings.java | 129 ++++++++---------- 1 file changed, 57 insertions(+), 72 deletions(-) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 2528affd703a..f331cd4083b1 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -37,7 +37,7 @@ public class Mappings { private MultiMaplet mySourceFileToClasses; private MultiMaplet mySourceFileToAnnotationUsages; - private Maplet mySourceFileToUsages; + private MultiMaplet mySourceFileToUsages; private Maplet myClassToSourceFile; private static final TransientMultiMaplet.CollectionConstructor ourClassSetConstructor = @@ -47,6 +47,13 @@ public class Mappings { } }; + private static final TransientMultiMaplet.CollectionConstructor ourUsageClusterSetConstructor = + new TransientMultiMaplet.CollectionConstructor() { + public Set create() { + return new HashSet(); + } + }; + private static final TransientMultiMaplet.CollectionConstructor ourUsageSetConstructor = new TransientMultiMaplet.CollectionConstructor() { public Set create() { @@ -70,13 +77,6 @@ public class Mappings { myRootDir.mkdirs(); createImplementation(myRootDir, true); - - //myClassToSubclasses = new TransientMultiMaplet(ourStringSetConstructor); - //mySourceFileToClasses = new TransientMultiMaplet(ourClassSetConstructor); - //mySourceFileToUsages = new TransientMaplet(); - //mySourceFileToAnnotationUsages = new TransientMultiMaplet(ourUsageSetConstructor); - //myClassToSourceFile = new TransientMaplet(); - //myClassToClassDependency = new TransientMultiMaplet(ourStringSetConstructor); } public Mappings(final File rootDir) throws IOException { @@ -111,9 +111,10 @@ public class Mappings { ourUsageSetConstructor); mySourceFileToUsages = - new PersistentMaplet(DependencyContext.getTableFile(rootDir, SOURCE_TO_USAGES), - DependencyContext.descriptorS, - UsageRepr.Cluster.clusterExternalizer(myContext)); + new PersistentMultiMaplet(DependencyContext.getTableFile(rootDir, SOURCE_TO_USAGES), + DependencyContext.descriptorS, + UsageRepr.Cluster.clusterExternalizer(myContext), + ourUsageClusterSetConstructor); myClassToSourceFile = new PersistentMaplet(DependencyContext.getTableFile(rootDir, CLASS_TO_SOURCE), @@ -583,7 +584,7 @@ public class Mappings { if (dependants != null) { for (DependencyContext.S depClass : dependants) { final DependencyContext.S depFile = myClassToSourceFile.get(depClass); - + if (depFile != null && sourceFile != null && !depFile.equals(sourceFile)) { affectedFiles.add(new File(myContext.getValue(depFile))); } @@ -1214,44 +1215,47 @@ public class Mappings { continue filewise; } - final UsageRepr.Cluster depCluster = mySourceFileToUsages.get(depFile); - final Set depUsages = depCluster.getUsages(); + final Collection depClusters = mySourceFileToUsages.get(depFile); - if (depUsages != null) { - final Set usages = new HashSet(depUsages); + for (UsageRepr.Cluster depCluster : depClusters) { + final Set depUsages = depCluster.getUsages(); - usages.retainAll(affectedUsages); + if (depUsages != null) { + final Set usages = new HashSet(depUsages); - if (!usages.isEmpty()) { - for (UsageRepr.Usage usage : usages) { - final Util.UsageConstraint constraint = usageConstraints.get(usage); + usages.retainAll(affectedUsages); - if (constraint == null) { - affectedFiles.add(theFile); - continue filewise; + if (!usages.isEmpty()) { + for (UsageRepr.Usage usage : usages) { + final Util.UsageConstraint constraint = usageConstraints.get(usage); + + if (constraint == null) { + affectedFiles.add(theFile); + continue filewise; + } + else { + final Set residenceClasses = depCluster.getResidence(usage); + for (DependencyContext.S residentName : residenceClasses) { + if (constraint.checkResidence(residentName)) { + affectedFiles.add(theFile); + continue filewise; + } + } + + } } - else { - final Set residenceClasses = depCluster.getResidence(usage); - for (DependencyContext.S residentName : residenceClasses) { - if (constraint.checkResidence(residentName)) { + } + + if (annotationQuery.size() > 0) { + final Collection annotationUsages = mySourceFileToAnnotationUsages.get(depFile); + + for (UsageRepr.Usage usage : annotationUsages) { + for (UsageRepr.AnnotationUsage query : annotationQuery) { + if (query.satisfies(usage)) { affectedFiles.add(theFile); continue filewise; } } - - } - } - } - - if (annotationQuery.size() > 0) { - final Collection annotationUsages = mySourceFileToAnnotationUsages.get(depFile); - - for (UsageRepr.Usage usage : annotationUsages) { - for (UsageRepr.AnnotationUsage query : annotationQuery) { - if (query.satisfies(usage)) { - affectedFiles.add(theFile); - continue filewise; - } } } } @@ -1269,8 +1273,7 @@ public class Mappings { for (String file : removed) { final DependencyContext.S key = myContext.get(file); final Set classes = (Set)mySourceFileToClasses.get(key); - final UsageRepr.Cluster cluster = mySourceFileToUsages.get(key); - final Set usages = cluster == null ? null : cluster.getUsages(); + final Collection clusters = mySourceFileToUsages.get(key); if (classes != null) { for (ClassRepr cr : classes) { @@ -1282,13 +1285,16 @@ public class Mappings { myClassToSubclasses.removeFrom(superSomething, cr.name); } - if (usages != null) { - for (UsageRepr.Usage u : usages) { - if (u instanceof UsageRepr.ClassUsage) { - final Set residents = cluster.getResidence(u); + for (UsageRepr.Cluster cluster : clusters) { + final Set usages = cluster.getUsages(); + if (usages != null) { + for (UsageRepr.Usage u : usages) { + if (u instanceof UsageRepr.ClassUsage) { + final Set residents = cluster.getResidence(u); - if (residents != null && residents.contains(cr.name)) { - myClassToClassDependency.removeFrom(((UsageRepr.ClassUsage)u).className, cr.name); + if (residents != null && residents.contains(cr.name)) { + myClassToClassDependency.removeFrom(((UsageRepr.ClassUsage)u).className, cr.name); + } } } } @@ -1301,10 +1307,6 @@ public class Mappings { } } - //final Set cl = (Set) delta.mySourceFileToClasses.get(new DependencyContext.S(352)); - - //System.out.println("There: " + (cl == null ? "wow..." : cl.size())); - myClassToSubclasses.putAll(delta.myClassToSubclasses); mySourceFileToClasses.putAll(delta.mySourceFileToClasses); mySourceFileToUsages.putAll(delta.mySourceFileToUsages); @@ -1340,21 +1342,6 @@ public class Mappings { } } - private void updateSourceToUsages(final DependencyContext.S source, final UsageRepr.Cluster usages) { - UsageRepr.Cluster c = mySourceFileToUsages.get(source); - if (c == null) { - c = usages; - } - else { - c.updateCluster(usages); - } - mySourceFileToUsages.put(source, c); - } - - private void updateSourceToAnnotationUsages(final DependencyContext.S source, final Set usages) { - mySourceFileToAnnotationUsages.put(source, usages); - } - public Callbacks.Backend getCallback() { return new Callbacks.Backend() { public Collection getClassFiles() { @@ -1408,11 +1395,11 @@ public class Mappings { } if (!localUsages.isEmpty()) { - updateSourceToUsages(sourceFileNameS, localUsages); + mySourceFileToUsages.put(sourceFileNameS, localUsages); } if (!localAnnotationUsages.isEmpty()) { - updateSourceToAnnotationUsages(sourceFileNameS, localAnnotationUsages); + mySourceFileToAnnotationUsages.put(sourceFileNameS, localAnnotationUsages); } } }; @@ -1433,8 +1420,6 @@ public class Mappings { if (!myIsTansient) { // only close if you own the context - //final Set classes = (Set)mySourceFileToClasses.get(new DependencyContext.S(352)); - //System.out.println("Here: " + (classes == null ? "wow..." : classes.size())); myContext.close(); }