From 0da5a0cefdafa41da5da8de96667fcdd8d16de54 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 4 May 2016 13:38:07 +0200 Subject: [PATCH] replace code duplicates: move change signature out of write action --- .../refactoring/extractMethod/ExtractMethodProcessor.java | 6 +++++- .../refactoring/util/duplicates/ConstantMatchProvider.java | 3 +++ .../refactoring/util/duplicates/DuplicatesImpl.java | 3 +++ .../refactoring/util/duplicates/MatchProvider.java | 7 ++++++- .../util/duplicates/MethodDuplicatesMatchProvider.java | 6 +++++- 5 files changed, 22 insertions(+), 3 deletions(-) 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 fbeb184239ec..afc0bbb0df36 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -1229,8 +1229,12 @@ public class ExtractMethodProcessor implements MatchProvider { return result; } - public PsiElement processMatch(Match match) throws IncorrectOperationException { + @Override + public void prepareSignature(Match match) { MatchUtil.changeSignature(match, myExtractedMethod); + } + + public PsiElement processMatch(Match match) throws IncorrectOperationException { if (RefactoringUtil.isInStaticContext(match.getMatchStart(), myExtractedMethod.getContainingClass())) { PsiUtil.setModifierProperty(myExtractedMethod, PsiModifier.STATIC, true); } diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/ConstantMatchProvider.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/ConstantMatchProvider.java index 7c66aaebcf03..21f8cf5ba50a 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/ConstantMatchProvider.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/ConstantMatchProvider.java @@ -40,6 +40,9 @@ class ConstantMatchProvider implements MatchProvider { myMatches = matches; } + @Override + public void prepareSignature(Match match) {} + @Override public PsiElement processMatch(Match match) throws IncorrectOperationException { final PsiClass containingClass = myField.getContainingClass(); diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java index 3b08eef16b75..54658db14ed1 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java @@ -140,6 +140,9 @@ public class DuplicatesImpl { HighlightManager.getInstance(project).removeSegmentHighlighter(editor, highlighters.get(0)); } + // call change signature when needed + provider.prepareSignature(match); + new WriteCommandAction(project, MethodDuplicatesHandler.REFACTORING_NAME, MethodDuplicatesHandler.REFACTORING_NAME) { @Override protected void run(@NotNull Result result) throws Throwable { diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MatchProvider.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MatchProvider.java index 8c067a215ef3..7f8b6fe1aa0f 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MatchProvider.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MatchProvider.java @@ -17,7 +17,6 @@ package com.intellij.refactoring.util.duplicates; import com.intellij.psi.PsiElement; import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -26,6 +25,12 @@ import java.util.List; * @author dsl */ public interface MatchProvider { + /** + * Call change signature here to avoid refactoring under write action + * @param match match which requires signature to be changed e.g. due to stronger expected type, etc + */ + void prepareSignature(Match match); + PsiElement processMatch(Match match) throws IncorrectOperationException; List getDuplicates(); diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesMatchProvider.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesMatchProvider.java index 2da15dbc7450..2b1cd58890f7 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesMatchProvider.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesMatchProvider.java @@ -47,8 +47,12 @@ class MethodDuplicatesMatchProvider implements MatchProvider { } @Override - public PsiElement processMatch(Match match) throws IncorrectOperationException { + public void prepareSignature(Match match) { MatchUtil.changeSignature(match, myMethod); + } + + @Override + public PsiElement processMatch(Match match) throws IncorrectOperationException { final PsiClass containingClass = myMethod.getContainingClass(); if (isEssentialStaticContextAbsent(match)) { PsiUtil.setModifierProperty(myMethod, PsiModifier.STATIC, true);