mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
include classes of super methods in expected type (IDEA-188892)
This commit is contained in:
@@ -1185,8 +1185,23 @@ public class ExpectedTypesProvider {
|
||||
final PsiManager manager = methodCallExpr.getManager();
|
||||
final JavaPsiFacade facade = JavaPsiFacade.getInstance(manager.getProject());
|
||||
final PsiMethod[] methods = myClassProvider.findDeclaredMethods(manager, reference.getReferenceName());
|
||||
LinkedHashSet<PsiMethod> psiMethods = new LinkedHashSet<>();
|
||||
for (PsiMethod m : methods) {
|
||||
if (m.hasModifierProperty(PsiModifier.STATIC) || m.hasModifierProperty(PsiModifier.PRIVATE)) {
|
||||
psiMethods.add(m);
|
||||
}
|
||||
else {
|
||||
PsiMethod[] superMethods = m.findDeepestSuperMethods();
|
||||
if (superMethods.length > 0) {
|
||||
psiMethods.addAll(Arrays.asList(superMethods));
|
||||
}
|
||||
else {
|
||||
psiMethods.add(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
Set<ExpectedTypeInfo> types = new THashSet<>();
|
||||
for (PsiMethod method : methods) {
|
||||
for (PsiMethod method : psiMethods) {
|
||||
final PsiClass aClass = method.getContainingClass();
|
||||
if (aClass == null || !facade.getResolveHelper().isAccessible(method, reference, aClass)) continue;
|
||||
|
||||
@@ -1196,7 +1211,8 @@ public class ExpectedTypesProvider {
|
||||
|
||||
if (method.hasModifierProperty(PsiModifier.STATIC) || method.hasModifierProperty(PsiModifier.PRIVATE)) {
|
||||
types.add(createInfoImpl(type, ExpectedTypeInfo.TYPE_STRICTLY, type, TailType.DOT));
|
||||
} else if (method.findSuperMethods().length == 0) {
|
||||
}
|
||||
else {
|
||||
types.add(createInfoImpl(type, ExpectedTypeInfo.TYPE_OR_SUBTYPE, type, TailType.DOT));
|
||||
}
|
||||
}
|
||||
|
||||
+17
-3
@@ -1,6 +1,8 @@
|
||||
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package com.intellij.java.codeInsight.daemon.quickFix
|
||||
|
||||
|
||||
import com.intellij.codeInsight.ExpectedTypesProvider
|
||||
import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase
|
||||
import com.intellij.codeInsight.lookup.LookupManager
|
||||
import com.intellij.codeInsight.template.impl.TemplateManagerImpl
|
||||
@@ -9,9 +11,7 @@ import com.intellij.openapi.actionSystem.DataContext
|
||||
import com.intellij.openapi.actionSystem.IdeActions
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.editor.actionSystem.EditorActionManager
|
||||
import com.intellij.psi.PsiDocumentManager
|
||||
import com.intellij.psi.PsiMethod
|
||||
import com.intellij.psi.PsiModifier
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleSettings
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
|
||||
@@ -281,4 +281,18 @@ public class InvalidClass {
|
||||
}
|
||||
'''
|
||||
}
|
||||
|
||||
void 'test expected types'() {
|
||||
configureFromFileText 'a.java', '''\
|
||||
class A {
|
||||
{
|
||||
new A().get<caret>Bar().toString();
|
||||
}
|
||||
}
|
||||
'''
|
||||
def expr = PsiTreeUtil.getParentOfType(file.findElementAt(editor.caretModel.offset), PsiExpression.class)
|
||||
|
||||
def types = ExpectedTypesProvider.getExpectedTypes(expr, false)
|
||||
assertNotNull(types.find {it.defaultType.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user