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 @Nullable
FqName getFQName(); FqName getFQName();
boolean isTopLevel(); boolean isTopLevel();
boolean isClassObject();
} }
@@ -35,7 +35,7 @@ import org.jetbrains.jet.plugin.JetLanguage;
import java.io.IOException; import java.io.IOException;
public class JetFileElementType extends IStubFileElementType<PsiJetFileStub> { public class JetFileElementType extends IStubFileElementType<PsiJetFileStub> {
public static final int STUB_VERSION = 21; public static final int STUB_VERSION = 22;
public JetFileElementType() { public JetFileElementType() {
super("jet.FILE", JetLanguage.INSTANCE); super("jet.FILE", JetLanguage.INSTANCE);
@@ -25,6 +25,7 @@ import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.util.io.StringRef; import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; 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.JetObjectDeclaration;
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub; import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetObjectStubImpl; import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetObjectStubImpl;
@@ -53,7 +54,7 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
PsiElement psiElement = node.getPsi(); PsiElement psiElement = node.getPsi();
if (psiElement instanceof JetObjectDeclaration) { if (psiElement instanceof JetObjectDeclaration) {
JetObjectDeclaration objectDeclaration = (JetObjectDeclaration) psiElement; 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 @Override
public PsiJetObjectStub createStub(@NotNull JetObjectDeclaration psi, @NotNull StubElement parentStub) { public PsiJetObjectStub createStub(@NotNull JetObjectDeclaration psi, @NotNull StubElement parentStub) {
String name = psi.getName(); String name = psi.getName();
assert name != null;
FqName fqName = psi.getFqName(); 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 @Override
@@ -75,6 +74,7 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
FqName fqName = stub.getFQName(); FqName fqName = stub.getFQName();
dataStream.writeName(fqName != null ? fqName.toString() : null); dataStream.writeName(fqName != null ? fqName.toString() : null);
dataStream.writeBoolean(stub.isTopLevel()); dataStream.writeBoolean(stub.isTopLevel());
dataStream.writeBoolean(stub.isClassObject());
} }
@Override @Override
@@ -83,12 +83,17 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
StringRef fqNameStr = dataStream.readName(); StringRef fqNameStr = dataStream.readName();
FqName fqName = fqNameStr != null ? new FqName(fqNameStr.toString()) : null; FqName fqName = fqNameStr != null ? new FqName(fqNameStr.toString()) : null;
boolean isTopLevel = dataStream.readBoolean(); 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 @Override
public void indexStub(PsiJetObjectStub stub, IndexSink sink) { public void indexStub(PsiJetObjectStub stub, IndexSink sink) {
StubIndexServiceFactory.getInstance().indexObject(stub, 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 StringRef name;
private final FqName fqName; private final FqName fqName;
private final boolean isTopLevel; private final boolean isTopLevel;
private final boolean isClassObject;
public PsiJetObjectStubImpl( public PsiJetObjectStubImpl(
@NotNull IStubElementType elementType, @NotNull IStubElementType elementType,
@NotNull StubElement parent, @NotNull StubElement parent,
@NotNull String name, @Nullable String name,
@Nullable FqName fqName, @Nullable FqName fqName,
boolean isTopLevel) { boolean isTopLevel,
this(elementType, parent, StringRef.fromString(name), fqName, isTopLevel); boolean isClassObject
) {
this(elementType, parent, StringRef.fromString(name), fqName, isTopLevel, isClassObject);
} }
public PsiJetObjectStubImpl( public PsiJetObjectStubImpl(
@NotNull IStubElementType elementType, @NotNull IStubElementType elementType,
@NotNull StubElement parent, @NotNull StubElement parent,
@NotNull StringRef name, @Nullable StringRef name,
@Nullable FqName fqName, @Nullable FqName fqName,
boolean isTopLevel) { boolean isTopLevel,
boolean isClassObject) {
super(parent, elementType); super(parent, elementType);
this.name = name; this.name = name;
this.fqName = fqName; this.fqName = fqName;
this.isTopLevel = isTopLevel; this.isTopLevel = isTopLevel;
this.isClassObject = isClassObject;
} }
@Override @Override
@@ -69,12 +74,21 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
return isTopLevel; return isTopLevel;
} }
@Override
public boolean isClassObject() {
return isClassObject;
}
@Override @Override
public String toString() { public String toString() {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.append("PsiJetObjectStubImpl["); builder.append("PsiJetObjectStubImpl[");
if (isClassObject) {
builder.append("class-object ");
}
if (isTopLevel) { if (isTopLevel) {
builder.append("top "); 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.JetClassOrObject;
import org.jetbrains.jet.lang.psi.stubs.*; import org.jetbrains.jet.lang.psi.stubs.*;
import org.jetbrains.jet.lang.psi.stubs.elements.StubIndexService; 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.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
public class StubIndexServiceImpl implements StubIndexService { public class StubIndexServiceImpl implements StubIndexService {
@@ -61,7 +63,22 @@ public class StubIndexServiceImpl implements StubIndexService {
@Override @Override
public void indexObject(PsiJetObjectStub stub, IndexSink sink) { public void indexObject(PsiJetObjectStub stub, IndexSink sink) {
String name = stub.getName(); 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); sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name);
@@ -69,7 +86,6 @@ public class StubIndexServiceImpl implements StubIndexService {
sink.occurrence(JetTopLevelShortObjectNameIndex.getInstance().getKey(), name); sink.occurrence(JetTopLevelShortObjectNameIndex.getInstance().getKey(), name);
} }
FqName fqName = stub.getFQName();
if (fqName != null) { if (fqName != null) {
sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqName.getFqName()); sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqName.getFqName());
} }
@@ -72,6 +72,16 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
" TYPE_PARAMETER:PsiJetTypeParameterStubImpl[name=T extendText=null]\n"); " 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() { public void testFunctionInNotNamedObject() {
doBuildTest("object { fun testing() = 12 }", doBuildTest("object { fun testing() = 12 }",
"PsiJetFileStubImpl[package=]\n" + "PsiJetFileStubImpl[package=]\n" +