no staticness distinction in stub hierarchy

This commit is contained in:
peter
2016-07-05 19:26:11 +02:00
parent a468c68314
commit 88944e57ef
7 changed files with 25 additions and 64 deletions
@@ -19,11 +19,9 @@ import com.intellij.ide.highlighter.JavaClassFileType;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiNameHelper;
import com.intellij.psi.PsiReferenceList;
import com.intellij.psi.compiled.ClassFileDecompilers;
import com.intellij.psi.impl.cache.ModifierFlags;
import com.intellij.psi.impl.java.stubs.*;
import com.intellij.psi.impl.java.stubs.hierarchy.IndexTree;
import com.intellij.psi.impl.java.stubs.hierarchy.IndexTree.*;
@@ -35,6 +33,7 @@ import com.intellij.psi.stubs.StubTree;
import com.intellij.psi.stubs.StubTreeBuilder;
import com.intellij.psi.stubsHierarchy.StubHierarchyIndexer;
import com.intellij.util.ArrayUtil;
import com.intellij.util.BitUtil;
import com.intellij.util.indexing.FileContent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -154,18 +153,8 @@ public class JavaStubIndexer extends StubHierarchyIndexer {
private static int translateFlags(PsiClassStubImpl<?> classStub, int accessModifiers) {
int flags = 0;
if (classStub.isInterface()) {
flags |= IndexTree.INTERFACE;
}
if (classStub.isEnum()) {
flags |= IndexTree.ENUM;
}
if (classStub.isAnnotationType()) {
flags |= IndexTree.ANNOTATION;
}
if (ModifierFlags.hasModifierProperty(PsiModifier.STATIC, accessModifiers)) {
flags |= IndexTree.STATIC;
}
flags = BitUtil.set(flags, IndexTree.ENUM, classStub.isEnum());
flags = BitUtil.set(flags, IndexTree.ANNOTATION, classStub.isAnnotationType());
return flags;
}
@@ -101,11 +101,6 @@ public class StubEnter {
private static int checkFlags(long flags, Symbol owner, boolean compiled) {
int mask = 0;
if (owner.isClass() && (owner.myOwner.isPackage() || owner.isStatic())) {
if ((flags & (IndexTree.INTERFACE | IndexTree.ENUM | IndexTree.STATIC)) != 0) {
mask |= IndexTree.STATIC;
}
}
if ((flags & IndexTree.SUPERS_UNRESOLVED) != 0) {
mask |= IndexTree.SUPERS_UNRESOLVED;
}
@@ -96,7 +96,7 @@ public class StubHierarchyIndex extends FileBasedIndexExtension<Integer, Seriali
@Override
public int getVersion() {
return IndexTree.STUB_HIERARCHY_ENABLED ? 6 + Arrays.stream(ourIndexers).mapToInt(StubHierarchyIndexer::getVersion).sum() : 0;
return IndexTree.STUB_HIERARCHY_ENABLED ? 7 + Arrays.stream(ourIndexers).mapToInt(StubHierarchyIndexer::getVersion).sum() : 0;
}
@NotNull
@@ -100,18 +100,17 @@ public class StubResolver {
private void findMemberType(Symbol s, @ShortName int name, Set<Symbol> symbols) throws IncompleteHierarchyException {
if (s.isClass()) {
processInheritedMembers((Symbol.ClassSymbol)s, name, false, symbols, null);
processInheritedMembers((Symbol.ClassSymbol)s, name, symbols, null);
} else {
processMembers(s.getMembers(), name, symbols, false);
processMembers(s.getMembers(), name, symbols);
}
}
private void processInheritedMembers(Symbol.ClassSymbol s,
@ShortName int name,
boolean requireStatic,
Set<Symbol> symbols,
@Nullable Set<Symbol> processed) throws IncompleteHierarchyException {
processMembers(s.getMembers(), name, symbols, requireStatic);
processMembers(s.getMembers(), name, symbols);
@CompactArray(Symbol.ClassSymbol.class) Object supers = s.getSuperClasses(myConnector);
if (supers == null) return;
@@ -120,10 +119,10 @@ public class StubResolver {
if (!processed.add(s)) return;
if (supers instanceof Symbol.ClassSymbol) {
processInheritedMembers((Symbol.ClassSymbol)supers, name, requireStatic, symbols, processed);
processInheritedMembers((Symbol.ClassSymbol)supers, name, symbols, processed);
} else if (supers instanceof Symbol.ClassSymbol[]) {
for (Symbol.ClassSymbol st : (Symbol.ClassSymbol[])supers) {
processInheritedMembers(st, name, requireStatic, symbols, processed);
processInheritedMembers(st, name, symbols, processed);
}
}
}
@@ -180,34 +179,25 @@ public class StubResolver {
// handling of import static `tsym.name` as
private void importNamedStatic(final Symbol.ClassSymbol tsym, @ShortName final int name, final Set<Symbol> symbols) throws IncompleteHierarchyException {
processInheritedMembers(tsym, name, true, symbols, null);
processInheritedMembers(tsym, name, symbols, null);
}
private static void processMembers(Symbol.ClassSymbol[] members, @ShortName int name, Set<Symbol> symbols, boolean requireStatic) {
private static void processMembers(Symbol.ClassSymbol[] members, @ShortName int name, Set<Symbol> symbols) {
int index = getIndex(name, members);
if (index < 0) return;
// elem
Symbol.ClassSymbol member = members[index];
if (!requireStatic || member.isStatic()) {
symbols.add(member);
}
symbols.add(members[index]);
// on the left
int i = index - 1;
while (i >= 0 && members[i].myShortName == name) {
member = members[i];
if (!requireStatic || member.isStatic()) {
symbols.add(member);
}
symbols.add(members[i]);
i--;
}
// on the right
i = index + 1;
while (i < members.length && members[i].myShortName == name) {
member = members[i];
if (!requireStatic || member.isStatic()) {
symbols.add(member);
}
symbols.add(members[i]);
i++;
}
}
@@ -27,7 +27,7 @@ import java.util.*;
* Java symbols needed for hierarchy building. Mostly classes ({@link ClassSymbol}) or packages ({@link PackageSymbol}),
* but other {@link MemberSymbol}s are also sometimes needed for working with anonymous or local classes.
*/
public abstract class Symbol {
abstract class Symbol {
public int myFlags;
public int myShortName;
public final Symbol myOwner;
@@ -47,10 +47,6 @@ public abstract class Symbol {
return ClassSymbol.EMPTY_ARRAY;
}
public boolean isStatic() {
return BitUtil.isSet(myFlags, IndexTree.STATIC);
}
public boolean isPackage() {
return BitUtil.isSet(myFlags, IndexTree.PACKAGE);
}