Skip to content

Commit 0995451

Browse files
authored
Fix barf forward (#1976)
* Repro the issue * Fix jar hell * Git ignore .calva and .clj-kondo files but /.clj-kondo/config.edn * Several explorations, make slurp tests to pass * Make code easier to read * 💅 * Cleaning up dead code * 💅 * Add FIXME on range * Replace slurp-backward with slurp-backward-into * Make test-lib green * :nail-care: * Add failing test scenario for paredit raise to be tackled in the future * Pass row col to paredit functions * Update CHANGELOG * Fix barf forward and cursor positioning * 💅 * Refactor backard-barf tests * Refactor paredit raise * Refactor paredit kill * Delete dead code * Fix cursor positioning in barf forward and kill * Fix raise test scenario * Update CHANGELOG
1 parent 953be59 commit 0995451

File tree

3 files changed

+60
-75
lines changed

3 files changed

+60
-75
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
- Bump clj-kondo to `2025.02.20`.
77
- Add support for OpenTelemetry(otlp) log, enabled if configured. #1963
88
- Editor
9-
- Improve paredit slurp corner cases. #1973
9+
- Improve paredit slurp and barf corner cases. #1973 #1976
1010

1111
## 2025.02.07-16.11.24
1212

lib/src/clojure_lsp/feature/paredit.clj

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,29 @@
88
(defn ^:private paredit-op [paredit-fn move-cursor? uri original-zloc row col]
99
(try
1010
(when original-zloc
11-
(let [zloc (paredit-fn original-zloc)
11+
(let [{original-row :row original-col :col} (-> original-zloc z/node meta)
12+
offset-row (- row original-row)
13+
offset-col (- col original-col)
14+
pos-zloc (-> original-zloc
15+
z/root-string
16+
(z/of-string {:track-position? true}) ;; https://clojurians.slack.com/archives/CHB5Q2XUJ/p1740958982303849
17+
(edit/find-at-pos row col))
18+
zloc (paredit-fn pos-zloc)
19+
[row' col'] (z/position zloc)
20+
[new-row new-col] (if (= (z/node original-zloc) (z/node zloc)) ;; if the node where the cursor is has changed
21+
[(+ row' offset-row) (+ col' offset-col)] ;; move the cursor to the new node position
22+
[row col]) ;; otherwise keep the cursor in the same place
1223
root-zloc (z/up (edit/to-top zloc))]
1324
{:changes-by-uri {uri [{:loc root-zloc
1425
:range (meta (z/node root-zloc))}]} ;; FIXME: range is always the whole document
1526
:show-document-after-edit {:uri uri
1627
:take-focus true
1728
:range (if move-cursor?
1829
(meta (z/node (z/up original-zloc)))
19-
{:row row :col col :end-row row :end-col col})}}))
30+
{:row new-row
31+
:col new-col
32+
:end-row new-row
33+
:end-col new-col})}}))
2034
(catch Exception e
2135
(logger/error e))))
2236

lib/test/clojure_lsp/feature/paredit_test.clj

Lines changed: 43 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,19 @@
22
(:require
33
[clojure-lsp.feature.paredit :as f.paredit]
44
[clojure-lsp.test-helper :as h]
5-
[clojure.test :refer [are deftest is]]))
5+
[clojure.test :refer [are deftest]]))
66

