1 ;;; factor-smie.el --- Helper function for indenting factor code
3 ;; Copyright (C) 2016 Björn Lindqvist
4 ;; See http://factorcode.org/license.txt for BSD license.
8 ;; Factor indentation using the SMIE framework.
13 (defcustom factor-block-offset 4
14 "Indentation of Factor statements."
19 ;; These prefixes starts a definition and causes the indent-level to
21 (defconst factor-indent-def-starts
24 "COM-INTERFACE" "CONSULT"
28 "IDENTITY-MEMO" "INTERSECTION"
29 "M" "M:" "MACRO" "MACRO:"
30 "MAIN-WINDOW" "MEMO" "MEMO:" "METHOD"
32 "PREDICATE" "PROTOCOL"
34 "STRUCT" "SYMBOLS" "TAG" "TUPLE"
37 "UNION-STRUCT" "UNION"
38 "VARIANT" "VERTEX-FORMAT"))
40 ;; These prefixes starts a definition but does not cause the indent
42 (defconst factor-no-indent-def-starts
44 "FUNCTION" "FUNCTION-ALIAS"
47 "SPECIALIZED-ARRAYS"))
49 (defconst factor-indent-def-regex
50 (format "^\\(%s:\\)$" (regexp-opt factor-indent-def-starts)))
52 (defconst factor-smie-grammar
59 (defun factor-smie-rules (kind token)
60 (pcase (cons kind token)
61 (`(:before . ";") factor-block-offset)
62 (`(:list-intro . ,_) t)
65 (defun factor-smie-token (dir)
67 (`forward (forward-comment (point-max)))
68 (`backward (forward-comment (- (point)))))
69 (let ((tok (buffer-substring-no-properties
71 (let ((syntax "w_\\\""))
73 (`forward (skip-syntax-forward syntax))
74 (`backward (skip-syntax-backward syntax)))
76 ;; Token normalization. This way we only need one rule in
77 ;; factor-smie-grammar.
78 (cond ((string-match factor-indent-def-regex tok) ":")
81 (defun factor-smie-forward-token ()
82 (factor-smie-token 'forward))
84 (defun factor-smie-backward-token ()
85 (factor-smie-token 'backward))
87 (defun factor-smie-indent ()
88 (unless (looking-at ";\\_>")
91 (while (progn (setq x (smie-backward-sexp))
93 (when (string-match factor-indent-def-regex
96 (+ factor-block-offset (smie-indent-virtual)))))))
98 (provide 'factor-smie)
100 ;;; factor-smie.el ends here