Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,12 @@
import com.intellij.java.impl.refactoring.extractMethod.ExtractMethodHandler;
import com.intellij.java.impl.refactoring.extractMethod.PrepareFailedException;
import com.intellij.java.impl.refactoring.util.duplicates.DuplicatesImpl;
import consulo.application.ApplicationManager;
import consulo.codeEditor.Editor;
import consulo.codeEditor.ScrollType;
import consulo.dataContext.DataContext;
import consulo.document.RangeMarker;
import consulo.document.util.TextRange;
import consulo.language.codeStyle.PostprocessReformattingAspect;
import consulo.language.editor.refactoring.RefactoringBundle;
import consulo.language.editor.refactoring.action.RefactoringActionHandler;
import consulo.language.editor.refactoring.localize.RefactoringLocalize;
import consulo.language.editor.refactoring.util.CommonRefactoringUtil;
Expand All @@ -42,98 +40,116 @@
import consulo.localize.LocalizeValue;
import consulo.logging.Logger;
import consulo.project.Project;
import consulo.ui.annotation.RequiredUIAccess;
import consulo.undoRedo.CommandProcessor;

import jakarta.annotation.Nonnull;

import java.util.function.Consumer;

public class ExtractMethodObjectHandler implements RefactoringActionHandler {
private static final Logger LOG = Logger.getInstance(ExtractMethodObjectHandler.class);

public void invoke(@Nonnull final Project project, final Editor editor, final PsiFile file, final DataContext dataContext) {
ExtractMethodHandler.selectAndPass(project, editor, file, new Consumer<PsiElement[]>() {
public void accept(final PsiElement[] selectedValue) {
invokeOnElements(project, editor, file, selectedValue);
}
});
}
private static final Logger LOG = Logger.getInstance(ExtractMethodObjectHandler.class);

private void invokeOnElements(@Nonnull final Project project, @Nonnull final Editor editor, @Nonnull PsiFile file, @Nonnull PsiElement[] elements) {
if (elements.length == 0) {
LocalizeValue message = RefactoringLocalize.cannotPerformRefactoringWithReason(
RefactoringLocalize.selectedBlockShouldRepresentASetOfStatementsOrAnExpression()
);
CommonRefactoringUtil.showErrorHint(project, editor, message.get(), ExtractMethodObjectProcessor.REFACTORING_NAME, HelpID.EXTRACT_METHOD_OBJECT);
return;
}

final ExtractMethodObjectProcessor processor = new ExtractMethodObjectProcessor(project, editor, elements, "");
final ExtractMethodObjectProcessor.MyExtractMethodProcessor extractProcessor = processor.getExtractProcessor();
try {
if (!extractProcessor.prepare()) return;
} catch (PrepareFailedException e) {
CommonRefactoringUtil.showErrorHint(project, editor, e.getMessage(), ExtractMethodObjectProcessor.REFACTORING_NAME, HelpID.EXTRACT_METHOD_OBJECT);
ExtractMethodHandler.highlightPrepareError(e, file, editor, project);
return;
public void invoke(@Nonnull final Project project, final Editor editor, final PsiFile file, final DataContext dataContext) {
ExtractMethodHandler.selectAndPass(project, editor, file, new Consumer<PsiElement[]>() {
public void accept(final PsiElement[] selectedValue) {
invokeOnElements(project, editor, file, selectedValue);
}
});
}

if (!CommonRefactoringUtil.checkReadOnlyStatus(project, extractProcessor.getTargetClass().getContainingFile()))
return;
if (extractProcessor.showDialog()) {
run(project, editor, processor, extractProcessor);
}
}
@RequiredUIAccess
private void invokeOnElements(
@Nonnull final Project project,
@Nonnull final Editor editor,
@Nonnull PsiFile file,
@Nonnull PsiElement[] elements
) {
if (elements.length == 0) {
LocalizeValue message = RefactoringLocalize.cannotPerformRefactoringWithReason(
RefactoringLocalize.selectedBlockShouldRepresentASetOfStatementsOrAnExpression()
);
CommonRefactoringUtil.showErrorHint(
project,
editor,
message,
ExtractMethodObjectProcessor.REFACTORING_NAME,
HelpID.EXTRACT_METHOD_OBJECT
);
return;
}

public static void run(@Nonnull final Project project,
@Nonnull final Editor editor,
@Nonnull final ExtractMethodObjectProcessor processor,
@Nonnull final ExtractMethodObjectProcessor.MyExtractMethodProcessor extractProcessor) {
final int offset = editor.getCaretModel().getOffset();
final RangeMarker marker = editor.getDocument().createRangeMarker(new TextRange(offset, offset));
CommandProcessor.getInstance().executeCommand(project, new Runnable() {
public void run() {
PostprocessReformattingAspect.getInstance(project).postponeFormattingInside(new Runnable() {
public void run() {
try {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
extractProcessor.doRefactoring();
}
});
processor.run();
processor.runChangeSignature();
} catch (IncorrectOperationException e) {
LOG.error(e);
final ExtractMethodObjectProcessor processor = new ExtractMethodObjectProcessor(project, editor, elements, "");
final ExtractMethodObjectProcessor.MyExtractMethodProcessor extractProcessor = processor.getExtractProcessor();
try {
if (!extractProcessor.prepare()) {
return;
}
}
});
}
catch (PrepareFailedException e) {
CommonRefactoringUtil.showErrorHint(
project,
editor,
LocalizeValue.ofNullable(e.getMessage()),
ExtractMethodObjectProcessor.REFACTORING_NAME,
HelpID.EXTRACT_METHOD_OBJECT
);
ExtractMethodHandler.highlightPrepareError(e, file, editor, project);
return;
}

PsiDocumentManager.getInstance(project).commitAllDocuments();
if (processor.isCreateInnerClass()) {
processor.moveUsedMethodsToInner();
PsiDocumentManager.getInstance(project).commitAllDocuments();
DuplicatesImpl.processDuplicates(extractProcessor, project, editor);
if (!CommonRefactoringUtil.checkReadOnlyStatus(project, extractProcessor.getTargetClass().getContainingFile())) {
return;
}
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
if (processor.isCreateInnerClass()) {
processor.changeInstanceAccess(project);
}
final PsiElement method = processor.getMethod();
LOG.assertTrue(method != null);
method.delete();
}
});
}
}, ExtractMethodObjectProcessor.REFACTORING_NAME, ExtractMethodObjectProcessor.REFACTORING_NAME);
editor.getCaretModel().moveToOffset(marker.getStartOffset());
marker.dispose();
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
}
if (extractProcessor.showDialog()) {
run(project, editor, processor, extractProcessor);
}
}

