Class object FqNames indexed properly

#KT-3337 In Progress
LightClasses: class object's property getter unresolved in Java, but compiles OK
This commit is contained in:
Andrey Breslav
2013-02-14 19:48:56 +04:00
parent 53b2bbad68
commit 15938e3d28
6 changed files with 59 additions and 13 deletions
@@ -25,4 +25,5 @@ public interface PsiJetObjectStub extends NamedStub<JetObjectDeclaration> {
@Nullable
FqName getFQName();
boolean isTopLevel();
boolean isClassObject();
}
@@ -35,7 +35,7 @@ import org.jetbrains.jet.plugin.JetLanguage;
import java.io.IOException;
public class JetFileElementType extends IStubFileElementType<PsiJetFileStub> {
public static final int STUB_VERSION = 21;
public static final int STUB_VERSION = 22;
public JetFileElementType() {
super("jet.FILE", JetLanguage.INSTANCE);
@@ -25,6 +25,7 @@ import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.util.io.StringRef;
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.stubs.PsiJetObjectStub;
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetObjectStubImpl;
@@ -53,7 +54,7 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
PsiElement psiElement = node.getPsi();
if (psiElement instanceof JetObjectDeclaration) {
JetObjectDeclaration objectDeclaration = (JetObjectDeclaration) psiElement;
return objectDeclaration.getName() != null;
return objectDeclaration.getName() != null || isClassObject(objectDeclaration);
}
}
@@ -63,10 +64,8 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
@Override
public PsiJetObjectStub createStub(@NotNull JetObjectDeclaration psi, @NotNull StubElement parentStub) {
String name = psi.getName();
assert name != null;
FqName fqName = psi.getFqName();
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, psi.isTopLevel());
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, psi.isTopLevel(), isClassObject(psi));
}
@Override
@@ -75,6 +74,7 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
FqName fqName = stub.getFQName();
dataStream.writeName(fqName != null ? fqName.toString() : null);
dataStream.writeBoolean(stub.isTopLevel());
dataStream.writeBoolean(stub.isClassObject());
}
@Override
@@ -83,12 +83,17 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
StringRef fqNameStr = dataStream.readName();
FqName fqName = fqNameStr != null ? new FqName(fqNameStr.toString()) : null;
boolean isTopLevel = dataStream.readBoolean();
boolean isClassObject = dataStream.readBoolean();
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, isTopLevel);
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, isTopLevel, isClassObject);
}
@Override
public void indexStub(PsiJetObjectStub stub, IndexSink sink) {
StubIndexServiceFactory.getInstance().indexObject(stub, sink);
}
private static boolean isClassObject(@NotNull JetObjectDeclaration objectDeclaration) {
return objectDeclaration.getParent() instanceof JetClassObject;
}
}
@@ -30,27 +30,32 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
private final StringRef name;
private final FqName fqName;
private final boolean isTopLevel;
private final boolean isClassObject;
public PsiJetObjectStubImpl(
@NotNull IStubElementType elementType,
@NotNull StubElement parent,
@NotNull String name,
@Nullable String name,
@Nullable FqName fqName,
boolean isTopLevel) {
this(elementType, parent, StringRef.fromString(name), fqName, isTopLevel);
boolean isTopLevel,
boolean isClassObject
) {
this(elementType, parent, StringRef.fromString(name), fqName, isTopLevel, isClassObject);
}
public PsiJetObjectStubImpl(
@NotNull IStubElementType elementType,
@NotNull StubElement parent,
@NotNull StringRef name,
@Nullable StringRef name,
@Nullable FqName fqName,
boolean isTopLevel) {
boolean isTopLevel,
boolean isClassObject) {
super(parent, elementType);
this.name = name;
this.fqName = fqName;
this.isTopLevel = isTopLevel;
this.isClassObject = isClassObject;
}
@Override
@@ -69,12 +74,21 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
return isTopLevel;
}
@Override
public boolean isClassObject() {
return isClassObject;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("PsiJetObjectStubImpl[");
if (isClassObject) {
builder.append("class-object ");
}
if (isTopLevel) {
builder.append("top ");
}
@@ -21,7 +21,9 @@ import com.intellij.psi.stubs.StubElement;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.stubs.*;
import org.jetbrains.jet.lang.psi.stubs.elements.StubIndexService;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
public class StubIndexServiceImpl implements StubIndexService {
@@ -61,7 +63,22 @@ public class StubIndexServiceImpl implements StubIndexService {
@Override
public void indexObject(PsiJetObjectStub stub, IndexSink sink) {
String name = stub.getName();
assert name != null;
FqName fqName = stub.getFQName();
if (stub.isClassObject()) {
StubElement parentStub = stub.getParentStub();
assert parentStub instanceof PsiJetClassStub : "Something but a class is a parent to class object stub: " + parentStub;
name = JvmAbi.CLASS_OBJECT_CLASS_NAME;
String qualifiedName = ((PsiJetClassStub) parentStub).getQualifiedName();
if (qualifiedName != null) {
fqName = new FqName(qualifiedName).child(Name.identifier(name));
}
}
else {
assert name != null;
}
sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name);
@@ -69,7 +86,6 @@ public class StubIndexServiceImpl implements StubIndexService {
sink.occurrence(JetTopLevelShortObjectNameIndex.getInstance().getKey(), name);
}
FqName fqName = stub.getFQName();
if (fqName != null) {
sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqName.getFqName());
}
@@ -72,6 +72,16 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
" TYPE_PARAMETER:PsiJetTypeParameterStubImpl[name=T extendText=null]\n");
}
public void testClassObject() {
doBuildTest("class C { class object { fun foo() {} }}",
"PsiJetFileStubImpl[package=]\n" +
" CLASS:PsiJetClassStubImpl[name=C fqn=C superNames=[]]\n" +
" TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n" +
" OBJECT_DECLARATION:PsiJetObjectStubImpl[class-object name=null fqName=null]\n" +
" FUN:PsiJetFunctionStubImpl[name=foo]\n" +
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n");
}
public void testFunctionInNotNamedObject() {
doBuildTest("object { fun testing() = 12 }",
"PsiJetFileStubImpl[package=]\n" +