fennel-ls/test/rename-test.fnl
XeroOl 8b6d905450 make multival definition tracking much better
there should now be no cases where multivals and table destructures are
confused. ie, (local [_ x] (values 1 2)) and (local (_ x) [1 2]) are recognized
as nonsense.
2024-02-02 02:12:30 -06:00

59 lines
2.4 KiB
Fennel

(import-macros {: is-matching : is-casing : describe : it : before-each} :test)
(local utils (require :fennel-ls.utils))
(local is (require :test.is))
(local {: view} (require :fennel))
(local {: ROOT-URI
: create-client} (require :test.client))
(local filename (.. ROOT-URI "/imaginary-file.fnl"))
(fn check-rename [body line col new-name new-body]
(let [client (doto (create-client)
(: :open-file! filename body))
[{: result}] (client:rename filename line col new-name)
changes (. result.changes filename)
body (. client.server.files filename :text)]
(is.equal
(utils.apply-edits body changes client.server.position-encoding)
new-body)))
(describe "rename"
(it "renames a variable"
(check-rename "(let [old-name 100] old-name)" 0 9 :new-name
"(let [new-name 100] new-name)"))
(it "renames a variable 2"
(check-rename "(let [old-name 100] (print old-name) (print old-name))" 0 9 :new-name!!
"(let [new-name!! 100] (print new-name!!) (print new-name!!))"))
(it "renames a multisym"
(check-rename "(let [old-name {:field 10}] old-name.field)" 0 9 :new-name
"(let [new-name {:field 10}] new-name.field)")
(check-rename "(let [old-name {:field 10}] old-name.field)" 0 30 :new-name
"(let [new-name {:field 10}] new-name.field)"))
(it "renames from destructure/args"
(check-rename "(fn [{: x}] x)" 0 8 :foo "(fn [{: foo}] foo)")
(check-rename "(fn [{:x x}] x)" 0 9 :foo "(fn [{:x foo}] foo)"))
(it "renames a sym inside of lambda"
(check-rename "(λ [foo] (print foo))" 0 6 :something
"(λ [something] (print something))"))
(it "renames a sym inside of set"
(check-rename "(var x 10)\n(set x 20)" 1 6 :something
"(var something 10)\n(set something 20)"))
(it "renames a sym inside of set 2"
(check-rename "(var x 10)\n(var m 0)\n(set (m x) (values 10 20))" 2 8 :something
"(var something 10)\n(var m 0)\n(set (m something) (values 10 20))"))
(it "renames a sym inside of set 3"
(check-rename "(var (x y) 10)\n(set (x y) 10)" 1 8 :something
"(var (x something) 10)\n(set (x something) 10)"))
(it "renames a sym inside of macro that uses multiple times"
(check-rename "(var x 10)\n(doto x (set 20) (set 30))" 1 6 :something
"(var something 10)\n(doto something (set 20) (set 30))")))