IDEA-61337 Don't suggest default-package classes in non-default package context

This commit is contained in:
peter.gromov
2010-12-30 19:25:40 +03:00
parent b72bd1c528
commit ad6472fa7e
5 changed files with 57 additions and 9 deletions
@@ -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");
@@ -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");
@@ -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
}
}