fun doHandleBackspacePressed()

in rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/editorActions/FSharpBackspaceHandlerDelegate.kt [119:168]


  fun doHandleBackspacePressed(
    editor: Editor,
    caret: Caret,
    isStringLiteralToken: (IElementType) -> Boolean,
  ): Boolean {

    val caretOffset = caret.offset

    val iterator = editor.highlighter.createIterator(caretOffset)
    if (iterator.atEnd()) return false

    if (isStringLiteralToken(iterator.tokenType))
      return handleBackspaceInString(editor, caret, iterator)

    if (iterator.start != caretOffset) return false

    val rightBracketPos = iterator.start
    val bracketMatcher = FSharpBracketMatcher()

    iterator.retreat()
    val prevTokenType = iterator.tokenType
    if (bracketMatcher.findMatchingBracket(iterator.asTokenIterator()) == null || iterator.start != rightBracketPos) {
      return false
    }

    // Find the leftmost unclosed parenthesis of the current type
    // (including those before the cursor) such that there are no open parentheses of another type.
    var leftBracketPos = iterator.start
    do {
      if (iterator.tokenType == prevTokenType && bracketMatcher.isStackEmpty()) {
        leftBracketPos = iterator.start
      } else if (!bracketMatcher.proceedStack(iterator.tokenType)) {
        break
      }
      iterator.retreat()
    } while (!iterator.atEnd())

    val iterator2 = editor.highlighter.createIterator(leftBracketPos).asTokenIterator()

    // Attempt to find a matching closing bracket
    val caretOffset2 = caretOffset - 1
    caret.moveToOffset(caretOffset2)
    editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
    editor.document.deleteString(
      caretOffset2,
      caretOffset2 + if (bracketMatcher.findMatchingBracket(iterator2) != null) 2 else 1
    )

    return true
  }