From 95f7f465acadfef837a292c60ea39ec8a4383a01 Mon Sep 17 00:00:00 2001 From: Alexandr Suhinin Date: Wed, 17 Feb 2021 12:37:56 +0200 Subject: [PATCH] IDEA-262270 refactor this: suggest `introduce parameter object` only on method declaration GitOrigin-RevId: a48227cf7e09c2fc62200e9cb2455afbd787de32 --- .../IntroduceParameterObjectHandler.java | 34 ++++--------------- .../IntroduceParameterObject.java | 9 +++++ .../IntroduceParameterObjectFiltered.java | 9 +++++ .../java/refactoring/RefactorThisTest.kt | 11 +++++- 4 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObject.java create mode 100644 java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObjectFiltered.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectHandler.java index 7210c0ccde55..40c06d540124 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectHandler.java @@ -30,13 +30,14 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactorJBundle; import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.refactoring.actions.RefactoringActionContextUtil; import com.intellij.refactoring.util.CommonRefactoringUtil; import org.jetbrains.annotations.NotNull; public class IntroduceParameterObjectHandler implements RefactoringActionHandler, ContextAwareActionHandler { @Override public boolean isAvailableForQuickList(@NotNull Editor editor, @NotNull PsiFile file, @NotNull DataContext dataContext) { - final PsiMethod selectedMethod = getSelectedMethod(editor, file, dataContext); + final PsiMethod selectedMethod = getSelectedMethod(editor, file); if (selectedMethod != null) { final PsiMethod[] deepestSuperMethods = selectedMethod.findDeepestSuperMethods(); return deepestSuperMethods.length > 0 || getErrorMessage(selectedMethod) == null; @@ -48,7 +49,7 @@ public class IntroduceParameterObjectHandler implements RefactoringActionHandler public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { final ScrollingModel scrollingModel = editor.getScrollingModel(); scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE); - PsiMethod selectedMethod = getSelectedMethod(editor, file, dataContext); + PsiMethod selectedMethod = getSelectedMethod(editor, file); if (selectedMethod == null) { final String message = RefactorJBundle.message("cannot.perform.the.refactoring") + RefactorJBundle.message("the.caret.should.be.positioned.at.the.name.of.the.method.to.be.refactored"); @@ -58,31 +59,10 @@ public class IntroduceParameterObjectHandler implements RefactoringActionHandler invoke(project, selectedMethod, editor); } - private static PsiMethod getSelectedMethod(Editor editor, PsiFile file, DataContext dataContext) { - final PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(dataContext); - PsiMethod selectedMethod = null; - if (element instanceof PsiMethod) { - selectedMethod = (PsiMethod)element; - } - else if (element instanceof PsiParameter && ((PsiParameter)element).getDeclarationScope() instanceof PsiMethod){ - selectedMethod = (PsiMethod)((PsiParameter)element).getDeclarationScope(); - } - else { - final CaretModel caretModel = editor.getCaretModel(); - final int position = caretModel.getOffset(); - final PsiElement elementAt = file.findElementAt(position); - final PsiMethodCallExpression methodCallExpression = - PsiTreeUtil.getParentOfType(elementAt, PsiMethodCallExpression.class); - if (methodCallExpression != null) { - selectedMethod = methodCallExpression.resolveMethod(); - } else { - final PsiParameterList parameterList = PsiTreeUtil.getParentOfType(elementAt, PsiParameterList.class); - if (parameterList != null && parameterList.getParent() instanceof PsiMethod) { - selectedMethod = (PsiMethod)parameterList.getParent(); - } - } - } - return selectedMethod; + private static PsiMethod getSelectedMethod(Editor editor, PsiFile file) { + final int caret = editor.getCaretModel().getOffset(); + final PsiElement elementAt = file.findElementAt(caret); + return RefactoringActionContextUtil.getJavaMethodHeader(elementAt); } @Override diff --git a/java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObject.java b/java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObject.java new file mode 100644 index 000000000000..c5a2d4deb465 --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObject.java @@ -0,0 +1,9 @@ +public class Test { + + void test(){ + foo(5, 10); + } + + void foo(int x, int y){ + } +} diff --git a/java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObjectFiltered.java b/java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObjectFiltered.java new file mode 100644 index 000000000000..32b92858dcd3 --- /dev/null +++ b/java/java-tests/testData/refactoring/refactorThis/IntroduceParameterObjectFiltered.java @@ -0,0 +1,9 @@ +public class Test { + + void test(){ + foo(5, 10); + } + + void foo(int x, int y){ + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt b/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt index 53dee1d91b9a..6fcf62095b62 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/RefactorThisTest.kt @@ -127,9 +127,18 @@ class RefactorThisTest: LightJavaCodeInsightTestCase() { assertTrue(doActionExists()) } + fun testIntroduceParameterObject() { + assertTrue(doActionExists()) + } + + fun testIntroduceParameterObjectFiltered() { + assertFalse(doActionExists()) + } + private inline fun doActionExists(): Boolean { configureByFile("$BASE_PATH/${getTestName(false)}.java") - return findAvailableActions().any { action -> action is A } + val actions = findAvailableActions() + return actions.any { action -> action is A } } private fun findAvailableActions(): List {