From 1a9c4c2f19fc46fe8c99b4bb9d4a0389d45e44ea Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 13 Apr 2016 13:40:05 +0200 Subject: [PATCH] extract method: when context was changed ensure that static method is not qualified with this --- .../extractMethod/ExtractMethodProcessor.java | 10 ++++++- .../QualifyWhenConflictingNamePresent.java | 11 +++++++ ...alifyWhenConflictingNamePresent_after.java | 15 ++++++++++ .../refactoring/ExtractMethodTest.java | 30 +++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index b6a46bb5ab0b..d22b60890fd2 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -730,6 +730,14 @@ public class ExtractMethodProcessor implements MatchProvider { } } + @TestOnly + public void testTargetClass(PsiClass targetClass) { + if (targetClass != null) { + myTargetClass = targetClass; + myNeedChangeContext = true; + } + } + @TestOnly public void testPrepare(PsiType returnType, boolean makeStatic) throws PrepareFailedException{ if (makeStatic) { @@ -1018,7 +1026,7 @@ public class ExtractMethodProcessor implements MatchProvider { ChangeContextUtil.decodeContextInfo(myExtractedMethod, myTargetClass, RefactoringChangeUtil.createThisExpression(myManager, null)); if (myMethodCall.resolveMethod() != myExtractedMethod) { final PsiReferenceExpression methodExpression = myMethodCall.getMethodExpression(); - methodExpression.setQualifierExpression(RefactoringChangeUtil.createThisExpression(myManager, myTargetClass)); + RefactoringChangeUtil.qualifyReference(methodExpression, myExtractedMethod, PsiUtil.getEnclosingStaticElement(methodExpression, myTargetClass) != null ? myTargetClass : null); } } } diff --git a/java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent.java b/java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent.java new file mode 100644 index 000000000000..ab15ba3e6716 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent.java @@ -0,0 +1,11 @@ +class A { + public void newMethod() {} +} + +class B { + static class C extends A { + { + System.out.println(); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent_after.java b/java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent_after.java new file mode 100644 index 000000000000..8892139ce8c5 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/QualifyWhenConflictingNamePresent_after.java @@ -0,0 +1,15 @@ +class A { + public void newMethod() {} +} + +class B { + static class C extends A { + { + B.newMethod(); + } + } + + private void newMethod() { + System.out.println(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 650badbd68c0..7df6b43c8fb7 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -26,6 +26,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.extractMethod.ExtractMethodHandler; import com.intellij.refactoring.extractMethod.ExtractMethodProcessor; import com.intellij.refactoring.extractMethod.PrepareFailedException; @@ -776,6 +777,18 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTest(); } + public void testQualifyWhenConflictingNamePresent() throws Exception { + final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); + settings.ELSE_ON_NEW_LINE = true; + settings.CATCH_ON_NEW_LINE = myCatchOnNewLine; + configureByFile(BASE_PATH + getTestName(false) + ".java"); + final PsiClass psiClass = PsiTreeUtil.getParentOfType(getFile().findElementAt(getEditor().getSelectionModel().getLeadSelectionOffset()), PsiClass.class); + assertNotNull(psiClass); + boolean success = performExtractMethod(true, true, getEditor(), getFile(), getProject(), false, null, false, null, psiClass.getContainingClass()); + assertTrue(success); + checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); + } + private void doTestDisabledParam() throws PrepareFailedException { final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); settings.ELSE_ON_NEW_LINE = true; @@ -875,6 +888,22 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { String newNameOfFirstParam, int... disabledParams) throws PrepareFailedException, IncorrectOperationException { + return performExtractMethod(doRefactor, replaceAllDuplicates, editor, file, project, extractChainedConstructor, returnType, makeStatic, + newNameOfFirstParam, null, disabledParams); + } + + public static boolean performExtractMethod(boolean doRefactor, + boolean replaceAllDuplicates, + Editor editor, + PsiFile file, + Project project, + final boolean extractChainedConstructor, + PsiType returnType, + boolean makeStatic, + String newNameOfFirstParam, + PsiClass targetClass, + int... disabledParams) + throws PrepareFailedException, IncorrectOperationException { int startOffset = editor.getSelectionModel().getSelectionStart(); int endOffset = editor.getSelectionModel().getSelectionEnd(); @@ -904,6 +933,7 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { } if (doRefactor) { + processor.testTargetClass(targetClass); processor.testPrepare(returnType, makeStatic); processor.testNullness(); if (disabledParams != null) {