include classes of super methods in expected type (IDEA-188892)

This commit is contained in:
Anna.Kozlova
2018-04-24 18:30:54 +02:00
parent b536fc4ef1
commit aa598f5093
2 changed files with 35 additions and 5 deletions
@@ -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));
}
}
@@ -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)})
}
}