in src/main/kotlin/org/arend/formatting/ArendEnterAtIndentHandler.kt [25:70]
override fun preprocessEnter(origFile: PsiFile, origEditor: Editor, caretOffset: Ref<Int>, caretAdvance: Ref<Int>, dataContext: DataContext, originalHandler: EditorActionHandler?): EnterHandlerDelegate.Result {
var file = origFile
var editor = origEditor
if (editor is EditorWindow) {
file = InjectedLanguageManager.getInstance(file.project).getTopLevelFile(file)
editor = editor.delegate
}
if (file !is ArendFile) return EnterHandlerDelegate.Result.Continue
val charSeq = editor.document.charsSequence
val currentOffset = editor.logicalPositionToOffset(editor.caretModel.logicalPosition)
val startParenOffset = startingParenOffset(currentOffset, charSeq, origFile)
if (startParenOffset != -1) {
insertLineBreak(editor, startParenOffset, "")
return EnterHandlerDelegate.Result.Stop
}
val comment = file.findElementAt(currentOffset)
if (comment != null && comment.node.elementType == DOC_COMMENT) {
val commentStart = comment.node.treePrev
val relativeOffset = currentOffset - commentStart.startOffset
val commentStartPortion = (commentStart.text + comment.text).substring(0, relativeOffset)
val lastMatch = Regex("((\\n( )+-)|(\\{-))").findAll(commentStartPortion).lastOrNull()
if (lastMatch != null) {
val dashIndex = lastMatch.range.last + commentStart.startOffset
insertLineBreak(editor, dashIndex, "- ")
return EnterHandlerDelegate.Result.Stop
}
} else if (comment?.elementType == DOC_NEWLINE &&
file.findElementAt(currentOffset - 1)?.elementType == DOC_START) {
val document = editor.document
document.insertString(currentOffset, "\n - ")
if (!hasDocEnd(currentOffset + 1, file) && file.findElementAt(currentOffset + 1)?.elementType == DOC_TEXT) {
document.insertString(currentOffset + 4, "\n -}")
}
editor.caretModel.moveToOffset(currentOffset + 4)
return EnterHandlerDelegate.Result.Stop
}
return if (BackspaceHandler.isWhitespaceBeforeCaret(editor)) {
EnterHandlerDelegate.Result.DefaultSkipIndent
} else EnterHandlerDelegate.Result.Continue
}