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")