Navigation: Support NEW_AS_CONSTRUCTOR flag for constructor calls
#KT-15398 Fixed #KT-15536 Fixed
This commit is contained in:
+12
-5
@@ -16,17 +16,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.search.ideaExtensions
|
package org.jetbrains.kotlin.idea.search.ideaExtensions
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.JavaTargetElementEvaluator
|
||||||
import com.intellij.codeInsight.TargetElementEvaluatorEx
|
import com.intellij.codeInsight.TargetElementEvaluatorEx
|
||||||
import com.intellij.codeInsight.TargetElementUtil
|
import com.intellij.codeInsight.TargetElementUtil
|
||||||
import com.intellij.codeInsight.TargetElementUtilExtender
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiReference
|
import com.intellij.psi.PsiReference
|
||||||
import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference
|
import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.isAbstract
|
|
||||||
|
|
||||||
class KotlinTargetElementEvaluator : TargetElementEvaluatorEx {
|
class KotlinTargetElementEvaluator : TargetElementEvaluatorEx {
|
||||||
override fun includeSelfInGotoImplementation(element: PsiElement): Boolean = !(element is KtClass && element.isAbstract())
|
override fun includeSelfInGotoImplementation(element: PsiElement): Boolean = !(element is KtClass && element.isAbstract())
|
||||||
@@ -36,6 +34,15 @@ class KotlinTargetElementEvaluator : TargetElementEvaluatorEx {
|
|||||||
if (ref is KtDestructuringDeclarationReference && flags.and(TargetElementUtil.ELEMENT_NAME_ACCEPTED) != 0) {
|
if (ref is KtDestructuringDeclarationReference && flags.and(TargetElementUtil.ELEMENT_NAME_ACCEPTED) != 0) {
|
||||||
return ref.element
|
return ref.element
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val refExpression = ref.element as? KtSimpleNameExpression
|
||||||
|
val calleeExpression = refExpression?.getParentOfTypeAndBranch<KtCallElement> { calleeExpression }
|
||||||
|
if (calleeExpression != null) {
|
||||||
|
(ref.resolve() as? KtConstructor<*>)?.let {
|
||||||
|
return if (flags and JavaTargetElementEvaluator.NEW_AS_CONSTRUCTOR != 0) it else it.containingClassOrObject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass
|
||||||
|
// OPTIONS: usages, constructorUsages
|
||||||
|
annotation class MyAnnotation()
|
||||||
|
|
||||||
|
@<caret>MyAnnotation
|
||||||
|
fun test() {
|
||||||
|
MyAnnotation::class.java
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Annotation 5 @MyAnnotation
|
||||||
|
Unclassified usage 7 MyAnnotation::class.java
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass
|
||||||
|
// OPTIONS: usages, constructorUsages
|
||||||
|
fun test() {
|
||||||
|
val kk: KK = <caret>KK()
|
||||||
|
}
|
||||||
|
|
||||||
|
class KK()
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Local variable declaration 4 val kk: KK = KK()
|
||||||
|
New instance creation 4 val kk: KK = KK()
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass
|
||||||
|
// OPTIONS: usages, constructorUsages
|
||||||
|
fun test() {
|
||||||
|
val kk: KK = <caret>KK()
|
||||||
|
}
|
||||||
|
|
||||||
|
class KK {
|
||||||
|
constructor()
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Local variable declaration 4 val kk: KK = KK()
|
||||||
|
New instance creation 4 val kk: KK = KK()
|
||||||
@@ -979,6 +979,18 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("annotationEntry.0.kt")
|
||||||
|
public void testAnnotationEntry() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("constructorCall.0.kt")
|
||||||
|
public void testConstructorCall() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jvmOverloaded.0.kt")
|
@TestMetadata("jvmOverloaded.0.kt")
|
||||||
public void testJvmOverloaded() throws Exception {
|
public void testJvmOverloaded() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.0.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.0.kt");
|
||||||
@@ -1195,6 +1207,12 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("constructorCall.0.kt")
|
||||||
|
public void testConstructorCall() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("defaultSecondaryConstructor.0.kt")
|
@TestMetadata("defaultSecondaryConstructor.0.kt")
|
||||||
public void testDefaultSecondaryConstructor() throws Exception {
|
public void testDefaultSecondaryConstructor() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.0.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.0.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user