Function: neocaml--indent-rules
neocaml--indent-rules is a natively compiled function defined in
neocaml.el.
Signature
(neocaml--indent-rules LANGUAGE)
Documentation
Return tree-sitter indentation rules for LANGUAGE.
The return value is suitable for treesit-simple-indent-rules.
Source Code
;; Defined in /nix/store/ahssdx4rwzyxhyhavpn0bkznk13xrggi-emacs-packages-deps/share/emacs/site-lisp/elpa/neocaml-20260907.2015/neocaml.el
(defun neocaml--indent-rules (language)
"Return tree-sitter indentation rules for LANGUAGE.
The return value is suitable for `treesit-simple-indent-rules'."
`((,language
;; Comment continuation lines: align with the body text after
;; the opening delimiter. Must come before `no-node' because
;; lines inside a multi-line comment have node=nil, parent=comment.
((parent-is "comment") neocaml--comment-body-anchor 0)
;; Empty lines: use previous line's indentation, adding offset
;; when the previous line ends with a body-expecting token.
;; Must come before the top-level rule because Emacs sets
;; node=nil, parent=compilation_unit for empty lines.
(no-node prev-line neocaml--empty-line-offset)
;; Top-level definitions: column 0
((parent-is "compilation_unit") column-0 0)
;; Closing delimiters align with the opening construct
((node-is ")") parent-bol 0)
((node-is "]") parent-bol 0)
((node-is "}") parent-bol 0)
((node-is "done") parent-bol 0)
((node-is "end") parent-bol 0)
((node-is ";;") parent-bol 0)
;; "with" keyword aligns with match/try
((node-is "with") parent-bol 0)
;; then/else clauses align with their enclosing if
((node-is "then_clause") parent-bol 0)
((node-is "else_clause") parent-bol 0)
;; | pipe in match/try aligns with the keyword
((match "^|$" "match_expression") parent-bol 0)
((match "^|$" "try_expression") parent-bol 0)
;; Match cases: match_case node aligns with match/try keyword
((node-is "match_case") parent-bol 0)
;; Bodies inside then/else are indented
((parent-is "then_clause") parent-bol neocaml-indent-offset)
((parent-is "else_clause") parent-bol neocaml-indent-offset)
;; Match case bodies (after ->) are indented from |
((parent-is "match_case") parent-bol neocaml-indent-offset)
;; let...in: body after "in" aligns with "let" (no accumulation)
((parent-is "let_expression") parent-bol 0)
;; Binding operators: and* / and+ align with let* / let+
((node-is "let_and_operator") parent-bol 0)
;; Let/type/external bindings: body after = is indented
((parent-is "let_binding") parent-bol neocaml-indent-offset)
((parent-is "type_binding") parent-bol neocaml-indent-offset)
((parent-is "external") parent-bol neocaml-indent-offset)
((parent-is "value_specification") parent-bol neocaml-indent-offset)
;; Type definition components — use grand-parent-bol to avoid
;; shifting when the declaration starts on the same line as
;; its first child
((parent-is "record_declaration") parent-bol neocaml-indent-offset)
((parent-is "variant_declaration") neocaml--grand-parent-bol neocaml-indent-offset)
;; Module structures and signatures
((parent-is "structure") parent-bol neocaml-indent-offset)
((parent-is "signature") parent-bol neocaml-indent-offset)
;; Loop bodies
((parent-is "do_clause") parent-bol neocaml-indent-offset)
;; fun/function expressions
((parent-is "fun_expression") parent-bol neocaml-indent-offset)
((parent-is "function_expression") parent-bol neocaml-indent-offset)
;; try/with
((parent-is "try_expression") parent-bol neocaml-indent-offset)
;; Compound expressions
((parent-is "parenthesized_expression") parent-bol neocaml-indent-offset)
((parent-is "record_expression") parent-bol neocaml-indent-offset)
((parent-is "list_expression") parent-bol neocaml-indent-offset)
((parent-is "array_expression") parent-bol neocaml-indent-offset)
;; Application and field access
((parent-is "application_expression") parent-bol neocaml-indent-offset)
((parent-is "field_expression") parent-bol neocaml-indent-offset)
;; Sequences (expr1; expr2) — keep aligned
((parent-is "sequence_expression") parent-bol 0)
;; Object-oriented features
((parent-is "object_expression") parent-bol neocaml-indent-offset)
((parent-is "class_body_type") parent-bol neocaml-indent-offset)
;; Error recovery
((parent-is "ERROR") parent-bol neocaml-indent-offset)
;; Comment continuation lines align with the body start
((node-is "comment") neocaml--comment-body-anchor 0)
;; Strings preserve previous indentation
((node-is "string") prev-line 0))))