Commit d0df37c 1 parent 1b98854 commit d0df37c Copy full SHA for d0df37c
File tree 4 files changed +44
-22
lines changed
test/noahtheduke/splint/rules/lint
4 files changed +44
-22
lines changed Original file line number Diff line number Diff line change 17
17
form))
18
18
19
19
(defn parse-imports [args]
20
- (reduce
21
- (fn [acc cur]
22
- (cond
23
- (symbol? cur)
24
- (assoc acc cur cur)
25
- (seq? cur)
26
- (let [prefix (first cur)
27
- aliases (rest cur)]
28
- (reduce
29
- (fn [acc alias_]
30
- (let [full-name (symbol (str prefix " ." alias_))]
31
- (-> acc
32
- (assoc alias_ full-name)
33
- (assoc full-name full-name))))
34
- acc aliases))
35
- :else acc))
36
- {} args))
20
+ (persistent!
21
+ (reduce
22
+ (fn [acc cur]
23
+ (cond
24
+ (symbol? cur)
25
+ (assoc! acc cur cur)
26
+ (seq? cur)
27
+ (let [prefix (first cur)
28
+ aliases (rest cur)]
29
+ (reduce
30
+ (fn [acc alias_]
31
+ (let [full-name (symbol (str prefix " ." alias_))]
32
+ (-> acc
33
+ (assoc! alias_ full-name)
34
+ (assoc! full-name full-name))))
35
+ acc aliases))
36
+ :else acc))
37
+ (transient {})
38
+ args)))
37
39
38
40
(defmethod derive-aliases 'import
39
41
[[_ & args]]
Original file line number Diff line number Diff line change 10
10
11
11
(set! *warn-on-reflection* true )
12
12
13
+ (defn attach-import-meta [ns-state obj]
14
+ (if-let [ns_ (and (symbol? obj) (some-> obj namespace symbol))]
15
+ (if-let [fqns (get-in @ns-state [:imports ns_])]
16
+ (vary-meta obj assoc :spat/import-ns fqns)
17
+ obj)
18
+ obj))
19
+
13
20
(defn make-edamame-opts [ns-state]
14
21
{:all true
15
22
:row-key :line
35
42
; ; Gotta apply location data here as using `:postprocess` skips automatic
36
43
; ; location data
37
44
(if (e/iobj? obj)
38
- (vary-meta obj merge loc)
45
+ (->> (vary-meta obj merge loc)
46
+ (attach-import-meta ns-state))
39
47
obj))
40
48
:uneval (fn [{:keys [uneval next]}]
41
49
(cond
Original file line number Diff line number Diff line change 4
4
5
5
(ns ^:no-doc noahtheduke.splint.rules.lint.fn-wrapper
6
6
(:require
7
- [noahtheduke.splint.rules :refer [defrule ]]))
7
+ [noahtheduke.splint.rules :refer [defrule ]]
8
+ [noahtheduke.splint.diagnostic :refer [->diagnostic]]
9
+ [noahtheduke.splint.rules.helpers :refer [default-import?]]))
8
10
9
11
(set! *warn-on-reflection* true )
10
12
13
+ (defn interop? [sexp]
14
+ (or (some->> sexp namespace symbol default-import?)
15
+ (some->> sexp meta :spat/import-ns )))
16
+
11
17
(defrule lint /fn-wrapper
12
18
" Avoid wrapping functions in pass-through anonymous function defitions.
13
19
27
33
"
28
34
{:patterns ['(%fn?? [?arg] (?fun ?arg))
29
35
'(%fn?? ([?arg] (?fun ?arg)))]
30
- :message " No need to wrap function. Clojure supports first-class functions."
31
- :replace '?fun})
36
+ :on-match (fn [ctx rule form {:syms [?fun ?args]}]
37
+ (when-not (interop? ?fun)
38
+ (->diagnostic rule form {:replace-form ?fun
39
+ :message " No need to wrap function. Clojure supports first-class functions." })))})
Original file line number Diff line number Diff line change 5
5
(ns noahtheduke.splint.rules.lint.fn-wrapper-test
6
6
(:require
7
7
[expectations.clojure.test :refer [defexpect expect]]
8
- [noahtheduke.splint-test :refer [check-alt]]))
8
+ [noahtheduke.splint-test :refer [check-alt check-all ]]))
9
9
10
10
(defexpect fn-wrapper-test
11
11
(expect 'f (check-alt " (fn* [arg] (f arg))" ))
12
12
(expect 'f (check-alt " (fn [arg] (f arg))" ))
13
13
(expect 'f (check-alt " #(f %)" )))
14
+
15
+ (defexpect interop-static-test
16
+ (expect nil (check-alt " #(Integer/parseInt %)" ))
17
+ (expect nil (check-all " (do (import (java.util.regex Pattern)) #(Pattern/compile %))" )))
You can’t perform that action at this time.
0 commit comments