diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 805b3f9eccd..6e59693d1c3 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -296,6 +296,7 @@ + diff --git a/idea/src/org/jetbrains/jet/plugin/search/KotlinLightMethodTextOccurrenceProcessor.java b/idea/src/org/jetbrains/jet/plugin/search/KotlinLightMethodTextOccurrenceProcessor.java new file mode 100644 index 00000000000..2a26c17d51e --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/search/KotlinLightMethodTextOccurrenceProcessor.java @@ -0,0 +1,29 @@ +package org.jetbrains.jet.plugin.search; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiReference; +import com.intellij.psi.impl.search.MethodTextOccurrenceProcessor; +import com.intellij.util.Processor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.asJava.LightClassUtil; +import org.jetbrains.jet.lang.psi.JetNamedFunction; + +public class KotlinLightMethodTextOccurrenceProcessor extends MethodTextOccurrenceProcessor { + public KotlinLightMethodTextOccurrenceProcessor(@NotNull PsiClass aClass, boolean strictSignatureSearch, PsiMethod... methods) { + super(aClass, strictSignatureSearch, methods); + } + + @Override + protected boolean processInexactReference( + PsiReference ref, PsiElement refElement, PsiMethod method, Processor consumer + ) { + if (refElement instanceof JetNamedFunction) { + PsiMethod lightMethod = LightClassUtil.getLightClassMethod((JetNamedFunction) refElement); + if (lightMethod != null) return super.processInexactReference(ref, lightMethod, method, consumer); + } + + return true; + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/search/KotlinLightMethodUsagesSearcher.java b/idea/src/org/jetbrains/jet/plugin/search/KotlinLightMethodUsagesSearcher.java new file mode 100644 index 00000000000..6a361cd2b92 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/search/KotlinLightMethodUsagesSearcher.java @@ -0,0 +1,15 @@ +package org.jetbrains.jet.plugin.search; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.impl.search.MethodTextOccurrenceProcessor; +import com.intellij.psi.impl.search.MethodUsagesSearcher; + +public class KotlinLightMethodUsagesSearcher extends MethodUsagesSearcher { + @Override + protected MethodTextOccurrenceProcessor getTextOccurrenceProcessor( + PsiMethod[] methods, PsiClass aClass, boolean strictSignatureSearch + ) { + return new KotlinLightMethodTextOccurrenceProcessor(aClass, strictSignatureSearch, methods); + } +} diff --git a/idea/testData/findUsages/findMethodUsages/javaMethodUsages.0.kt b/idea/testData/findUsages/findMethodUsages/javaMethodUsages.0.kt index 290a8f9f624..1d4e6e42af4 100644 --- a/idea/testData/findUsages/findMethodUsages/javaMethodUsages.0.kt +++ b/idea/testData/findUsages/findMethodUsages/javaMethodUsages.0.kt @@ -2,6 +2,10 @@ // OPTIONS: usages package testing; -public class Server() { - public fun processRequest() = "foo" +public open class Server() { + public open fun processRequest() = "foo" +} + +public class ServerEx(): Server() { + public override fun processRequest() = "foofoo" } diff --git a/idea/testData/findUsages/findMethodUsages/javaMethodUsages.1.java b/idea/testData/findUsages/findMethodUsages/javaMethodUsages.1.java index 18b8e3e3ef2..71cd1fd9d40 100644 --- a/idea/testData/findUsages/findMethodUsages/javaMethodUsages.1.java +++ b/idea/testData/findUsages/findMethodUsages/javaMethodUsages.1.java @@ -2,7 +2,7 @@ import testing.*; class Client { public void foo() { - Server server = new Server(); - server.processRequest(); + new Server().processRequest(); + new ServerEx().processRequest(); } } diff --git a/idea/testData/findUsages/findMethodUsages/javaMethodUsages.results.txt b/idea/testData/findUsages/findMethodUsages/javaMethodUsages.results.txt index 9e5e5aa96f5..60610682c1d 100644 --- a/idea/testData/findUsages/findMethodUsages/javaMethodUsages.results.txt +++ b/idea/testData/findUsages/findMethodUsages/javaMethodUsages.results.txt @@ -1 +1,2 @@ -Unclassified usage (6: 16) server.processRequest(); \ No newline at end of file +Unclassified usage (5: 22) new Server().processRequest(); +Unclassified usage (6: 24) new ServerEx().processRequest(); \ No newline at end of file diff --git a/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.0.kt b/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.0.kt index 3d1e7e6f0f6..948ea0c621e 100644 --- a/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.0.kt +++ b/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.0.kt @@ -2,5 +2,11 @@ // OPTIONS: usages package server; -fun processRequest() = "foo" +public open class Server() { + open fun processRequest() = "foo" +} + +public class ServerEx(): Server() { + override fun processRequest() = "foofoo" +} diff --git a/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.1.kt b/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.1.kt index 9bd981a0c77..17b7c749d69 100644 --- a/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.1.kt +++ b/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.1.kt @@ -1,12 +1,8 @@ -package client - -import server.processRequest +import server.*; class Client { - val methodRef = ::processRequest() - - fun doProcessRequest() { - println("Process...") - processRequest() + public fun foo() { + Server().processRequest() + ServerEx().processRequest() } -} \ No newline at end of file +} diff --git a/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.results.txt b/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.results.txt index 6af85d2954b..669a9568fa7 100644 --- a/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.results.txt +++ b/idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.results.txt @@ -1,3 +1,2 @@ -Callable reference (6: 23) val methodRef = ::processRequest() -Function call (10: 9) processRequest() -Import directive (3: 15) import server.processRequest \ No newline at end of file +Function call (5: 18) Server().processRequest() +Function call (6: 20) ServerEx().processRequest() \ No newline at end of file diff --git a/idea/testData/findUsages/findMethodUsages/kotlinOverloadAndExtensionUsages.results.txt b/idea/testData/findUsages/findMethodUsages/kotlinOverloadAndExtensionUsages.results.txt index 25e0595e117..1f1945ce682 100644 --- a/idea/testData/findUsages/findMethodUsages/kotlinOverloadAndExtensionUsages.results.txt +++ b/idea/testData/findUsages/findMethodUsages/kotlinOverloadAndExtensionUsages.results.txt @@ -3,4 +3,5 @@ Function call (11: 7) x.foo(1, 2) Function call (25: 5) foo(t) Function call (30: 7) a.foo(1, "") Function call (35: 9) foo(t) +Function call (39: 5) foo(s) Function call (3: 18) super.foo(t) \ No newline at end of file diff --git a/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.0.kt b/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.0.kt new file mode 100644 index 00000000000..3d1e7e6f0f6 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.0.kt @@ -0,0 +1,6 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetNamedFunction +// OPTIONS: usages +package server; + +fun processRequest() = "foo" + diff --git a/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.1.kt b/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.1.kt new file mode 100644 index 00000000000..9bd981a0c77 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.1.kt @@ -0,0 +1,12 @@ +package client + +import server.processRequest + +class Client { + val methodRef = ::processRequest() + + fun doProcessRequest() { + println("Process...") + processRequest() + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.results.txt b/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.results.txt new file mode 100644 index 00000000000..6af85d2954b --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.results.txt @@ -0,0 +1,3 @@ +Callable reference (6: 23) val methodRef = ::processRequest() +Function call (10: 9) processRequest() +Import directive (3: 15) import server.processRequest \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java index 1860e574ca2..05e15579ffa 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java @@ -191,6 +191,11 @@ public class JetFindUsagesTest extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/findMethodUsages/kotlinOverloadAndExtensionUsages.0.kt"); } + @TestMetadata("kotlinTopLevelMethodUsages.0.kt") + public void testKotlinTopLevelMethodUsages() throws Exception { + doTest("idea/testData/findUsages/findMethodUsages/kotlinTopLevelMethodUsages.0.kt"); + } + } @TestMetadata("idea/testData/findUsages/findObjectUsages")