From 15938e3d280ade6c87c3c35e64fd8e2a7c6b6bc4 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 14 Feb 2013 19:48:56 +0400 Subject: [PATCH] Class object FqNames indexed properly #KT-3337 In Progress LightClasses: class object's property getter unresolved in Java, but compiles OK --- .../jet/lang/psi/stubs/PsiJetObjectStub.java | 1 + .../stubs/elements/JetFileElementType.java | 2 +- .../stubs/elements/JetObjectElementType.java | 15 ++++++++---- .../psi/stubs/impl/PsiJetObjectStubImpl.java | 24 +++++++++++++++---- .../stubindex/StubIndexServiceImpl.java | 20 ++++++++++++++-- .../jet/plugin/stubs/JetStubsTest.java | 10 ++++++++ 6 files changed, 59 insertions(+), 13 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetObjectStub.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetObjectStub.java index 02651c4e2e9..a11ca689de0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetObjectStub.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetObjectStub.java @@ -25,4 +25,5 @@ public interface PsiJetObjectStub extends NamedStub { @Nullable FqName getFQName(); boolean isTopLevel(); + boolean isClassObject(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java index c2f68a299f2..489ed2695fe 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java @@ -35,7 +35,7 @@ import org.jetbrains.jet.plugin.JetLanguage; import java.io.IOException; public class JetFileElementType extends IStubFileElementType { - public static final int STUB_VERSION = 21; + public static final int STUB_VERSION = 22; public JetFileElementType() { super("jet.FILE", JetLanguage.INSTANCE); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java index 436a6cd0f3d..660f3374226 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java @@ -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 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 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 "); } diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java b/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java index 01987814f04..68f2ebeb3a6 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java @@ -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()); } diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java index 2a2a973b3d1..82163890101 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java @@ -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" +