clj-kondo

https://github.com/clj-kondo/clj-kondo
Helins 2021-02-09T19:31:46.113800Z

I have a special macro which is essentially about executing given forms as Clojure code no matter the target platform. (In CLJS, they are evaled during the compilation stage) Is there a way to write a hook for that very special use case? Forcing linting as Clojure? The problem is that in a CLJC file, Clj-kondo will complain if those forms refer to something that is Clojure specific (eg. a call to alter-var-root) because as such, it doesn't know that they will never execute as CLJS.

borkdude 2021-02-10T11:34:06.115300Z

@adam678 Is it an option to put this code in a :clj reader conditional?

borkdude 2021-02-10T11:35:22.115500Z

If not, please make a small repro which clarifies the problem

Helins 2021-02-10T12:53:40.120100Z

I tried to make my case here but feel free to close it if you find it to be too narrow of a use case: https://github.com/clj-kondo/clj-kondo/issues/1165 Thanks!

borkdude 2021-02-10T12:56:51.120400Z

Why don't you suppress unresolved symbol linting for this macro?

borkdude 2021-02-10T12:57:38.120600Z

{:linters
  {:unresolved-symbol
    {:exclude [(your-ns/eval-as-clojure)]}}}

borkdude 2021-02-10T12:58:18.120800Z

I have another feature in the works to only lint .cljc as one language, e.g. only consider the :clj branches and unbranched code as only clj and ignore the rest.

borkdude 2021-02-10T12:58:25.121Z

Would that also fit your use case?

borkdude 2021-02-10T12:58:30.121200Z

This would disable cljs linting for .cljc

Helins 2021-02-10T13:10:54.121400Z

The thing is, forms passed to such a macro are Clojure forms which should be linted as usual. In that example, Clj-kondo will end up complaining about format because it thinks it is going to be called from CLJS as well. It is essentially about forcing to lint as Clojure in a context where a reader conditional cannot be used. Unfortunately, forcing linting to Clojure in a whole CLJC file would be a heavy price to pay since you would become blind regarding the CLJS side.

borkdude 2021-02-10T13:16:11.121600Z

so the macro is always executed by clojure on the JVM side right? so expanding the macro into #?(:clj the-forms) in a hook would be the correct interpretation?

borkdude 2021-02-10T13:16:40.121800Z

this is currently not possible I think but could be an appropriate solution

Helins 2021-02-10T13:20:56.122Z

Exactly so

Helins 2021-02-10T13:24:11.122200Z

I guess you didn't have many people requesting that. Outside of tooling, I admit I am not sure how useful that would be in "day to day" code

borkdude 2021-02-10T13:26:50.122400Z

yes, but adding the possibility of creating reader conditionals to hook code might be generally useful

👍 1
borkdude 2021-02-10T13:26:58.122600Z

although still a bit niche maybe

Helins 2021-02-10T13:30:31.122900Z

Unfortunately I can't help you much since I am not very aware of the inner workings. I've started writing hooks and taking a deeper look only recently

borkdude 2021-02-10T13:32:06.123100Z

I'll leave the issue open and will think about it for a while

🤘 1