duplicate-table-keys lint
This commit is contained in:
parent
d219cfffcb
commit
d4c24b00f4
@ -16,7 +16,8 @@ the `file.diagnostics` field, filling it with diagnostics."
|
|||||||
:reference []
|
:reference []
|
||||||
:macro-call []
|
:macro-call []
|
||||||
:function-call []
|
:function-call []
|
||||||
:special-call []})
|
:special-call []
|
||||||
|
:other []})
|
||||||
|
|
||||||
(local all-lints [])
|
(local all-lints [])
|
||||||
|
|
||||||
@ -331,6 +332,25 @@ the `file.diagnostics` field, filling it with diagnostics."
|
|||||||
:message (.. "too many args. my analysis of the signature says we ignore any arguments past " min-params " arguments but you've provided " number-of-args)
|
:message (.. "too many args. my analysis of the signature says we ignore any arguments past " min-params " arguments but you've provided " number-of-args)
|
||||||
:severity message.severity.WARN})))))})
|
:severity message.severity.WARN})))))})
|
||||||
|
|
||||||
|
(add-lint :duplicate-table-keys
|
||||||
|
{:type :other
|
||||||
|
:impl (fn [server file]
|
||||||
|
(let [seen []]
|
||||||
|
(each [ast (pairs file.lexical)]
|
||||||
|
(when (table? ast)
|
||||||
|
(case (getmetatable ast)
|
||||||
|
{: keys} (let [dkey (accumulate [_ 1 i v (ipairs keys) &until (. seen v)]
|
||||||
|
(do (set (. seen v) i)
|
||||||
|
(+ i 1)))]
|
||||||
|
(when (. keys dkey)
|
||||||
|
(coroutine.yield
|
||||||
|
{:code :duplicate-table-keys
|
||||||
|
:range (message.ast->range server file ast)
|
||||||
|
:message (.. "key " (tostring (. keys dkey)) " appears more than once")
|
||||||
|
:severity message.severity.WARN}))
|
||||||
|
(each [k (pairs seen)]
|
||||||
|
(set (. seen k) nil))))))))})
|
||||||
|
|
||||||
(local lint-mt {:__tojson (fn [{: self} state] (dkjson.encode self state))
|
(local lint-mt {:__tojson (fn [{: self} state] (dkjson.encode self state))
|
||||||
:__index #(. $1 :self $2)})
|
:__index #(. $1 :self $2)})
|
||||||
|
|
||||||
@ -349,7 +369,9 @@ the `file.diagnostics` field, filling it with diagnostics."
|
|||||||
(table.insert file.diagnostics
|
(table.insert file.diagnostics
|
||||||
(wrap (doto diagnostic
|
(wrap (doto diagnostic
|
||||||
(tset :code lint.name))))))))
|
(tset :code lint.name))))))))
|
||||||
|
(each [diagnostic (coroutine.wrap #(run lints.other server file))]
|
||||||
|
(table.insert file.diagnostics
|
||||||
|
(wrap diagnostic)))
|
||||||
(each [symbol definition (pairs file.definitions)]
|
(each [symbol definition (pairs file.definitions)]
|
||||||
(when (. file.lexical symbol)
|
(when (. file.lexical symbol)
|
||||||
(run lints.definition server file symbol definition)))
|
(run lints.definition server file symbol definition)))
|
||||||
|
|||||||
@ -315,6 +315,21 @@
|
|||||||
:flsproject.fnl "{:lints {:mismatched-argument-count true}}"})
|
:flsproject.fnl "{:lints {:mismatched-argument-count true}}"})
|
||||||
nil)
|
nil)
|
||||||
|
|
||||||
|
(fn test-duplicate-keys []
|
||||||
|
(assert-ok "{:a 1 :b 2}")
|
||||||
|
(assert-ok "(local _ {:a 1}) {:a 2}")
|
||||||
|
(check "{:a 1 :a 2}" [{:code :duplicate-table-keys :message "key a appears more than once"}])
|
||||||
|
(check "{:there :are
|
||||||
|
:lots :of
|
||||||
|
:choices :for
|
||||||
|
:which :key
|
||||||
|
:to :include
|
||||||
|
:in :the
|
||||||
|
:message :.
|
||||||
|
:which :one?}" [{:code :duplicate-table-keys :message "key which appears more than once"}])
|
||||||
|
(check "(local a 1) {:a 2 : a}" [{:code :duplicate-table-keys}])
|
||||||
|
nil)
|
||||||
|
|
||||||
;; TODO lints:
|
;; TODO lints:
|
||||||
;; duplicate keys in kv table
|
;; duplicate keys in kv table
|
||||||
;; (tset <sym> <any>) --> (set (. <sym> <any>)) (might be wanted for compat?)
|
;; (tset <sym> <any>) --> (set (. <sym> <any>)) (might be wanted for compat?)
|
||||||
@ -341,4 +356,5 @@
|
|||||||
: test-op-with-no-arguments
|
: test-op-with-no-arguments
|
||||||
: test-empty-let
|
: test-empty-let
|
||||||
: test-decreasing-comparison
|
: test-decreasing-comparison
|
||||||
: test-arg-count}
|
: test-arg-count
|
||||||
|
: test-duplicate-keys}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user