suggest inner classes from superclas in smart completion

This commit is contained in:
peter
2011-09-14 13:11:29 +02:00
parent 6595d8b6ee
commit 8ea2424104
5 changed files with 36 additions and 8 deletions
@@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.CodeInsightUtil;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightClassUtil;
import com.intellij.codeInsight.lookup.*;
import com.intellij.openapi.util.Condition;
import com.intellij.pom.java.LanguageLevel;
@@ -116,11 +117,7 @@ public class JavaInheritorsGetter extends CompletionProvider<CompletionParameter
final PsiClass psiClass = PsiUtil.resolveClassInType(type);
if (psiClass == null) return null;
final PsiClass parentClass = psiClass.getContainingClass();
if (parentClass != null && !psiClass.hasModifierProperty(PsiModifier.STATIC) &&
!PsiTreeUtil.isAncestor(parentClass, parameters.getPosition(), false) &&
!(parentClass.getContainingFile().equals(parameters.getOriginalFile()) &&
parentClass.getTextRange().contains(parameters.getOffset()))) {
if (HighlightClassUtil.checkCreateInnerClassFromStaticContext(parameters.getPosition(), null, psiClass) != null) {
return null;
}
@@ -792,6 +792,7 @@ public class HighlightClassUtil {
@Nullable
public static HighlightInfo checkCreateInnerClassFromStaticContext(PsiNewExpression expression) {
PsiType type = expression.getType();
PsiExpression qualifier = expression.getQualifier();
if (type == null || type instanceof PsiArrayType || type instanceof PsiPrimitiveType) return null;
PsiClass aClass = PsiUtil.resolveClassInType(type);
if (aClass == null) return null;
@@ -800,23 +801,26 @@ public class HighlightClassUtil {
if (aClass == null) return null;
}
return checkCreateInnerClassFromStaticContext(expression, qualifier, aClass);
}
public static HighlightInfo checkCreateInnerClassFromStaticContext(PsiElement element, @Nullable PsiExpression qualifier, PsiClass aClass) {
if (!PsiUtil.isInnerClass(aClass)) return null;
PsiClass outerClass = aClass.getContainingClass();
if (outerClass == null) return null;
PsiElement placeToSearchEnclosingFrom;
PsiExpression qualifier = expression.getQualifier();
if (qualifier != null) {
PsiType qtype = qualifier.getType();
placeToSearchEnclosingFrom = PsiUtil.resolveClassInType(qtype);
}
else {
placeToSearchEnclosingFrom = expression;
placeToSearchEnclosingFrom = element;
}
if (outerClass instanceof JspClass
|| hasEnclosingInstanceInScope(outerClass, placeToSearchEnclosingFrom, true)) return null;
return reportIllegalEnclosingUsage(placeToSearchEnclosingFrom, aClass, outerClass, expression);
return reportIllegalEnclosingUsage(placeToSearchEnclosingFrom, aClass, outerClass, element);
}
public static HighlightInfo checkSuperQualifierType(@NotNull Project project, @NotNull PsiMethodCallExpression superCall) {
@@ -0,0 +1,13 @@
public class Zoo2 {
static class Handler {}
}
class Zoo3 extends Zoo2 {
class MyHandler extends Handler {}
}
class Zoo4 extends Zoo3 {
{
Handler handler = new MyHandler();<caret>
}
}
@@ -0,0 +1,13 @@
public class Zoo2 {
static class Handler {}
}
class Zoo3 extends Zoo2 {
class MyHandler extends Handler {}
}
class Zoo4 extends Zoo3 {
{
Handler handler = new M<caret>
}
}
@@ -953,6 +953,7 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
public void testSiblingOfAStaticallyImportedField() throws Throwable { doTest(); }
public void testPrimitiveArrayClassInMethod() throws Throwable { doTest(); }
public void testPrimitiveClassInAnno() throws Throwable { doTest(); }
public void testNewInnerClassOfSuper() throws Throwable { doTest(); }
public void testInferFromCall() throws Throwable {
doTest();