diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index ee2603e5f9b..09a1c78770a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -54,8 +54,13 @@ public fun PsiReference.matchesTarget(candidateTarget: PsiElement): Boolean { || it is JetObjectDeclaration && it.isCompanion() && it.getNonStrictParentOfType() == unwrappedCandidate } } - else { - if (targets.any { unwrappedCandidate.isConstructorOf(it) }) return true + // TODO: Workaround for Kotlin constructor search in Java code. To be removed after refactoring of the search API + else if (this is PsiJavaCodeReferenceElement && unwrappedCandidate is JetSecondaryConstructor) { + var parent = getElement().getParent() + if (parent is PsiAnonymousClass) { + parent = parent.getParent() + } + if ((parent as? PsiNewExpression)?.resolveConstructor()?.unwrapped == unwrappedCandidate) return true } if (this is PsiReferenceExpression && candidateTarget is JetObjectDeclaration && unwrappedTargets.size() == 1) { val referredClass = unwrappedTargets.first() diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt index 4e4a8befd00..bfe02c2a785 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt @@ -40,6 +40,11 @@ import org.jetbrains.kotlin.idea.util.application.runReadAction import java.util.Collections import com.intellij.find.findUsages.JavaFindUsagesHandler import com.intellij.find.findUsages.JavaFindUsagesHandlerFactory +import com.intellij.psi.PsiMethod +import com.intellij.psi.search.searches.MethodReferencesSearch +import com.intellij.util.CommonProcessors +import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages public class KotlinFindClassUsagesHandler( jetClass: JetClassOrObject, @@ -78,12 +83,23 @@ public class KotlinFindClassUsagesHandler( val classOrObject = element as JetClassOrObject + val uniqueProcessor = CommonProcessors.UniqueProcessor(processor) + return runReadAction { val target = kotlinOptions.toSearchTarget(classOrObject, true) val classUsages = kotlinOptions.toClassHelper().newRequest(target).search() val declarationUsages = kotlinOptions.toClassDeclarationsHelper().newRequest(target).search() - (classUsages + declarationUsages).all { ref -> KotlinFindUsagesHandler.processUsage(processor, ref) } && processInheritors() + if (kotlinOptions.searchConstructorUsages) { + val constructors = classOrObject.toLightClass()?.getConstructors() ?: PsiMethod.EMPTY_ARRAY + for (constructor in constructors) { + constructor.processDelegationCallConstructorUsages(constructor.getUseScope()) { + it.getCalleeExpression()?.getReference()?.let { KotlinFindUsagesHandler.processUsage(uniqueProcessor, it) } + } + } + } + + (classUsages + declarationUsages).all { KotlinFindUsagesHandler.processUsage(uniqueProcessor, it)} && processInheritors() } } diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java index 843e76a4c9b..1fb3f39cda7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java @@ -26,17 +26,13 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiReference; import com.intellij.psi.search.PsiElementProcessor; import com.intellij.psi.search.PsiElementProcessorAdapter; -import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.usageView.UsageInfo; +import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; -import jet.runtime.typeinfo.JetValueParameter; -import kotlin.Function1; -import kotlin.Unit; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.asJava.LightClassUtil; -import org.jetbrains.kotlin.descriptors.ConstructorDescriptor; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.idea.findUsages.*; import org.jetbrains.kotlin.idea.findUsages.dialogs.KotlinFindFunctionUsagesDialog; import org.jetbrains.kotlin.idea.findUsages.dialogs.KotlinFindPropertyUsagesDialog; @@ -44,7 +40,6 @@ import org.jetbrains.kotlin.idea.search.declarationsSearch.DeclarationsSearchPac import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest; import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearch; import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchHelper; -import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchPackage; import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchRequest; import org.jetbrains.kotlin.psi.*; @@ -158,18 +153,23 @@ public abstract class KotlinFindMemberUsagesHandlertoSearchTarget(options, (T) element, true)); + final CommonProcessors.UniqueProcessor uniqueProcessor = + new CommonProcessors.UniqueProcessor(processor); + for (PsiReference ref : UsagesSearch.INSTANCE$.search(request)) { - processUsage(processor, ref); + processUsage(uniqueProcessor, ref); } - if (element instanceof JetSecondaryConstructor || element instanceof PsiMethod) { - UsagesSearchPackage.processDelegationCallConstructorUsages(element, options.searchScope, new Function1() { - @Override - public Unit invoke(PsiElement element) { - processUsage(processor, element); - return null; - } - }); + PsiMethod psiMethod = + element instanceof PsiMethod + ? (PsiMethod) element + : element instanceof JetSecondaryConstructor + ? LightClassUtil.getLightClassMethod((JetFunction) element) + : null; + if (psiMethod != null) { + for (PsiReference ref : MethodReferencesSearch.search(psiMethod, options.searchScope, true)) { + processUsage(uniqueProcessor, ref.getElement()); + } } if (kotlinOptions.getSearchOverrides()) { @@ -180,7 +180,7 @@ public abstract class KotlinFindMemberUsagesHandler() { @Override public boolean execute(@NotNull PsiMethod method) { - return processUsage(processor, method.getNavigationElement()); + return processUsage(uniqueProcessor, method.getNavigationElement()); } } ) diff --git a/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.0.java b/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.0.java new file mode 100644 index 00000000000..000b72c9223 --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.0.java @@ -0,0 +1,7 @@ +// PSI_ELEMENT: com.intellij.psi.PsiMethod +// OPTIONS: usages +public class J { + public J(int i) { + + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.1.kt b/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.1.kt new file mode 100644 index 00000000000..f2c2b62bf92 --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.1.kt @@ -0,0 +1,13 @@ +class A: J { + constructor(): super(1) { + + } +} + +class B: J(1) { + +} + +fun test() { + J(2) +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.results.txt b/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.results.txt new file mode 100644 index 00000000000..619a2a1cbad --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.results.txt @@ -0,0 +1,3 @@ +New instance creation (12: 5) J(2) +Supertype (7: 10) class B: J(1) { +Unclassified usage (2: 20) constructor(): super(1) { \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.0.java b/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.0.java new file mode 100644 index 00000000000..5a59e680d7a --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.0.java @@ -0,0 +1,7 @@ +// PSI_ELEMENT: com.intellij.psi.PsiMethod +// OPTIONS: usages +public class J { + public J() { + + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.1.kt b/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.1.kt new file mode 100644 index 00000000000..e9052cfc830 --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.1.kt @@ -0,0 +1,17 @@ +class A: J { + constructor(i: Int): super() { + + } + + constructor() { + + } +} + +class B: J() { + +} + +fun test() { + J() +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.results.txt b/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.results.txt new file mode 100644 index 00000000000..665a47ab14f --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.results.txt @@ -0,0 +1,4 @@ +New instance creation (16: 5) J() +Supertype (11: 10) class B: J() { +Unclassified usage (2: 26) constructor(i: Int): super() { +Unclassified usage (6: 19) constructor() { \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.0.java b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.0.java new file mode 100644 index 00000000000..6a7f22cfaa4 --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.0.java @@ -0,0 +1,12 @@ +// PSI_ELEMENT: com.intellij.psi.PsiMethod +// FIND_BY_REF +// OPTIONS: usages +public class JJ extends B { + public JJ(int i) { + super(""); + } + + void test() { + new B(""); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.1.kt b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.1.kt new file mode 100644 index 00000000000..30d9c9d819a --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.1.kt @@ -0,0 +1,23 @@ +open class B { + constructor(): this("") { + + } + + constructor(s: String) { + + } +} + +open class A : B { + constructor(a: Int) : super("") { + + } +} + +class C : B("") { + +} + +fun test() { + B("") +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.results.txt b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.results.txt new file mode 100644 index 00000000000..966a8bc7257 --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.results.txt @@ -0,0 +1,6 @@ +New instance creation (10: 13) new B(""); +New instance creation (22: 5) B("") +Supertype (17: 11) class C : B("") { +Unclassified usage (12: 27) constructor(a: Int) : super("") { +Unclassified usage (2: 20) constructor(): this("") { +Unclassified usage (6: 9) super(""); \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.0.java b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.0.java new file mode 100644 index 00000000000..708299eafb1 --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.0.java @@ -0,0 +1,12 @@ +// PSI_ELEMENT: com.intellij.psi.PsiMethod +// FIND_BY_REF +// OPTIONS: usages +public class JJ extends B { + public JJ(int i) { + super(""); + } + + void test() { + new B(""); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.1.kt b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.1.kt new file mode 100644 index 00000000000..30d9c9d819a --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.1.kt @@ -0,0 +1,23 @@ +open class B { + constructor(): this("") { + + } + + constructor(s: String) { + + } +} + +open class A : B { + constructor(a: Int) : super("") { + + } +} + +class C : B("") { + +} + +fun test() { + B("") +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.results.txt b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.results.txt new file mode 100644 index 00000000000..966a8bc7257 --- /dev/null +++ b/idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.results.txt @@ -0,0 +1,6 @@ +New instance creation (10: 13) new B(""); +New instance creation (22: 5) B("") +Supertype (17: 11) class C : B("") { +Unclassified usage (12: 27) constructor(a: Int) : super("") { +Unclassified usage (2: 20) constructor(): this("") { +Unclassified usage (6: 9) super(""); \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.0.kt index f02df48f0be..2430258d3a4 100644 --- a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.0.kt +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.0.kt @@ -3,6 +3,10 @@ package server open class Server { + constructor(name: String): this() { + + } + companion object { val NAME = "Server" } diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.1.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.1.kt index 7195e473204..d5c355819a1 100644 --- a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.1.kt +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.1.kt @@ -25,6 +25,16 @@ object ClientObject: Server() { } +class Client2: Server { + constructor(name: String) { + + } + + constructor(): super() { + + } +} + fun Client.bar(s: Server) { foo(s) } diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.results.txt index 55e495cc8b8..a0c115120e8 100644 --- a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassConstructorUsages.results.txt @@ -1,2 +1,5 @@ Supertype (24: 22) object ClientObject: Server() { -Supertype (5: 15) class Client: Server() { \ No newline at end of file +Supertype (5: 15) class Client: Server() { +Unclassified usage (29: 31) constructor(name: String) { +Unclassified usage (33: 20) constructor(): super() { +Unclassified usage (6: 32) constructor(name: String): this() { \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt index d0ee39213b4..2f71ad44321 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt @@ -1,6 +1,5 @@ Unclassified usage (12: 17) public void setFoo(String s) { Unclassified usage (13: 9) set(value: String) { Unclassified usage (25: 18) override var foo: String = "" -Unclassified usage (25: 18) override var foo: String = "" Unclassified usage (7: 19) public String getFoo() { -Unclassified usage (9: 9) get() { +Unclassified usage (9: 9) get() { \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt index f4b45fe2af8..409c56f7f6e 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt @@ -1,8 +1,6 @@ Unclassified usage (11: 9) set(value: String) { Unclassified usage (12: 17) public void setFoo(String s) { Unclassified usage (23: 18) override var foo: String = "" -Unclassified usage (23: 18) override var foo: String = "" -Unclassified usage (26: 30) open class E(override var foo: T): A(foo) Unclassified usage (26: 30) open class E(override var foo: T): A(foo) Unclassified usage (7: 19) public String getFoo() { -Unclassified usage (7: 9) get() { +Unclassified usage (7: 9) get() { \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.0.kt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.0.kt new file mode 100644 index 00000000000..436b0530019 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.0.kt @@ -0,0 +1,29 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetSecondaryConstructor +// OPTIONS: usages +open class B { + constructor() { + + } + + constructor(a: Int): this() { + + } +} + +class A : B { + constructor(a: Int) : super() { + + } + + constructor() { + + } +} + +class C : B() { + +} + +fun test() { + B() +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.1.java b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.1.java new file mode 100644 index 00000000000..343ac72a29d --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.1.java @@ -0,0 +1,13 @@ +public class J extends B { + public J(int i) { + super(); + } + + public J() { + + } + + void test() { + new B(); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.results.txt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.results.txt new file mode 100644 index 00000000000..b5fa860aabf --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.results.txt @@ -0,0 +1,8 @@ +New instance creation (11: 13) new B(); +New instance creation (28: 5) B() +Supertype (23: 11) class C : B() { +Unclassified usage (14: 27) constructor(a: Int) : super() { +Unclassified usage (18: 19) constructor() { +Unclassified usage (3: 9) super(); +Unclassified usage (6: 12) public J() { +Unclassified usage (8: 26) constructor(a: Int): this() { \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.0.kt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.0.kt new file mode 100644 index 00000000000..657899f8751 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.0.kt @@ -0,0 +1,25 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetSecondaryConstructor +// OPTIONS: usages +open class B { + constructor(): this("") { + + } + + constructor(s: String) { + + } +} + +open class A : B { + constructor(a: Int) : super("") { + + } +} + +class C: B("") { + +} + +fun test() { + B("") +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.1.java b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.1.java new file mode 100644 index 00000000000..f5e3a27cd9d --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.1.java @@ -0,0 +1,9 @@ +public class JJ extends B { + public JJ(int i) { + super(""); + } + + void test() { + new B(""); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.results.txt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.results.txt new file mode 100644 index 00000000000..7c41d2ddda2 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.results.txt @@ -0,0 +1,6 @@ +New instance creation (24: 5) B("") +New instance creation (7: 13) new B(""); +Supertype (19: 10) class C: B("") { +Unclassified usage (14: 27) constructor(a: Int) : super("") { +Unclassified usage (3: 9) super(""); +Unclassified usage (4: 20) constructor(): this("") { \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/AbstractJetFindUsagesTest.java b/idea/tests/org/jetbrains/kotlin/findUsages/AbstractJetFindUsagesTest.java index 282863830fd..2560cdbaec3 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/AbstractJetFindUsagesTest.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/AbstractJetFindUsagesTest.java @@ -57,6 +57,7 @@ import org.jetbrains.kotlin.idea.findUsages.KotlinPropertyFindUsagesOptions; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.test.InTextDirectivesUtils; import org.jetbrains.kotlin.test.JetTestUtils; +import static com.intellij.codeInsight.TargetElementUtil.*; import java.io.File; import java.io.FilenameFilter; @@ -326,7 +327,7 @@ public abstract class AbstractJetFindUsagesTest extends JetLightCodeInsightFixtu PsiElement originalElement = InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// FIND_BY_REF") - ? TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED) + ? TargetElementUtilBase.findTargetElement(myFixture.getEditor(), REFERENCED_ELEMENT_ACCEPTED | NEW_AS_CONSTRUCTOR) : myFixture.getElementAtCaret(); if (InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// FIND_BY_MIRROR_ELEMENT")) { assert originalElement instanceof PsiCompiledElement : "PsiCompiledElement is expected: " + originalElement; diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java index 98d6524f65c..9a7e260a0e8 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java @@ -45,6 +45,7 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { Kotlin.FindPackageUsages.class, Kotlin.FindParameterUsages.class, Kotlin.FindPropertyUsages.class, + Kotlin.FindSecondaryConstructorUsages.class, Kotlin.FindTypeParameterUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.FindWithStructuralGrouping.class, @@ -879,6 +880,27 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { } } + @TestMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FindSecondaryConstructorUsages extends AbstractJetFindUsagesTest { + public void testAllFilesPresentInFindSecondaryConstructorUsages() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true); + } + + @TestMetadata("defaultSecondaryConstructor.0.kt") + public void testDefaultSecondaryConstructor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.0.kt"); + doTest(fileName); + } + + @TestMetadata("secondaryConstructor.0.kt") + public void testSecondaryConstructor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.0.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/findUsages/kotlin/findTypeParameterUsages") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -1000,6 +1022,7 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { @TestMetadata("idea/testData/findUsages/java") @TestDataPath("$PROJECT_ROOT") @InnerTestClasses({ + Java.FindConstructorUsages.class, Java.FindJavaClassUsages.class, Java.FindJavaFieldUsages.class, Java.FindJavaMethodUsages.class, @@ -1010,6 +1033,39 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/java"), Pattern.compile("^(.+)\\.0\\.java$"), true); } + @TestMetadata("idea/testData/findUsages/java/findConstructorUsages") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FindConstructorUsages extends AbstractJetFindUsagesTest { + public void testAllFilesPresentInFindConstructorUsages() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/java/findConstructorUsages"), Pattern.compile("^(.+)\\.0\\.java$"), true); + } + + @TestMetadata("javaConstructorInDelegationCall.0.java") + public void testJavaConstructorInDelegationCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/java/findConstructorUsages/javaConstructorInDelegationCall.0.java"); + doTest(fileName); + } + + @TestMetadata("javaDefaultConstructorInDelegationCall.0.java") + public void testJavaDefaultConstructorInDelegationCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/java/findConstructorUsages/javaDefaultConstructorInDelegationCall.0.java"); + doTest(fileName); + } + + @TestMetadata("secondaryConstructorByJavaNewExpression.0.java") + public void testSecondaryConstructorByJavaNewExpression() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaNewExpression.0.java"); + doTest(fileName); + } + + @TestMetadata("secondaryConstructorByJavaSuperCall.0.java") + public void testSecondaryConstructorByJavaSuperCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/java/findConstructorUsages/secondaryConstructorByJavaSuperCall.0.java"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/findUsages/java/findJavaClassUsages") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)