From 6fe7ef3c1247cdfe765c4b6714abeb463e8c045b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 16:19:52 +0100 Subject: [PATCH] extract: don't reject super types based on calling of final methods - they could be called on inheritors without problems (IDEA-149121) --- .../codeInsight/ExpectedTypesProvider.java | 4 +--- ...pesHierarchyBasedOnCalledMethod.after.java | 10 ++++++++++ .../TypesHierarchyBasedOnCalledMethod.java | 9 +++++++++ .../refactoring/IntroduceVariableTest.java | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java 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");