From c3d0f767b3cd007f3847abd4a9d42dbc04c7ed7b Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Sat, 24 Dec 2011 14:30:22 +0400 Subject: [PATCH] Reimplementing deltas as persistent (jps/incremental). --- .idea/modules.xml | 4 +- .../dependencyView/DependencyContext.java | 2 +- .../ether/dependencyView/Maplet.java | 2 +- .../ether/dependencyView/Mappings.java | 74 ++++--- .../ether/dependencyView/MethodRepr.java | 10 - .../ether/dependencyView/MultiMaplet.java | 2 +- .../dependencyView/PersistentMaplet.java | 55 +++-- .../dependencyView/PersistentMultiMaplet.java | 57 +++-- .../ether/dependencyView/TransientMaplet.java | 2 +- .../org/jetbrains/ether/ProjectWrapper.java | 5 + .../.idea/misc.xml | 6 + .../.idea/workspace.xml | 198 ++++++++++++++++-- 12 files changed, 329 insertions(+), 88 deletions(-) diff --git a/.idea/modules.xml b/.idea/modules.xml index 73a3546daa9b..1f2298ba989d 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -87,10 +87,10 @@ - - + + diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/DependencyContext.java b/jps/model/src/org/jetbrains/ether/dependencyView/DependencyContext.java index 384aee5bc72b..dfd3736fc358 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/DependencyContext.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/DependencyContext.java @@ -88,7 +88,7 @@ class DependencyContext { } } - private S(final int i) { + /*private*/ S(final int i) { index = i; } diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Maplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/Maplet.java index 526ce9b3d33c..dfcfac21be89 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Maplet.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Maplet.java @@ -34,5 +34,5 @@ interface Maplet { void remove(final Object key); void close(); Collection keyCollection(); - Set> entrySet(); + Collection> entrySet(); } diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 6a10f0d36bef..5d2b45d9ee4e 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -27,6 +27,8 @@ public class Mappings { private final static String mySourceToUsagesName = "sourceToUsages.tab"; private final static String myClassToSourceName = "classToSource.tab"; + private final boolean myIsTansient; + private final File myRootDir; private DependencyContext myContext; private MultiMaplet myClassToSubclasses; @@ -59,9 +61,15 @@ public class Mappings { } }; - private Mappings(final DependencyContext context) { - myRootDir = null; - myContext = context; + private Mappings(final Mappings base) throws IOException { + myIsTansient = true; + + myRootDir = new File(FileUtil.toSystemIndependentName(base.myRootDir.getAbsolutePath()) + File.separatorChar + "delta"); + myContext = base.myContext; + + myRootDir.mkdirs(); + + //createImplementation(myRootDir, myIsTansient); myClassToSubclasses = new TransientMultiMaplet(ourStringSetConstructor); mySourceFileToClasses = new TransientMultiMaplet(ourClassSetConstructor); @@ -72,12 +80,15 @@ public class Mappings { } public Mappings(final File rootDir) throws IOException { + myIsTansient = false; myRootDir = rootDir; - createPersistentImplementation(rootDir); + createImplementation(rootDir, myIsTansient); } - private void createPersistentImplementation(File rootDir) throws IOException { - myContext = new DependencyContext(rootDir); + private void createImplementation(final File rootDir, final boolean isTransient) throws IOException { + if (! isTransient) { + myContext = new DependencyContext(rootDir); + } myClassToSubclasses = new PersistentMultiMaplet(DependencyContext.getTableFile(rootDir, myClassToSubclassesName), @@ -110,7 +121,12 @@ public class Mappings { } public Mappings createDelta() { - return new Mappings(myContext); + try { + return new Mappings(this); + } + catch (IOException e) { + throw new RuntimeException(e); + } } public void clearMemoryCaches() { @@ -149,7 +165,7 @@ public class Mappings { if (myRootDir != null) { close(); FileUtil.delete(myRootDir); - createPersistentImplementation(myRootDir); + createImplementation(myRootDir, false); } } @@ -555,7 +571,8 @@ public class Mappings { dependents.addAll(deps); } - affectedUsages.add(rootUsage instanceof UsageRepr.MetaMethodUsage ? method.createMetaUsage(myContext, p) : method.createUsage(myContext, p)); + affectedUsages + .add(rootUsage instanceof UsageRepr.MetaMethodUsage ? method.createMetaUsage(myContext, p) : method.createUsage(myContext, p)); } } @@ -811,22 +828,6 @@ public class Mappings { else { final Collection propagated = u.propagateMethodAccess(m.name, it.name); u.affectMethodUsages(m, propagated, m.createMetaUsage(myContext, it.name), affectedUsages, dependants); - - /* - final UsageRepr.Usage usage = it.createUsage(); - - affectedUsages.add(usage); - - if ((m.access & Opcodes.ACC_PUBLIC) > 0) { - - } - else if (isPackageLocal(m.access)) { - usageConstraints.put(usage, u.new PackageConstraint(it.getPackageName())); - } - else if ((m.access & Opcodes.ACC_PROTECTED) > 0) { - usageConstraints.put(usage, u.new InheritanceConstraint(it.name)); - } - */ } } @@ -838,7 +839,9 @@ public class Mappings { final Collection lessSpecific = it.findMethods(u.lessSpecific(m)); for (MethodRepr mm : lessSpecific) { - u.affectMethodUsages(mm, propagated, mm.createUsage(myContext, it.name), affectedUsages, dependants); + if (!mm.equals(m)) { + u.affectMethodUsages(mm, propagated, mm.createUsage(myContext, it.name), affectedUsages, dependants); + } } for (Pair p : affectedMethods) { @@ -1295,6 +1298,10 @@ 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); @@ -1398,15 +1405,22 @@ public class Mappings { } public void close() { - if (myRootDir != null) { - // only close if you own the context - myContext.close(); - } myClassToSubclasses.close(); myClassToClassDependency.close(); mySourceFileToClasses.close(); mySourceFileToAnnotationUsages.close(); mySourceFileToUsages.close(); myClassToSourceFile.close(); + + 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(); + } + else { + FileUtil.delete(myRootDir); + } } } diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/MethodRepr.java b/jps/model/src/org/jetbrains/ether/dependencyView/MethodRepr.java index 917656431ee5..2aa6d5b33d7f 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/MethodRepr.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/MethodRepr.java @@ -154,16 +154,6 @@ class MethodRepr extends ProtoMember { }; } - /* - static Predicate equal(final MethodRepr me){ - return new Predicate() { - @Override - public boolean satisfy(MethodRepr that) { - return me.equals(that); - } - }; - } - */ @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java index 30d9f44ec130..52353edf0be7 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java @@ -37,5 +37,5 @@ interface MultiMaplet { void removeAll(final K key, final Collection value); void close(); Collection keyCollection(); - Set>> entrySet(); + Collection>> entrySet(); } diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMaplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMaplet.java index 08a72c11d913..f3b50bdddf7a 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMaplet.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMaplet.java @@ -22,8 +22,8 @@ import com.intellij.util.io.PersistentHashMap; import java.io.File; import java.io.IOException; import java.util.Collection; +import java.util.LinkedList; import java.util.Map; -import java.util.Set; /** * Created by IntelliJ IDEA. @@ -33,11 +33,11 @@ import java.util.Set; * To change this template use File | Settings | File Templates. */ public class PersistentMaplet implements Maplet { - private final PersistentHashMap map; + private final PersistentHashMap myMap; public PersistentMaplet(final File file, final KeyDescriptor k, final DataExternalizer v) { try { - map = new PersistentHashMap(file, k, v); + myMap = new PersistentHashMap(file, k, v); } catch (IOException e) { throw new RuntimeException(e); @@ -47,7 +47,7 @@ public class PersistentMaplet implements Maplet { @Override public boolean containsKey(final Object key) { try { - return map.containsMapping((K)key); + return myMap.containsMapping((K)key); } catch (IOException e) { throw new RuntimeException(e); @@ -57,7 +57,7 @@ public class PersistentMaplet implements Maplet { @Override public V get(final Object key) { try { - return map.get((K)key); + return myMap.get((K)key); } catch (IOException e) { throw new RuntimeException(e); @@ -67,7 +67,7 @@ public class PersistentMaplet implements Maplet { @Override public void put(final K key, final V value) { try { - map.put(key, value); + myMap.put(key, value); } catch (IOException e) { throw new RuntimeException(e); @@ -78,7 +78,7 @@ public class PersistentMaplet implements Maplet { public void putAll(final Maplet m) { try { for (Map.Entry e : m.entrySet()) { - map.put(e.getKey(), e.getValue()); + myMap.put(e.getKey(), e.getValue()); } } catch (IOException e) { @@ -89,7 +89,7 @@ public class PersistentMaplet implements Maplet { @Override public void remove(final Object key) { try { - map.remove((K)key); + myMap.remove((K)key); } catch (IOException e) { throw new RuntimeException(e); @@ -99,7 +99,7 @@ public class PersistentMaplet implements Maplet { @Override public void close() { try { - map.close(); + myMap.close(); } catch (IOException e) { throw new RuntimeException(e); @@ -109,7 +109,7 @@ public class PersistentMaplet implements Maplet { @Override public Collection keyCollection() { try { - return map.getAllKeysWithExistingMapping(); + return myMap.getAllKeysWithExistingMapping(); } catch (IOException e) { throw new RuntimeException(e); @@ -117,8 +117,37 @@ public class PersistentMaplet implements Maplet { } @Override - public Set> entrySet() { - assert (false); - return null; + public Collection> entrySet() { + final Collection> result = new LinkedList>(); + + try { + for (final K key : myMap.getAllKeysWithExistingMapping()) { + final V value = myMap.get(key); + + final Map.Entry entry = new Map.Entry() { + @Override + public K getKey() { + return key; + } + + @Override + public V getValue() { + return value; + } + + @Override + public V setValue(V value) { + return null; + } + }; + + result.add(entry); + } + + return result; + } + catch (IOException e) { + throw new RuntimeException(e); + } } } diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java index 4c850f9450ca..292143cd5ad3 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java @@ -22,8 +22,8 @@ import com.intellij.util.io.PersistentHashMap; import java.io.*; import java.util.Collection; import java.util.Collections; +import java.util.LinkedList; import java.util.Map; -import java.util.Set; /** * Created by IntelliJ IDEA. @@ -41,9 +41,8 @@ class PersistentMultiMaplet implements MultiMaplet { final DataExternalizer valueExternalizer, final TransientMultiMaplet.CollectionConstructor collectionFactory) throws IOException { myValueExternalizer = valueExternalizer; - myMap = new PersistentHashMap>( - file, keyExternalizer, new CollectionDataExternalizer(valueExternalizer, collectionFactory) - ); + myMap = new PersistentHashMap>(file, keyExternalizer, + new CollectionDataExternalizer(valueExternalizer, collectionFactory)); } @@ -142,22 +141,16 @@ class PersistentMultiMaplet implements MultiMaplet { @Override public void putAll(MultiMaplet m) { - try { - for (Map.Entry> entry : m.entrySet()) { - myMap.put(entry.getKey(), entry.getValue()); - } - } - catch (IOException e) { - throw new RuntimeException(e); + for (Map.Entry> entry : m.entrySet()) { + put(entry.getKey(), entry.getValue()); } } - public Collection keyCollection() { try { return myMap.getAllKeysWithExistingMapping(); } - catch (IOException e){ + catch (IOException e) { throw new RuntimeException(e); } } @@ -173,16 +166,46 @@ class PersistentMultiMaplet implements MultiMaplet { } @Override - public Set>> entrySet() { - assert(false); - return null; + public Collection>> entrySet() { + final Collection>> result = new LinkedList>>(); + + try { + for (final K key : myMap.getAllKeysWithExistingMapping()) { + final Collection value = myMap.get(key); + + final Map.Entry> entry = new Map.Entry>() { + @Override + public K getKey() { + return key; + } + + @Override + public Collection getValue() { + return value; + } + + @Override + public Collection setValue(Collection value) { + return null; + } + }; + + result.add(entry); + } + + return result; + } + catch (IOException e) { + throw new RuntimeException(e); + } } private static class CollectionDataExternalizer implements DataExternalizer> { private final DataExternalizer myElementExternalizer; private final TransientMultiMaplet.CollectionConstructor myCollectionFactory; - public CollectionDataExternalizer(DataExternalizer elementExternalizer, TransientMultiMaplet.CollectionConstructor collectionFactory) { + public CollectionDataExternalizer(DataExternalizer elementExternalizer, + TransientMultiMaplet.CollectionConstructor collectionFactory) { myElementExternalizer = elementExternalizer; myCollectionFactory = collectionFactory; } diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/TransientMaplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/TransientMaplet.java index 25502118d0fc..bab32504f40b 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/TransientMaplet.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/TransientMaplet.java @@ -69,7 +69,7 @@ public class TransientMaplet implements Maplet{ } @Override - public Set> entrySet() { + public Collection> entrySet() { return map.entrySet(); } } diff --git a/jps/src/org/jetbrains/ether/ProjectWrapper.java b/jps/src/org/jetbrains/ether/ProjectWrapper.java index d229f0254385..12aa503c5ea3 100644 --- a/jps/src/org/jetbrains/ether/ProjectWrapper.java +++ b/jps/src/org/jetbrains/ether/ProjectWrapper.java @@ -1169,6 +1169,7 @@ public class ProjectWrapper { } dependencyMapping.integrate(delta, files, removed); + delta.close(); if (!incremental) { affectedFiles.addAll(sources); @@ -1186,6 +1187,7 @@ public class ProjectWrapper { return iterativeCompile(chunk, sources, null, null, flags); } else { + delta.close(); return BuildStatus.FAILURE; } } @@ -1262,6 +1264,8 @@ public class ProjectWrapper { } catch (Exception e) { e.printStackTrace(); + delta.close(); + return BuildStatus.FAILURE; } @@ -1280,6 +1284,7 @@ public class ProjectWrapper { } dependencyMapping.integrate(delta, files, removedSources); + delta.close(); for (Module m : chunkModules) { Reporter.reportBuildSuccess(m, flags.tests()); diff --git a/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/misc.xml b/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/misc.xml index f22d96b8c6a5..f756a685860b 100644 --- a/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/misc.xml +++ b/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/misc.xml @@ -1,5 +1,8 @@ + + + + + http://www.w3.org/1999/xhtml + diff --git a/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/workspace.xml b/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/workspace.xml index 9aa9e4b7a9e5..e4fbf68dece0 100644 --- a/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/workspace.xml +++ b/jps/testData/incremental/generics/changeToCovariantMethodInBase3/.idea/workspace.xml @@ -13,7 +13,6 @@ @@ -57,9 +56,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -86,8 +156,8 @@ - + @@ -96,6 +166,34 @@ + + + + + + + + + + + + + + + + @@ -104,9 +202,13 @@ + + + + @@ -206,39 +308,64 @@ + + + 1317044130792 1317044130792 - - + + - - + + - - + + + + - + - - + - + + + +