From c3c0925de173b059acdff551b0a6841d5de35886 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 23 Oct 2013 17:44:04 +0400 Subject: [PATCH] Add support of local declarations --- .../KotlinFindClassUsagesHandler.java | 6 +- .../KotlinFindFunctionUsagesHandler.java | 60 +++++++++++++++---- .../kotlinLocalClassUsages1.0.kt | 9 +++ .../kotlinLocalClassUsages1.results.txt | 2 + .../kotlinLocalClassUsages2.0.kt | 13 ++++ .../kotlinLocalClassUsages2.results.txt | 2 + .../kotlinLocalMethodUsages1.0.kt | 11 ++++ .../kotlinLocalMethodUsages1.results.txt | 2 + .../kotlinLocalMethodUsages2.0.kt | 15 +++++ .../kotlinLocalMethodUsages2.results.txt | 2 + .../kotlinLocalObjectUsages1.0.kt | 9 +++ .../kotlinLocalObjectUsages1.results.txt | 1 + .../kotlinLocalObjectUsages2.0.kt | 13 ++++ .../kotlinLocalObjectUsages2.results.txt | 1 + .../kotlinLocalPropertyUsages1.0.kt | 9 +++ .../kotlinLocalPropertyUsages1.results.txt | 1 + .../kotlinLocalPropertyUsages2.0.kt | 13 ++++ .../kotlinLocalPropertyUsages2.results.txt | 1 + .../jet/findUsages/JetFindUsagesTest.java | 40 +++++++++++++ 19 files changed, 196 insertions(+), 14 deletions(-) create mode 100644 idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages1.0.kt create mode 100644 idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages1.results.txt create mode 100644 idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.0.kt create mode 100644 idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.results.txt create mode 100644 idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.0.kt create mode 100644 idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.results.txt create mode 100644 idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.0.kt create mode 100644 idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.results.txt create mode 100644 idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.0.kt create mode 100644 idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.results.txt create mode 100644 idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.0.kt create mode 100644 idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.results.txt create mode 100644 idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.0.kt create mode 100644 idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.results.txt create mode 100644 idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.0.kt create mode 100644 idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.results.txt diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java index 1466b04c486..833313b2d49 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java @@ -71,9 +71,6 @@ public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandler references = ReferencesSearch.search( new ReferencesSearch.SearchParameters(jetClass, kotlinOptions.searchScope, false) @@ -90,6 +87,9 @@ public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandler { public KotlinFindFunctionUsagesHandler( @@ -69,13 +74,48 @@ public class KotlinFindFunctionUsagesHandler extends KotlinFindUsagesHandler processor, @NotNull FindUsagesOptions options ) { - final KotlinMethodFindUsagesOptions kotlinOptions = (KotlinMethodFindUsagesOptions)options; + final KotlinMethodFindUsagesOptions kotlinOptions = (KotlinMethodFindUsagesOptions) options; SearchScope searchScope = kotlinOptions.searchScope; + JetElement blockForLocalDeclaration = JetPsiUtil.getEnclosingBlockForLocalDeclaration((JetNamedFunction) element); + if (blockForLocalDeclaration != null && kotlinOptions.isUsages) { + BindingContext bindingContext = + AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) element.getContainingFile()).getBindingContext(); + + final List result = new ArrayList(); + CalleeReferenceVisitorBase visitor = new CalleeReferenceVisitorBase(bindingContext, true) { + private boolean isAcceptable(PsiElement declaration) { + if (kotlinOptions.isIncludeOverloadUsages) { + //noinspection ConstantConditions + return declaration instanceof JetNamedFunction && + ((JetNamedFunction) element).getName() + .equals(((JetNamedFunction) declaration).getName()); + } + + return declaration.equals(element); + } + + @Override + protected void processDeclaration(JetReferenceExpression reference, PsiElement declaration) { + if (isAcceptable(declaration)) { + result.add(reference.getReference()); + } + } + }; + + blockForLocalDeclaration.accept(visitor); + + for (PsiReference ref : result) { + if (!processUsage(processor, ref, kotlinOptions)) return false; + } + + return true; + } + final PsiMethod lightMethod = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public PsiMethod compute() { @@ -114,18 +154,18 @@ public class KotlinFindFunctionUsagesHandler extends KotlinFindUsagesHandler( - new PsiElementProcessor() { - @Override - public boolean execute(@NotNull PsiMethod element) { - return processUsage(processor, element.getNavigationElement(), kotlinOptions); + new PsiElementProcessor() { + @Override + public boolean execute(@NotNull PsiMethod element) { + return processUsage(processor, element.getNavigationElement(), kotlinOptions); + } } - } ) ); } if (kotlinOptions.isIncludeOverloadUsages) { - String name = ((PsiNamedElement)element).getName(); + String name = ((PsiNamedElement) element).getName(); if (name == null) return true; for (PsiReference ref : KotlinExtensionSearch.search(lightMethod, searchScope).findAll()) { @@ -147,6 +187,4 @@ public class KotlinFindFunctionUsagesHandler extends KotlinFindUsagesHandlerBar + + return Bar() +} + +val x = Bar() diff --git a/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages1.results.txt b/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages1.results.txt new file mode 100644 index 00000000000..62605c61e3c --- /dev/null +++ b/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages1.results.txt @@ -0,0 +1,2 @@ +Instantiation (6: 12) return Bar() + diff --git a/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.0.kt b/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.0.kt new file mode 100644 index 00000000000..b9b32d35d79 --- /dev/null +++ b/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.0.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: usages, constructorUsages +fun foo(): Any { + if (false) { + class Bar + + return Bar() + } + + return Bar() +} + +val x = Bar() diff --git a/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.results.txt b/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.results.txt new file mode 100644 index 00000000000..a4a2701e022 --- /dev/null +++ b/idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.results.txt @@ -0,0 +1,2 @@ +Instantiation (7: 16) return Bar() + diff --git a/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.0.kt b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.0.kt new file mode 100644 index 00000000000..1f2b31b0337 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.0.kt @@ -0,0 +1,11 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetNamedFunction +// OPTIONS: usages +fun foo() { + fun bar() { + + } + + bar() +} + +bar() diff --git a/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.results.txt b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.results.txt new file mode 100644 index 00000000000..996c08ca343 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.results.txt @@ -0,0 +1,2 @@ +Function call (8: 5) bar() + diff --git a/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.0.kt b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.0.kt new file mode 100644 index 00000000000..1de3be7e672 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.0.kt @@ -0,0 +1,15 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetNamedFunction +// OPTIONS: usages +fun foo() { + if (true) { + fun bar() { + + } + + bar() + } + + bar() +} + +bar() diff --git a/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.results.txt b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.results.txt new file mode 100644 index 00000000000..b5852c12963 --- /dev/null +++ b/idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.results.txt @@ -0,0 +1,2 @@ +Function call (9: 9) bar() + diff --git a/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.0.kt b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.0.kt new file mode 100644 index 00000000000..c304f1bdb09 --- /dev/null +++ b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.0.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclarationName +// OPTIONS: usages +fun foo(): Any { + object Bar + + return Bar +} + +val x = Bar diff --git a/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.results.txt b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.results.txt new file mode 100644 index 00000000000..ba1c507c3d7 --- /dev/null +++ b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.results.txt @@ -0,0 +1 @@ +Value read (6: 12) return Bar diff --git a/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.0.kt b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.0.kt new file mode 100644 index 00000000000..91a7bf64add --- /dev/null +++ b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.0.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclarationName +// OPTIONS: usages +fun foo(): Any { + if (true) { + object Bar + + return Bar + } + + return Bar +} + +val x = Bar diff --git a/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.results.txt b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.results.txt new file mode 100644 index 00000000000..168f0885a02 --- /dev/null +++ b/idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.results.txt @@ -0,0 +1 @@ +Value read (7: 16) return Bar diff --git a/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.0.kt b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.0.kt new file mode 100644 index 00000000000..82f5bbde365 --- /dev/null +++ b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.0.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetProperty +// OPTIONS: usages +fun foo(): String { + val bar = "" + + return bar +} + +val x = bar diff --git a/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.results.txt b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.results.txt new file mode 100644 index 00000000000..d8919533402 --- /dev/null +++ b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.results.txt @@ -0,0 +1 @@ +Value read (6: 12) return bar diff --git a/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.0.kt b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.0.kt new file mode 100644 index 00000000000..31b06aa1551 --- /dev/null +++ b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.0.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetProperty +// OPTIONS: usages +fun foo(): String { + if (true) { + val bar = "" + + return bar + } + + return bar +} + +val x = bar diff --git a/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.results.txt b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.results.txt new file mode 100644 index 00000000000..a6e139e9408 --- /dev/null +++ b/idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.results.txt @@ -0,0 +1 @@ +Value read (7: 16) return bar diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java index d7c42cb3bce..73ba8844c08 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java @@ -163,6 +163,16 @@ public class JetFindUsagesTest extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/findClassUsages/kotlinDerivedInterfaceUsages2.0.kt"); } + @TestMetadata("kotlinLocalClassUsages1.0.kt") + public void testKotlinLocalClassUsages1() throws Exception { + doTest("idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages1.0.kt"); + } + + @TestMetadata("kotlinLocalClassUsages2.0.kt") + public void testKotlinLocalClassUsages2() throws Exception { + doTest("idea/testData/findUsages/findClassUsages/kotlinLocalClassUsages2.0.kt"); + } + @TestMetadata("kotlinPrivateClassUsages.0.kt") public void testKotlinPrivateClassUsages() throws Exception { doTest("idea/testData/findUsages/findClassUsages/kotlinPrivateClassUsages.0.kt"); @@ -186,6 +196,16 @@ public class JetFindUsagesTest extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/findMethodUsages/javaMethodUsages.0.kt"); } + @TestMetadata("kotlinLocalMethodUsages1.0.kt") + public void testKotlinLocalMethodUsages1() throws Exception { + doTest("idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages1.0.kt"); + } + + @TestMetadata("kotlinLocalMethodUsages2.0.kt") + public void testKotlinLocalMethodUsages2() throws Exception { + doTest("idea/testData/findUsages/findMethodUsages/kotlinLocalMethodUsages2.0.kt"); + } + @TestMetadata("kotlinMethodUsages.0.kt") public void testKotlinMethodUsages() throws Exception { doTest("idea/testData/findUsages/findMethodUsages/kotlinMethodUsages.0.kt"); @@ -219,6 +239,16 @@ public class JetFindUsagesTest extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/findObjectUsages/javaObjectUsages.0.kt"); } + @TestMetadata("kotlinLocalObjectUsages1.0.kt") + public void testKotlinLocalObjectUsages1() throws Exception { + doTest("idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages1.0.kt"); + } + + @TestMetadata("kotlinLocalObjectUsages2.0.kt") + public void testKotlinLocalObjectUsages2() throws Exception { + doTest("idea/testData/findUsages/findObjectUsages/kotlinLocalObjectUsages2.0.kt"); + } + @TestMetadata("kotlinObjectUsages.0.kt") public void testKotlinObjectUsages() throws Exception { doTest("idea/testData/findUsages/findObjectUsages/kotlinObjectUsages.0.kt"); @@ -242,6 +272,16 @@ public class JetFindUsagesTest extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/findPropertyUsages/javaPropertyUsages.0.kt"); } + @TestMetadata("kotlinLocalPropertyUsages1.0.kt") + public void testKotlinLocalPropertyUsages1() throws Exception { + doTest("idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages1.0.kt"); + } + + @TestMetadata("kotlinLocalPropertyUsages2.0.kt") + public void testKotlinLocalPropertyUsages2() throws Exception { + doTest("idea/testData/findUsages/findPropertyUsages/kotlinLocalPropertyUsages2.0.kt"); + } + @TestMetadata("kotlinPrivatePropertyUsages.0.kt") public void testKotlinPrivatePropertyUsages() throws Exception { doTest("idea/testData/findUsages/findPropertyUsages/kotlinPrivatePropertyUsages.0.kt");