diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractDuplicatesProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractDuplicatesProcessor.java deleted file mode 100644 index 01ce78eab5a0..000000000000 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractDuplicatesProcessor.java +++ /dev/null @@ -1,254 +0,0 @@ -// 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.refactoring.extractMethod; - -import com.intellij.codeInsight.CodeInsightUtil; -import com.intellij.ide.util.EditorHelper; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.util.Couple; -import com.intellij.openapi.util.Segment; -import com.intellij.psi.*; -import com.intellij.refactoring.BaseRefactoringProcessor; -import com.intellij.refactoring.HelpID; -import com.intellij.refactoring.RefactoringBundle; -import com.intellij.refactoring.ui.UsageViewDescriptorAdapter; -import com.intellij.refactoring.util.CommonRefactoringUtil; -import com.intellij.refactoring.util.duplicates.DuplicatesImpl; -import com.intellij.refactoring.util.duplicates.Match; -import com.intellij.refactoring.util.duplicates.MatchProvider; -import com.intellij.usageView.UsageInfo; -import com.intellij.usageView.UsageViewDescriptor; -import com.intellij.util.ArrayUtil; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.containers.ContainerUtil; -import gnu.trove.THashSet; -import one.util.streamex.StreamEx; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -/** - * @author Pavel.Dolgov - */ -public class ExtractDuplicatesProcessor extends BaseRefactoringProcessor { - private static final Logger LOG = Logger.getInstance(ExtractDuplicatesProcessor.class); - - private final PsiMethod myMethod; - private final List>> myDuplicatesPointers = new ArrayList<>(); - private final ExtractMethodSnapshot myExtractMethodSnapshot; - private final List> myElementPointers; - - public ExtractDuplicatesProcessor(ExtractMethodProcessor processor) { - super(processor.getProject()); - - myExtractMethodSnapshot = new ExtractMethodSnapshot(processor); - - PsiElement[] elements = processor.getElements(); - PsiMethod method = processor.generateEmptyMethod(processor.getMethodName(), processor.getTargetClass().getLBrace()); - - List duplicates = processor.getDuplicates(); - if (ContainerUtil.isEmpty(duplicates)) { - ParametrizedDuplicates parametrizedDuplicates = processor.getParametrizedDuplicates(); - if (parametrizedDuplicates != null) { - duplicates = parametrizedDuplicates.getDuplicates(); - method = parametrizedDuplicates.getParametrizedMethod(); - } - else { - duplicates = Collections.emptyList(); - } - } - myMethod = method; - - SmartPointerManager manager = SmartPointerManager.getInstance(processor.getProject()); - myElementPointers = StreamEx.of(elements).map(manager::createSmartPsiElementPointer).toList(); - - myDuplicatesPointers.add(createPointerPair(elements[0], elements[elements.length - 1], manager)); - for (Match duplicate : duplicates) { - myDuplicatesPointers.add(createPointerPair(duplicate.getMatchStart(), duplicate.getMatchEnd(), manager)); - } - - setPreviewUsages(true); - } - - Couple> createPointerPair(@NotNull PsiElement start, - @NotNull PsiElement end, - @NotNull SmartPointerManager manager) { - if (start == end) { - SmartPsiElementPointer pointer = manager.createSmartPsiElementPointer(start); - return Couple.of(pointer, pointer); - } - SmartPsiElementPointer startPointer = manager.createSmartPsiElementPointer(start); - SmartPsiElementPointer endPointer = manager.createSmartPsiElementPointer(end); - return Couple.of(startPointer, endPointer); - } - - @NotNull - @Override - protected UsageViewDescriptor createUsageViewDescriptor(@NotNull UsageInfo[] usages) { - return new UsageViewDescriptorAdapter() { - @NotNull - @Override - public PsiElement[] getElements() { - return new PsiElement[]{myMethod}; - } - - @Override - public String getProcessedElementsHeader() { - return RefactoringBundle.message("refactoring.extract.method.preview.tree.method"); - } - - @Override - public String getCodeReferencesText(int usagesCount, int filesCount) { - return RefactoringBundle.message("refactoring.extract.method.preview.tree.duplicates", usagesCount, filesCount); - } - }; - } - - @NotNull - @Override - protected UsageInfo[] findUsages() { - List infos = new ArrayList<>(); - for (Couple> pointers : myDuplicatesPointers) { - PsiElement start = pointers.getFirst().getElement(); - PsiElement end = pointers.getSecond().getElement(); - if (start != null && end != null && start.isValid() && end.isValid()) { - infos.add(MyUsageInfo.create(start, end)); - } - } - return infos.toArray(UsageInfo.EMPTY_ARRAY); - } - - @Override - protected void performRefactoring(@NotNull UsageInfo[] usages) { - if (usages.length == 0) return; - PsiElement[] elements = StreamEx.of(myElementPointers) - .map(SmartPsiElementPointer::getElement) - .toArray(PsiElement.EMPTY_ARRAY); - LOG.assertTrue(!ArrayUtil.contains(null, elements)); - - JavaDuplicatesExtractMethodProcessor myProcessor = - new JavaDuplicatesExtractMethodProcessor(elements, ExtractMethodHandler.REFACTORING_NAME); - myProcessor.applyFromSnapshot(myExtractMethodSnapshot); - myProcessor.setShowErrorDialogs(true); - try { - if (!myProcessor.prepare(null)) return; - } - catch (PrepareFailedException e) { - CommonRefactoringUtil.showErrorHint(myProject, null, e.getMessage(), ExtractMethodHandler.REFACTORING_NAME, HelpID.EXTRACT_METHOD); - } - - ExtractMethodHandler.extractMethod(myProject, myProcessor); - myProcessor.initParametrizedDuplicates(false); - PsiMethodCallExpression call = myProcessor.getMethodCall(); - Editor editor = EditorHelper.openInEditor(call); - if (editor != null) { - MatchProvider provider = new MyMatchProvider(myProcessor, usages); - DuplicatesImpl.invoke(myProject, provider, false); - } - } - - @NotNull - @Override - protected String getCommandName() { - return RefactoringBundle.message("refactoring.extract.method.preview.command"); - } - - @Nullable - public static PsiElement[] getUsageInfoElements(@NotNull UsageInfo usageInfo) { - Segment segment = usageInfo.getSegment(); - PsiFile file = usageInfo.getFile(); - if (segment != null && file != null) { - PsiElement[] elements = getSegmentElements(segment, file); - if (elements.length != 0) { - return elements; - } - } - return null; - } - - @NotNull - public static PsiElement[] getSegmentElements(@NotNull Segment textRange, @NotNull PsiFile file) { - PsiExpression expr = CodeInsightUtil.findExpressionInRange(file, textRange.getStartOffset(), textRange.getEndOffset()); - if (expr != null) { - return new PsiElement[]{expr}; - } - return CodeInsightUtil.findStatementsInRange(file, textRange.getStartOffset(), textRange.getEndOffset()); - } - - - private static class MyUsageInfo extends UsageInfo { - private MyUsageInfo(int startOffset, int endOffset, @NotNull PsiElement parent) { - super(parent, startOffset, endOffset); - } - - private MyUsageInfo(@NotNull PsiElement element) { - super(element); - } - - static MyUsageInfo create(@NotNull PsiElement start, @NotNull PsiElement end) { - if (start == end) { - return new MyUsageInfo(start); - } - PsiElement parent = start.getParent(); - int parentOffset = parent.getTextRange().getStartOffset(); - int startOffset = start.getTextRange().getStartOffset() - parentOffset; - int endOffset = end.getTextRange().getEndOffset() - parentOffset; - return new MyUsageInfo(startOffset, endOffset, parent); - } - } - - private static class MyMatchProvider implements MatchProvider { - private final JavaDuplicatesExtractMethodProcessor myProcessor; - private final UsageInfo[] myUsages; - - public MyMatchProvider(JavaDuplicatesExtractMethodProcessor processor, UsageInfo[] usages) { - myProcessor = processor; - myUsages = usages; - } - - @Override - public void prepareSignature(Match match) { - myProcessor.prepareSignature(match); - } - - @Override - public PsiElement processMatch(Match match) throws IncorrectOperationException { - return myProcessor.processMatch(match); - } - - @Override - public List getDuplicates() { - Set selected = new THashSet<>(); - for (UsageInfo usage : myUsages) { - PsiElement[] elements = getUsageInfoElements(usage); - if (elements != null && elements.length != 0 && elements[0] != null && elements[0].isValid()) { - selected.add(elements[0]); - } - } - - List duplicates = myProcessor.getDuplicates(); - return ContainerUtil.filter(duplicates, d -> selected.contains(d.getMatchStart())); - } - - @Nullable - @Override - public Boolean hasDuplicates() { - return myUsages.length > 1 ? null : false; - } - - @Nullable - @Override - public String getConfirmDuplicatePrompt(Match match) { - return null; - } - - @Override - public String getReplaceDuplicatesTitle(int idx, int size) { - return myProcessor.getReplaceDuplicatesTitle(idx, size); - } - } -} diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodHandler.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodHandler.java index 7302e61fa39a..2a538e79c945 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodHandler.java @@ -35,7 +35,6 @@ import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pass; import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; import com.intellij.psi.*; @@ -163,7 +162,8 @@ public class ExtractMethodHandler implements RefactoringActionHandler, ContextAw processor.setPreviewSupported(true); if (processor.showDialog(directTypes)) { if (processor.isPreviewDuplicates()) { - return previewExtractMethod(processor); + previewExtractMethod(processor); + return true; } extractMethod(project, processor); DuplicatesImpl.processDuplicates(processor, project, editor); @@ -172,16 +172,9 @@ public class ExtractMethodHandler implements RefactoringActionHandler, ContextAw return false; } - private static boolean previewExtractMethod(@NotNull ExtractMethodProcessor processor) { + private static void previewExtractMethod(@NotNull ExtractMethodProcessor processor) { processor.previewRefactoring(); - boolean showToolWindow = Registry.is("extract.method.duplicates.tool.window"); - if (showToolWindow) { - ExtractMethodPreviewManager.getInstance(processor.getProject()).showPreview(processor); - } - else { - new ExtractDuplicatesProcessor(processor).run(); - } - return true; + ExtractMethodPreviewManager.getInstance(processor.getProject()).showPreview(processor); } public static void extractMethod(@NotNull final Project project, final ExtractMethodProcessor processor) { diff --git a/platform/platform-resources-en/src/messages/RefactoringBundle.properties b/platform/platform-resources-en/src/messages/RefactoringBundle.properties index b46e7e61efe4..a9de6e1cb095 100644 --- a/platform/platform-resources-en/src/messages/RefactoringBundle.properties +++ b/platform/platform-resources-en/src/messages/RefactoringBundle.properties @@ -796,9 +796,6 @@ change.signature.leave.blank.default.value=Leave &blank change.signature.feel.lucky=Feel &lucky change.signature.use.selected.value=Use selected &value refactoring.extract.method.from.duplicate.code=Extract method from duplicate code -refactoring.extract.method.preview.tree.method=Method to replace code duplicates -refactoring.extract.method.preview.tree.duplicates=Code duplicates ({0,choice, 0#No fragments|1#1 fragment|2#{0,number} fragments}{1,choice, 0#|1# in 1 file|2# in {1,number} files}) -refactoring.extract.method.preview.command=Extracting method refactoring.extract.method.preview.group.method=Method to extract refactoring.extract.method.preview.group.original=Original code fragment refactoring.extract.method.preview.group.duplicates=Duplicate code fragments diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 82072a1d08a6..91c012a1c76c 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -1523,9 +1523,6 @@ junit4.search.4.tests.all.in.scope.description=Check each class in scope if it's duplicates.inspection.only.extractable=false duplicates.inspection.only.extractable.description=Highlight duplicate code only if it can be extracted into a method -extract.method.duplicates.tool.window=true -extract.method.duplicates.tool.window.description=Show extract method preview tool window - ide.interlanguage.fixes=true ide.interlanguage.fixes.description=Enable 'Create Xxx from usage' fixes in JVM languages ide.jvm.run.marker=false