fun handleBackspaceInTripleQuotedString()

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
  }