mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-61337 Don't suggest default-package classes in non-default package context
This commit is contained in:
@@ -146,6 +146,7 @@ public class AllClassesGetter {
|
||||
final Set<String> qnames = new THashSet<String>();
|
||||
|
||||
final GlobalSearchScope scope = filterByScope ? context.getContainingFile().getResolveScope() : GlobalSearchScope.allScope(context.getProject());
|
||||
final boolean pkgContext = JavaCompletionUtil.inSomePackage(context);
|
||||
|
||||
AllClassesSearch.search(scope, context.getProject(), new Condition<String>() {
|
||||
public boolean value(String s) {
|
||||
@@ -154,7 +155,8 @@ public class AllClassesGetter {
|
||||
}).forEach(new Processor<PsiClass>() {
|
||||
public boolean process(PsiClass psiClass) {
|
||||
assert psiClass != null;
|
||||
if (isSuitable(context, packagePrefix, qnames, psiClass, filterByScope)) {
|
||||
if (isSuitable(context, packagePrefix, qnames, psiClass, filterByScope, pkgContext)) {
|
||||
qnames.add(psiClass.getQualifiedName());
|
||||
consumer.consume(psiClass);
|
||||
}
|
||||
return true;
|
||||
@@ -177,8 +179,8 @@ public class AllClassesGetter {
|
||||
}
|
||||
|
||||
private static boolean isSuitable(@NotNull final PsiElement context, final String packagePrefix, final Set<String> qnames,
|
||||
@NotNull final PsiClass psiClass,
|
||||
final boolean filterByScope) {
|
||||
@NotNull final PsiClass psiClass,
|
||||
final boolean filterByScope, final boolean pkgContext) {
|
||||
ProgressManager.checkCanceled();
|
||||
|
||||
if (!context.isValid() || !psiClass.isValid()) return false;
|
||||
@@ -188,11 +190,11 @@ public class AllClassesGetter {
|
||||
final String qualifiedName = psiClass.getQualifiedName();
|
||||
if (qualifiedName == null || !qualifiedName.startsWith(packagePrefix)) return false;
|
||||
|
||||
if (!(psiClass instanceof PsiCompiledElement) || !filterByScope ||
|
||||
JavaPsiFacade.getInstance(psiClass.getProject()).getResolveHelper().isAccessible(psiClass, context, psiClass)) {
|
||||
return qnames.add(qualifiedName);
|
||||
}
|
||||
return false;
|
||||
if (qnames.contains(qualifiedName)) return false;
|
||||
|
||||
if (!filterByScope && !(psiClass instanceof PsiCompiledElement)) return true;
|
||||
|
||||
return JavaCompletionUtil.isSourceLevelAccessible(context, psiClass, pkgContext);
|
||||
}
|
||||
|
||||
public static JavaPsiClassReferenceElement createLookupItem(@NotNull final PsiClass psiClass,
|
||||
|
||||
@@ -587,11 +587,16 @@ public class JavaCompletionUtil {
|
||||
|
||||
boolean mayHighlight = qualifierType != null && (castedQualifierType == null || !qualifierType.isAssignableFrom(castedQualifierType));
|
||||
|
||||
final boolean pkgContext = inSomePackage(element);
|
||||
|
||||
final Set<PsiMember> mentioned = new THashSet<PsiMember>();
|
||||
for (CompletionElement completionElement : plainResults) {
|
||||
LookupElement item = createLookupElement(completionElement, qualifierType);
|
||||
if (item != null) {
|
||||
final Object o = item.getObject();
|
||||
if (o instanceof PsiClass && !isSourceLevelAccessible(element, (PsiClass)o, pkgContext)) {
|
||||
continue;
|
||||
}
|
||||
if (o instanceof PsiMember) {
|
||||
mentioned.add((PsiMember)o);
|
||||
}
|
||||
@@ -1002,4 +1007,24 @@ public class JavaCompletionUtil {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean inSomePackage(PsiElement context) {
|
||||
PsiFile contextFile = context.getContainingFile();
|
||||
return contextFile instanceof PsiClassOwner && StringUtil.isNotEmpty(((PsiClassOwner)contextFile).getPackageName());
|
||||
}
|
||||
|
||||
public static boolean isSourceLevelAccessible(PsiElement context, PsiClass psiClass, final boolean pkgContext) {
|
||||
if (!JavaPsiFacade.getInstance(psiClass.getProject()).getResolveHelper().isAccessible(psiClass, context, psiClass)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pkgContext) {
|
||||
PsiFile classFile = psiClass.getContainingFile();
|
||||
if (classFile instanceof PsiClassOwner && StringUtil.isEmpty(((PsiClassOwner)classFile).getPackageName())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,11 +32,13 @@ public abstract class StaticMemberProcessor {
|
||||
private final Project myProject;
|
||||
private final PsiResolveHelper myResolveHelper;
|
||||
private boolean myHintShown = false;
|
||||
private final boolean myPackagedContext;
|
||||
|
||||
public StaticMemberProcessor(final PsiElement position) {
|
||||
myPosition = position;
|
||||
myProject = myPosition.getProject();
|
||||
myResolveHelper = JavaPsiFacade.getInstance(myProject).getResolveHelper();
|
||||
myPackagedContext = JavaCompletionUtil.inSomePackage(position);
|
||||
}
|
||||
|
||||
public void importMembersOf(@Nullable PsiClass psiClass) {
|
||||
@@ -64,7 +66,7 @@ public abstract class StaticMemberProcessor {
|
||||
final PsiClass containingClass = method.getContainingClass();
|
||||
assert containingClass != null;
|
||||
|
||||
if (classes.add(containingClass)) {
|
||||
if (classes.add(containingClass) && JavaCompletionUtil.isSourceLevelAccessible(myPosition, containingClass, myPackagedContext)) {
|
||||
final boolean shouldImport = myStaticImportedClasses.contains(containingClass);
|
||||
if (!myHintShown && !shouldImport && CompletionService.getCompletionService().getAdvertisementText() == null) {
|
||||
final String shortcut = CompletionContributor.getActionShortcut("EditorRight");
|
||||
|
||||
+9
@@ -828,6 +828,15 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase {
|
||||
public void testOnlyAnnotationsAfterAt() throws Throwable { doTest() }
|
||||
public void testOnlyExceptionsInCatch() throws Throwable { doTest() }
|
||||
|
||||
public void testTopLevelClassesFromPackaged() throws Throwable {
|
||||
myFixture.addClass "public class Fooooo {}"
|
||||
final text = "package foo; class Bar { Fooo<caret> }"
|
||||
def file = myFixture.addFileToProject("foo/Bar.java", text)
|
||||
myFixture.configureFromExistingVirtualFile file.virtualFile
|
||||
assertEmpty myFixture.completeBasic()
|
||||
myFixture.checkResult text
|
||||
}
|
||||
|
||||
public void testRightShift() throws Throwable {
|
||||
configure()
|
||||
assertStringItems("myField1", "myField2");
|
||||
|
||||
+10
@@ -437,5 +437,15 @@ try {} catch (AbcdException"""
|
||||
myFixture.checkResult "try {} catch (AbcdException<caret> e) {}"
|
||||
}
|
||||
|
||||
public void testTopLevelClassesFromPackaged() throws Throwable {
|
||||
myFixture.addClass "public class Fooooo {}"
|
||||
final text = "package foo; class Bar { Fooo<caret> }"
|
||||
def file = myFixture.addFileToProject("foo/Bar.groovy", text)
|
||||
myFixture.configureFromExistingVirtualFile file.virtualFile
|
||||
assertEmpty myFixture.completeBasic()
|
||||
myFixture.checkResult text
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user