diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt b/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt index 3ceda7f763b..ac1b7565233 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt +++ b/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt @@ -1,18 +1,18 @@ /* - * Copyright 2010-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +* Copyright 2010-2014 JetBrains s.r.o. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ package org.jetbrains.jet.plugin.references @@ -38,6 +38,7 @@ import com.intellij.util.containers.ContainerUtil import org.jetbrains.jet.asJava.* import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.utils.keysToMap +import com.intellij.psi.PsiMethod public trait JetReference : PsiPolyVariantReference { public fun resolveToDescriptors(): Collection @@ -68,7 +69,13 @@ abstract class AbstractJetReference(element: T) override fun bindToElement(element: PsiElement): PsiElement = throw IncorrectOperationException() - protected fun areElementsEquivalent(el1: PsiElement, el2: PsiElement): Boolean = el1.namedUnwrappedElement == el2.namedUnwrappedElement + protected fun checkElementMatch(referenceTarget: PsiElement, elementToMatch: PsiElement): Boolean { + val unwrappedTarget = referenceTarget.namedUnwrappedElement + val unwrappedElementToMatch = elementToMatch.namedUnwrappedElement + + return (unwrappedTarget == unwrappedElementToMatch) || + (referenceTarget is PsiMethod && referenceTarget.isConstructor() && referenceTarget.getContainingClass() == elementToMatch) + } [suppress("CAST_NEVER_SUCCEEDS")] override fun getVariants(): Array = PsiReference.EMPTY_ARRAY as Array @@ -147,7 +154,7 @@ public abstract class JetSimpleReference(expression: if (resolvedElement == null || element == null) { return false } - return areElementsEquivalent(element, resolvedElement) + return checkElementMatch(resolvedElement, element) } } @@ -156,6 +163,6 @@ public abstract class JetMultiReference(expression: T) : Abstrac if (element == null) { return false } - return multiResolve(false).map { it.getElement() }.filterNotNull().any { areElementsEquivalent(it, element) } + return multiResolve(false).map { it.getElement() }.filterNotNull().any { checkElementMatch(it, element) } } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassAllUsages.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassAllUsages.0.java index 451c43618b9..f754abf71c7 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassAllUsages.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassAllUsages.0.java @@ -4,6 +4,10 @@ public class A { public String bar = "bar"; public static String BAR = "BAR"; + public A() { + + } + public void foo() { } diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedAnonymousObjects.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedAnonymousObjects.0.java index 1b651131d41..eea2d7f95ba 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedAnonymousObjects.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedAnonymousObjects.0.java @@ -1,5 +1,7 @@ // PSI_ELEMENT: com.intellij.psi.PsiClass // OPTIONS: derivedClasses public class A { + public A() { + } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedClasses.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedClasses.0.java index 1b651131d41..eea2d7f95ba 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedClasses.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedClasses.0.java @@ -1,5 +1,7 @@ // PSI_ELEMENT: com.intellij.psi.PsiClass // OPTIONS: derivedClasses public class A { + public A() { + } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java index 1b651131d41..eea2d7f95ba 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java @@ -1,5 +1,7 @@ // PSI_ELEMENT: com.intellij.psi.PsiClass // OPTIONS: derivedClasses public class A { + public A() { + } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java index 1b651131d41..eea2d7f95ba 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java @@ -1,5 +1,7 @@ // PSI_ELEMENT: com.intellij.psi.PsiClass // OPTIONS: derivedClasses public class A { + public A() { + } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalClasses.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalClasses.0.java index 1b651131d41..eea2d7f95ba 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalClasses.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalClasses.0.java @@ -1,5 +1,7 @@ // PSI_ELEMENT: com.intellij.psi.PsiClass // OPTIONS: derivedClasses public class A { + public A() { + } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalObjects.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalObjects.0.java index 1b651131d41..eea2d7f95ba 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalObjects.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalObjects.0.java @@ -1,5 +1,7 @@ // PSI_ELEMENT: com.intellij.psi.PsiClass // OPTIONS: derivedClasses public class A { + public A() { + } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedObjects.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedObjects.0.java index 1b651131d41..eea2d7f95ba 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedObjects.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedObjects.0.java @@ -1,5 +1,7 @@ // PSI_ELEMENT: com.intellij.psi.PsiClass // OPTIONS: derivedClasses public class A { + public A() { + } } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassFieldsUsages.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassFieldsUsages.0.java index 6b4cd578b89..3fed91ba2a6 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassFieldsUsages.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassFieldsUsages.0.java @@ -4,6 +4,10 @@ public class A { public String bar = "bar"; public static String BAR = "BAR"; + public A() { + + } + public void foo() { } diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.0.java index 9d1466688cb..569332ef2bc 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.0.java @@ -4,6 +4,10 @@ public class A { public String bar = "bar"; public static String BAR = "BAR"; + public A() { + + } + public void foo() { } diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.results.txt b/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.results.txt index cffa0dedadd..c491a66770b 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.results.txt +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.results.txt @@ -1,2 +1,7 @@ Function call (20: 18) super.foo() Function call (7: 11) A.foos() +New instance creation (2: 20) var next: A? = A() +New instance creation (32: 18) fun X.bar(a: A = A()) { +Supertype (1: 39) public class X(bar: String? = A.BAR): A() { +Supertype (23: 19) class object: A() { +Supertype (28: 11) object O: A() { diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.0.java new file mode 100644 index 00000000000..451c43618b9 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.0.java @@ -0,0 +1,14 @@ +// PSI_ELEMENT: com.intellij.psi.PsiClass +// OPTIONS: usages +public class A { + public String bar = "bar"; + public static String BAR = "BAR"; + + public void foo() { + + } + + public static void foos() { + + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.1.kt b/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.1.kt new file mode 100644 index 00000000000..923a2c2112e --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.1.kt @@ -0,0 +1,38 @@ +public class X(bar: String? = A.BAR): A() { + var next: A? = A() + val myBar: String? = A.BAR + + { + A.BAR = "" + A.foos() + } + + fun foo(a: A) { + val aa: A = a + aa.bar = "" + } + + fun getNext(): A? { + return next + } + + public override fun foo() { + super.foo() + } + + class object: A() { + + } +} + +object O: A() { + +} + +fun X.bar(a: A = A()) { + +} + +fun Any.toA(): A? { + return if (this is A) this as A else null +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.results.txt b/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.results.txt new file mode 100644 index 00000000000..c6809cccfa8 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.results.txt @@ -0,0 +1,18 @@ +Class/object property type (2: 15) var next: A? = A() +Function return types (15: 20) fun getNext(): A? { +Function return types (36: 16) fun Any.toA(): A? { +Local variable declaration (11: 17) val aa: A = a +Nested class/object (1: 31) public class X(bar: String? = A.BAR): A() { +Nested class/object (3: 26) val myBar: String? = A.BAR +Nested class/object (6: 9) A.BAR = "" +Nested class/object (7: 9) A.foos() +New instance creation (2: 20) var next: A? = A() +New instance creation (32: 18) fun X.bar(a: A = A()) { +Parameter type (10: 16) fun foo(a: A) { +Parameter type (32: 14) fun X.bar(a: A = A()) { +Super type qualifier (20: 15) super.foo() +Supertype (1: 39) public class X(bar: String? = A.BAR): A() { +Supertype (23: 19) class object: A() { +Supertype (28: 11) object O: A() { +Target type of 'is' operation (37: 24) return if (this is A) this as A else null +Usage in cast target type (37: 35) return if (this is A) this as A else null diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKInnerClassAllUsages.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKInnerClassAllUsages.0.java index 65795c41a7b..c249e0d53e6 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKInnerClassAllUsages.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKInnerClassAllUsages.0.java @@ -4,6 +4,10 @@ public class Outer { public class A { public String bar = "bar"; + public A() { + + } + public void foo() { } diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKNestedClassAllUsages.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKNestedClassAllUsages.0.java index 8cc70a43390..eb90961d9d5 100644 --- a/idea/testData/findUsages/java/findJavaClassUsages/JKNestedClassAllUsages.0.java +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKNestedClassAllUsages.0.java @@ -5,6 +5,10 @@ public class Outer { public String bar = "bar"; public static String BAR = "BAR"; + public A() { + + } + public void foo() { } diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java index 5680b617d9a..b69010d1800 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java @@ -631,6 +631,11 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.0.java"); } + @TestMetadata("JKClassWithImplicitConstructorAllUsages.0.java") + public void testJKClassWithImplicitConstructorAllUsages() throws Exception { + doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassWithImplicitConstructorAllUsages.0.java"); + } + @TestMetadata("JKDerivedInterfaces.0.java") public void testJKDerivedInterfaces() throws Exception { doTest("idea/testData/findUsages/java/findJavaClassUsages/JKDerivedInterfaces.0.java");