public void invoke(@Nonnull final Project project, @Nonnull final PsiElement[] elements, final DataContext dataContext) {
throw new UnsupportedOperationException();
}
public static void run(
@Nonnull final Project project,
@Nonnull final Editor editor,
@Nonnull final ExtractMethodObjectProcessor processor,
@Nonnull final ExtractMethodObjectProcessor.MyExtractMethodProcessor extractProcessor
) {
final int offset = editor.getCaretModel().getOffset();
final RangeMarker marker = editor.getDocument().createRangeMarker(new TextRange(offset, offset));
CommandProcessor.getInstance().newCommand()
.project(project)
.name(ExtractMethodObjectProcessor.REFACTORING_NAME)
.groupId(ExtractMethodObjectProcessor.REFACTORING_NAME)
.run(() -> {
PostprocessReformattingAspect.getInstance(project).postponeFormattingInside(() -> {
try {
project.getApplication().runWriteAction(() -> extractProcessor.doRefactoring());
processor.run();
processor.runChangeSignature();
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
});

PsiDocumentManager.getInstance(project).commitAllDocuments();
if (processor.isCreateInnerClass()) {
processor.moveUsedMethodsToInner();
PsiDocumentManager.getInstance(project).commitAllDocuments();
DuplicatesImpl.processDuplicates(extractProcessor, project, editor);
}
project.getApplication().runWriteAction(() -> {
if (processor.isCreateInnerClass()) {
processor.changeInstanceAccess(project);
}
PsiElement method = processor.getMethod();
LOG.assertTrue(method != null);
method.delete();
});
});
editor.getCaretModel().moveToOffset(marker.getStartOffset());
marker.dispose();
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
}

public void invoke(@Nonnull final Project project, @Nonnull final PsiElement[] elements, final DataContext dataContext) {
throw new UnsupportedOperationException();
}
}
Loading
Loading