From 4d048bbc4c20594376fa9e8ab6d63d121d5bfce5 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 10 Jun 2016 10:34:02 +0200 Subject: [PATCH] release stub hierarchy name enumerator to save memory; reusing it brings almost nothing anyway --- .../impl/HierarchyServiceImpl.java | 30 +++++-------------- .../psi/stubsHierarchy/impl/StubEnter.java | 8 ++--- .../psi/stubsHierarchy/impl/Symbols.java | 9 +++--- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/HierarchyServiceImpl.java b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/HierarchyServiceImpl.java index 159a4f6c1db2..31fa42faa53a 100644 --- a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/HierarchyServiceImpl.java +++ b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/HierarchyServiceImpl.java @@ -31,7 +31,6 @@ import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.reference.SoftReference; import com.intellij.util.CachedValueBase; import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NotNull; @@ -40,9 +39,7 @@ public class HierarchyServiceImpl extends HierarchyService { private static final SingleClassHierarchy EMPTY_HIERARCHY = new SingleClassHierarchy(Symbol.ClassSymbol.EMPTY_ARRAY); private final Project myProject; private final ProjectFileIndex myFileIndex; - - private volatile SoftReference myNamesCache = null; - private final CachedValue myHierarchy ; + private final CachedValue myHierarchy; public HierarchyServiceImpl(Project project) { myProject = project; @@ -70,29 +67,16 @@ public class HierarchyServiceImpl extends HierarchyService { } private SingleClassHierarchy buildHierarchy() { - NameEnvironment names = obtainNames(); - Symbols symbols = new Symbols(names); - loadSymbols(names, symbols); - return symbols.createHierarchy(); - } + Symbols symbols = new Symbols(); + StubEnter stubEnter = new StubEnter(symbols); - @NotNull - private NameEnvironment obtainNames() { - NameEnvironment names = SoftReference.dereference(myNamesCache); - if (names == null) { - myNamesCache = new SoftReference(names = new NameEnvironment()); - } - return names; - } - - private void loadSymbols(NameEnvironment names, Symbols symbols) { - StubEnter stubEnter = new StubEnter(names, symbols); - - loadUnits(false, names, stubEnter); + loadUnits(false, symbols.myNameEnvironment, stubEnter); stubEnter.connect1(); - loadUnits(true, names, stubEnter); + loadUnits(true, symbols.myNameEnvironment, stubEnter); stubEnter.connect2(); + + return symbols.createHierarchy(); } private void loadUnits(boolean sourceMode, NameEnvironment names, StubEnter stubEnter) { diff --git a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubEnter.java b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubEnter.java index 42aec9d49b90..728a39f29c21 100644 --- a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubEnter.java +++ b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubEnter.java @@ -30,10 +30,10 @@ public class StubEnter { private ArrayList uncompleted = new ArrayList(); - public StubEnter(NameEnvironment nameEnvironment, Symbols symbols) { - this.myNameEnvironment = nameEnvironment; - this.mySymbols = symbols; - myStubHierarchyConnector = new StubHierarchyConnector(nameEnvironment, symbols); + StubEnter(Symbols symbols) { + myNameEnvironment = symbols.myNameEnvironment; + mySymbols = symbols; + myStubHierarchyConnector = new StubHierarchyConnector(myNameEnvironment, symbols); } void unitEnter(Unit tree) { diff --git a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/Symbols.java b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/Symbols.java index 16ed9f1f2903..42feaf324509 100644 --- a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/Symbols.java +++ b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/Symbols.java @@ -12,7 +12,7 @@ import java.util.List; public class Symbols { public final PackageSymbol myRootPackage; - protected final NameEnvironment myNameEnvironment; + protected final NameEnvironment myNameEnvironment = new NameEnvironment(); private List myClassSymbols = new ArrayList<>(0x8000); // fullName -> PackageSymbol @@ -20,10 +20,9 @@ public class Symbols { // nameId -> ClassSymbols (used by global resolve) private Object[] myClassSymbolsByNameId = new Object[0x8000]; - protected Symbols(NameEnvironment nameEnvironment) { - this.myNameEnvironment = nameEnvironment; - myRootPackage = new PackageSymbol(null, nameEnvironment.empty, NamesEnumerator.NO_NAME); - myPackages.put(nameEnvironment.empty.myId, myRootPackage); + protected Symbols() { + myRootPackage = new PackageSymbol(null, myNameEnvironment.empty, NamesEnumerator.NO_NAME); + myPackages.put(myNameEnvironment.empty.myId, myRootPackage); } public PackageSymbol enterPackage(QualifiedName qualifiedName) {