diff --git a/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java b/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java index ab214e4b459..ecbd25dd5e1 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java +++ b/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java @@ -16,21 +16,24 @@ package org.jetbrains.jet.plugin.search; +import com.intellij.codeInsight.navigation.MethodImplementationsSearch; 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.PsiElement; +import com.intellij.psi.PsiMethod; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.util.Processor; -import com.intellij.util.Query; +import com.intellij.util.containers.ContainerUtil; 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; public class KotlinDefinitionsSearcher extends QueryExecutorBase { @Override - public void processQuery(@NotNull final PsiElement queryParameters, @NotNull final Processor consumer) { + public void processQuery(@NotNull final PsiElement queryParameters, @NotNull Processor consumer) { if (queryParameters instanceof JetClass) { PsiClass psiClass = ApplicationManager.getApplication().runReadAction(new Computable() { @Override @@ -39,13 +42,20 @@ public class KotlinDefinitionsSearcher extends QueryExecutorBase query = ClassInheritorsSearch.search(psiClass, true); - query.forEach(new Processor() { - @Override - public boolean process(PsiClass clazz) { - return consumer.process(clazz); - } - }); + ContainerUtil.process(ClassInheritorsSearch.search(psiClass, true), consumer); + } + } + + if (queryParameters instanceof JetNamedFunction) { + PsiMethod psiMethod = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiMethod compute() { + return LightClassUtil.getLightClassMethod((JetNamedFunction) queryParameters); + } + }); + + if (psiMethod != null) { + ContainerUtil.process(MethodImplementationsSearch.getMethodImplementations(psiMethod), consumer); } } } diff --git a/idea/testData/navigation/implementations/FunctionOverrideNavigation.kt b/idea/testData/navigation/implementations/FunctionOverrideNavigation.kt new file mode 100644 index 00000000000..246d3fee72a --- /dev/null +++ b/idea/testData/navigation/implementations/FunctionOverrideNavigation.kt @@ -0,0 +1,21 @@ +package testing + +open class Base { + open fun test() { + } +} + +open class SubBase: Base() { + override fun test() { + + } +} + +class SubSubBase: SubBase() { + override fun test() { + } +} + + +// REF: (in testing.SubBase).test() +// REF: (in testing.SubSubBase).test() diff --git a/idea/testData/navigation/implementations/multifile/ImplementFunInJava/ImplementFunInJava.java b/idea/testData/navigation/implementations/multifile/ImplementFunInJava/ImplementFunInJava.java new file mode 100644 index 00000000000..1279aefb97b --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementFunInJava/ImplementFunInJava.java @@ -0,0 +1,7 @@ +package testing.jj; + +public class JavaBase extends testing.kt.KotlinBase { + @Override + public void test() { + } +} \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementFunInJava/ImplementFunInJava.kt b/idea/testData/navigation/implementations/multifile/ImplementFunInJava/ImplementFunInJava.kt new file mode 100644 index 00000000000..e25ddd658e5 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementFunInJava/ImplementFunInJava.kt @@ -0,0 +1,7 @@ +package testing.kt + +open class KotlinBase { + open fun test() {} +} + +// REF: (in testing.jj.JavaBase).test() diff --git a/idea/testData/navigation/implementations/multifile/ImplementMethodInKotlin/ImplementMethodInKotlin.java b/idea/testData/navigation/implementations/multifile/ImplementMethodInKotlin/ImplementMethodInKotlin.java new file mode 100644 index 00000000000..af972d16509 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementMethodInKotlin/ImplementMethodInKotlin.java @@ -0,0 +1,5 @@ +public class BaseJava { + public void testMethod() { + + } +} \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementMethodInKotlin/ImplementMethodInKotlin.kt b/idea/testData/navigation/implementations/multifile/ImplementMethodInKotlin/ImplementMethodInKotlin.kt new file mode 100644 index 00000000000..d965c46c475 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementMethodInKotlin/ImplementMethodInKotlin.kt @@ -0,0 +1,13 @@ +package testing.kt + +class TestFromJava() : BaseJava() { + override fun testMethod() { + } +} + +fun test() { + BaseJava().testMethod() +} + +// REF: (in testing.kt.TestFromJava).testMethod() +// REF: (in BaseJava).testMethod() diff --git a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java index 5284418ee73..ed6d73c4299 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java @@ -23,6 +23,10 @@ import org.jetbrains.jet.plugin.PluginTestCaseBase; import java.io.File; public class JetGotoImplementationMultifileTest extends CodeInsightTestCase { + public void testImplementFunInJava() throws Exception { + doKotlinJavaTest(); + } + public void testImplementKotlinClassInJava() throws Exception { doKotlinJavaTest(); } @@ -31,6 +35,10 @@ public class JetGotoImplementationMultifileTest extends CodeInsightTestCase { doKotlinJavaTest(); } + public void testImplementMethodInKotlin() 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 b2aa70b5a18..a863e867bbd 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.navigation; import com.intellij.codeInsight.navigation.GotoTargetHandler; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.testFramework.LightCodeInsightTestCase; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.plugin.PluginTestCaseBase; import java.io.File; @@ -32,6 +33,11 @@ public class JetGotoImplementationTest extends LightCodeInsightTestCase { doTest(); } + public void testFunctionOverrideNavigation() { + doTest(); + } + + @NotNull @Override protected String getTestDataPath() { return new File(PluginTestCaseBase.getTestDataPathBase(), "/navigation/implementations").getPath() +