Search in sources :

Example 1 with JavaLikeQuoteHandler

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;
}
Also used : JavaLikeQuoteHandler(com.intellij.codeInsight.editorActions.JavaLikeQuoteHandler) StringLiteralLexer(com.intellij.lexer.StringLiteralLexer) ASTNode(com.intellij.lang.ASTNode) CommonCodeStyleSettings(com.intellij.psi.codeStyle.CommonCodeStyleSettings) TextRange(com.intellij.openapi.util.TextRange) Document(com.intellij.openapi.editor.Document) PsiElement(com.intellij.psi.PsiElement)

Aggregations

JavaLikeQuoteHandler (com.intellij.codeInsight.editorActions.JavaLikeQuoteHandler)1 ASTNode (com.intellij.lang.ASTNode)1 StringLiteralLexer (com.intellij.lexer.StringLiteralLexer)1 Document (com.intellij.openapi.editor.Document)1 TextRange (com.intellij.openapi.util.TextRange)1 PsiElement (com.intellij.psi.PsiElement)1 CommonCodeStyleSettings (com.intellij.psi.codeStyle.CommonCodeStyleSettings)1