For a list of breaking changes, check here.
Clj-kondo: static analyzer and linter for Clojure code that sparks joy ✨
- #2274: Support clojure 1.12 new type hint notations
- #2260: calling static field as function should warn, e.g.
(System/err)
- #1917: detect string being called as function
- #1923: Lint invalid fn name
- #2256: enable
assert
in hooks - #2253: add support for
datomic-type-extensions
to datalog syntax checking - #2255: support
:exclude-files
in combination with linting from stdin + provided--filename
argument - #2246: preserve metadata on symbol when going through
:macroexpand
hook - #2254: lint files in absence of config dir
- #2251: support suppressing
:unused-value
using:config-in-call
- #2266: suppress
:not-a-function
linter in reader tag - #2259:
ns-map
unmaps var defined prior in namespace - #2272: Report var usage in
if
/when
condition as always truthy, e.g.(when #'some-var 1)
- #1990: Specify
:min-clj-kondo-version
in config.edn and warn when current version is too low (@snasphysicist) - #1753: New linter
:underscore-in-namespace
(@cosineblast) - #2207: New
:condition-always-true
linter, see docs - #2235: New
:multiple-async-in-deftest
linter: warn on multiple async blocks incljs.test/deftest
, since only the first will run. - #2013: Fix NPE and similar errors when linting an import with an illegal token (@cosineblast)
- #2215: Passthrough hook should not affect linting
- #2232: Bump analysis for clojure 1.12 (partitionv, etc)
- #2223: Do not consider classes created with
deftype
a var that is referred with:refer :all
- #2236:
:line-length
warnings cannot be:clj-kondo/ignore
d - #2224: Give
#'foo/foo
and(var foo/foo)
the same treatment with respect to private calls - #2239: Fix printing of unresolved var when going through
:macroexpand
hook
- #1804: new linter
:self-requiring-namespace
- #2065: new linter
:equals-false
, counterpart of:equals-true
(@svdo) - #2199: add
:syntax
check for var names starting or ending with dot (reserved by Clojure) - #2179: consider alias-as-object usage in CLJS for :unused-alias linter
- #2183: respect
:level
in:discouraged-var
config - #2184: Add missing documentation for
:single-logical-operand
linter (@wtfleming) - #2187: Fix type annotation of argument of
clojure.core/parse-uuid
fromnilable/string
to string (@dbunin) - #2192: Support
:end-row
and:end-col
in:pattern
output format (@joshgelbard) - #2182: Namespace local configuration does not silence
:missing-else-branch
- #2186: Improve warning when
--copy-configs
is enabled but no config dir exists - #2190: false positive with
:unused-alias
and namespaced map - #2200: include optional
:callstack
in analysis
- #1332: New linter
:unused-alias
. See docs. - #2143: false positive type warning for
clojure.set/project
- #2145: support ignore hint on multi-arity branch of function definition
- #2147: use alternative solution as workaround for cognitect/transit-clj#43
- #2152: Fix false positive with used-underscored-binding with core.match
- #2150: allow command line options = as in --fail-level=error
- #2149:
:lint-as clojure.core/defmacro
should suppress&env
as unresolved symbol - #2161: Fix type annotation for
clojure.core/zero?
to number -> boolean - #2165: Fix error when serializing type data to cache
- #2167: Don't crash when
:unresolved-symbol
linter config contains unqualified symbol - #2170:
:keyword-binding
linter should ignore auto-resolved keywords - #2172: detect invalid amount of args and invalid argument type for
throw
- #2164: deftest inside let triggers :unused-value
- #2154: add
:exclude
option to:deprecated-namespace
linter - #2134: don't warn on usage of private var in
data_readers.clj(c)
- #2148: warn on configuration error in
:unused-refeferred-var
linter - Expose more vars in
clj-kondo.hooks-api
interpreter namespace
- #2111: warn on symbol in case test using new opt-in linter
:case-symbol-test
- Rename
:quoted-case-test-constant
to:case-quoted-test
- Rename
:duplicate-case-test-constant
to:case-duplicate-test
- #1230: new linter,
:unsorted imports
- #1125: new
:deprecated-namespace
linter - #2097: analyze and act on
defprotocol
metadata (@lread) - #2105: Consider
.cljd
files when linting (@ericdallo) - #2101: false positive with
if-some
+recur
- #2109:
java.util.List
type hint corresponds to:list
or nil - #2096: apply
:arglists
metadata to:arglist-strs
for analysis data (@lread) - #256: warn on reader conditional usage in non-cljc files
- #2115: false positive
:redundant-fn-wrapper
in CLJS when passing keyword to JS - #1082: protocol methods do not support varargs
- #2125: Setting
clj-kondo.hooks-api/*reload*
to true does not lint with the latest hook changes. - #2135: private vars starting with
_
should not be reported as unused - #1199: warn about reader conditional features that are not keywords, e.g.
#?(:clj 1 2)
(2 is not a keyword) - #2132: false negative unused value in clojure.test
- #1294: redefined var comment edge case
- #2083: fix regression with
:missing-test-assertion
introduced in 2023.05.18 - #2084: add
:refers
to:refer-all
finding - #2086: false positive missing test assertion with
swap!
- #2087: honor :config-in-comment for :unused-referred-var
- Linter
:uninitialized-var
moved from default:level :off
to:warning
- #2065: new linter
:equals-true
: suggest using(true? x)
over(= true x)
(defaults to:level :off
). - #2066: new linters
:plus-one
and:minus-one
: suggest using(inc x)
over(+ x 1)
(and similarly fordec
and-
, defaults to:level :off
) - #2051: consider
:unresolved-namespace :exclude
as already required namespaces - #2056: validate collection nodes when constructing and
--debug
is true - #2058: warn about
#()
and#""
in.edn
files - #2064: False positive when using
:sha
instead of:git/sha
in combination with git url indeps.edn
- #2063: introduce new
:defined-by->lint-as
key which contains the:lint-as
value for "defining" var, whereas:defined-as
now always contains the name of the original "defining var". This is a BREAKING change. - #1983: produce java-member-definition analysis for
.java
files. - #2068: include
:or
default in:local-usages analysis
- #2079: analysis for
data_readers.clj
- #2067: support
:ns-groups
to be used with:analyze-call
and:macroexpand
hooks - #1918: ignore keyword bindings with namespaced in
:keyword-binding
linter - #2073:
:lint-as clj-kondo.lint-as/def-catch-all
should ignore unresolved namespaces - #2078: detect more
:missing-test-assertion
cases, e.g.(deftest foo (not (= 1 2)))
- #1196: show language context in
.cljc
files with:output {:langs true}
. See docs. - #2026: coercing string did not create StringNode, but TokenNode, lead to false positive
Too many arguments to def
- #2030: Add a new
:discouraged-tag
linter for discouraged tag literals. See the docs. - Add
:gen
support onclojure.spec.alpha/keys
- #1647: support
:exclude-patterns
in:unresolved-symbol
linter - #2036: False positive
:def-fn
ondef
+reify
- #2024: CLJS allows interop in constructor position
- #2025: support namespace groups with
:unresolved-namespace
linter - #2039: :analysis
:symbols
+:aliased-namespace-symbol
linter gives false positive in quoted symbol - #2043: support ignore annotation on private calls
- Support
:exclude-pattern
in:unused-binding
- #2046: clj-kondo stuck in loop with multiple :or in destructuring
- #2048: better linting in
schema.core/defn
with invalid s-exprs
- #2010: Support inline macro configuration. See docs
- #2010: Short syntax to disable linters:
{:ignore [:unresolved-symbol]}
or{:ignore true}
, valid in ns-metadata,:config-in-ns
,:config-in-call
- #2009: new
:var-same-name-except-case
linter: warn when vars have names that differ only in case (important for AOT compilation and case-insensitive filesystems) (@emlyn). - #1269: warn on
:jvm-opts
in top level ofdeps.edn
- #2003: detect invalid arity call for function passed to
update
,update-in
,swap!
,swap-vals!
,send
,send-off
, andsend-via
(@jakemcc). - #1983: add support for java member analysis, via new
java-member-definitions
bucket (@ericdallo). - #1999: add
hooks-api/set-node
andhooks-api/set-node?
(@sritchie). - #1997: False positive on
clojure.core/aget
with more than two args - #2011: push images to GHCR (@lispyclouds)
- #2001: false positive
:misplaced-docstring
inclojure.test/deftest
- #1976: warn about using multiple bindings after varargs (
&
) symbol in fn syntax - Add arity checks for core
def
- #1954: new
:uninitialized-var
linter. See docs. - #1996: expose
hooks-api/resolve
. See docs. - #1971: false positive
:redundant-fn-wrapper
with syntax-quoted body - #1984: lint java constructor calls as unresolved-symbol when using dot notation.
- #1970:
:dynamic-var-not-earmuffed
should be opt-in - #1972: type hint aliases should not result in unresolved symbol
- #1951: include end locations in
:line-length
linter - #1987: Fix escaping of regex literal string in
:macroexpand
- #1980: make support for ignoring warnings in generated hooks explicit
- #1979: allow
:level :off
in:discouraged-var
config on var level - #1995:
clj-kondo.lint-as/def-catch-all
doesn't emit locations, fixes navigation for lsp - #1978: false positive type error with symbol argument + varargs
- #1989: don't analyze location metadata coming from
:macroexpand hook
(performance optimization)
- #1956: enable printing to
*err*
in hooks - #1943: allow
:discouraged-namespace
to be suppressed with#_:clj-kondo/ignore
- #1942: prioritize specific namespace over ns-groups for
:discouraged-namespace
linter - #1959: analyze custom
defn
properly - #1961: be lenient with unexpected type
- #1945: support merging of multiple ns-group configs
- #1962: don't emit warning for aliased namespace var usage in syntax-quote
- #1952: add
:exclude-urls
and:exclude-pattern
- #1920: new linter
:def-fn
: warn when usingfn
insidedef
, orfn
insidelet
insidedef
(@andreyorst). - #1949:
:aliased-namespace-var-usage
gives erroneous output for keywords - Add test for #1944 (already worked)
- Don't reload SCI namespace on every hook usage
- #1742: new linter
:aliased-namespace-var-usage
: warn on var usage from namespaces that were used with:as-alias
. See demo. - #1914: Don't warn about single arg use when there's a second arg in a reader conditional (@mk)
- #1912: Allow forward references in
comment
forms (@mk). See demo. - #1926: Add keyword analysis for edn files.
- #1922: don't crash on invalid type specification
- #1902: provide
:symbols
analysis for navigation to symbols in quoted forms or EDN files. See demo. - #1939: no longer warn on unused namespace that was only used with
:as-alias
- #1911: missing test assertion linter doesn't work in CLJS
- #1891: support
CLJ_KONDO_EXTRA_CONFIG_DIR
environment variable to enable extra linters after project config
- #1909: lower requirement on
glibc
in dynamic linux binary to 2.31 by using fixed version of CircleCI image
- #609: typecheck var usage, e.g.
(def x :foo) (inc x)
will now give a warning - #1867: add name metadata to class usage
- #1875: add
:duplicate-field-name
linter for deftype and defrecord definitions. - #1883: constructor usage should have name-col in analysis
- #1874: fix name of fully qualified class usage
- #1876: suppress . analysis from .. macroexpansion
- #1877: suppress
new
analysis from(String. x)
expansion - #1888: use
namespace-munge
for resolving hook files rather thanmunge
- #1896: don't consider
**
,***
etc. to be a dynamic vars - #1899: treat var or local reference as unused value when not in tail position
- #1903: int can be cast to double
- #1871: clj-kondo marks args in
definterface
as unused - #1879: analyze
definterface
more similarly todefprotocol
for lsp-navigation - #1907: add
hooks-api/generated-node?
function to check if a node was generated - #1887, use
re-find
for ns groups rather than re-matches
- #1846: new linters:
:earmuffed-var-not-dynamic
and:dynamic-var-not-earmuffed
. See docs. - #1842: Add
:exclude
option to:used-underscored-binding
(@staifa) - #1840: Fix warning in
.cljs
and.cljc
for:aliased-namespace-symbol
in interop calls. (@NoahTheDuke) - #1845: add
:derived-location
to analysis when location is derived from parent node - #1853: fix
:level :off
not being respected in:discouraged-var
configs that are merged in. - #1855: accept symbol in addition to keyword in
clojure.spec.alpha/def
name position - #1844: support extra schema in
schema.core/defrecord
- #1720: prevent parse error on defmulti without args
- #1863: Added
clj-kondo-docker
pre-commit hook.
- #1831: Add
:redundant-fn-wrapper
support for keyword and binding calls (@NoahTheDuke) - #1830: Fix warning on
:include-macros
in.cljs
and.cljc
for:unknown-require-option
linter. (@NoahTheDuke) - #1238: Build a linux/aarch64 executable in CI (cap10morgan)
- Add
:exclude
option to:unknown-require-option
- Enable
:unused-value
by default - Publish
.sha256
files along with released artifacts
- #611: New linter:
:unused-value
- see docs. Also see issue #1258. - #1794: New linter:
:line-length
- see docs (@ourkwest) - #1460: New linter:
:unknown-require-option
- see docs. (@NoahTheDuke) - #1800: New linter:
:aliased-namespace-symbol
- see docs. (@NoahTheDuke) - #1758: Overrides don't get applied to var-definitions during analysis (@sheluchin)
- #1807: False positive with map transducer in cljs
- #1806: False positive recur mismatch with letfn
- #1810: Fix printing error map as additional error (@NoahTheDuke)
- #1812: Inconsistent handling of location metadata sometimes produces
nil
values (@sheluchin) - #1805: Ignore hints not being considered on protocol vars
- #1819: Fix "Too many open files" in java class definition analysis caused by files not being closed (@rsauex)
- #1821: Include vectors in
:unused-binding
config:exclude-destructured-as
flag. (@NoahTheDuke) - #1818: unresolved var when using interop on var in CLJS
- #1817: improve warning with invalid require libspec (@benjamin-asdf)
- #1801: Missing docstring fix for
deftype
in CLJS - Bump GraalVM to 22.2.0 for native-image
- Bump SCI to 0.4.33
:config-in-call
- see docs- #1127:
:config-in-tag
- see docs - #1791: Fix issue with namespace-name-mismatch on namespaces with + sign (and others)
- #1782: Fix issue with jar URI missreporting to
file-analyzed-fn
, bump babashka/fs to 0.1.11 - #1780: Can not use NPM dependency namespaces beginning with "@" in consistent-linter alias
- #1771: don't crash on empty ns clauses:
(require '[])
and(import '())
- #1774: Add support for sourcehut inferred git dep urls for the Clojure CLI
- #1768: Expose a
tag
function inclj-kondo.hooks-api
- #1790: Add support for
:filename-pattern
in:ns-group
- #1773: false positive type mismatch warning with hook
- #1779: lazy-seq should be coerced a list node
- #1764: store overrides in cache and don't run them at runtime
- #1755: Fix false positive invalid-arity when using mapcat transducer in sequence with multiple collections
- #1749: expose
clojure.pprint/pprint
to the hooks API - #698: output rule name with new output option
:show-rule-name-in-message true
. See example in config guide. - #1735 Add support for nilable map type specs
- #1744 Expose
:imported-ns
in analysis of vars imported by potemkin - #1746 Printing deps.edn error to stdout
- #1716 Include dispatch-val in analysis of defmethod
- #1760 Add
:arglist-strs
support for functions defined with fn - #1731: prioritize special form in name resolving
- #1739: Namespaced map type check fix
- Fix #1737: config-in-ns for specific namespace + ns-group override
- Fix #1741: Ignore redundant-call when single call is made in .cljc
- #1721: new
:discouraged-namespace
linter. See docs. - #1728 New macOS aarch64 (M1-compatible) binary
- #1726: fix invalid arity warning for
sequence
withmap
multi-arity transducer - #1715: fix false positive warning for
recur
not in tail position withcore.async alt!!
- #1714: fix recur arity for
defrecord
,deftype
anddefinterface
- #1718: make unsorted namespaces linter case-insensitive
- #1722: suppress redundant do in
.cljc
for just one language
- Ensure every node has a location when returning from
:macroexpand
- Support
:instance-invocations
analysis bucket - Copy
.clj_kondo
files from configs
- Fix false positive redundant do's from
:macroexpand
hooks (regression in 2022.05.27)
- #686: new
:warn-on-reflection
linter. See docs. - #1692: new linter
:redundant-call
- warns when a function or macro call with 1 given argument returns the argument. See docs. - All new JVM
clj-kondo.hooks-api
API ns for REPL usage. See docs. - #1674: config options to limit analysis of var-usages and bodies of var-definitions. Can be used to get a quick overview of a project's namespaces and vars, without analyzing their details.
- #1676: Add support for custom function to be called for progress update,
:file-analyzed-fn
. - #1697: update docs and messaging around importing configs (@lread)
- #1700: allow discouraged var on non-analyzed (closed source) vars
- #1703: update built-in cache with newest CLJ (1.11.1) and CLJS (1.11.54) versions
- #1704: fix re-frame analysis bug
- #1705: add pre-commit utility support via
.pre-commit-hooks.yaml
- #1701: preserve locations in seqs and symbols in
:macroexpand
hook - #1685: Support
.clj_kondo
hook extension - #1670: parse error on auto-resolved keyword for current ns
- #1672: support
clojure.test/deftest-
- #1678: support
with-precision
- #1669: fix re-frame analysis problem causing file to be not parsed
- #1653: new linter
:keyword-binding
- warns when a keyword is used in a:keys
binding vector. This linter is:off
by default. See docs. - #996: new linter
:discouraged-var
. See docs. - #1618: new
:config-in-ns
configuration option. See docs. - Support
:ns-groups
configuration option. See docs - #1657: support bindings with same name in
clojure.core.match
- #1659: fix false positive unused import
- #1649: dot (
.
) should be unresolved when not in fn position
- #1331: new linter
:non-arg-vec-return-type-hint
that warns when a return type hint is not placed on the arg vector (CLJ only). See docs. - Enable
:namespace-name-mismatch
by default - #1611: support
^:replace
override for nested config values - #1625: Add option
--skip-lint
, to skip linting while still executing other tasks like copying configuration with--copy-configs
. - #1620: return type too narrow for
re-find
Analysis:
- #1623: Implement analysis for Java classes:
:java-class-definitions
and:java-class-usages
. See docs. - #1635: add
:end-row
andend-col
to analyze data for:namespace-definitions
- #1651: Improvements for
:protocol-impls
- #1612: Improve analysis for
deftype
- #1613: Improve analysis for
reify
- #1609: keyword analysis for
ns
+require
- #1607: disable
:namespace-name-mismatch
until further notice due to problems on Windows - #1570: add
:defmethod true
to defmethodvar-usages
analysis.
- #1605: error while determining namespace mismatch on Windows
- #1240: Add linter
:namespace-name-mismatch
to detect when namespace name does not match file name. (@svdo)
- #1598:
:scope-end-row
is missing on multi-arity fn args (@mainej) - #1588: analyze type hint in reified method
- #1581: redundant fn wrapper false positive when using pre-post-map
- #1582: False positive Insufficient input when using symbol call
- #1579: relax linting in tagged literal forms
- #1578: allow
:deprecated-var
config in ns form metadata - #892: suppress unresolved namespaces in data readers config
- #1594: lint clojure.test.check.properties/for-all as let
- #1549: detect and warn on cyclic task dependencies in
bb.edn
(@mknoszlig) - #1547: catch undefined tasks present in
:depends
. (@mknoszlig) - #783:
:keys
can be used in:ret
position, also fixes types return map call as input for another typed map function. (@pfeodrippe) - #1526: detect
redundant fn wrappers, like
#(inc %)
. See docs. This linter of:off
by default but may be enabled by default in future versions after more testing. - #1560: lint task definition keys in
bb.edn
(@mknoszlig) - #1484: Add analysis information about protocol implementations. (@ericdallo)
- #1563: vector inside list should not be linted as function call when inside tagged literal.
- #1540: imported class flagged as unused when it only appears in annotation metadata.
- #1571: ignore spliced reader conditionals wrt. namespace sorting.
- #1574: def usage context contains reference of the re-frame reg-sub it is used in. (@benedekfazekas)
- Fix #1537: stackoverflow with potemkin import vars with cyclic references
- Fix #1545:
recur
incond->
gives warning aboutrecur
not in tail position. - Fix #1535: support CLJS vars / protocols references via dot rather than slash.
- Add linter
:conflicting-fn-arity
: warn when an arity occurs more than once in a function that overloads on arity. #1136 (@mknoszlig) - Add linter
:clj-kondo-config
which provides linting for.clj-kondo/config.edn
. #1527 - Relax
:reduce-without-init
for functions known to be safe #1519 - Symbol arg to
fdef
can be arbitrary namespace #1532 - Improve potemkin generated var-definition analysis #1521 (@ericdallo)
- Stabilize cache version independent from kondo version #1520. This allows you to re-use the cache over multiple kondo versions.
:output {:progress true}
should print to stderr #1523- Only print informative messages when
--debug
is enabled. #1514 - Add Sublime Text instructions #827 (@KyleErhabor)
- Fix end location in anonyous function body #1533
- Bump datalog-parser to 0.1.9: allows symbol constants in datalog expression
- Add linter
:reduce-without-init
: warn against two argument version of reduce. Disabled by default. See docs. #1064 (@mknoszlig) - Add linter
:quoted-case-test-constant
: warn on quoted test constants in case. #1496 (@mknoszlig)
- Fix false positive unused binding in re-frame subscribe #1504
- Fix exclude-defmulti-args for CLJS #1503
- Fix warning location of namespaced map #1475
- False positive :docstring-no-summary on multiline docstrings #1507
- Automatically load configurations from
.clj-kondo/*/*/config.edn
. This can be disabled with:auto-load-configs false
. #1492 - Add linter
:duplicate-case-test-constant
: detect duplicate case test constants. See docs. #587 (@mknoszlig) - Add linter
:unexpected-recur
: warn onrecur
in unexpected (non-tail) position. #1126 - Add linter
:used-underscored-binding
: warn on used bindings that start with underscore. Disabled by default. See docs. #1149 (@mknoszlig) - Add linter
:docstring-blank
for checking empty docstring. See docs. #805 (@joodie) - Add linter
:docstring-leading-trailing-whitespace
for checking leading and trailing whitespace in docstring. Disabled by default. See docs. #805 (@joodie) - Add linter
:docstring-no-summary
for checking the absence of summary of args in docstring. Disabled by default. See docs. #805 (@joodie) - Add
:exclude-defmulti-args
option for:unused-bindings
linter. See docs. #1188 (@mknoszlig) - Support
:config-in-comment
#1473. See docs.
- Bump built-in cache for clojure 1.11.0-alpha3 and
clojure.data.json
- Reword
:refer
suggestion so you can copy paste it #1293 (@vemv) - Add re-frame analysis output #1465 (@benedekfazekas)
- Qualified map causes too many arguments in type checker #1474
- Handle reader conditional with unknown language #970
- Improve linting in
extend-protocol
,extend-type
,reify
,specify!
#1333, #1447 - Support
:context
in nodes in hooks for adding context to analysis #1211 goog.object
,goog.string
etc must be required before use in newer releases of CLJS #1422- Resume linting after invalid keyword #1451
- Fix install script for relative dir opts #1444
- Fix type mismatch error with auto-qualified keyword #1467
- String type hint causes false error report #1455
- Fix false positive with cljs/specify! #1450
- Improve analysis for ns-modifying destructuring key #1441
- CLJS
(exists? foo.bar/az)
complains about require #1472
- New optional linter: warn on missing
gen-class
if namespace has-main
fn #1417. See docs. - Detect arity mismatches for functions defined with
def
#1408 - Type inference improvements for
def
+fn
combination #1410 - Local
fn
type inference #1412 - Analysis: allow user to request all or specific metadata be returned #1280 (@lread)
rseq
called on other type than vector or sorted-map now gives type error #1432
- Fix false positive with ns-unmap #1393
- Support custom-lint-fn with
.cljc
#1403 - Allow reader conditional in metadata #1414
- Analysis: add
:from-var
in higher order call #1404 - Dedupe linted files #1395 (@ericdallo)
- Add
:duplicate-ns
to duplicate-require linter output #1421 (@ericdallo) if-let
/if-some
with invalid arity no longer warn #1426- Analysis: spport for defn 2nd attr-map, :doc derivation fixes (@lread)
- Fix parsing of trailing metdata map #1433 (@lread)
- Update built-in cache to clojure 1.11.0-alpha2 #1382
- Take into account aliases in
import-vars
#1385 - Consider var as used in CLJS
case
to avoid false positives for constants #1388 - Understand
ns-unmap
pattern #1384 - Expose config functions in core API namespace #1389
- Fix false positives when using quoted collection in function position #1390
- Add
:end-row
,:end-col
to:var-usages
analysis element #1387 - BREAKING: Change
:row
and:col
for:var-usages
to use the start location of the call instead of the name location #1387
- Support
:as-alias
(new feature in Clojure 1.11) #1378 - Improve
:loop-without-recuir
wrt/fn
and other constructs that introduce arecur
target #1376
- Add
:loop-without-recur
linter. #426 - Lint
deps.edn
andbb.edn
:paths
#1353 (@lread) - Fix unresolved-symbol for all-lowercase class name #1362
- Add
:refer
to var-usages when inside a require #1364 (@ericdallo) - musl fix #1365 (@thiagokokada)
- Fix incorrectly reported filename #1366
- Self-referring private-var should be reported unused if not used elsewhere #1367
- Support options map in
babashka.process/$
#1368 - Analyze metadata map of
defmulti
#1310 - Add support for potemkin full qualified symbols #1371 (@ericdallo)
- Expose
ns-analysis
fn in hooks API #1349 (@hugoduncan) - Fix for Windows when analyzing deps
- Fix conflicts between application code and hook config code in cache #1340
- Allow overriding level in
reg-finding!
#1344 (@ericdallo) - Fix
declare
name positions in analysis #1343 (@ericdallo) - Updated rules for
deps.edn
to match Clojure CLI1.10.1.933
(@dpassen)
:macroexpand
hook. This allows linting using the same or similar macros from your code. See docs.
- Add types for
ex-info
#1314 - Bump SCI to v0.2.6
- Fix EDN/JSON serialization of findings for NPM string namespace #1319
- Support fully qualified symbol in def referring to current namespace #1326
- Fix false positive redundant expression in pre-post map #1335
- Lint arities of fn arguments to higher order functions (
map
,filter
,reduce
, etc.) #1297 - Add
map-node
andmap-node?
to hooks API #1270
- Disable redefined-var warning in comment #1294
:skip-comments false
doesn't override:skip-comments true
in namespace config #1295- False positive duplicate element set for symbols/classes #1296
- False positive unused namespace with
clojure.spec/keys
#1289
- Lint
clojure.spec.alpha/keys
#1272 (@daveduthie) - Macroexpand
clojure.template/do-template
#603 - Proper macroexpansion for
clojure.test/are
#1284 - Resolve vars in
clojure.data.xml
imported via macro #1274 - Lint
([])
as invalid call to vector #1276
- Improve keyword reg support for re-frame #1159 (@ericdallo)
- Refine messaging around importing configs #1256 (@lread)
- Static linux binary is now compiled with musl
- Recognize
:doc
from attr-map indefn
#1265 - Don't skip linting
.jar
files with--dependencies
when config(s) have changed #1285
--fail-level
flag to specify the minimum severity for a non-zero exit code #1259 (@RickMoynihan)
- Support
core.async
defblockingop
macro #1244 - Add error message when keywords are passed in
:or
map #1242 - False positive unused default when analyzing locals #1246
- False positive when destructuring depends on previous arg #782
- Keyword analysis for namespaced maps #1251 (@ericdallo)
- Report reader errors at the start of token #1255 (@yuhan0)
- Fix recur arity for lazy-seq and lazy-cat (@yuhan0)
- Prioritize aliases over object access in CLJS #1248 (@jahson)
:defined-by
contains raw node for sgen fns #1231- Fix wrong order of unresolved symbols #1237
- Remove generated nodes from analysis #1239 (@ericdallo)
- Add
:report-duplicates
linter config for several linters. #1232 (@snoe)
--copy-configs
flag to indicate copy configs from dependencies while linting. This replaces--no-warnings
.--dependencies
flag to indicate skipping already linted jars for performance. This replaces--no-warnings
.
- Support js property access syntax #1189
- Fix linting
user.clj
#1190 - Add linting for
sgen/lazy-prims
#1192 - NullPointerException when ignoring :deprecated-var #1195
- Fix
:lint-as
withcond->
#1205 - Expose config to hook fns #1208 (@not-in-stock)
- Fix crash with :clj-kondo/ignore in combination with :rename #1210
- Fix false positive unresolved symbol in CLJS type hint #1212
- Fix invalid namespace in clojure.data.xml analysis #1202
- Fix analysis of
clojure.core.reducers/defcurried
#1217 - Add
:defined-by
on missing var definitions #1219 (@ericdallo) - Add name positions to local-usage analysis #1220 (@ericdallo)
- False positive
:unused-private-var
warning for deftype^:private
#1222 - Correct escaping for docstrings in analysis #1224 (@lread)
- Redundant expression false positive #1183
- Redundant expression false positive #1185
- Regression in unresolved symbol config #1187
- Lint nested function literal #636
- Redundant expression linter #298
- Add
:exclude
config to :refer linter #1172 - Warn on non-existent var in
:refer
#546 - Support
clojure.data.xml/alias-uri
#1180
- Fix schema.core/defmethod linting for vectors dispatch-values #1175 (@leoiacovini)
- Continue analyzing on invalid symbol #1146
- Standalone require should be emitted to analysis #1177
- Upgrade sci to 0.2.4
Thanks to @snoe and @ericdallo for contributing to this release. Thanks to the sponsors on Github, OpenCollective and Clojurists Together for making this release possible.
- Core.match support #496
- Keyword analysis #1129 (@snoe). See analysis docs.
- BREAKING: Don't use lint-as for hooks #1170
- Fix crash when linting kitchen-async #1148
- Memory optimizations for clojure-lsp commit
- Upgrade to GraalVM 21.0.0 #1163
- Fix analysis of case dispatch vals #1169
- Potemkin improvement with regards to unresolved var #1167
- Exported config fix for git deps #1171
- Add
:aliases
to ns ctx and:alias
to var-usages #1133 (@snoe) - Add
:end-row
and:end-col
to var-definitions bucket on analysis #1147 (@ericdallo) - Fix unresolved var
clojure.spec.gen.alpha/fmap
#1157
Thanks to @SevereOverfl0w, @jysandy, @tomdl89, @snoe, @audriu, and @ericdallo for contributing to this release.
- New linter:
:unresolved-var
. This detects unresolved vars in other namespaces, likeset/onion
. See docs. #635 - Alpine Docker build #1111
- Add locals to analysis #1109 (@snoe)
- Add analysis for arglists #1123 (@snoe)
- Fix finding without location info #1101
- Detect duplicate key in '{[1 2] 3, (1 2) 4} #1056 (@jysandy)
- Add cljs.core cases in
lint-specific-calls!
#1116 (@tomdl89) - [#1099] Add :single-operand-logical linter for
and
andor
#1122 (@tomdl89) - Add
:ns
to:unused-namespace
findings (@ericdallo) - Derive config dir from only file path linted #1135
- Support name in defmethod fn-tail #1115
- Avoid crash when using
:refer-clojure
+:only
#957
- Documentation: a list of all available linters #936
- Lint protocol and interface implementations in
deftype
anddefrecord
#140 - Upgrade to GraalVM 20.3.0 #1085
- Support
cljs.core/simple-benchmark
syntax #1079 - Support
babashka.process/$
macro syntax #1089
- Fix recur arity in doysync #1081
- Alias linter doesn't recognize (quote alias) form #1074
- Fix retries for
refer :all
when linting in parallel #1068 - Improve analyzing syntax of
amap
#1069 - Namespaced map in
deps.edn
causes false positive #1093 - Support ignore hints in
deps.edn
#1094 - Fix unsorted namespaces linter for nested libspecs #1097
- Fix reported ns name in analysis for nested libspecs #1100
Thanks @bennyandresen, @jaihindhreddy, @mharju, @pepijn, @slipset and @nvuillam for contributing to this release. Thanks to Clojurists Together for sponsoring this release.
- Lint deps.edn #945
--filename
option to set filename when linting from stdin. This should be used for editor plugins to enabledeps.edn
linting.- Export and import config via classpath #559, clj-kondo/config#1
--no-warnings
flag to indicate linting is used to populate cache.- Skip already linted jars #705
- Implement
:include
option for shadowed-var linter #1040 - Return
:files
count in summary #1046
- Better resolving of vars referred with
:all
#1010 - Fix false positive with
format
#1044 - Fix index out of bounds exception clj-kondo.lsp#11
- More robust marking of generated nodes to avoid redundant dos and lets despite location metadata #1059
Thanks @zilti, @dharrigan and @sogaiu for contributing to this release. Thanks to Clojurists Together for sponsoring this release.
- Shadowed var linter #646. See docs.
- Config for ignoring unused
:as
binding clj-kondo#1016 (@dharrigan) - Type warning for
contains?
#1021 - Predicate functions for hooks api #1006. See docs.
- Support reader conditionals in ignore hint #1022. See docs.
- Support ignore hint on unused binding #1017
- Support ignore hint in ns form #1031
- Linux packages (@zilti)
- Fix memory leak in long running process #1036
- Claypoole config enhancements clj-kondo/config#7
- Don't warn about redundant
let
anddo
in hook-generated code #1038 - Fix format string false positive #1007
- Parse failure in
(or)
#1023 - Analyze require in top-level do #1018
- Analyze quote in require #1019
- Base Docker image on Ubuntu latest #1026
Thanks to @cldwalker, @bfontaine, @snoe, @andreyorst, @jeroenvandijk, @jaihindhreddy, @sittim and @sogaiu for contributing to this release. Thanks to the people who helped designing the new features in Github issue conversations. Thanks to Clojurists Together for sponsoring this release.
-
Add
--parallel
option to lint sources in parallel. This will speed up linting an entire classpath. #632, #972 -
Detect error when calling a local that's not a function. #948
(let [inc "foo"] (inc 1)) ^--- String cannot be called as a function
-
Support ignore hints #872:
(inc 1 2 3) ^--- clojure.core/inc is called with 3 args but expects 1 #_:clj-kondo/ignore (inc 1 2 3) ^--- arity warning ignored #_{:clj-kondo/ignore[:invalid-arity]} (do (inc 1 2 3)) ^--- only redundant do is reported, but invalid arity is ignored
Also see config.md.
-
Merge config from
$HOME/.config/clj-kondo
, respectingXDG_CONFIG_HOME
. See config.md for details. #992 -
New
:config-paths
option in<project>/.clj-kondo/config.edn
. This allows extra configuration directories to be merged in. See config.md for details. #992 -
Config tool that can spit out library specific configurations that can be added via
:config-paths
. Contributions for libraries are welcome. -
Experimental spec inspection tool that attempts to extract type information for linting. Also uses the new
:config-paths
feature. -
Allow pinned version in installation script #946 (@cldwalker)
- Fix docstring in Rum
defc
hook #960 - Format string checking improvements #942, #949
- False positive with
into
andtransducer
#952 - Alias usage not detected in keywords when in quoted form #981
- Fully qualified class name incorrectly assumed to be var #950
- Backup existing clj-kondo binary when installing #963 (@bfontaine)
- Various documentation fixes and improvements (@jeroenvandijk, @sittim, @sogaiu)
- Update to GraalVM 20.2.0 for
native-image
build @jaihindhreddy
Details about releases prior to v2020.09.09 can be found here.
- #2063: introduce new
:defined-by->lint-as
key which contains the:lint-as
value for "defining" var, whereas:defined-as
now always contains the name of the original "defining var". This is a BREAKING change.
- Change
:row
and:col
for:var-usages
to use the start location of the call instead of the name location #1387