Skip to content

Commit 65c2fd7

Browse files
rrudakovbbatsov
authored andcommitted
Slightly speed-up clojure-ts-align and fix a minor issue
Before we were trying to align multiple nodes starting from the top-level node and moving to the most deeply nested node. This could produce misaligned forms if nested nodes have extra spaces that has to be cleaned up. Now we start from the most deeply nested node and gradually move to the top of the tree.
1 parent 456a7ca commit 65c2fd7

File tree

1 file changed

+39
-25
lines changed

1 file changed

+39
-25
lines changed

clojure-ts-mode.el

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,7 +1570,10 @@ BOUND bounds the whitespace search."
15701570
(when-let* ((cur-sexp (treesit-node-first-child-for-pos root-node (point) t)))
15711571
(goto-char (treesit-node-start cur-sexp))
15721572
(if (clojure-ts--metadata-node-p cur-sexp)
1573-
(treesit-end-of-thing 'sexp 2 'restricted)
1573+
(progn
1574+
(treesit-end-of-thing 'sexp 1 'restricted)
1575+
(just-one-space)
1576+
(treesit-end-of-thing 'sexp 1 'restricted))
15741577
(treesit-end-of-thing 'sexp 1 'restricted))
15751578
(when (looking-at-p ",")
15761579
(forward-char))
@@ -1603,6 +1606,33 @@ BOUND bounds the whitespace search."
16031606
sexp-end
16041607
t)))
16051608

1609+
(defvar clojure-ts--align-query
1610+
(treesit-query-compile 'clojure
1611+
(append
1612+
`(((map_lit) @map)
1613+
((ns_map_lit) @ns-map)
1614+
((list_lit
1615+
((sym_lit) @sym
1616+
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-binding-forms) @sym))
1617+
(vec_lit) @bindings-vec))
1618+
((list_lit
1619+
((sym_lit) @sym
1620+
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-cond-forms) @sym)))
1621+
@cond)
1622+
((anon_fn_lit
1623+
((sym_lit) @sym
1624+
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-binding-forms) @sym))
1625+
(vec_lit) @bindings-vec))
1626+
((anon_fn_lit
1627+
((sym_lit) @sym
1628+
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-cond-forms) @sym)))
1629+
@cond)))))
1630+
1631+
(defvar clojure-ts--align-reader-conditionals-query
1632+
(treesit-query-compile 'clojure
1633+
'(((read_cond_lit) @read-cond)
1634+
((splicing_read_cond_lit) @read-cond))))
1635+
16061636
(defun clojure-ts--get-nodes-to-align (beg end)
16071637
"Return a plist of nodes data for alignment.
16081638
@@ -1617,31 +1647,15 @@ have changed."
16171647
;; By default `treesit-query-capture' captures all nodes that cross the range.
16181648
;; We need to restrict it to only nodes inside of the range.
16191649
(let* ((region-node (clojure-ts--region-node beg end))
1620-
(query (treesit-query-compile 'clojure
1621-
(append
1622-
`(((map_lit) @map)
1623-
((ns_map_lit) @ns-map)
1624-
((list_lit
1625-
((sym_lit) @sym
1626-
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-binding-forms) @sym))
1627-
(vec_lit) @bindings-vec))
1628-
((list_lit
1629-
((sym_lit) @sym
1630-
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-cond-forms) @sym)))
1631-
@cond)
1632-
((anon_fn_lit
1633-
((sym_lit) @sym
1634-
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-binding-forms) @sym))
1635-
(vec_lit) @bindings-vec))
1636-
((anon_fn_lit
1637-
((sym_lit) @sym
1638-
(:match ,(clojure-ts-symbol-regexp clojure-ts-align-cond-forms) @sym)))
1639-
@cond))
1640-
(when clojure-ts-align-reader-conditionals
1641-
'(((read_cond_lit) @read-cond)
1642-
((splicing_read_cond_lit) @read-cond)))))))
1643-
(thread-last (treesit-query-capture region-node query beg end)
1650+
(nodes (append (treesit-query-capture region-node clojure-ts--align-query beg end)
1651+
(when clojure-ts-align-reader-conditionals
1652+
(treesit-query-capture region-node clojure-ts--align-reader-conditionals-query beg end)))))
1653+
(thread-last nodes
16441654
(seq-remove (lambda (elt) (eq (car elt) 'sym)))
1655+
;; Reverse the result to align the most deeply nested nodes
1656+
;; first. This way we can prevent breaking alignment of outer
1657+
;; nodes.
1658+
(seq-reverse)
16451659
;; When first node is reindented, all other nodes become
16461660
;; outdated. Executing the entire query everytime is very
16471661
;; expensive, instead we use markers for every captured node to

0 commit comments

Comments
 (0)