Skip to content

Commit

Permalink
[#434] fix :lint-as clojure.core/for (2)
Browse files Browse the repository at this point in the history
  • Loading branch information
borkdude committed Sep 9, 2019
1 parent 8a2df7b commit 3e13871
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 11 deletions.
8 changes: 7 additions & 1 deletion corpus/lint_as_for.clj
Expand Up @@ -2,10 +2,16 @@
{:clj-kondo/config '{;; TODO: setting the level doesn't yet work in ns local
;; configs, see #430, so we have to set it in our tests
:linters {:unresolved-symbol {:level :warning}}
:lint-as {plumbing.core/for-map clojure.core/for}}})
:lint-as {plumbing.core/for-map clojure.core/for
clojure.java.jdbc/with-db-transaction clojure.core/let}}})

(require 'plumbing.core)

(plumbing.core/for-map [[k v] {} :let [[v & _rst] v]] [k v])

(for [[k v] {} :let [[v & _rst] v]] [k v])

;; the fix for #434 does not result in a redundant let warning for:
(require 'clojure.java.jdbc)
(let [_a 1 d 2]
(clojure.java.jdbc/with-db-transaction [db d] db))
25 changes: 15 additions & 10 deletions src/clj_kondo/impl/analyzer.clj
Expand Up @@ -354,8 +354,9 @@
(map #(extract-bindings ctx %))
(reduce deep-merge {})))

(defn analyze-let-like-bindings [ctx binding-vector call]
(let [for-like? (one-of call [for doseq])]
(defn analyze-let-like-bindings [ctx binding-vector]
(let [resolved-as-clojure-var-name (:resolved-as-clojure-var-name ctx)
for-like? (one-of resolved-as-clojure-var-name [for doseq])]
(loop [[binding value & rest-bindings] (-> binding-vector :children)
bindings (:bindings ctx)
arities (:arities ctx)
Expand All @@ -369,7 +370,7 @@
new-analyzed :analyzed
new-arities :arities}
(analyze-let-like-bindings
(ctx-with-bindings ctx bindings) value call)]
(ctx-with-bindings ctx bindings) value)]
(recur rest-bindings
(merge bindings new-bindings)
(merge arities new-arities)
Expand Down Expand Up @@ -411,8 +412,9 @@

(defn analyze-like-let
[{:keys [:filename :callstack
:maybe-redundant-let?] :as ctx} expr call]
(let [let? (= 'let call)
:maybe-redundant-let?] :as ctx} expr]
(let [call (-> callstack first second)
let? (= 'let call)
let-parent? (one-of (second callstack)
[[clojure.core let]
[cljs.core let]])
Expand All @@ -428,7 +430,7 @@
(analyze-let-like-bindings
(-> ctx
;; prevent linting redundant let when using let in bindings
(update :callstack #(cons [nil :let-bindings] %))) bv call)
(update :callstack #(cons [nil :let-bindings] %))) bv)
let-body (nnext (:children expr))
single-child? (and let? (= 1 (count let-body)))]
(lint-even-forms-bindings! ctx 'let bv)
Expand Down Expand Up @@ -551,14 +553,14 @@
(namespace/reg-alias! ctx (:name ns) alias-sym ns-sym)
(assoc-in ns [:qualify-ns alias-sym] ns-sym)))

(defn analyze-loop [ctx expr call]
(defn analyze-loop [ctx expr]
(let [bv (-> expr :children second)]
(when (and bv (= :vector (tag bv)))
(let [arg-count (let [c (count (:children bv))]
(when (even? c)
(/ c 2)))]
(analyze-like-let (assoc ctx
:recur-arity {:fixed-arity arg-count}) expr call)))))
:recur-arity {:fixed-arity arg-count}) expr)))))

(defn analyze-recur [{:keys [:findings :filename :recur-arity] :as ctx} expr]
(when-not (linter-disabled? ctx :invalid-arity)
Expand Down Expand Up @@ -884,6 +886,9 @@
resolved-as-clojure-var-name
(when (one-of resolved-as-namespace [clojure.core cljs.core])
resolved-as-name)
ctx (if resolved-as-clojure-var-name
(assoc ctx :resolved-as-clojure-var-name resolved-as-clojure-var-name)
ctx)
analyzed
(case resolved-as-clojure-var-name
ns
Expand Down Expand Up @@ -921,7 +926,7 @@
(ctx-with-linter-disabled :invalid-arity)
(ctx-with-linter-disabled :unresolved-symbol)) expr)
(let let* for doseq dotimes with-open)
(analyze-like-let ctx expr resolved-as-clojure-var-name)
(analyze-like-let ctx expr)
letfn
(analyze-letfn ctx expr)
(if-let if-some when-let when-some when-first)
Expand All @@ -933,7 +938,7 @@
case
(analyze-case ctx expr)
loop
(analyze-loop ctx expr 'loop)
(analyze-loop ctx expr)
recur
(analyze-recur ctx expr)
quote nil
Expand Down

0 comments on commit 3e13871

Please sign in to comment.