From bf106d01b83de91ce0b44b06275445938dd7022f Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 10 Apr 2018 18:00:23 +0300 Subject: [PATCH] Find Usages: Restrict search scope of private top-level declarations #KT-7622 Fixed --- .../kotlin/psi/KtNamedDeclarationStub.java | 24 +++++++++++++++++-- .../after/a/noImports.java | 4 +--- .../after/a/noImports.kt | 2 -- .../movePrivateProperty/conflicts.txt | 1 - .../after/a/noImports.java | 6 ++--- .../after/a/noImports.kt | 2 -- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedDeclarationStub.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedDeclarationStub.java index b2ca362a2ba..7119eb7112f 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedDeclarationStub.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedDeclarationStub.java @@ -18,15 +18,18 @@ package org.jetbrains.kotlin.psi; import com.google.common.collect.ImmutableSet; import com.intellij.lang.ASTNode; +import com.intellij.openapi.project.Project; +import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiElement; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.psi.search.SearchScope; +import com.intellij.psi.PsiPackage; +import com.intellij.psi.search.*; 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; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.idea.KotlinFileType; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; @@ -149,6 +152,23 @@ abstract class KtNamedDeclarationStub> extends if (containingClass != null) { return new LocalSearchScope(containingClass); } + KtFile ktFile = getContainingKtFile(); + if (this instanceof KtClassOrObject) { + // Private top-level class may be used in non-Kotlin JVM code + Project project = getProject(); + GlobalSearchScope kotlinFilesScope = GlobalSearchScope.getScopeRestrictedByFileTypes( + GlobalSearchScope.allScope(project), + KotlinFileType.INSTANCE + ); + PsiPackage psiPackage = JavaPsiFacade.getInstance(project).findPackage(ktFile.getPackageFqName().asString()); + SearchScope baseScope = psiPackage != null + ? new PackageScope(psiPackage, false, true) + : super.getUseScope(); + baseScope.intersectWith(GlobalSearchScope.notScope(kotlinFilesScope)); + } + else { + return new LocalSearchScope(ktFile); + } } SearchScope scope = super.getUseScope(); diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.java b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.java index 2219158ca07..9cc12698d1e 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.java +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.java @@ -1,9 +1,7 @@ package a; -import b.TestKt; - class J { void bar() { - TestKt.test(); + MainKt.test(); } } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.kt index 576a8bd2bee..4c10813ba46 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/functionAlreadyInaccessible/after/a/noImports.kt @@ -1,7 +1,5 @@ package a -import b.test - fun bar() { test() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePrivateProperty/conflicts.txt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePrivateProperty/conflicts.txt index 94493c54c80..bb9d6ea6a68 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePrivateProperty/conflicts.txt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePrivateProperty/conflicts.txt @@ -1,2 +1 @@ -Getter for property bar uses property foo which will be inaccessible after move Property foo uses property bar which will be inaccessible after move \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.java b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.java index 362e5fd1b83..083aa86c198 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.java +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.java @@ -1,10 +1,8 @@ package a; -import b.TestKt; - class J { void bar() { - TestKt.setTest(""); - System.out.println(TestKt.getTest()); + MainKt.setTest(""); + System.out.println(MainKt.getTest()); } } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.kt index c7d1ea8ff44..f319c15486f 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.kt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/propertyAlreadyInaccessible/after/a/noImports.kt @@ -1,7 +1,5 @@ package a -import b.test - fun bar() { test = "" println(test)