[go: up one dir, main page]

Skip to content

Commit

Permalink
Lint against incorrect transient usage (#442)
Browse files Browse the repository at this point in the history
* Lint against incorrect transient usage

Closes #441
  • Loading branch information
vemv committed Sep 14, 2022
1 parent caf8720 commit d289d06
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 15 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Eastwood can be run from the command line as a
Merge the following into your `project.clj` or `~/.lein/profiles.clj`:

```clojure
:plugins [[jonase/eastwood "1.2.5"]]
:plugins [[jonase/eastwood "1.3.0"]]
```

To run Eastwood with the default set of lint warnings on all of the
Expand All @@ -60,7 +60,7 @@ If you're using `deps.edn`, you can set Eastwood options in an edn map, like thi
"eastwood.lint"
;; Any Eastwood options can be passed here as edn:
{}]
:extra-deps {jonase/eastwood {:mvn/version "1.2.5"}}}}}
:extra-deps {jonase/eastwood {:mvn/version "1.3.0"}}}}}

```
to your `deps.edn`, and you should then be able to run Eastwood as
Expand Down Expand Up @@ -421,7 +421,7 @@ If you use Leiningen, merge this into your project's `project.clj`
file first:

```clojure
:profiles {:dev {:dependencies [[jonase/eastwood "1.2.5" :exclusions [org.clojure/clojure]]]}}
:profiles {:dev {:dependencies [[jonase/eastwood "1.3.0" :exclusions [org.clojure/clojure]]]}}
```

If you use a different build tool, you will need to add the dependency
Expand Down Expand Up @@ -564,7 +564,7 @@ can be used to modify this merging behavior.
For example, if your user-wide `profiles.clj` file contains this:

```clojure
{:user {:plugins [[jonase/eastwood "1.2.5"]]
{:user {:plugins [[jonase/eastwood "1.3.0"]]
:eastwood {:exclude-linters [:unlimited-use]
:debug [:time]}
}}
Expand Down Expand Up @@ -2202,7 +2202,7 @@ your local Maven repository:
$ cd path/to/eastwood
$ lein with-profile -user,-dev,+eastwood-plugin install

Then add `[jonase/eastwood "1.2.5"]` to
Then add `[jonase/eastwood "1.3.0"]` to
your `:plugins` vector in your `:user` profile, perhaps in your
`$HOME/.lein/profiles.clj` file.

Expand Down
18 changes: 18 additions & 0 deletions cases/testcases/unused_ret_vals/red5.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
(ns testcases.unused-ret-vals.red5
"https://github.com/jonase/eastwood/issues/441")

(defn bad1 [x]
(conj! x 2)
42)

(defn bad2 [x]
(assoc! x :a 2)
42)

(defn bad3 [x]
(pop! x)
42)

(defn bad4 [x]
(dissoc! x :a)
42)
9 changes: 8 additions & 1 deletion changes.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
## Changes from 1.2.5 to 1.2.5
## Changes from 1.2.5 to 1.3.0

#### New

* Lint against incorrect usage of transients.
* Closes https://github.com/jonase/eastwood/issues/441

## Changes from 1.2.4 to 1.2.5

#### Bugfixes

Expand Down
4 changes: 2 additions & 2 deletions project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@
[metosin/spec-tools "0.10.5"]
[org.clojure/core.async "1.5.648"]
[org.clojure/java.jdbc "0.7.12"]]}
:clj-kondo {:dependencies [[clj-kondo "2022.08.03"]]}
:antq {:plugins [[com.github.liquidz/antq "2.0.889"]]
:clj-kondo {:dependencies [[clj-kondo "2022.09.08"]]}
:antq {:plugins [[com.github.liquidz/antq "2.0.895"]]
:antq {:exclude ["nrepl/nrepl" "org.clojure/clojure"]}}
:1.7 {:dependencies [[org.clojure/clojure "1.7.0"]]}
:1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]}
Expand Down
12 changes: 8 additions & 4 deletions resource/var-info.edn
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@
clojure.core/assert {:var-kind nil, :macro true},
clojure.core/assert-same-protocol {:var-kind nil, :macro nil, :side-effect true},
clojure.core/assoc {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/assoc! {:var-kind nil, :macro nil, :predicate false, :side-effect true, :pure-fn false, :warn-if-ret-val-unused false, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
;; `:warn-if-ret-val-unused true` because "transients are not designed to be bashed in-place" (https://clojure.org/reference/transients):
clojure.core/assoc! {:var-kind nil, :macro nil, :predicate false, :side-effect false, :pure-fn false, :warn-if-ret-val-unused true, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
clojure.core/assoc-in {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/associative? {:var-kind nil, :macro nil, :lazy false, :pure-fn true, :predicate true},
clojure.core/atom {:var-kind nil, :macro nil},
Expand Down Expand Up @@ -210,7 +211,8 @@
clojure.core/cond->> {:var-kind nil, :macro true},
clojure.core/condp {:var-kind nil, :macro true},
clojure.core/conj {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/conj! {:var-kind nil, :macro nil, :predicate false, :side-effect true, :pure-fn false, :warn-if-ret-val-unused false, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
;; `:warn-if-ret-val-unused true` because "transients are not designed to be bashed in-place" (https://clojure.org/reference/transients):
clojure.core/conj! {:var-kind nil, :macro nil, :predicate false, :side-effect false, :pure-fn false, :warn-if-ret-val-unused true, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
clojure.core/cons {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/constantly {:var-kind nil, :macro nil, :pure-if-fn-args-pure true},
clojure.core/construct-proxy {:var-kind nil, :macro nil},
Expand Down Expand Up @@ -248,7 +250,8 @@
clojure.core/disj {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/disj! {:var-kind nil, :macro nil, :predicate false, :side-effect true, :pure-fn false, :warn-if-ret-val-unused false, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
clojure.core/dissoc {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/dissoc! {:var-kind nil, :macro nil, :predicate false, :side-effect true, :pure-fn false, :warn-if-ret-val-unused false, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
;; `:warn-if-ret-val-unused true` because "transients are not designed to be bashed in-place" (https://clojure.org/reference/transients):
clojure.core/dissoc! {:var-kind nil, :macro nil, :predicate false, :side-effect false, :pure-fn false, :warn-if-ret-val-unused true, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
clojure.core/distinct {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/distinct? {:var-kind nil, :macro nil, :lazy false, :pure-fn true, :predicate true},
clojure.core/doall {:var-kind nil, :macro nil, :predicate false, :side-effect true :pure-fn false :warn-if-ret-val-unused false :lazy false, :pure-if-fn-args-pure false :io-fn false :evals-exprs false}, ;; TBD: Consider making a special warning just for this one, suggesting to use dorun instead if the return value is not needed, potentially saving memory
Expand Down Expand Up @@ -447,7 +450,8 @@
clojure.core/persistent! {:var-kind nil, :macro nil, :predicate false, :side-effect true, :pure-fn false, :warn-if-ret-val-unused false, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
clojure.core/pmap {:var-kind nil, :macro nil, :lazy true, :pure-fn-if-fn-args-pure true},
clojure.core/pop {:var-kind nil, :macro nil, :lazy false, :pure-fn true},
clojure.core/pop! {:var-kind nil, :macro nil, :predicate false, :side-effect true, :pure-fn false, :warn-if-ret-val-unused false, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
;; `:warn-if-ret-val-unused true` because "transients are not designed to be bashed in-place" (https://clojure.org/reference/transients):
clojure.core/pop! {:var-kind nil, :macro nil, :predicate false, :side-effect false, :pure-fn false, :warn-if-ret-val-unused true, :lazy false, :pure-if-fn-args-pure false, :io-fn false, :evals-exprs false},
clojure.core/pop-thread-bindings {:var-kind nil, :macro nil},
clojure.core/pos? {:var-kind nil, :macro nil, :lazy false, :pure-fn true, :predicate true},
clojure.core/pr {:var-kind nil, :macro nil, :io-fn true, :side-effect true},
Expand Down
4 changes: 2 additions & 2 deletions resources/EASTWOOD_VERSION
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
:major 1
:minor 2
:patch 5
:minor 3
:patch 0
}
13 changes: 12 additions & 1 deletion test/eastwood/lint_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,18 @@ See https://github.com/jonase/eastwood/issues/402"
#{'testcases.unused-ret-vals.red1} {:some-warnings true}
#{'testcases.unused-ret-vals.red2} {:some-warnings true}
#{'testcases.unused-ret-vals.red3} {:some-warnings true}
#{'testcases.unused-ret-vals.red4} {:some-warnings true})))
#{'testcases.unused-ret-vals.red4} {:some-warnings true}))

(testing "Transients"
(let [^String s (with-out-str
(-> sut/default-opts
(assoc :namespaces #{'testcases.unused-ret-vals.red5})
(sut/eastwood)))]
(is (-> s (.contains
"cases/testcases/unused_ret_vals/red5.clj:5:3: unused-ret-vals {:kind :invoke}: Should use return value of function call, but it is discarded: (conj! x 2).
cases/testcases/unused_ret_vals/red5.clj:9:3: unused-ret-vals {:kind :invoke}: Should use return value of function call, but it is discarded: (assoc! x :a 2).
cases/testcases/unused_ret_vals/red5.clj:13:3: unused-ret-vals {:kind :invoke}: Should use return value of function call, but it is discarded: (pop! x).
cases/testcases/unused_ret_vals/red5.clj:17:3: unused-ret-vals {:kind :invoke}: Should use return value of function call, but it is discarded: (dissoc! x :a)."))))))

(deftest reflection
(are [desc input expected] (testing input
Expand Down

0 comments on commit d289d06

Please sign in to comment.