diff --git a/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java b/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java index 6b3d2837d87..950032e1fbe 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java +++ b/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java @@ -21,6 +21,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.QueryExecutorBase; import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiCompiledElement; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; import com.intellij.psi.search.searches.ClassInheritorsSearch; @@ -30,6 +31,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.asJava.LightClassUtil; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.lang.psi.JetProperty; +import org.jetbrains.jet.lang.psi.JetPropertyAccessor; public class KotlinDefinitionsSearcher extends QueryExecutorBase { @Override @@ -41,6 +44,10 @@ public class KotlinDefinitionsSearcher extends QueryExecutorBase consumer) { @@ -67,4 +74,30 @@ public class KotlinDefinitionsSearcher extends QueryExecutorBase consumer) { + LightClassUtil.PropertyAccessorsPsiMethods accessorsPsiMethods = ApplicationManager.getApplication().runReadAction( + new Computable() { + @Override + public LightClassUtil.PropertyAccessorsPsiMethods compute() { + return LightClassUtil.getLightClassPropertyMethods(property); + } + }); + + for (PsiMethod method : accessorsPsiMethods) { + PsiMethod[] implementations = MethodImplementationsSearch.getMethodImplementations(method); + for (PsiMethod implementation : implementations) { + PsiElement mirrorElement = implementation instanceof PsiCompiledElement ? ((PsiCompiledElement) implementation).getMirror() : null; + if (mirrorElement instanceof JetProperty) { + consumer.process(mirrorElement); + } + else if (mirrorElement instanceof JetPropertyAccessor && mirrorElement.getParent() instanceof JetProperty) { + consumer.process(mirrorElement.getParent()); + } + else { + consumer.process(implementation); + } + } + } + } } diff --git a/idea/testData/navigation/implementations/PropertyOverriddenNavigation.kt b/idea/testData/navigation/implementations/PropertyOverriddenNavigation.kt new file mode 100644 index 00000000000..31ed7520492 --- /dev/null +++ b/idea/testData/navigation/implementations/PropertyOverriddenNavigation.kt @@ -0,0 +1,17 @@ +package testing + +open class Base { + open var test = 12 +} + +open class SubBase: Base() { + override var test = 12 +} + +class SubSubBase: SubBase() { + override var test = 12 +} + + +// REF: (testing.SubBase).test +// REF: (testing.SubSubBase).test \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementVarInJava/ImplementVarInJava.java b/idea/testData/navigation/implementations/multifile/ImplementVarInJava/ImplementVarInJava.java new file mode 100644 index 00000000000..9cec2ab5d00 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementVarInJava/ImplementVarInJava.java @@ -0,0 +1,11 @@ +package testing.jj; + +public class JavaBase extends testing.kt.KotlinBase { + @Override + public String getSome() { + } + + @Override + public void setSome(String someValue) { + } +} \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementVarInJava/ImplementVarInJava.kt b/idea/testData/navigation/implementations/multifile/ImplementVarInJava/ImplementVarInJava.kt new file mode 100644 index 00000000000..c1d0b9b8540 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementVarInJava/ImplementVarInJava.kt @@ -0,0 +1,8 @@ +package testing.kt + +open class KotlinBase { + open var some = "Test" +} + +// REF: (in testing.jj.JavaBase).getSome() +// REF: (in testing.jj.JavaBase).setSome(String) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java index ed6d73c4299..22fc50b54cf 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java @@ -39,6 +39,10 @@ public class JetGotoImplementationMultifileTest extends CodeInsightTestCase { doKotlinJavaTest(); } + public void testImplementVarInJava() throws Exception { + doKotlinJavaTest(); + } + private void doKotlinJavaTest() throws Exception { doMultifileTest(getTestName(false) + ".kt", getTestName(false) + ".java"); } diff --git a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java index a863e867bbd..27e2f18ef46 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java @@ -37,6 +37,10 @@ public class JetGotoImplementationTest extends LightCodeInsightTestCase { doTest(); } + public void testPropertyOverriddenNavigation() { + doTest(); + } + @NotNull @Override protected String getTestDataPath() {