diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index c2a1bfef670c..c6dcf130c3f8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -1230,9 +1230,7 @@ public class ExpectedTypesProvider { final PsiClassType type = substitutor == null ? facade.getElementFactory().createType(aClass) : facade.getElementFactory().createType(aClass, substitutor); - if (method.hasModifierProperty(PsiModifier.STATIC) || - method.hasModifierProperty(PsiModifier.FINAL) || - method.hasModifierProperty(PsiModifier.PRIVATE)) { + 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) { types.add(createInfoImpl(type, ExpectedTypeInfo.TYPE_OR_SUBTYPE, type, TailType.DOT)); diff --git a/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java new file mode 100644 index 000000000000..37fcc4adbbb1 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java @@ -0,0 +1,10 @@ +class A { + public final void foo() {} +} +class B extends A {} +class C { + void f(B b) { + B v = b; + v.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java new file mode 100644 index 000000000000..e1d75f927852 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java @@ -0,0 +1,9 @@ +class A { + public final void foo() {} +} +class B extends A {} +class C { + void f(B b) { + b.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index a486f2b3a7fd..d74120994221 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -521,6 +521,25 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { }); } + public void testTypesHierarchyBasedOnCalledMethod() { + doTest(new MockIntroduceVariableHandler("v", true, false, false, "B") { + @Override + public IntroduceVariableSettings getSettings(Project project, Editor editor, + PsiExpression expr, PsiExpression[] occurrences, + TypeSelectorManagerImpl typeSelectorManager, + boolean declareFinalIfAll, + boolean anyAssignmentLHS, + InputValidator validator, + PsiElement anchor, final OccurrencesChooser.ReplaceChoice replaceChoice) { + final PsiType[] types = typeSelectorManager.getTypesForAll(); + assertTrue(types[0].getPresentableText(), types[0].getPresentableText().equals("B")); + assertTrue(types[1].getPresentableText(), types[1].getPresentableText().equals("A")); + return super.getSettings(project, editor, expr, occurrences, typeSelectorManager, declareFinalIfAll, anyAssignmentLHS, + validator, anchor, replaceChoice); + } + }); + } + private void doTest(IntroduceVariableBase testMe) { String baseName = "/refactoring/introduceVariable/" + getTestName(false); configureByFile(baseName + ".java");