Add local class/object declarations to super name index

This commit is contained in:
Alexey Sedunov
2013-11-08 18:01:21 +04:00
parent 72c7399df1
commit 594c966c44
9 changed files with 128 additions and 50 deletions
@@ -1008,8 +1008,10 @@ public class JetPsiUtil {
}
//noinspection unchecked
JetElement container =
PsiTreeUtil.getParentOfType(declaration, JetBlockExpression.class, JetClassInitializer.class);
JetElement container = PsiTreeUtil.getParentOfType(
declaration,
JetBlockExpression.class, JetClassInitializer.class, JetProperty.class, JetFunction.class
);
if (container == null) return null;
return (container instanceof JetClassInitializer) ? ((JetClassInitializer) container).getBody() : container;
@@ -22,6 +22,8 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject;
import java.util.List;
public interface PsiJetClassOrObjectStub<T extends JetClassOrObject> extends PsiJetStubWithFqName<T> {
boolean isLocal();
@NotNull
List<String> getSuperNames();
}
@@ -50,13 +50,29 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
return node.getElementType() != JetStubElementTypes.ENUM_ENTRY ? new JetClass(node) : new JetEnumEntry(node);
}
@Override
public boolean shouldCreateStub(ASTNode node) {
return true;
}
@Override
public PsiJetClassStub createStub(@NotNull JetClass psi, StubElement parentStub) {
FqName fqName = JetPsiUtil.getFQName(psi);
boolean isEnumEntry = psi instanceof JetEnumEntry;
List<String> superNames = PsiUtilPackage.getSuperNames(psi);
return new PsiJetClassStubImpl(getStubType(isEnumEntry), parentStub, fqName != null ? fqName.asString() : null, psi.getName(),
superNames, psi.isTrait(), psi.isEnum(), isEnumEntry, psi.isAnnotation(), psi.isInner());
return new PsiJetClassStubImpl(
getStubType(isEnumEntry),
parentStub,
fqName != null ? fqName.asString() : null,
psi.getName(),
superNames,
psi.isTrait(),
psi.isEnum(),
isEnumEntry,
psi.isAnnotation(),
psi.isInner(),
JetPsiUtil.isLocal(psi)
);
}
@Override
@@ -69,6 +85,7 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
dataStream.writeBoolean(stub.isEnumEntry());
dataStream.writeBoolean(stub.isAnnotation());
dataStream.writeBoolean(stub.isInner());
dataStream.writeBoolean(stub.isLocal());
List<String> superNames = stub.getSuperNames();
dataStream.writeVarInt(superNames.size());
@@ -87,6 +104,7 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
boolean isEnumEntry = dataStream.readBoolean();
boolean isAnnotation = dataStream.readBoolean();
boolean isInner = dataStream.readBoolean();
boolean isLocal = dataStream.readBoolean();
int superCount = dataStream.readVarInt();
StringRef[] superNames = StringRef.createArray(superCount);
@@ -95,7 +113,7 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
}
return new PsiJetClassStubImpl(getStubType(isEnumEntry), parentStub, qualifiedName, name, superNames,
isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner);
isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner, isLocal);
}
@Override
@@ -36,7 +36,7 @@ import org.jetbrains.jet.plugin.JetLanguage;
import java.io.IOException;
public class JetFileElementType extends IStubFileElementType<PsiJetFileStub> {
public static final int STUB_VERSION = 25;
public static final int STUB_VERSION = 26;
public JetFileElementType() {
super("jet.FILE", JetLanguage.INSTANCE);
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.psi.stubs.elements;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.IndexSink;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubInputStream;
@@ -27,6 +26,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage;
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetObjectStubImpl;
@@ -52,15 +52,7 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
@Override
public boolean shouldCreateStub(ASTNode node) {
if (super.shouldCreateStub(node)) {
PsiElement psiElement = node.getPsi();
if (psiElement instanceof JetObjectDeclaration) {
JetObjectDeclaration objectDeclaration = (JetObjectDeclaration) psiElement;
return objectDeclaration.getName() != null || isClassObject(objectDeclaration);
}
}
return false;
return true;
}
@Override
@@ -69,7 +61,14 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
FqName fqName = psi.getFqName();
List<String> superNames = PsiUtilPackage.getSuperNames(psi);
return new PsiJetObjectStubImpl(
JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, superNames, psi.isTopLevel(), isClassObject(psi)
JetStubElementTypes.OBJECT_DECLARATION,
parentStub,
name,
fqName,
superNames,
psi.isTopLevel(),
isClassObject(psi),
JetPsiUtil.isLocal(psi)
);
}
@@ -82,6 +81,7 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
dataStream.writeBoolean(stub.isTopLevel());
dataStream.writeBoolean(stub.isClassObject());
dataStream.writeBoolean(stub.isLocal());
List<String> superNames = stub.getSuperNames();
dataStream.writeVarInt(superNames.size());
@@ -99,6 +99,7 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
boolean isTopLevel = dataStream.readBoolean();
boolean isClassObject = dataStream.readBoolean();
boolean isLocal = dataStream.readBoolean();
int superCount = dataStream.readVarInt();
StringRef[] superNames = StringRef.createArray(superCount);
@@ -106,7 +107,9 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
superNames[i] = dataStream.readName();
}
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, superNames, isTopLevel, isClassObject);
return new PsiJetObjectStubImpl(
JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, superNames, isTopLevel, isClassObject, isLocal
);
}
@Override
@@ -40,6 +40,7 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
private final boolean isEnumEntry;
private final boolean isAnnotation;
private final boolean isInner;
private final boolean isLocal;
public PsiJetClassStubImpl(
JetClassElementType type,
@@ -47,9 +48,9 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
@Nullable String qualifiedName,
String name,
List<String> superNames,
boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, boolean isInner) {
boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, boolean isInner, boolean isLocal) {
this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), wrapStrings(superNames),
isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner);
isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner, isLocal);
}
public PsiJetClassStubImpl(
@@ -62,7 +63,8 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
boolean isEnumClass,
boolean isEnumEntry,
boolean isAnnotation,
boolean isInner) {
boolean isInner,
boolean isLocal) {
super(parent, type);
this.qualifiedName = qualifiedName;
this.name = name;
@@ -72,6 +74,7 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
this.isEnumEntry = isEnumEntry;
this.isAnnotation = isAnnotation;
this.isInner = isInner;
this.isLocal = isLocal;
}
private static StringRef[] wrapStrings(List<String> names) {
@@ -116,6 +119,11 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
return isInner;
}
@Override
public boolean isLocal() {
return isLocal;
}
@Override
public String getName() {
return StringRef.toString(name);
@@ -156,6 +164,10 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
builder.append("inner ");
}
if (isLocal()) {
builder.append("local ");
}
builder.append("name=").append(getName());
builder.append(" fqn=").append(getFqName());
builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]");
@@ -37,6 +37,7 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
private final StringRef[] superNames;
private final boolean isTopLevel;
private final boolean isClassObject;
private final boolean isLocal;
public PsiJetObjectStubImpl(
@NotNull IStubElementType elementType,
@@ -45,9 +46,10 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
@Nullable FqName fqName,
@NotNull List<String> superNames,
boolean isTopLevel,
boolean isClassObject
boolean isClassObject,
boolean isLocal
) {
this(elementType, parent, StringRef.fromString(name), fqName, Utils.instance$.wrapStrings(superNames), isTopLevel, isClassObject);
this(elementType, parent, StringRef.fromString(name), fqName, Utils.instance$.wrapStrings(superNames), isTopLevel, isClassObject, isLocal);
}
public PsiJetObjectStubImpl(
@@ -57,7 +59,8 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
@Nullable FqName fqName,
@NotNull StringRef[] superNames,
boolean isTopLevel,
boolean isClassObject) {
boolean isClassObject,
boolean isLocal) {
super(parent, elementType);
this.name = name;
@@ -65,6 +68,7 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
this.superNames = superNames;
this.isTopLevel = isTopLevel;
this.isClassObject = isClassObject;
this.isLocal = isLocal;
}
@Override
@@ -98,6 +102,11 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
return isClassObject;
}
@Override
public boolean isLocal() {
return isLocal;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
@@ -112,6 +121,10 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
builder.append("top ");
}
if (isLocal()) {
builder.append("local ");
}
builder.append("name=").append(getName());
builder.append(" fqName=").append(fqName != null ? fqName.toString() : "null");
builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]");
@@ -47,23 +47,16 @@ public class StubIndexServiceImpl implements StubIndexService {
if (name != null) {
sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name);
}
FqName fqn = stub.getFqName();
if (fqn != null) {
sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqn.asString());
}
indexSuperNames(stub, sink);
recordClassOrObjectByPackage(stub, sink);
}
private static <T extends JetClassOrObject> void indexSuperNames(PsiJetClassOrObjectStub<T> stub, IndexSink sink) {
for (String superName : stub.getSuperNames()) {
sink.occurrence(JetSuperClassIndex.getInstance().getKey(), superName);
}
}
@Override
public void indexObject(PsiJetObjectStub stub, IndexSink sink) {
String name = stub.getName();
@@ -80,14 +73,13 @@ public class StubIndexServiceImpl implements StubIndexService {
fqName = parentFqName.child(Name.identifier(name));
}
}
else {
assert name != null;
}
sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name);
if (name != null) {
sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name);
if (stub.isTopLevel()) {
sink.occurrence(JetTopLevelShortObjectNameIndex.getInstance().getKey(), name);
if (stub.isTopLevel()) {
sink.occurrence(JetTopLevelShortObjectNameIndex.getInstance().getKey(), name);
}
}
if (fqName != null) {
@@ -95,10 +87,15 @@ public class StubIndexServiceImpl implements StubIndexService {
}
indexSuperNames(stub, sink);
recordClassOrObjectByPackage(stub, sink);
}
private static void indexSuperNames(PsiJetClassOrObjectStub<? extends JetClassOrObject> stub, IndexSink sink) {
for (String superName : stub.getSuperNames()) {
sink.occurrence(JetSuperClassIndex.getInstance().getKey(), superName);
}
}
private static void recordClassOrObjectByPackage(StubElement<? extends JetClassOrObject> stub, IndexSink sink) {
StubElement parentStub = stub.getParentStub();
if (parentStub instanceof PsiJetFileStub) {
@@ -27,9 +27,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetFileStubBuilder;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import org.jetbrains.jet.plugin.JetFileType;
@@ -86,8 +84,9 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
public void testFunctionInNotNamedObject() {
doBuildTest("object { fun testing() = 12 }",
"PsiJetFileStubImpl[package=]\n" +
" FUN:PsiJetFunctionStubImpl[name=testing]\n" +
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n");
" OBJECT_DECLARATION:PsiJetObjectStubImpl[top name=null fqName=null superNames=[]]\n" +
" FUN:PsiJetFunctionStubImpl[name=testing]\n" +
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n");
}
public void testFunctionParameters() {
@@ -99,13 +98,6 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
" VALUE_PARAMETER:PsiJetParameterStubImpl[val name=other typeText=String defaultValue=\"hello\"]\n");
}
public void testNotStoreInFunction() {
doBuildTest("fun some() { val test = 12;\n fun fake() {}\n class FakeClass\n }",
"PsiJetFileStubImpl[package=]\n" +
" FUN:PsiJetFunctionStubImpl[top topFQName=some name=some]\n" +
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n");
}
public void testPackageProperty() {
doBuildTest("package test.testing\n" +
"val some = 12",
@@ -175,6 +167,26 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
" CLASS:PsiJetClassStubImpl[inner name=B fqn=A.B superNames=[]]\n");
}
public void testLocalClass() {
doBuildTest("class A\ntrait T\nfun foo() { class Test: A(), T }",
"PsiJetFileStubImpl[package=]\n" +
" CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" +
" CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" +
" FUN:PsiJetFunctionStubImpl[top topFQName=foo name=foo]\n" +
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n" +
" CLASS:PsiJetClassStubImpl[local name=Test fqn=null superNames=[AT]]\n");
}
public void testLocalClassInLocalFunction() {
doBuildTest("class A\ntrait T\nfun foo() { fun bar() { class Test: A(), T } }",
"PsiJetFileStubImpl[package=]\n" +
" CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" +
" CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" +
" FUN:PsiJetFunctionStubImpl[top topFQName=foo name=foo]\n" +
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n" +
" CLASS:PsiJetClassStubImpl[local name=Test fqn=null superNames=[AT]]\n");
}
public void testNamedObject() {
doBuildTest("class A\ntrait T\nobject Test: A(), T {}",
"PsiJetFileStubImpl[package=]\n" +
@@ -183,6 +195,25 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
" OBJECT_DECLARATION:PsiJetObjectStubImpl[top name=Test fqName=Test superNames=[AT]]\n");
}
public void testLocalNamedObject() {
doBuildTest("class A\ntrait T\nfun foo() { object O: A(), T }",
"PsiJetFileStubImpl[package=]\n" +
" CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" +
" CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" +
" FUN:PsiJetFunctionStubImpl[top topFQName=foo name=foo]\n" +
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n" +
" OBJECT_DECLARATION:PsiJetObjectStubImpl[local name=O fqName=null superNames=[AT]]\n");
}
public void testAnonymousObject() {
doBuildTest("class A\ntrait T\nval obj = object : A(), T",
"PsiJetFileStubImpl[package=]\n" +
" CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" +
" CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" +
" PROPERTY:PsiJetPropertyStubImpl[val top topFQName=obj name=obj typeText=null bodyText=object : A(), T]\n" +
" OBJECT_DECLARATION:PsiJetObjectStubImpl[local name=null fqName=null superNames=[AT]]\n");
}
public void testAnnotationOnClass() {
doBuildTest("Deprecated class Test {}",
"PsiJetFileStubImpl[package=]\n" +