Skip to content

Instantly share code, notes, and snippets.

@liquidz
Created December 9, 2022 06:52
Show Gist options
  • Save liquidz/68fbb6faaa3aa52645c1b7145dab60e4 to your computer and use it in GitHub Desktop.
Save liquidz/68fbb6faaa3aa52645c1b7145dab60e4 to your computer and use it in GitHub Desktop.
babashka pods から clj-kondo を使い public だけれども private にできそうな var を抽出する
(ns foo
(:require
[babashka.pods :as pods]))
;; Babashka pods として clj-kondo を読み込む
;; clj-kondo コマンドへのパスが通っている必要あり
;; もし clj-kondo コマンドを持っていない場合は Pod registry も利用可能
;; https://github.com/babashka/pod-registry
(pods/load-pod "clj-kondo")
;; 読み込んだ pod で提供されている ns を require
(require '[pod.borkdude.clj-kondo :as clj-kondo])
(def analysis-data
(-> {:lint ["src"]
:config {:output {:analysis true}}}
(clj-kondo/run!)
(:analysis)))
(def public-vars
(->> (:var-definitions analysis-data)
;; public なものだけにしたいので private は除外
(remove :private)
;; 必要な情報(ns名, var名)だけにする
(map #(select-keys % [:ns :name]))
(distinct)))
(doseq [v public-vars]
(let [;; public な var を使っている箇所を抜き出す
usages (filter #(= (:name v) (:name %)) (:var-usages analysis-data))]
;; var の利用元の ns 名がすべて定義されている ns と一致するならば、それは「privateにできそうな var」
(when (every? #(= (:ns v) (:from %)) usages)
(println (format "%s/%s" (:ns v) (:name v))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment