Find Usages: Restrict search scope of private top-level declarations

#KT-7622 Fixed
This commit is contained in:
Alexey Sedunov
2018-04-10 18:00:23 +03:00
parent c172810d1d
commit bf106d01b8
6 changed files with 25 additions and 14 deletions
@@ -18,15 +18,18 @@ package org.jetbrains.kotlin.psi;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.intellij.lang.ASTNode; 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.PsiElement;
import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.PsiPackage;
import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.*;
import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException; import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.KotlinFileType;
import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
@@ -149,6 +152,23 @@ abstract class KtNamedDeclarationStub<T extends KotlinStubWithFqName<?>> extends
if (containingClass != null) { if (containingClass != null) {
return new LocalSearchScope(containingClass); 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(); SearchScope scope = super.getUseScope();
@@ -1,9 +1,7 @@
package a; package a;
import b.TestKt;
class J { class J {
void bar() { void bar() {
TestKt.test(); MainKt.test();
} }
} }
@@ -1,7 +1,5 @@
package a package a
import b.test
fun bar() { fun bar() {
test() test()
} }
@@ -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 Property foo uses property bar which will be inaccessible after move
@@ -1,10 +1,8 @@
package a; package a;
import b.TestKt;
class J { class J {
void bar() { void bar() {
TestKt.setTest(""); MainKt.setTest("");
System.out.println(TestKt.getTest()); System.out.println(MainKt.getTest());
} }
} }
@@ -1,7 +1,5 @@
package a package a
import b.test
fun bar() { fun bar() {
test = "" test = ""
println(test) println(test)