From 9d989b2b7f9f13379cbe486f82265bb80af58bb7 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 26 Sep 2024 13:58:19 +0200 Subject: [PATCH] [java-refactoring] Inline Parameter: do not erroneously report top-level non-static class references Fixes IDEA-356746 Confusing warning when I inline array method parameter GitOrigin-RevId: 1964db1b4a09ec7eb1bcbbcd05fcb445862f06b4 --- .../inline/InlineParameterExpressionProcessor.java | 9 +++++---- .../refactoring/inlineParameter/ArrayInitializer.java | 9 +++++++++ .../inlineParameter/ArrayInitializer.java.after | 9 +++++++++ .../java/refactoring/inline/InlineParameterTest.java | 6 +++++- 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java.after diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java index 8d041546ae9c..3046f01c7168 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java @@ -257,9 +257,9 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor PsiElement anchor = findAnchorForLocalVariableDeclaration(body); final PsiElementFactory factory = JavaPsiFacade.getElementFactory(myMethod.getProject()); PsiExpression refExpression = factory.createExpressionFromText(myParameter.getName(), anchor); - PsiDeclarationStatement localDeclaration = + PsiDeclarationStatement localDeclaration = factory.createVariableDeclarationStatement(myParameter.getName(), myParameter.getType(), refExpression); - + localDeclaration = (PsiDeclarationStatement)body.addAfter(localDeclaration, anchor); final PsiLocalVariable declaredVar = (PsiLocalVariable)localDeclaration.getDeclaredElements()[0]; PsiUtil.setModifierProperty(declaredVar, PsiModifier.FINAL, myParameter.hasModifierProperty(PsiModifier.FINAL)); @@ -347,7 +347,7 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor } else if (!PsiUtil.isAccessible((PsiMember)element, myMethod, null)) { myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.depends.on.unavailable.value")); } - } else if (element instanceof PsiParameter && + } else if (element instanceof PsiParameter && PsiTreeUtil.isAncestor(((PsiParameter)element).getDeclarationScope(), myInitializer, true)) { boolean bound = false; for (PsiParameter parameter : myMethod.getParameterList().getParameters()) { @@ -387,7 +387,8 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor super.visitReferenceElement(reference); if (myMethod.hasModifierProperty(PsiModifier.STATIC)) { final PsiElement resolved = reference.resolve(); - if (resolved instanceof PsiClass && !((PsiClass)resolved).hasModifierProperty(PsiModifier.STATIC)) { + if (resolved instanceof PsiClass cls && + (PsiUtil.isInnerClass(cls) || PsiUtil.isLocalClass(cls))) { myConflicts.putValue(reference, JavaRefactoringBundle.message("inline.parameter.depends.on.non.static.class")); } } diff --git a/java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java b/java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java new file mode 100644 index 000000000000..7497bf8770eb --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java @@ -0,0 +1,9 @@ +class Test { + public static void main(String[] args) { + System.out.println(use(new Object[]{"1", "2", "3"})); + } + + public static String use(Object[] arr) { + return Arrays.toString(arr); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java.after b/java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java.after new file mode 100644 index 000000000000..c7bc2603153b --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/ArrayInitializer.java.after @@ -0,0 +1,9 @@ +class Test { + public static void main(String[] args) { + System.out.println(use()); + } + + public static String use() { + return Arrays.toString(new Object[]{"1", "2", "3"}); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java index b0af00c23515..dd17c8e017c2 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java @@ -188,7 +188,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { public void testRefNewTopLevel() { doTest(false); } - + public void testConflictingFieldName() { doTest(true); } @@ -326,6 +326,10 @@ public class InlineParameterTest extends LightRefactoringTestCase { } } + public void testArrayInitializer() { + doTest(false); + } + private void doTest(final boolean createLocal) { getProject().putUserData(InlineParameterExpressionProcessor.CREATE_LOCAL_FOR_TESTS, createLocal);