IDEA-205947 Join lines works incorrectly if next line string literal is followed by the method call

This commit is contained in:
Tagir Valeev
2019-01-24 18:49:29 +07:00
parent bcc8d9d5ba
commit 3a92a52992
4 changed files with 28 additions and 12 deletions
@@ -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;
}
}
@@ -0,0 +1,4 @@
class A{
String s <caret>= "hfjsdakhfjksda" +
" djfkasdjkfjs ".trim();
}
@@ -0,0 +1,3 @@
class A{
String s = "hfjsdakhfjksda" + " djfkasdjkfjs ".trim();
}
@@ -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(); }