mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 07:40:42 +07:00
stub hierarchy: use less memory for storing nested classes
This commit is contained in:
@@ -57,7 +57,11 @@ public class StubEnter {
|
||||
members[i++] = member;
|
||||
}
|
||||
}
|
||||
members = members.length == 0 ? ClassSymbol.EMPTY_ARRAY : Arrays.copyOf(members, i);
|
||||
if (i == 0) return ClassSymbol.EMPTY_ARRAY;
|
||||
|
||||
if (i < members.length) {
|
||||
members = Arrays.copyOf(members, i);
|
||||
}
|
||||
Arrays.sort(members, CLASS_SYMBOL_BY_NAME_COMPARATOR);
|
||||
return members;
|
||||
}
|
||||
@@ -97,8 +101,9 @@ public class StubEnter {
|
||||
if (uncompleted != null) {
|
||||
uncompleted.add(classSymbol);
|
||||
}
|
||||
ClassSymbol[] members = enter(tree.myDeclarations, info, classSymbol, qname);
|
||||
classSymbol.setMembers(members);
|
||||
if (tree.myDeclarations.length > 0) {
|
||||
classSymbol.setMembers(enter(tree.myDeclarations, info, classSymbol, qname));
|
||||
}
|
||||
return classSymbol;
|
||||
}
|
||||
|
||||
|
||||
@@ -103,35 +103,11 @@ public class StubResolver {
|
||||
if (!processed.add(s)) {
|
||||
return;
|
||||
}
|
||||
findImmediateMemberType(s, name, symbols);
|
||||
processMembers(s.getMembers(), name, symbols, false);
|
||||
if (s.isClass())
|
||||
findInheritedMemberType((Symbol.ClassSymbol)s, name, symbols, processed);
|
||||
}
|
||||
|
||||
private static void findImmediateMemberType(Symbol s, int name, Set<Symbol> symbols) {
|
||||
Symbol.ClassSymbol[] members = s.members();
|
||||
int index = getIndex(name, members);
|
||||
if (index < 0) return;
|
||||
|
||||
// elem
|
||||
Symbol.ClassSymbol member = members[index];
|
||||
symbols.add(member);
|
||||
// on the left
|
||||
int i = index - 1;
|
||||
while (i >= 0 && members[i].myShortName == name) {
|
||||
member = members[i];
|
||||
symbols.add(member);
|
||||
i--;
|
||||
}
|
||||
// on the right
|
||||
i = index + 1;
|
||||
while (i < members.length && members[i].myShortName == name) {
|
||||
member = members[i];
|
||||
symbols.add(member);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
private void findInheritedMemberType(Symbol.ClassSymbol c, int name, Set<Symbol> symbols, Set<Symbol> processed)
|
||||
throws IncompleteHierarchyException {
|
||||
for (Symbol.ClassSymbol st : c.getSuperClasses(myConnector))
|
||||
@@ -204,25 +180,25 @@ public class StubResolver {
|
||||
return;
|
||||
for (Symbol.ClassSymbol c : cs.getSuperClasses(myConnector))
|
||||
importFrom(c);
|
||||
importMember(cs.members(), name, symbols, true);
|
||||
processMembers(cs.getMembers(), name, symbols, true);
|
||||
}
|
||||
}.importFrom(tsym);
|
||||
}
|
||||
|
||||
private static void importMember(Symbol.ClassSymbol[] members, int name, Set<Symbol> symbols, boolean isStatic) {
|
||||
private static void processMembers(Symbol.ClassSymbol[] members, int name, Set<Symbol> symbols, boolean requireStatic) {
|
||||
int index = getIndex(name, members);
|
||||
if (index < 0) return;
|
||||
|
||||
// elem
|
||||
Symbol.ClassSymbol member = members[index];
|
||||
if (!isStatic || member.isStatic()) {
|
||||
if (!requireStatic || member.isStatic()) {
|
||||
symbols.add(member);
|
||||
}
|
||||
// on the left
|
||||
int i = index - 1;
|
||||
while (i >= 0 && members[i].myShortName == name) {
|
||||
member = members[i];
|
||||
if (!isStatic || member.isStatic()) {
|
||||
if (!requireStatic || member.isStatic()) {
|
||||
symbols.add(member);
|
||||
}
|
||||
i--;
|
||||
@@ -231,7 +207,7 @@ public class StubResolver {
|
||||
i = index + 1;
|
||||
while (i < members.length && members[i].myShortName == name) {
|
||||
member = members[i];
|
||||
if (!isStatic || member.isStatic()) {
|
||||
if (!requireStatic || member.isStatic()) {
|
||||
symbols.add(member);
|
||||
}
|
||||
i++;
|
||||
|
||||
@@ -45,7 +45,7 @@ public abstract class Symbol {
|
||||
return myShortName;
|
||||
}
|
||||
|
||||
public ClassSymbol[] members() {
|
||||
ClassSymbol[] getMembers() {
|
||||
return ClassSymbol.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ public abstract class Symbol {
|
||||
|
||||
/** A class for class symbols
|
||||
*/
|
||||
public static class ClassSymbol extends Symbol {
|
||||
public static class ClassSymbol extends MemberSymbol {
|
||||
private static final int HIERARCHY_INCOMPLETE = 1 << 20;
|
||||
private static final int CONNECT_STARTED = 1 << 21;
|
||||
public static final ClassSymbol[] EMPTY_ARRAY = new ClassSymbol[0];
|
||||
@@ -98,7 +98,6 @@ public abstract class Symbol {
|
||||
*/
|
||||
Object mySuperClasses;
|
||||
UnitInfo myUnitInfo;
|
||||
private ClassSymbol[] myMembers;
|
||||
|
||||
ClassSymbol(StubClassAnchor classAnchor,
|
||||
int flags,
|
||||
@@ -149,14 +148,6 @@ public abstract class Symbol {
|
||||
return BitUtil.isSet(myFlags, IndexTree.COMPILED);
|
||||
}
|
||||
|
||||
public ClassSymbol[] members() {
|
||||
return myMembers;
|
||||
}
|
||||
|
||||
public void setMembers(ClassSymbol[] members) {
|
||||
this.myMembers = members;
|
||||
}
|
||||
|
||||
void markHierarchyIncomplete() {
|
||||
setSupers(Collections.emptySet());
|
||||
myFlags = BitUtil.set(myFlags, HIERARCHY_INCOMPLETE, true);
|
||||
@@ -192,15 +183,27 @@ public abstract class Symbol {
|
||||
* Represents methods, fields and other constructs that may contain anonymous or local classes.
|
||||
*/
|
||||
public static class MemberSymbol extends Symbol {
|
||||
private ClassSymbol[] myMembers;
|
||||
public MemberSymbol(Symbol owner) {
|
||||
/**
|
||||
* null when no members, or a single ClassSymbol, or ClassSymbol[]
|
||||
*/
|
||||
private Object myMembers = null;
|
||||
|
||||
MemberSymbol(Symbol owner) {
|
||||
super(IndexTree.MEMBER, owner, NamesEnumerator.NO_NAME);
|
||||
}
|
||||
public ClassSymbol[] members() {
|
||||
return myMembers;
|
||||
|
||||
MemberSymbol(int flags, Symbol owner, int name) {
|
||||
super(flags, owner, name);
|
||||
}
|
||||
public void setMembers(ClassSymbol[] members) {
|
||||
this.myMembers = members;
|
||||
|
||||
ClassSymbol[] getMembers() {
|
||||
return myMembers == null ? ClassSymbol.EMPTY_ARRAY :
|
||||
myMembers instanceof ClassSymbol ? new ClassSymbol[]{(ClassSymbol)myMembers} :
|
||||
(ClassSymbol[])myMembers;
|
||||
}
|
||||
|
||||
void setMembers(ClassSymbol[] members) {
|
||||
myMembers = members.length == 0 ? null : members.length == 1 ? members[0] : members;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user