From aa598f5093e1f052d873edd1f15100058fe47f05 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 24 Apr 2018 18:29:04 +0200 Subject: [PATCH] include classes of super methods in expected type (IDEA-188892) --- .../codeInsight/ExpectedTypesProvider.java | 20 +++++++++++++++++-- .../CreateMethodFromUsageTemplateTest.groovy | 20 ++++++++++++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index ae804a706681..7c8bec09f9c0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -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 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 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)); } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/CreateMethodFromUsageTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/CreateMethodFromUsageTemplateTest.groovy index f14a7932fe82..d71b9ea67fce 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/CreateMethodFromUsageTemplateTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/CreateMethodFromUsageTemplateTest.groovy @@ -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().getBar().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)}) + } }