in rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/editorActions/FSharpEnterHandlerDelegate.kt [605:672]
fun handleEnterAddIndent(editor: Editor, caretOffset: Int): Boolean {
var iterator = editor.highlighter.createIterator(caretOffset - 1)
if (iterator.atEnd()) return false
var encounteredNewLine = false
while (!iterator.atEnd() && (isIgnored(iterator.tokenType) || iterator.tokenType == FSharpTokenType.NEW_LINE)) {
if (iterator.tokenType == FSharpTokenType.NEW_LINE) encounteredNewLine = true
iterator.retreat()
}
if (iterator.atEnd()) return false
if (!indentTokens.contains(iterator.tokenType) && (encounteredNewLine || !allowKeepIndent.contains(iterator.tokenType)))
return false
val tokenStart = iterator.start
val tokenType = iterator.tokenType
val document = editor.document
val line = document.getLineNumber(tokenStart)
if (leftBracketsToAddIndent.contains(tokenType) &&
!isSingleLineBrackets(editor, tokenStart) &&
!isLastTokenOnLine(editor, tokenStart) &&
isFirstTokenOnLine(editor, tokenStart)
) return false
val caretLine = document.getLineNumber(caretOffset)
val nestedIndent = tryGetNestedIndentBelowLine(editor, line)
if (nestedIndent != null) {
val (belowLine, lineIndent) = nestedIndent
if (belowLine == caretLine) return false
insertNewLineAt(editor, lineIndent.indent, caretOffset, true)
return true
}
iterator = editor.highlighter.createIterator(caretOffset)
if (!iterator.atEnd() &&
isFirstTokenOnLine(editor, iterator.start) &&
!isLastTokenOnLine(editor, iterator.start)
) return false
val indentSize = run {
val lineIndent = getLineIndent(editor, caretLine)
if (lineIndent != null && lineIndent.type == Comments)
return@run lineIndent.indent
iterator = editor.highlighter.createIterator(caretOffset - 1)
val indent = getIndentSettings(editor).indentSize
if (tokenType == FSharpTokenType.EQUALS && !encounteredNewLine && isFirstTokenOnLine(editor, iterator.start)
) {
getOffsetInLine(document, line, tokenStart)
} else if (indentFromToken.contains(tokenType)) {
indent + getOffsetInLine(document, line, tokenStart)
} else {
val prevIndentSize = run {
val continuedLine = getContinuedIndentLine(editor, tokenStart, true)
getLineWhitespaceIndent(editor, continuedLine)
}
prevIndentSize + indent
}
}
insertNewLineAt(editor, indentSize, caretOffset, true)
return true
}