boolean (Editor editor, HighlighterIterator iterator, int offset) { if (iterator.getTokenType() == JavaTokenType.TEXT_BLOCK_LITERAL || iterator.getTokenType() == JavaTokenType.TEXT_BLOCK_TEMPLATE_BEGIN) { Document document = editor.getDocument(); Project project = editor.getProject(); PsiFile file = project == null ? null : PsiDocumentManager.getInstance(project).getPsiFile(document); if (file == null || !testBlocksIsAvailable(file)) return false; String text = document.getText(); boolean hasOpenQuotes = StringUtil.equals(text.substring(iterator.getStart(), offset + 1), "\"\"\""); if (hasOpenQuotes) { boolean hasCloseQuotes = StringUtil.contains(text.substring(offset + 1, iterator.getEnd()), "\"\"\""); if (!hasCloseQuotes) return true; // check if parser interpreted next text block start quotes as end quotes for the current one int nTextBlockQuotes = StringUtil.getOccurrenceCount(text.substring(iterator.getEnd()), "\"\"\""); return nTextBlockQuotes % 2 != 0; } } return super.hasNonClosedLiteral(editor, iterator, offset); }