From 58bb24679c4e9c181aaa43d974de165102f2610b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 3 Nov 2021 18:50:15 +0100 Subject: [PATCH] [java] inline parameter: add context to avoid qualify conflicting field names (IDEA-281362) GitOrigin-RevId: 08cf0efc30b17590e6592e37b7e91910ad6e5da6 --- .../InlineParameterExpressionProcessor.java | 23 +++++++++---------- .../inlineParameter/ConflictingFieldName.java | 13 +++++++++++ .../ConflictingFieldName.java.after | 14 +++++++++++ .../inline/InlineParameterTest.java | 4 ++++ 4 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java index 5f325dac302b..e9f0ec01170a 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java @@ -257,22 +257,21 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor myInitializer = (PsiExpression)RefactoringUtil.replaceElementsWithMap(myInitializer, replacements); if (myCreateLocal) { - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(myMethod.getProject()); - PsiDeclarationStatement localDeclaration = - factory.createVariableDeclarationStatement(myParameter.getName(), myParameter.getType(), myInitializer); - final PsiLocalVariable declaredVar = (PsiLocalVariable)localDeclaration.getDeclaredElements()[0]; - PsiUtil.setModifierProperty(declaredVar, PsiModifier.FINAL, myParameter.hasModifierProperty(PsiModifier.FINAL)); - final PsiExpression localVarInitializer = - InlineUtil.inlineVariable(myParameter, myInitializer, (PsiReferenceExpression)factory.createExpressionFromText(myParameter.getName(), myMethod)); - final PsiExpression initializer = declaredVar.getInitializer(); - LOG.assertTrue(initializer != null); - initializer.replace(localVarInitializer); final PsiCodeBlock body = myMethod.getBody(); if (body != null) { PsiElement anchor = findAnchorForLocalVariableDeclaration(body); - body.addAfter(localDeclaration, anchor); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(myMethod.getProject()); + PsiExpression refExpression = factory.createExpressionFromText(myParameter.getName(), anchor); + 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)); + InlineUtil.inlineVariable(myParameter, myInitializer, (PsiReferenceExpression)declaredVar.getInitializer()); } - } else { + } + else { for (PsiJavaCodeReferenceElement paramRef : paramRefsToInline) { InlineUtil.inlineVariable(myParameter, myInitializer, paramRef); } diff --git a/java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java b/java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java new file mode 100644 index 000000000000..d007d6cd59e2 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java @@ -0,0 +1,13 @@ +class A { + private String f; + + public void m() { + m1(f); + } + + private void m1(String f) { + if (!f.isEmpty()) { + System.out.println(f); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java.after b/java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java.after new file mode 100644 index 000000000000..237d3fda40a2 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/ConflictingFieldName.java.after @@ -0,0 +1,14 @@ +class A { + private String f; + + public void m() { + m1(); + } + + private void m1() { + String f = this.f; + if (!f.isEmpty()) { + System.out.println(f); + } + } +} \ 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 95e8b1118129..9b111fd481f2 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,6 +188,10 @@ public class InlineParameterTest extends LightRefactoringTestCase { public void testRefNewTopLevel() { doTest(false); } + + public void testConflictingFieldName() { + doTest(true); + } public void testRefNewLocal() { try {