use of com.intellij.codeInsight.editorActions.JavaLikeQuoteHandler in project intellij-community by JetBrains.
the class EnterInStringLiteralHandler method preprocessEnter.
@Override
public Result preprocessEnter(@NotNull final PsiFile file, @NotNull final Editor editor, @NotNull Ref<Integer> caretOffsetRef, @NotNull final Ref<Integer> caretAdvanceRef, @NotNull final DataContext dataContext, final EditorActionHandler originalHandler) {
int caretOffset = caretOffsetRef.get().intValue();
int caretAdvance = caretAdvanceRef.get().intValue();
if (!isInStringLiteral(editor, dataContext, caretOffset))
return Result.Continue;
PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument());
PsiElement psiAtOffset = file.findElementAt(caretOffset);
if (psiAtOffset != null && psiAtOffset.getTextOffset() < caretOffset) {
Document document = editor.getDocument();
CharSequence text = document.getText();
ASTNode token = psiAtOffset.getNode();
JavaLikeQuoteHandler quoteHandler = getJavaLikeQuoteHandler(editor, psiAtOffset);
if (quoteHandler != null && quoteHandler.getConcatenatableStringTokenTypes() != null && quoteHandler.getConcatenatableStringTokenTypes().contains(token.getElementType())) {
TextRange range = token.getTextRange();
final char literalStart = token.getText().charAt(0);
final StringLiteralLexer lexer = new StringLiteralLexer(literalStart, token.getElementType());
lexer.start(text, range.getStartOffset(), range.getEndOffset());
while (lexer.getTokenType() != null) {
if (lexer.getTokenStart() < caretOffset && caretOffset < lexer.getTokenEnd()) {
if (StringEscapesTokenTypes.STRING_LITERAL_ESCAPES.contains(lexer.getTokenType())) {
caretOffset = lexer.getTokenEnd();
}
break;
}
lexer.advance();
}
if (quoteHandler.needParenthesesAroundConcatenation(psiAtOffset)) {
document.insertString(psiAtOffset.getTextRange().getEndOffset(), ")");
document.insertString(psiAtOffset.getTextRange().getStartOffset(), "(");
caretOffset++;
caretAdvance++;
}
final String insertedFragment = literalStart + " " + quoteHandler.getStringConcatenationOperatorRepresentation();
document.insertString(caretOffset, insertedFragment + " " + literalStart);
caretOffset += insertedFragment.length();
caretAdvance = 1;
CommonCodeStyleSettings langSettings = CodeStyleSettingsManager.getSettings(file.getProject()).getCommonSettings(file.getLanguage());
if (langSettings.BINARY_OPERATION_SIGN_ON_NEXT_LINE) {
caretOffset -= 1;
caretAdvance = 3;
}
caretOffsetRef.set(caretOffset);
caretAdvanceRef.set(caretAdvance);
return Result.DefaultForceIndent;
}
}
return Result.Continue;
}
Aggregations