From fa1ecfaa93c8516bcb293e05cd0e9afb52f03be5 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 22 May 2012 18:31:26 +0200 Subject: [PATCH] find usages of Kotlin methods in Java code (KT-1819) #KT-1819 fixed --- .../KotlinFindFunctionUsagesHandler.java | 53 +++++++++++++++++++ .../KotlinFindUsagesHandlerFactory.java | 11 +++- .../findUsages/findMethodUsages/Client.java | 8 +++ .../findUsages/findMethodUsages/Server.kt | 5 ++ .../jet/findUsages/JetFindUsagesTest.java | 12 +++++ 5 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindFunctionUsagesHandler.java create mode 100644 idea/testData/findUsages/findMethodUsages/Client.java create mode 100644 idea/testData/findUsages/findMethodUsages/Server.kt diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindFunctionUsagesHandler.java b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindFunctionUsagesHandler.java new file mode 100644 index 00000000000..6df300ddee1 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindFunctionUsagesHandler.java @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2012 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.findUsages; + +import com.intellij.find.findUsages.FindUsagesHandler; +import com.intellij.psi.PsiCompiledElement; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.asJava.JetLightClass; +import org.jetbrains.jet.lang.psi.JetClass; +import org.jetbrains.jet.lang.psi.JetClassBody; +import org.jetbrains.jet.lang.psi.JetFunction; + +/** + * @author yole + */ +public class KotlinFindFunctionUsagesHandler extends FindUsagesHandler { + protected KotlinFindFunctionUsagesHandler(@NotNull PsiElement psiElement) { + super(psiElement); + } + + @NotNull + @Override + public PsiElement[] getSecondaryElements() { + JetFunction function = (JetFunction) getPsiElement(); + if (function.getParent() instanceof JetClassBody) { + JetClass containingClass = PsiTreeUtil.getParentOfType(function, JetClass.class); + JetLightClass wrapper = JetLightClass.wrapDelegate(containingClass); + for (PsiMethod method : wrapper.getMethods()) { + if (method instanceof PsiCompiledElement && ((PsiCompiledElement) method).getMirror() == function) { + return new PsiElement[] { method }; + } + } + } + return PsiElement.EMPTY_ARRAY; + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.java b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.java index c8ab9bf11cc..b395df5aea7 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.java @@ -21,6 +21,7 @@ import com.intellij.find.findUsages.FindUsagesHandlerFactory; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetClass; +import org.jetbrains.jet.lang.psi.JetFunction; /** * @author yole @@ -28,11 +29,17 @@ import org.jetbrains.jet.lang.psi.JetClass; public class KotlinFindUsagesHandlerFactory extends FindUsagesHandlerFactory { @Override public boolean canFindUsages(@NotNull PsiElement element) { - return element instanceof JetClass; + return element instanceof JetClass || element instanceof JetFunction; } @Override public FindUsagesHandler createFindUsagesHandler(@NotNull PsiElement element, boolean forHighlightUsages) { - return new KotlinFindClassUsagesHandler(element); + if (element instanceof JetClass) { + return new KotlinFindClassUsagesHandler(element); + } + if (element instanceof JetFunction) { + return new KotlinFindFunctionUsagesHandler(element); + } + throw new IllegalArgumentException("unexpected element type: " + element); } } diff --git a/idea/testData/findUsages/findMethodUsages/Client.java b/idea/testData/findUsages/findMethodUsages/Client.java new file mode 100644 index 00000000000..18b8e3e3ef2 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/Client.java @@ -0,0 +1,8 @@ +import testing.*; + +class Client { + public void foo() { + Server server = new Server(); + server.processRequest(); + } +} diff --git a/idea/testData/findUsages/findMethodUsages/Server.kt b/idea/testData/findUsages/findMethodUsages/Server.kt new file mode 100644 index 00000000000..66bd72bc977 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/Server.kt @@ -0,0 +1,5 @@ +package testing; + +public class Server() { + public fun processRequest() = "foo" +} diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java index bc1c00b9c08..073ed22c351 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java @@ -17,12 +17,14 @@ package org.jetbrains.jet.findUsages; import com.intellij.psi.PsiField; +import com.intellij.psi.PsiStatement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import com.intellij.usageView.UsageInfo; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetClass; +import org.jetbrains.jet.lang.psi.JetFunction; import org.jetbrains.jet.plugin.JetLightProjectDescriptor; import org.jetbrains.jet.plugin.PluginTestCaseBase; @@ -53,4 +55,14 @@ public class JetFindUsagesTest extends LightCodeInsightFixtureTestCase { final PsiField field = PsiTreeUtil.getParentOfType(first.getElement(), PsiField.class); assertEquals("private Server myServer;", field.getText()); } + + public void testFindMethodUsages() { + myFixture.configureByFiles("findMethodUsages/Server.kt", "findMethodUsages/Client.java"); + JetFunction function = PsiTreeUtil.getParentOfType(myFixture.getElementAtCaret(), JetFunction.class, false); + final Collection usages = myFixture.findUsages(function); + assertEquals(1, usages.size()); + UsageInfo first = usages.iterator().next(); + final PsiStatement stmt = PsiTreeUtil.getParentOfType(first.getElement(), PsiStatement.class); + assertEquals("server.processRequest();", stmt.getText()); + } }