Skip to content

Commit 3522b57

Browse files
rrudakovbbatsov
authored andcommitted
Improve support of extend-protocol forms
1 parent db7054b commit 3522b57

6 files changed

+49
-4
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## main (unreleased)
44

5+
- [#96](https://github.com/clojure-emacs/clojure-ts-mode/pull/96): Highlight function name properly in `extend-protocol` form.
6+
- [#96](https://github.com/clojure-emacs/clojure-ts-mode/pull/96): Add support for extend-protocol forms to `clojure-ts-add-arity` refactoring
7+
command.
8+
59
## 0.4.0 (2025-05-15)
610

711
- [#16](https://github.com/clojure-emacs/clojure-ts-mode/issues/16): Introduce `clojure-ts-align`.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ set. The following commands are available:
448448
`clojure-ts-add-arity`: Add a new arity to an existing single-arity or
449449
multi-arity function or macro. Function can be defined using `defn`, `fn` or
450450
`defmethod` form. This command also supports functions defined inside forms like
451-
`letfn`, `defprotol`, `reify` or `proxy`.
451+
`letfn`, `defprotol`, `reify`, `extend-protocol` or `proxy`.
452452

453453
### Default keybindings
454454

clojure-ts-mode.el

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,12 @@ literals with regex grammar."
602602
(sym_lit name: (sym_name) @font-lock-function-name-face))))
603603
((list_lit
604604
((sym_lit name: (sym_name) @def)
605-
((:equal "reify" @def)))
605+
((:match ,(rx-to-string
606+
`(seq bol
607+
(or "reify"
608+
"extend-protocol")
609+
eol))
610+
@def)))
606611
(list_lit
607612
(sym_lit name: (sym_name) @font-lock-function-name-face))))
608613
;; letfn
@@ -2186,6 +2191,12 @@ type, etc. See `treesit-thing-settings' for more details."
21862191
(and (clojure-ts--list-node-p node)
21872192
(string= (clojure-ts--list-node-sym-text parent) "reify"))))
21882193

2194+
(defun clojure-ts--extend-protocol-defn-p (node)
2195+
"Return non-nil if NODE is a function definition in an extend-protocol form."
2196+
(when-let* ((parent (treesit-node-parent node)))
2197+
(and (clojure-ts--list-node-p node)
2198+
(string= (clojure-ts--list-node-sym-text parent) "extend-protocol"))))
2199+
21892200
(defun clojure-ts-add-arity ()
21902201
"Add an arity to a function or macro."
21912202
(interactive)
@@ -2196,6 +2207,7 @@ type, etc. See `treesit-thing-settings' for more details."
21962207
"defmacro"
21972208
"defmethod"
21982209
"defprotocol"
2210+
"extend-protocol"
21992211
"reify"
22002212
"proxy")
22012213
eol))
@@ -2210,13 +2222,16 @@ type, etc. See `treesit-thing-settings' for more details."
22102222
(clojure-ts--parent-until #'clojure-ts--defprotocol-defn-p))
22112223
((string= parent-def-sym "reify")
22122224
(clojure-ts--parent-until #'clojure-ts--reify-defn-p))
2225+
((string= parent-def-sym "extend-protocol")
2226+
(clojure-ts--parent-until #'clojure-ts--extend-protocol-defn-p))
22132227
(t parent-def-node))))
22142228
(let ((beg-marker (copy-marker (treesit-node-start parent-def-node)))
22152229
(end-marker (copy-marker (treesit-node-end parent-def-node))))
22162230
(cond
22172231
((string= parent-def-sym "defprotocol")
22182232
(clojure-ts--add-arity-defprotocol-internal fn-node))
2219-
((string= parent-def-sym "reify")
2233+
((or (string= parent-def-sym "reify")
2234+
(string= parent-def-sym "extend-protocol"))
22202235
(clojure-ts--add-arity-reify-internal fn-node))
22212236
(t (clojure-ts--add-arity-internal fn-node)))
22222237
(indent-region beg-marker end-marker))

test/clojure-ts-mode-font-lock-test.el

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,10 @@ DESCRIPTION is the description of the spec."
223223
(2 12 font-lock-keyword-face)
224224
(14 14 font-lock-type-face)
225225
(19 21 font-lock-function-name-face)
226-
(34 39 font-lock-function-name-face))))
226+
(34 39 font-lock-function-name-face))
227+
228+
("(extend-protocol prepare/SettableParameter
229+
clojure.lang.IPersistentMap
230+
(set-parameter [m ^PreparedStatement s i]
231+
(.setObject s i (->pgobject m))))"
232+
(81 93 font-lock-function-name-face))))

test/clojure-ts-mode-refactor-add-arity-test.el

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,20 @@
324324

325325
(clojure-ts-add-arity))
326326

327+
(when-refactoring-with-point-it "should handle an extend-protocol"
328+
"(extend-protocol prepare/SettableParameter
329+
clojure.lang.IPersistentMap
330+
(set-parameter [m ^PreparedStatement s i]
331+
(.setObject| s i (->pgobject m))))"
332+
333+
"(extend-protocol prepare/SettableParameter
334+
clojure.lang.IPersistentMap
335+
(set-parameter [|])
336+
(set-parameter [m ^PreparedStatement s i]
337+
(.setObject s i (->pgobject m))))"
338+
339+
(clojure-ts-add-arity))
340+
327341
(it "should signal a user error when point is not inside a function body"
328342
(with-clojure-ts-buffer-point "
329343
(letf|n [(foo

test/samples/refactoring.clj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,9 @@
141141

142142
(when-not true
143143
(println "Hello world"))
144+
145+
(extend-protocol prepare/SettableParameter
146+
clojure.lang.IPersistentMap
147+
(set-parameter [])
148+
(set-parameter [m ^PreparedStatement s i]
149+
(.setObject| s i (->pgobject m))))

0 commit comments

Comments
 (0)