in rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/editorActions/FSharpBackspaceHandlerDelegate.kt [66:117]
fun handleBackspaceInTripleQuotedString(editor: Editor, caret: Caret): Boolean {
val offset = caret.offset
val iterator = editor.highlighter.createIterator(offset)
if (iterator.atEnd()) return false
val tokenType = iterator.tokenType
if (tokenType != FSharpTokenType.TRIPLE_QUOTED_STRING &&
tokenType != FSharpTokenType.TRIPLE_QUOTE_INTERPOLATED_STRING
|| iterator.start == offset
) return false
val strStart = when (tokenType) {
FSharpTokenType.TRIPLE_QUOTED_STRING -> "\"\"\""
FSharpTokenType.TRIPLE_QUOTE_INTERPOLATED_STRING -> "$\"\"\""
else -> throw IllegalArgumentException("Unexpected token type: $tokenType")
}
val strEnd = "\"\"\""
val newLineLength = "\n".length
// """{caret}"""
if (iterator.start == offset - strStart.length && iterator.end == offset + strEnd.length) {
editor.document.deleteString(offset - 1, offset + 3)
caret.moveToOffset(offset - 1)
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
return true
}
// """\n{caret} text here \n"""
if (iterator.start + strStart.length + newLineLength == offset) {
val document = editor.document
val strStartCoords = document.offsetToDocCoordinates(iterator.start)
val strEndCoords = document.offsetToDocCoordinates(iterator.end)
val caretLine = document.getLineNumber(offset)
if (caretLine != strStartCoords.line + 1) return false
if (offset != document.getLineStartOffset(caretLine)) return false
if (strStartCoords.line + 2 != strEndCoords.line) return false
if (strEndCoords.column != 3) return false
val lastNewLineOffset = iterator.end - strEnd.length - newLineLength
editor.document.deleteString(lastNewLineOffset, lastNewLineOffset + newLineLength)
editor.document.deleteString(offset - newLineLength, offset)
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
return true
}
return false
}