IDEA-125954 Incorrect code completion for deep inner class

This commit is contained in:
peter
2014-06-13 15:40:21 +02:00
parent 837ec9e77d
commit 01bb23e701
5 changed files with 44 additions and 11 deletions
@@ -151,9 +151,11 @@ public class JavaClassNameCompletionContributor extends CompletionContributor {
if (withInners && name != null) {
for (PsiClass inner : psiClass.getInnerClasses()) {
if (inner.hasModifierProperty(PsiModifier.STATIC)) {
for (JavaPsiClassReferenceElement lookupInner : createClassLookupItems(inner, withInners, insertHandler, condition)) {
for (JavaPsiClassReferenceElement lookupInner : createClassLookupItems(inner, true, insertHandler, condition)) {
String forced = lookupInner.getForcedPresentableName();
lookupInner.setForcedPresentableName(name + "." + (forced != null ? forced : inner.getName()));
String qualifiedName = name + "." + (forced != null ? forced : inner.getName());
lookupInner.setForcedPresentableName(qualifiedName);
lookupInner.setLookupString(qualifiedName);
result.add(lookupInner);
}
}
@@ -53,6 +53,8 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
}
PsiElement position = file.findElementAt(offset);
PsiJavaCodeReferenceElement ref = position != null && position.getParent() instanceof PsiJavaCodeReferenceElement ?
(PsiJavaCodeReferenceElement) position.getParent() : null;
PsiClass psiClass = item.getObject();
final Project project = context.getProject();
@@ -75,14 +77,8 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
return;
}
if (position != null) {
PsiElement parent = position.getParent();
if (parent instanceof PsiJavaCodeReferenceElement) {
final PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)parent;
if (PsiTreeUtil.getParentOfType(position, PsiDocTag.class) != null && ref.isReferenceTo(psiClass)) {
return;
}
}
if (ref != null && PsiTreeUtil.getParentOfType(position, PsiDocTag.class) != null && ref.isReferenceTo(psiClass)) {
return;
}
OffsetKey refEnd = context.trackOffset(context.getTailOffset(), false);
@@ -92,7 +88,9 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
context.setAddCompletionChar(false);
}
PsiTypeLookupItem.addImportForItem(context, psiClass);
if (ref == null || !ref.isQualified()) {
PsiTypeLookupItem.addImportForItem(context, psiClass);
}
if (context.getOffset(refEnd) < 0) {
return;
}
@@ -0,0 +1,13 @@
class ClassMain{
public static class ClassInner1{
public static class ClassInner2{
}
}
}
class Foo {
{
new ClassMain.Cla<caret>
}
}
@@ -0,0 +1,13 @@
class ClassMain{
public static class ClassInner1{
public static class ClassInner2{
}
}
}
class Foo {
{
new ClassMain.ClassInner1.ClassInner2()<caret>
}
}
@@ -938,6 +938,13 @@ public class ListUtils {
public void testQualifyInnerMembers() throws Throwable { doTest('\n') }
public void testDeepInner() throws Throwable {
configure()
assert myFixture.lookupElementStrings == ['ClassInner1', 'ClassInner1.ClassInner2']
selectItem(lookup.items[1])
checkResult()
}
public void testSuggestExpectedTypeMembers() throws Throwable { doTest('\n') }
public void testSuggestExpectedTypeMembersInCall() throws Throwable { doTest('\n') }
public void testSuggestExpectedTypeMembersInAnno() throws Throwable { doTest('\n') }