88 lines
3.5 KiB
Clojure
Executable file
88 lines
3.5 KiB
Clojure
Executable file
#!/usr/bin/env bb
|
|
|
|
;; $ examples/hsqldb_unused_vars.clj src
|
|
|
|
;; | :VARS/NS | :VARS/NAME | :VARS/FILENAME | :VARS/ROW | :VARS/COL |
|
|
;; |----------------------------+--------------------------+------------------------------------+-----------+-----------|
|
|
;; | babashka.impl.bencode.core | read-netstring | src/babashka/impl/bencode/core.clj | 162 | 1 |
|
|
;; | babashka.impl.bencode.core | write-netstring | src/babashka/impl/bencode/core.clj | 201 | 1 |
|
|
;; | babashka.impl.classes | generate-reflection-file | src/babashka/impl/classes.clj | 230 | 1 |
|
|
;; | babashka.impl.classpath | ->DirectoryResolver | src/babashka/impl/classpath.clj | 12 | 1 |
|
|
;; | babashka.impl.classpath | ->JarFileResolver | src/babashka/impl/classpath.clj | 37 | 1 |
|
|
;; | babashka.impl.classpath | ->Loader | src/babashka/impl/classpath.clj | 47 | 1 |
|
|
;; | babashka.impl.clojure.test | file-position | src/babashka/impl/clojure/test.clj | 286 | 1 |
|
|
;; | babashka.impl.nrepl-server | stop-server! | src/babashka/impl/nrepl_server.clj | 179 | 1 |
|
|
;; | babashka.main | -main | src/babashka/main.clj | 485 | 1 |
|
|
|
|
(ns hsqldb-unused-vars
|
|
(:require
|
|
[babashka.pods :as pods]
|
|
[clojure.pprint :refer [print-table]]))
|
|
|
|
(pods/load-pod "pod-babashka-hsqldb")
|
|
(require '[pod.babashka.hsqldb :as jdbc]
|
|
'[pod.babashka.hsqldb.sql :as sql])
|
|
|
|
(pods/load-pod "clj-kondo")
|
|
(require '[pod.borkdude.clj-kondo :as clj-kondo])
|
|
|
|
(def db "jdbc:hsqldb:mem:testdb;sql.syntax_mys=true")
|
|
|
|
(defn query [q]
|
|
(jdbc/execute! db [q]))
|
|
|
|
(defn create-db! []
|
|
(query "create table vars (
|
|
ns text
|
|
, name text
|
|
, filename text
|
|
, row int
|
|
, col int )")
|
|
(query "create table var_usages (
|
|
\"from\" text
|
|
, \"to\" text
|
|
, name text
|
|
, filename text
|
|
, row int
|
|
, col int )"))
|
|
|
|
(defn parse-int [^String x]
|
|
(when x
|
|
(Integer. x)))
|
|
|
|
(defn insert-vars! [var-definitions]
|
|
(sql/insert-multi! db :vars [:ns :name :filename :row :col]
|
|
(map (juxt (comp str :ns)
|
|
(comp str :name)
|
|
:filename
|
|
(comp parse-int :row)
|
|
(comp parse-int :col))
|
|
var-definitions)))
|
|
|
|
(defn insert-var-usages! [var-usages]
|
|
(sql/insert-multi! db :var_usages ["\"from\"" "\"to\"" :name :filename :row :col]
|
|
(map (juxt (comp str :from)
|
|
(comp str :to)
|
|
(comp str :name)
|
|
:filename
|
|
(comp parse-int :row)
|
|
(comp parse-int :col))
|
|
var-usages)))
|
|
|
|
(defn analysis->db [paths]
|
|
(let [results (clj-kondo/run! {:lint paths
|
|
:config {:output {:analysis true}}})
|
|
analysis (:analysis results)
|
|
{:keys [:var-definitions :var-usages]} analysis]
|
|
(insert-vars! var-definitions)
|
|
(insert-var-usages! var-usages)))
|
|
|
|
(create-db!)
|
|
(analysis->db *command-line-args*)
|
|
|
|
(def unused-vars "
|
|
select distinct * from vars v
|
|
where (v.ns, v.name) not in
|
|
(select vu.\"to\", vu.name from var_usages vu)")
|
|
|
|
(print-table (query unused-vars))
|