Make Kotlin light classes pass "element instanceof StubBasedPsiElement" in LocalSearchScope scope

This commit is contained in:
Nikolay Krasko
2015-09-01 20:52:45 +03:00
parent 853c29be5a
commit 73a24435f7
5 changed files with 44 additions and 2 deletions
@@ -25,7 +25,9 @@ import com.intellij.psi.impl.light.LightClass
import com.intellij.psi.impl.light.LightMethod import com.intellij.psi.impl.light.LightMethod
import com.intellij.psi.scope.PsiScopeProcessor import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.search.SearchScope import com.intellij.psi.search.SearchScope
import com.intellij.psi.stubs.IStubElementType
import com.intellij.psi.stubs.PsiClassHolderFileStub import com.intellij.psi.stubs.PsiClassHolderFileStub
import com.intellij.psi.stubs.StubElement
import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.IncorrectOperationException import com.intellij.util.IncorrectOperationException
@@ -40,6 +42,7 @@ import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import javax.swing.Icon import javax.swing.Icon
@@ -47,8 +50,8 @@ import javax.swing.Icon
public open class KotlinLightClassForExplicitDeclaration( public open class KotlinLightClassForExplicitDeclaration(
manager: PsiManager, manager: PsiManager,
private val classFqName: FqName, // FqName of (possibly inner) class private val classFqName: FqName, // FqName of (possibly inner) class
protected val classOrObject: JetClassOrObject) : KotlinWrappingLightClass(manager), JetJavaMirrorMarker { protected val classOrObject: JetClassOrObject)
: KotlinWrappingLightClass(manager), JetJavaMirrorMarker, StubBasedPsiElement<KotlinClassOrObjectStub<out JetClassOrObject>> {
private var delegate: PsiClass? = null private var delegate: PsiClass? = null
private fun getLocalClassParent(): PsiElement? { private fun getLocalClassParent(): PsiElement? {
@@ -376,6 +379,9 @@ public open class KotlinLightClassForExplicitDeclaration(
override fun getUseScope(): SearchScope = getOrigin().useScope override fun getUseScope(): SearchScope = getOrigin().useScope
override fun getElementType(): IStubElementType<out StubElement<*>, *>? = classOrObject.elementType
override fun getStub(): KotlinClassOrObjectStub<out JetClassOrObject>? = classOrObject.stub
companion object { companion object {
private val JAVA_API_STUB = Key.create<CachedValue<OutermostKotlinClassLightClassData>>("JAVA_API_STUB") private val JAVA_API_STUB = Key.create<CachedValue<OutermostKotlinClassLightClassData>>("JAVA_API_STUB")
@@ -0,0 +1,21 @@
public class ImplementJavaInnerInterface {
interface Test {
void foo();
}
void test() {
Test test = new Test() {
@Override
public void foo() {
}
};
}
void usage(Test test) {
test.<caret>foo();
}
}
// REF: (in KotlinTest).foo()
// REF: <anonymous>.foo()
@@ -0,0 +1,3 @@
class KotlinTest : ImplementJavaInnerInterface.Test {
override fun foo() {}
}
@@ -62,10 +62,18 @@ public class JetGotoImplementationMultifileTest extends JetLightCodeInsightFixtu
doKotlinJavaTest(); doKotlinJavaTest();
} }
public void testImplementJavaInnerInterface() throws Exception {
doJavaKotlinTest();
}
private void doKotlinJavaTest() throws Exception { private void doKotlinJavaTest() throws Exception {
doMultifileTest(getTestName(false) + ".kt", getTestName(false) + ".java"); doMultifileTest(getTestName(false) + ".kt", getTestName(false) + ".java");
} }
private void doJavaKotlinTest() throws Exception {
doMultifileTest(getTestName(false) + ".java", getTestName(false) + ".kt");
}
@NotNull @NotNull
@Override @Override
protected LightProjectDescriptor getProjectDescriptor() { protected LightProjectDescriptor getProjectDescriptor() {
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.test;
import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem; import com.intellij.navigation.NavigationItem;
import com.intellij.psi.PsiAnonymousClass;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPackage; import com.intellij.psi.PsiPackage;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
@@ -49,6 +50,9 @@ public final class ReferenceUtils {
String presentableText = presentation.getPresentableText(); String presentableText = presentation.getPresentableText();
String locationString = presentation.getLocationString(); String locationString = presentation.getLocationString();
if (locationString == null && element.getParent() instanceof PsiAnonymousClass) {
locationString = "<anonymous>";
}
return locationString == null || navigationElement instanceof PsiPackage return locationString == null || navigationElement instanceof PsiPackage
// for PsiPackage, presentableText is FQ name of current package // for PsiPackage, presentableText is FQ name of current package
? presentableText ? presentableText