fun handleEnterAddIndent()

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
  }