From 311ce2645e1a2b0fce278968a96e4ae4c98b7daa Mon Sep 17 00:00:00 2001 From: XeroOl Date: Sun, 7 Apr 2024 23:18:14 -0500 Subject: [PATCH] fix fennel-ls#22 This is getting messy, but now the same sym can reference multiple places. (. file references mysym) only holds the last one, but (. file definitions :referenced-by) could still hold older references. --- src/fennel-ls/compiler.fnl | 11 +++-------- src/fennel-ls/handlers.fnl | 8 +++++++- src/fennel-ls/lint.fnl | 3 --- test/lint.fnl | 1 + test/rename.fnl | 1 + 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/fennel-ls/compiler.fnl b/src/fennel-ls/compiler.fnl index ac0f9ba..fcc4e70 100644 --- a/src/fennel-ls/compiler.fnl +++ b/src/fennel-ls/compiler.fnl @@ -86,14 +86,9 @@ identifiers are declared / referenced in which places." ;; find reference (let [name (string.match (tostring symbol) "[^%.:]+")] (case (find-definition (tostring name) scope) - target - (if (. references symbol) - (do ;; already exists - (assert (= symbol (. references symbol :symbol)) (.. "the symbol should always be the same"))) - ;; (assert (= target (. references symbol :target)) (.. "different targets: " (view target) (view (. references symbol :target))))) - (let [ref {: symbol : target : ref-type}] - (tset references symbol ref) - (table.insert target.referenced-by ref)))))) + target (let [ref {: symbol : target : ref-type}] + (tset references symbol ref) + (table.insert target.referenced-by ref))))) (λ symbol-to-expression [ast scope ?reference?] (assert (sym? ast) "symbols only") diff --git a/src/fennel-ls/handlers.fnl b/src/fennel-ls/handlers.fnl index 39018da..fa5983c 100644 --- a/src/fennel-ls/handlers.fnl +++ b/src/fennel-ls/handlers.fnl @@ -226,7 +226,13 @@ Every time the client sends a message, it gets handled by a function in the corr (table.sort usages #(> (utils.position->byte definition.file.text $1.range.start :utf-8) (utils.position->byte definition.file.text $2.range.start :utf-8))) - {:changes {definition.file.uri usages}}) + (var prev {}) + (let [usages-dedup (icollect [_ edit (ipairs usages)] + (when (or (not= edit.range.start.line prev.line) + (not= edit.range.start.character prev.character)) + (set prev edit.range.start) + edit))] + {:changes {definition.file.uri usages-dedup}})) (catch _ nil)))) (fn pos<= [pos-1 pos-2] diff --git a/src/fennel-ls/lint.fnl b/src/fennel-ls/lint.fnl index 7470e3c..5044030 100644 --- a/src/fennel-ls/lint.fnl +++ b/src/fennel-ls/lint.fnl @@ -121,9 +121,6 @@ the `file.diagnostics` field, filling it with diagnostics." :quickfix #[{:range (message.ast->range self file call) :newText (view identity)}]})))) -; (fn quickfix.op-with-no-arguments [item] -; {:range item.range -; :newText (tostring item.data)}) (λ multival-in-middle-of-call [self file fun call arg index] "generally, values and unpack are signs that the user is trying to do diff --git a/test/lint.fnl b/test/lint.fnl index ad1d3f0..c0176fc 100644 --- a/test/lint.fnl +++ b/test/lint.fnl @@ -58,6 +58,7 @@ :end {:character 6 :line 0}}}] []) ;; setting a field without reading is okay (check "(fn [a b] (set a.x 10) (fn b.f []))" [] [{}]) + (check "(case {:b 1} (where (or {:a x} {:b x})) x)" [] [{}]) nil) (fn test-ampersand [] diff --git a/test/rename.fnl b/test/rename.fnl index 6ff61c3..28c89e1 100644 --- a/test/rename.fnl +++ b/test/rename.fnl @@ -31,6 +31,7 @@ (check "(fn [{:x x|}] x)" :foo "(fn [{:x foo}] foo)") + ;; issue fennel-ls#8 (check "(λ [foo|] (print foo))" :something "(λ [something] (print something))")