diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/LiteralJoinLinesHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/LiteralJoinLinesHandler.java index 3e2e9bd3b112..1636c9ff2c89 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/LiteralJoinLinesHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/LiteralJoinLinesHandler.java @@ -20,9 +20,15 @@ import com.intellij.psi.JavaTokenType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiJavaToken; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; public class LiteralJoinLinesHandler implements JoinLinesHandlerDelegate { + + private static final int STATE_INITIAL = 0; + private static final int STATE_BEFORE_PLUS = 1; + private static final int STATE_AFTER_PLUS = 2; + @Override public int tryJoinLines(@NotNull final Document doc, @NotNull final PsiFile psiFile, final int offsetNear, final int end) { CharSequence text = doc.getCharsSequence(); @@ -32,9 +38,9 @@ public class LiteralJoinLinesHandler implements JoinLinesHandlerDelegate { if (text.charAt(start) == '\"') start--; if (start < offsetNear) start++; - int state = 0; + int state = STATE_INITIAL; int startQuoteOffset = -1; - state_loop: + PsiElement parentExpression = null; for (int j = start; j < doc.getTextLength(); j++) { switch (text.charAt(j)) { case ' ': @@ -42,28 +48,30 @@ public class LiteralJoinLinesHandler implements JoinLinesHandlerDelegate { break; case '\"': - if (state == 0) { - state = 1; + PsiJavaToken token = ObjectUtils.tryCast(psiFile.findElementAt(j), PsiJavaToken.class); + if (token == null || token.getTokenType() != JavaTokenType.STRING_LITERAL) return -1; + if (state == STATE_INITIAL) { + state = STATE_BEFORE_PLUS; startQuoteOffset = j; - PsiElement psiAtOffset = psiFile.findElementAt(j); - if (!(psiAtOffset instanceof PsiJavaToken)) return -1; - if (((PsiJavaToken)psiAtOffset).getTokenType() != JavaTokenType.STRING_LITERAL) return -1; + // token.getParent() = PsiLiteralExpression + parentExpression = token.getParent().getParent(); break; } - if (state == 2) { + if (state == STATE_AFTER_PLUS) { + if (token.getParent().getParent() != parentExpression) return -1; doc.deleteString(startQuoteOffset, j + 1); return startQuoteOffset; } - break state_loop; + return -1; case '+': - if (state != 1) break state_loop; - state = 2; + if (state != STATE_BEFORE_PLUS) return -1; + state = STATE_AFTER_PLUS; break; default: - break state_loop; + return -1; } } diff --git a/java/java-tests/testData/codeInsight/joinLines/StringLiteralTrim.java b/java/java-tests/testData/codeInsight/joinLines/StringLiteralTrim.java new file mode 100644 index 000000000000..ff61dd0b7c2d --- /dev/null +++ b/java/java-tests/testData/codeInsight/joinLines/StringLiteralTrim.java @@ -0,0 +1,4 @@ +class A{ + String s = "hfjsdakhfjksda" + + " djfkasdjkfjs ".trim(); +} diff --git a/java/java-tests/testData/codeInsight/joinLines/StringLiteralTrim_after.java b/java/java-tests/testData/codeInsight/joinLines/StringLiteralTrim_after.java new file mode 100644 index 000000000000..2011e8eb17e1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/joinLines/StringLiteralTrim_after.java @@ -0,0 +1,3 @@ +class A{ + String s = "hfjsdakhfjksda" + " djfkasdjkfjs ".trim(); +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java index 4f90b68dc5b9..e6431e74a0f2 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java @@ -38,6 +38,7 @@ public class JoinLinesTest extends LightCodeInsightTestCase { public void testNormal() { doTest(); } public void testStringLiteral() { doTest(); } + public void testStringLiteralTrim() { doTest(); } public void testLiteralSCR4989() { doTest(); } public void testCallChain() { doTest(); }