mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
suggest inner classes from superclas in smart completion
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+7
-3
@@ -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) {
|
||||
|
||||
+13
@@ -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>
|
||||
}
|
||||
}
|
||||
+1
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user