diff --git a/java/java-impl/src/com/intellij/codeInspection/streamMigration/FoldExpressionIntoStreamInspection.java b/java/java-impl/src/com/intellij/codeInspection/streamMigration/FoldExpressionIntoStreamInspection.java index 839c09ee407d..853dc3058612 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamMigration/FoldExpressionIntoStreamInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamMigration/FoldExpressionIntoStreamInspection.java @@ -11,6 +11,7 @@ import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiLiteralUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtil; @@ -151,6 +152,10 @@ public class FoldExpressionIntoStreamInspection extends AbstractBaseJavaLocalIns .pairMap(EquivalenceChecker.getCanonicalPsiEquivalence()::expressionsAreEquivalent) .allMatch(Boolean.TRUE::equals)) { delimiter = operands[1]; + if (!InheritanceUtil.isInheritor(delimiter.getType(), "java.lang.CharSequence") && + !(delimiter instanceof PsiLiteralExpression && PsiType.CHAR.equals(delimiter.getType()))) { + return null; + } if (operands.length % 2 == 0) { rest = ArrayUtil.getLastElement(operands); } @@ -272,8 +277,20 @@ public class FoldExpressionIntoStreamInspection extends AbstractBaseJavaLocalIns String map = (lambda == null ? "" : mapToString(elementType, myOperandType, lambda)) + myMapToString; return map + ".collect(" + CommonClassNames.JAVA_UTIL_STREAM_COLLECTORS + - ".joining(" + (myDelimiter == null ? "" : ct.text(myDelimiter)) + "))" + + ".joining(" + getDelimiterText(ct) + "))" + (myRest == null ? "" : "+" + ct.text(myRest)); } + + @NotNull + private String getDelimiterText(CommentTracker ct) { + if (myDelimiter == null) { + return ""; + } + String text = ct.text(myDelimiter); + if (text.startsWith("'")) { + return PsiLiteralUtil.stringForCharLiteral(text); + } + return text; + } } } diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java index ae9525d5baf6..2d4f279dd5d2 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java @@ -3,6 +3,7 @@ package com.intellij.psi.util; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class PsiLiteralUtil { @@ -103,4 +104,24 @@ public class PsiLiteralUtil { integer |= lastDigit; return integer; } + + /** + * Converts passed character literal (like 'a') to string literal (like "a"). + * + * @param charLiteral character literal to convert. + * @return resulting string literal + */ + @NotNull + public static String stringForCharLiteral(@NotNull String charLiteral) { + if ("'\"'".equals(charLiteral)) { + return "\"\\\"\""; + } + else if ("'\\''".equals(charLiteral)) { + return "\"'\""; + } + else { + return '\"' + charLiteral.substring(1, charLiteral.length() - 1) + + '\"'; + } + } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/afterConcatCharDelimiter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/afterConcatCharDelimiter.java new file mode 100644 index 000000000000..b7e0696d5f4d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/afterConcatCharDelimiter.java @@ -0,0 +1,7 @@ +// "Fold expression into 'String.join'" "true" +class Test { + String foo(String a, String b, String c) { + String s = String.join("_", a, b, c); + return s; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/beforeConcatCharDelimiter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/beforeConcatCharDelimiter.java new file mode 100644 index 000000000000..6b742828d559 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/beforeConcatCharDelimiter.java @@ -0,0 +1,7 @@ +// "Fold expression into 'String.join'" "true" +class Test { + String foo(String a, String b, String c) { + String s = a + '_' + b + '_' + c ; + return s; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/beforeConcatIntDelimiter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/beforeConcatIntDelimiter.java new file mode 100644 index 000000000000..851fd2754de9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/foldIntoStream/beforeConcatIntDelimiter.java @@ -0,0 +1,7 @@ +// "Fold expression into 'String.join'" "false" +class Test { + String foo(String a, String b, String c) { + String s = a + 5 + b + 5 + c ; + return s; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringIntention.java index 741ee9d2332d..b986361d2b4c 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringIntention.java @@ -17,6 +17,7 @@ package com.siyeh.ipp.chartostring; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiLiteralExpression; +import com.intellij.psi.util.PsiLiteralUtil; import com.siyeh.ig.PsiReplacementUtil; import com.siyeh.ipp.base.Intention; import com.siyeh.ipp.base.PsiElementPredicate; @@ -34,20 +35,7 @@ public class CharToStringIntention extends Intention { public void processIntention(@NotNull PsiElement element) { final PsiLiteralExpression charLiteral = (PsiLiteralExpression)element; final String charLiteralText = charLiteral.getText(); - final String stringLiteral = stringForCharLiteral(charLiteralText); + final String stringLiteral = PsiLiteralUtil.stringForCharLiteral(charLiteralText); PsiReplacementUtil.replaceExpression(charLiteral, stringLiteral); } - - private static String stringForCharLiteral(String charLiteral) { - if ("'\"'".equals(charLiteral)) { - return "\"\\\"\""; - } - else if ("'\\''".equals(charLiteral)) { - return "\"'\""; - } - else { - return '\"' + charLiteral.substring(1, charLiteral.length() - 1) + - '\"'; - } - } } \ No newline at end of file