fennel-ls/test/signature-help.fnl
Michele Campeotto 945eb86b4c SignatureHelp returns parameters ranges instead just the name.
This fixes an issue where a parameter name that is a substring of the
function name causes the client to highlight the function name substring
instead of the argument. Using ranges of the signature string avoids the
problem.
2025-04-07 20:56:19 -07:00

262 lines
7.2 KiB
Fennel

(local faith (require :faith))
(local {: view} (require :fennel))
(local {: create-client} (require :test.utils))
(λ check-signature [expected response]
(case response
{:signatures [{:label signature : parameters}]}
(do
(faith.= expected.signature signature)
(faith.= expected.activeParameter response.activeParameter)
(faith.= expected.parameters parameters))
;; fail
_ (faith.is nil (.. "Invalid response: " (view response)))))
(fn check [file-contents expected]
(let [{: client : uri : cursor} (create-client file-contents)
[{: result}] (client:signature-help uri cursor)]
(check-signature expected result)))
(local fn-signature "(fn name? args docstring? ...)")
(local fn-params [{:label [4 9]}
{:label [10 14]}
{:label [15 25]}
{:label [26 29]}])
(local err-signature "(error message ?level)")
(local err-params [{:label [7 14]}
{:label [15 21]}])
(local let-signature "(let [name1 val1 ... nameN valN] ...)")
(local let-params [{:label [5 32]}
{:label [33 36]}])
(local function-signature "(func arg1 arg2)")
(local function-params [{:label [6 10]}
{:label [11 15]}])
(fn test-fn-definition []
(check "(fn |)"
{:signature fn-signature
:activeParameter 0
:parameters fn-params})
(check "(fn some-nam|)"
{:signature fn-signature
:activeParameter 0
:parameters fn-params})
(check "(fn some-name [|]"
{:signature fn-signature
:activeParameter 1
:parameters fn-params})
(check "(fn some-name [arg|])"
{:signature fn-signature
:activeParameter 1
:parameters fn-params})
(check "(fn some-name [arg1 arg2]
\"docstring|\")"
{:signature fn-signature
:activeParameter 2
:parameters fn-params})
(check "(fn some-name [arg1 arg2]
\"docstring\"
|"
{:signature fn-signature
:activeParameter 2
:parameters fn-params}))
(fn test-local-function []
(check "(fn func [arg1 arg2] (print :hello))
(func|)"
{:signature function-signature
:activeParameter nil
:parameters function-params})
(check "(fn func [arg1 arg2] (print :hello))
(func |)"
{:signature function-signature
:activeParameter 0
:parameters function-params})
(check "(fn func [arg1 arg2] (print :hello))
(func a1|)"
{:signature function-signature
:activeParameter 0
:parameters function-params})
(check "(fn func [arg1 arg2] (print :hello))
(func a|1 a2)"
{:signature function-signature
:activeParameter 0
:parameters function-params})
(check "(fn func [arg1 arg2] (print :hello))
(func a1 a2|)"
{:signature function-signature
:activeParameter 1
:parameters function-params})
(check "(fn func [arg1 arg2] (print :hello))
(func a1 a|2)"
{:signature function-signature
:activeParameter 1
:parameters function-params}))
(fn test-literals []
(check "(fn func [arg1 arg2] (print :hello))
(func arg 10|2)"
{:signature function-signature
:activeParameter 1
:parameters function-params})
(check "(fn func [arg1 arg2] (print :hello))
(func arg \"10|2\")"
{:signature function-signature
:activeParameter 1
:parameters function-params}))
(fn test-vararg []
(local or-params [{:label [4 5]}
{:label [6 7]}
{:label [8 11]}])
(check "(or a b|)"
{:signature "(or a b ...)"
:activeParameter 1
:parameters or-params})
(check "(or a b c|)"
{:signature "(or a b ...)"
:activeParameter 2
:parameters or-params})
(check "(or a b c d e|)"
{:signature "(or a b ...)"
:activeParameter 2
:parameters or-params}))
(fn test-lua-builtin []
(check "(error msg|)"
{:signature err-signature
:activeParameter 0
:parameters err-params})
(check "(error msg lvl|)"
{:signature err-signature
:activeParameter 1
:parameters err-params})
(check "(error msg lvl extr|)"
{:signature err-signature
:activeParameter 1
:parameters err-params}))
(fn test-multisym []
(check "(table.concat tbl s|)"
{:signature "(table.concat list ?sep ?i ?j)"
:activeParameter 1
:parameters [{:label [14 18]}
{:label [19 23]}
{:label [24 26]}
{:label [27 29]}]}))
(fn test-destructuring-arg []
(local dstr-params [{:label [6 19]}
{:label [20 24]}])
(check "(fn dstr [{:field name} arg2] {})
(dstr |)"
{:signature "(dstr {:field name} arg2)"
:activeParameter 0
:parameters dstr-params})
(check "(fn dstr [{:field name} arg2] {})
(dstr arg1 ar|)"
{:signature "(dstr {:field name} arg2)"
:activeParameter 1
:parameters dstr-params})
(check "(fn dstr [{:field |} arg2] {})"
{:signature fn-signature
:activeParameter 1
:parameters fn-params}))
(fn test-binding-form []
(local each-signature "(each [key value (iterator)] ...)")
(local each-params [{:label [6 28]}
{:label [29 32]}])
(check "(each |)"
{:signature each-signature
:activeParameter 0
:parameters each-params})
(check "(each [|])"
{:signature each-signature
:activeParameter 0
:parameters each-params})
(check "(each [k val|])"
{:signature each-signature
:activeParameter 0
:parameters each-params})
(check "(let [a 0]
(error |))"
{:signature err-signature
:activeParameter 0
:parameters err-params})
(check "(let [a|] (error))"
{:signature let-signature
:activeParameter 0
:parameters let-params}))
(fn test-indirect-definition []
(check "(let [a error]
(a |))"
{:signature err-signature
:activeParameter 0
:parameters err-params}))
(fn test-destructuring-binding []
(check "(let [(a b|) {}]"
{:signature let-signature
:activeParameter 0
:parameters let-params})
(check "(let [(a {:b |}) {}]"
{:signature let-signature
:activeParameter 0
:parameters let-params})
(check "(let [{:field |} {}]"
{:signature let-signature
:activeParameter 0
:parameters let-params})
(check "(let [{:field {: nested |"
{:signature let-signature
:activeParameter 0
:parameters let-params})
(check "(let [{:field {: nested &as |}} {}]"
{:signature let-signature
:activeParameter 0
:parameters let-params}))
{: test-fn-definition
: test-local-function
: test-literals
: test-vararg
: test-lua-builtin
: test-multisym
: test-destructuring-arg
: test-binding-form
: test-indirect-definition
: test-destructuring-binding}