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
}