check-ns -> check-file (and moved reporting to plugin)

This commit is contained in:
Jonas Enlund 2012-03-06 21:49:52 +02:00
parent b5bb4372dc
commit cd945be2cd
2 changed files with 21 additions and 40 deletions

View file

@ -4,23 +4,13 @@
[clojure.string :as string]
[jonase.kibit.arithmetic :as arith]
[jonase.kibit.control-structures :as control]
[jonase.kibit.misc :as misc]))
[jonase.kibit.misc :as misc])
(:import [clojure.lang LineNumberingPushbackReader]))
(def all-rules (merge control/rules
arith/rules
misc/rules))
(defn src [path]
(if-let [res (io/resource path)]
(clojure.lang.LineNumberingPushbackReader. (io/reader res))
(throw (RuntimeException. (str "File not found: " path)))))
(defn source-file [ns-sym]
(-> (name ns-sym)
(string/replace "." "/")
(string/replace "-" "_")
(str ".clj")))
(defn read-ns [r]
(lazy-seq
(let [form (read r false ::eof)
@ -32,32 +22,22 @@
([expr]
(check-form expr all-rules))
([expr rules]
(for [[rule alt] rules
:let [rule-broke (and (sequential? expr)
(logic/unifier expr rule))]
:when rule-broke]
(when-let [alt (some (fn [[rule alt]] (and (sequential? expr)
(logic/unifier expr rule)
alt))
rules)]
{:expr expr
:alt alt
:line (-> expr meta :line)})))
(defn check
"This is a presentation version of check-form,
used to print broken-rules to stdout"
([expr]
(check expr all-rules))
([expr rules]
(doseq [{:keys [line alt expr]} (check-form expr rules)]
(printf "[Kibit:%s] Consider %s instead of %s\n" line alt expr))))
(defn expr-seq [expr]
(tree-seq sequential?
seq
expr))
(defn check-ns
([ns-sym rules]
(with-open [reader (-> ns-sym source-file src)]
(doseq [form (mapcat expr-seq (read-ns reader))]
(check form rules))))
([ns-sym]
(check-ns ns-sym all-rules)))
(defn check-file
([reader]
(check-file reader all-rules))
([reader rules]
(keep check-form
(mapcat expr-seq (read-ns (LineNumberingPushbackReader. reader))))))

View file

@ -7,11 +7,12 @@
"Suggest idiomatic replacements for patterns of code."
[project]
(let [paths (or (:source-paths project) [(:source-path project)])
namespaces (apply concat (for [path paths]
(clj-ns/find-namespaces-in-dir (io/file path))))]
(doseq [ns-sym namespaces]
(try
(println "==" ns-sym "==")
(kibit/check-ns ns-sym)
(catch RuntimeException e (println ns-sym "not found."))))))
source-files (mapcat #(-> % io/file clj-ns/find-clojure-sources-in-dir)
paths)]
(doseq [source-file source-files]
(printf "== %s ==\n"
(or (second (clj-ns/read-file-ns-decl source-file)) source-file))
(with-open [reader (io/reader source-file)]
(doseq [{:keys [line expr alt]} (kibit/check-file reader)]
(printf "[%s] Consider %s instead of %s\n" line alt expr)))
(flush))))