blob: b3b8d27591a2e3af0c1c3ce41f099cbaacaed45e [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.editorActions;
import com.intellij.openapi.editor.Document;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaToken;
public class LiteralJoinLinesHandler implements JoinLinesHandlerDelegate {
@Override
public int tryJoinLines(final Document doc, final PsiFile psiFile, final int offsetNear, final int end) {
CharSequence text = doc.getCharsSequence();
int start = offsetNear;
while (text.charAt(start) == ' ' || text.charAt(start) == '\t' || text.charAt(start) == '+') start--;
if (text.charAt(start) == '\"') start--;
if (start < offsetNear) start++;
int state = 0;
int startQuoteOffset = -1;
state_loop:
for (int j = start; j < doc.getTextLength(); j++) {
switch (text.charAt(j)) {
case ' ':
case '\t':
break;
case '\"':
if (state == 0) {
state = 1;
startQuoteOffset = j;
PsiElement psiAtOffset = psiFile.findElementAt(j);
if (!(psiAtOffset instanceof PsiJavaToken)) return -1;
if (((PsiJavaToken)psiAtOffset).getTokenType() != JavaTokenType.STRING_LITERAL) return -1;
break;
}
if (state == 2) {
doc.deleteString(startQuoteOffset, j + 1);
return startQuoteOffset;
}
break state_loop;
case '+':
if (state != 1) break state_loop;
state = 2;
break;
default:
break state_loop;
}
}
return -1;
}
}