package com.jetbrains.lang.dart.ide.editor; import com.intellij.codeInsight.editorActions.SimpleTokenSetQuoteHandler; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.psi.tree.IElementType; import com.jetbrains.lang.dart.DartTokenTypes; import com.jetbrains.lang.dart.DartTokenTypesSets; public class DartQuoteHandler extends SimpleTokenSetQuoteHandler { public DartQuoteHandler() { super(DartTokenTypesSets.STRINGS); } public boolean isOpeningQuote(final HighlighterIterator iterator, final int offset) { final IElementType type = iterator.getTokenType(); if (type == DartTokenTypes.OPEN_QUOTE) return true; if (type == DartTokenTypes.RAW_SINGLE_QUOTED_STRING && offset == iterator.getStart() + 1) { // start of the raw string like r' return true; } return false; } public boolean isClosingQuote(final HighlighterIterator iterator, final int offset) { final IElementType type = iterator.getTokenType(); if (type == DartTokenTypes.CLOSING_QUOTE) return true; if (type == DartTokenTypes.RAW_SINGLE_QUOTED_STRING) { final int start = iterator.getStart(); final int end = iterator.getEnd(); if (end - start > 2 && offset == end - 1) { final CharSequence chars = iterator.getDocument().getCharsSequence(); return chars.charAt(start + 1) == chars.charAt(end - 1); // r'foo' } } return false; } @Override protected boolean isNonClosedLiteral(final HighlighterIterator iterator, final CharSequence chars) { if (iterator.getTokenType() == DartTokenTypes.RAW_SINGLE_QUOTED_STRING) { final int start = iterator.getStart(); final int end = iterator.getEnd(); return end - start <= 2 || chars.charAt(end - 1) != chars.charAt(start + 1); // not closed raw string like r' or r'foo } return super.isNonClosedLiteral(iterator, chars); } }