7-
(defmacro ^:private assert-op [op expected code]
8-
`(let [{{row# :row col# :col} :position zloc# :zloc} (h/load-code-into-zloc-and-position ~code)
9-
applied# (~op h/default-uri zloc# row# col#)
10-
[text# _#] (h/positions-from-text ~expected)]
11-
(is (= text#
12-
(h/changes->code (-> applied# :changes-by-uri first second) (h/db))))))
13-
14-
(defn ^:private apply-paredit
7+
(defn ^:private pareditfy
158
[paredit-fn code]
16-
(let [{{row :row col :col} :position zloc :zloc} (h/load-code-into-zloc-and-position code)
17-
transformations (paredit-fn h/default-uri zloc row col)
18-
{{actual-row :row actual-col :col} :range} (:show-document-after-edit transformations)
19-
result (h/changes->code (-> transformations :changes-by-uri first second) (h/db))]
20-
(if transformations
21-
(h/put-cursor-at result actual-row actual-col)
22-
"|")))
9+
(let [{{row :row col :col} :position zloc :zloc} (h/load-code-into-zloc-and-position code)]
10+
(if-let [transformations (paredit-fn h/default-uri zloc row col)]
11+
(let [{{actual-row :row actual-col :col} :range} (:show-document-after-edit transformations)
12+
result (h/changes->code (-> transformations :changes-by-uri first second) (h/db))]
13+
(h/put-cursor-at result actual-row actual-col))
14+
code)))
2315

2416
(deftest forward-slurp-test
25-
(are [expected code] (= expected (apply-paredit f.paredit/forward-slurp code))
17+
(are [expected code] (= expected (pareditfy f.paredit/forward-slurp code))
2618
"[1 [2 3| 4]]" "[1 [2 3|] 4]"
2719
"[1 [2 [|3 4 5]] 6]" "[1 [2 [|3 4] 5] 6]"
2820
"[|1 2]" "[|1] 2"
@@ -34,72 +26,51 @@
3426
;; "(get {}| :a)" "(get {}|) :a"
3527
;; "(get {} |:a)" "(get {} |) :a"
3628
"(get []| 0)" "(get []|) 0"
37-
"(get [] |0)" "(get [] |) 0"))
29+
"(get [] |0)" "(get [] |) 0"
30+
#_()))
3831

3932
(deftest forward-barf-test
40-
(assert-op f.paredit/forward-barf
41-
(h/code "[1 [2] 3| 4]")
42-
(h/code "[1 [2 3|] 4]"))
43-
(assert-op f.paredit/forward-barf
44-
(h/code "[1 [2 [|3 4] 5] 6]")
45-
(h/code "[1 [2 [|3 4 5]] 6]"))
46-
(assert-op f.paredit/forward-barf
47-
(h/code "[|1] 2")
48-
(h/code "[|1 2]"))
49-
(assert-op f.paredit/forward-barf
50-
(h/code "|1")
51-
(h/code "|1"))
52-
(assert-op f.paredit/forward-barf
53-
(h/code "|")
54-
(h/code "|")))
33+
(are [expected code] (= expected (pareditfy f.paredit/forward-barf code))
34+
"[1 [2] 3| 4]" "[1 [2 3|] 4]"
35+
"[12 [34] 5|6 78]" "[12 [34 5|6] 78]"
36+
"[1 [2 [|3 4] 5] 6]" "[1 [2 [|3 4 5]] 6]"
37+
"[|1] 2" "[|1 2]"
38+
"|1" "|1"
39+
"|" "|"
40+
"(get []) |:a" "(get [] |:a)"
41+
"(get []|) :a" "(get []| :a)"
42+
#_()))
5543

5644
(deftest backward-slurp-test
57-
(are [expected code] (= expected (apply-paredit f.paredit/backward-slurp code))
45+
(are [expected code] (= expected (pareditfy f.paredit/backward-slurp code))
5846
"[[1 |2 3] 4]" "[1 [|2 3] 4]"
5947
"[1 [[2 |3 4] 5] 6]" "[1 [2 [|3 4] 5] 6]"
6048
"[|1] 2" "[|1] 2"
6149
"|1" "|1"
62-
"|" "|"))
50+
"|" "|"
51+
#_()))
6352

6453
(deftest backward-barf-test
65-
(assert-op f.paredit/backward-barf
66-
(h/code "[1 |2 [3] 4]")
67-
(h/code "[1 [|2 3] 4]"))
68-
(assert-op f.paredit/backward-barf
69-
(h/code "[1 [2 [|3 4] 5] 6]")
70-
(h/code "[1 [[2 |3 4] 5] 6]"))
71-
(assert-op f.paredit/backward-barf
72-
(h/code "1 [] 2")
73-
(h/code "[|1] 2"))
74-
(assert-op f.paredit/backward-barf
75-
(h/code "|1")
76-
(h/code "|1"))
77-
(assert-op f.paredit/backward-barf
78-
(h/code "|")
79-
(h/code "|")))
54+
(are [expected code] (= expected (pareditfy f.paredit/backward-barf code))
55+
"[1 |2 [3] 4]" "[1 [|2 3] 4]"
56+
"[1 [2 [|3 4] 5] 6]" "[1 [[2 |3 4] 5] 6]"
57+
"|1 [] 2" "[|1] 2"
58+
"|1" "|1"
59+
"|" "|"
60+
#_()))
8061

8162
(deftest raise-test
82-
(assert-op f.paredit/raise
83-
(h/code "[1 [2 |3 5] 6]")
84-
(h/code "[1 [2 [|3 4] 5] 6]"))
85-
;; FIXME: the scenario below fails
86-
;; (assert-op f.paredit/raise
87-
;; (h/code "[1 [2 3| 5] 6]")
88-
;; (h/code "[1 [2 [3| 4] 5] 6]"))
89-
(assert-op f.paredit/raise
90-
(h/code "|1")
91-
(h/code "|1"))
92-
(assert-op f.paredit/raise
93-
(h/code "|")
94-
(h/code "|")))
63+
(are [expected code] (= expected (pareditfy f.paredit/raise code))
64+
"[1 [2 |3 5] 6]" "[1 [2 [|3 4] 5] 6]"
65+
;; FIXME: the scenario below fails
66+
;; "[1 [2 |4 5] 6]" "[1 [2 [3| 4] 5] 6]"
67+
"|1" "|1"
68+
"|" "|"
69+
#_()))
9570

9671
(deftest kill-test
97-
(assert-op f.paredit/kill
98-
(h/code "[1 [2 [|] 5] 6]")
99-
(h/code "[1 [2 [|3 4] 5] 6]"))
100-
(assert-op f.paredit/kill
101-
(h/code "|1")
102-
(h/code "|1"))
103-
(assert-op f.paredit/kill
104-
(h/code "|")
105-
(h/code "|")))
72+
(are [expected code] (= expected (pareditfy f.paredit/kill code))
73+
"[1 [2 [|] 5] 6]" "[1 [2 [|3 4] 5] 6]"
74+
"|1" "|1"
75+
"|" "|"
76+
#_()))

0 commit comments

Comments
 (0)