release stub hierarchy name enumerator to save memory; reusing it brings almost nothing anyway

This commit is contained in:
peter
2016-06-10 10:34:02 +02:00
parent 2257393d89
commit 4d048bbc4c
3 changed files with 15 additions and 32 deletions
@@ -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<NameEnvironment> myNamesCache = null;
private final CachedValue<SingleClassHierarchy> myHierarchy ;
private final CachedValue<SingleClassHierarchy> 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<NameEnvironment>(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) {
@@ -30,10 +30,10 @@ public class StubEnter {
private ArrayList<ClassSymbol> uncompleted = new ArrayList<ClassSymbol>();
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) {
@@ -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<ClassSymbol> 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) {