stub hierarchy: use less memory for storing nested classes

This commit is contained in:
peter
2016-06-25 14:03:05 +02:00
parent 602e2e08f7
commit bbadd9d7df
3 changed files with 34 additions and 50 deletions
@@ -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;
}
}