mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
release stub hierarchy name enumerator to save memory; reusing it brings almost nothing anyway
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user