From a13f334df28e77c2646833967049e2f669a2d931 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 27 Oct 2014 14:51:33 +0300 Subject: [PATCH] Find Usages: Restrict search scope for private class members #KT-6124 Fixed --- .../jet/lang/psi/JetNamedDeclarationStub.java | 10 +++++++--- .../org/jetbrains/jet/lang/psi/JetPsiUtil.java | 11 +++++++++-- .../plugin/search/usagesSearch/usagesSearch.kt | 18 +++++++++--------- .../kotlinPrivateClassUsages.results.txt | 2 -- .../kotlinPrivateMethodUsages.results.txt | 2 -- .../kotlinPrivateObjectUsages.results.txt | 2 -- .../kotlinPrivatePropertyUsages.results.txt | 2 -- .../kotlinPrivatePropertyUsages2.results.txt | 2 -- 8 files changed, 25 insertions(+), 24 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclarationStub.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclarationStub.java index 23894f93f3d..eba546148ef 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclarationStub.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedDeclarationStub.java @@ -21,6 +21,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.stubs.IStubElementType; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -89,9 +90,12 @@ abstract class JetNamedDeclarationStub extends J @NotNull @Override public SearchScope getUseScope() { - JetElement enclosingBlock = JetPsiUtil.getEnclosingElementForLocalDeclaration(this); - if (enclosingBlock != null) { - return new LocalSearchScope(enclosingBlock); + JetElement enclosingBlock = JetPsiUtil.getEnclosingElementForLocalDeclaration(this, false); + if (enclosingBlock != null) return new LocalSearchScope(enclosingBlock); + + if (hasModifier(JetTokens.PRIVATE_KEYWORD)) { + JetElement containingClass = PsiTreeUtil.getParentOfType(this, JetClassOrObject.class); + if (containingClass != null) return new LocalSearchScope(containingClass); } return super.getUseScope(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index a834fe9182d..f7c27274f01 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -819,12 +819,19 @@ public class JetPsiUtil { @Nullable public static JetElement getEnclosingElementForLocalDeclaration(@NotNull JetDeclaration declaration) { - if (declaration instanceof JetTypeParameter) { + return getEnclosingElementForLocalDeclaration(declaration, true); + } + + @Nullable + public static JetElement getEnclosingElementForLocalDeclaration(@NotNull JetDeclaration declaration, boolean skipParameters) { + if (declaration instanceof JetTypeParameter && skipParameters) { declaration = PsiTreeUtil.getParentOfType(declaration, JetNamedDeclaration.class); } else if (declaration instanceof JetParameter) { + if (((JetParameter) declaration).getValOrVarNode() != null) return null; + PsiElement parent = declaration.getParent(); - if (parent != null && parent.getParent() instanceof JetNamedFunction) { + if (skipParameters && parent != null && parent.getParent() instanceof JetNamedFunction) { declaration = (JetNamedFunction) parent.getParent(); } } diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/search/usagesSearch/usagesSearch.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/search/usagesSearch/usagesSearch.kt index f9498711318..5a826734b13 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/search/usagesSearch/usagesSearch.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/search/usagesSearch/usagesSearch.kt @@ -77,10 +77,16 @@ public data class UsagesSearchLocation( public data class UsagesSearchTarget( val element: T, - val scope: SearchScope, + private val scope: SearchScope, val location: UsagesSearchLocation = UsagesSearchLocation.DEFAULT, val restrictByTargetScope: Boolean = true -) +) { + fun retarget(element: U) = + UsagesSearchTarget(element, scope, location, restrictByTargetScope) + + val effectiveScope: SearchScope + get() = if (restrictByTargetScope) scope and element.effectiveScope else scope +} public trait UsagesSearchFilter { class object { @@ -150,7 +156,7 @@ public class KotlinPsiSearchHelper(private val project: Project): PsiSearchHelpe public fun processFilesWithText(item: UsagesSearchRequestItem, consumer: Processor): Boolean { return item.words.all { word -> val textProcessor = ResultTextProcessorImpl(item, consumer) - processElementsWithWord(textProcessor, item.target.scope, word, UsageSearchContext.IN_CODE, true) + processElementsWithWord(textProcessor, item.target.effectiveScope, word, UsageSearchContext.IN_CODE, true) } } } @@ -174,12 +180,6 @@ public object UsagesSearch: QueryFactory() { fun UsagesSearchRequest.search(): Query = UsagesSearch.search(this) -fun UsagesSearchTarget.retarget(element: B) = - UsagesSearchTarget(element, scope, location, restrictByTargetScope) - -val UsagesSearchTarget.effectiveScope: SearchScope - get() = if (restrictByTargetScope) scope and element.effectiveScope else scope - val PsiElement.effectiveScope: SearchScope get() = PsiSearchHelper.SERVICE.getInstance(getProject())!!.getUseScope(this) diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinPrivateClassUsages.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinPrivateClassUsages.results.txt index 38e6d940fe7..91eb967b3ba 100644 --- a/idea/testData/findUsages/kotlin/findClassUsages/kotlinPrivateClassUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinPrivateClassUsages.results.txt @@ -1,3 +1 @@ New instance creation (10: 33) open fun processRequest() = Foo() -New instance creation (14: 44) override fun processRequest() = Server.Foo() -New instance creation (5: 24) println(Server.Foo()) diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt index 14fe2ba42d1..d82ebc4e61a 100644 --- a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt @@ -1,3 +1 @@ -Function call (12: 45) override fun processRequest() = "foo" + doProcessRequest() -Function call (5: 18) Server().doProcessRequest() Function call (8: 33) open fun processRequest() = doProcessRequest() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt index 4bc4d748716..c847dd84084 100644 --- a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt @@ -1,3 +1 @@ Value read (10: 33) open fun processRequest() = Foo -Value read (14: 44) override fun processRequest() = Server.Foo -Value read (5: 26) println(Server().Foo) diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt index 7185df80296..6bb69c96e62 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt @@ -1,3 +1 @@ -Value read (12: 45) override fun processRequest() = "foo" + foo -Value read (5: 26) println(Server().foo) Value read (8: 33) open fun processRequest() = foo diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt index 7a57efd526b..9fddae8966e 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt @@ -1,3 +1 @@ -Value read (10: 45) override fun processRequest() = "foo" + foo -Value read (5: 26) println(Server().foo) Value read (6: 33) open fun processRequest() = foo