From 4afad1703cfd29ce34a23ccd13a0ec7223ad8bf9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 5 Oct 2015 19:02:43 +0200 Subject: [PATCH] inline: ensure parenthesis around numeric sum used inside string concatenation (IDEA-145795) --- .../com/intellij/refactoring/util/InlineUtil.java | 13 ++++++++++++- .../inlineMethod/StringPlusOverload.java | 15 +++++++++++++++ .../inlineMethod/StringPlusOverload.java.after | 10 ++++++++++ .../refactoring/inline/InlineMethodTest.java | 4 ++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index 804637a35db8..4a4366fe38b2 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -51,9 +51,20 @@ public class InlineUtil { PsiClass thisClass = RefactoringChangeUtil.getThisClass(initializer); PsiClass refParent = RefactoringChangeUtil.getThisClass(ref); - boolean insertCastWhenUnchecked = ref.getParent() instanceof PsiForeachStatement; + final PsiElement parent = ref.getParent(); + boolean insertCastWhenUnchecked = parent instanceof PsiForeachStatement; final PsiType varType = variable.getType(); initializer = RefactoringUtil.convertInitializerToNormalExpression(initializer, varType); + if (initializer instanceof PsiPolyadicExpression && + ((PsiPolyadicExpression)initializer).getOperationTokenType() == JavaTokenType.PLUS && + parent instanceof PsiPolyadicExpression && + ((PsiPolyadicExpression)parent).getOperationTokenType() == JavaTokenType.PLUS) { + final PsiType type = ((PsiPolyadicExpression)parent).getType(); + if (type != null && (type.equalsToText(CommonClassNames.JAVA_LANG_STRING) ^ varType.equalsToText(CommonClassNames.JAVA_LANG_STRING))) { + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(initializer.getProject()); + initializer = factory.createExpressionFromText("(" + initializer.getText() + ")", initializer); + } + } solveVariableNameConflicts(initializer, ref, initializer); ChangeContextUtil.encodeContextInfo(initializer, false); diff --git a/java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java b/java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java new file mode 100644 index 000000000000..c2a2acb8f686 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java @@ -0,0 +1,15 @@ + +class a { + public static void main(String[] args) + { + int x = 2; + System.out.println(getString(x + 2)); + } + + private static String getString(int number) + { + return "" + number; + } + + +} diff --git a/java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java.after b/java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java.after new file mode 100644 index 000000000000..b8697fa6390a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/StringPlusOverload.java.after @@ -0,0 +1,10 @@ + +class a { + public static void main(String[] args) + { + int x = 2; + System.out.println("" + (x + 2)); + } + + +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java index 032838650c89..544bdfd75e45 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java @@ -276,6 +276,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { doTest(); } + public void testStringPlusOverload() throws Exception { + doTest(); + } + public void testReturnStatementWithoutBraces() throws Exception { doTestInlineThisOnly(); }