package com.cedricziel.idea.fluid.codeInsight; import com.cedricziel.idea.fluid.lang.psi.FluidTypes; import com.intellij.codeInsight.editorActions.SimpleTokenSetQuoteHandler; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; public class FluidQuoteHandler extends SimpleTokenSetQuoteHandler { public FluidQuoteHandler() { super(new IElementType[]{FluidTypes.DOUBLE_QUOTED_STRING, FluidTypes.SINGLE_QUOTED_STRING}); } public boolean isOpeningQuote(HighlighterIterator iterator, int offset) { if (this.isInsideLiteral(iterator)) { int start = iterator.getStart(); return offset == start; } else { IElementType tokenType = iterator.getTokenType(); return tokenType == FluidTypes.DOUBLE_QUOTE || tokenType == FluidTypes.SINGLE_QUOTE; } } public boolean isClosingQuote(HighlighterIterator iterator, int offset) { if (this.isInsideLiteral(iterator)) { int start = iterator.getStart(); int end = iterator.getEnd(); return end - start >= 1 && offset == end - 1; } else { IElementType tokenType = iterator.getTokenType(); return tokenType == FluidTypes.DOUBLE_QUOTE || tokenType == FluidTypes.SINGLE_QUOTE; } } public boolean hasNonClosedLiteral(@NotNull Editor editor, @NotNull HighlighterIterator iterator, int offset) { Document document = editor.getDocument(); int lineEndOffset = document.getLineEndOffset(document.getLineNumber(offset)); if (offset < lineEndOffset) { CharSequence charSequence = document.getCharsSequence(); char openQuote = charSequence.charAt(offset); int nextCharOffset = offset + 1; if (nextCharOffset < lineEndOffset && charSequence.charAt(nextCharOffset) == openQuote) { return true; } for (int i = nextCharOffset + 1; i < lineEndOffset; ++i) { if (charSequence.charAt(i) == openQuote) { return false; } } } return true; } }