summaryrefslogtreecommitdiff
path: root/vim/bundle/slimv/swank-clojure/swank/loader.clj
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/slimv/swank-clojure/swank/loader.clj')
-rw-r--r--vim/bundle/slimv/swank-clojure/swank/loader.clj101
1 files changed, 101 insertions, 0 deletions
diff --git a/vim/bundle/slimv/swank-clojure/swank/loader.clj b/vim/bundle/slimv/swank-clojure/swank/loader.clj
new file mode 100644
index 0000000..27466f6
--- /dev/null
+++ b/vim/bundle/slimv/swank-clojure/swank/loader.clj
@@ -0,0 +1,101 @@
+(ns swank.loader
+ (:require [swank.util.sys :as sys]
+ [swank.util.clojure :as clj])
+ (:import [java.io File]))
+
+(defonce #^File *swank-source-path*
+ (if-let [resource (.getResource (clojure.lang.RT/baseLoader)
+ #^String *file*)]
+ (.getParentFile (File. (.getFile resource)))))
+
+(defonce #^File *swank-compile-path*
+ (File. (str (sys/user-home-path)
+ File/separator
+ ".slime"
+ File/separator
+ "cljclass")))
+
+(defn file-directory? [#^File f]
+ (.isDirectory f))
+
+(defn file-last-modified [#^File f]
+ (.lastModified f))
+
+(defn all-files-in-directory [#^File f]
+ (let [list-files (.listFiles f)
+ files (remove file-directory? list-files)
+ directories (filter file-directory? list-files)]
+ (concat files (mapcat all-files-in-directory directories))))
+
+(defn clj-file? [#^File f]
+ (.endsWith (str f) ".clj"))
+
+(defn swank-source-files [#^File path]
+ (filter clj-file? (all-files-in-directory path)))
+
+(defn relative-path-name [#^File parent #^File file]
+ (let [file-name (str file)
+ parent-name (str parent)]
+ (when (.startsWith file-name parent-name)
+ (.substring file-name (inc (.length parent-name))))))
+
+(defn file-name-to-swank-package-sym [#^String file-name]
+ (assert (clj-file? file-name))
+ (symbol
+ (str "swank."
+ (clj/unmunge
+ (.replaceAll (.substring file-name 0 (- (.length file-name) 4))
+ File/separator
+ ".")))))
+
+(defn swank-packages []
+ (map #(file-name-to-swank-package-sym (relative-path-name *swank-source-path* %))
+ (swank-source-files *swank-source-path*)))
+
+(defn swank-version
+ "A likely bad way of calculating a version number for swank clojure"
+ ([]
+ (str (reduce + (map file-last-modified (swank-source-files *swank-source-path*)))
+ "+" (clojure-version))))
+
+(defn delete-file-recursive [& paths]
+ (when-not (empty? paths)
+ (let [f #^File (first paths)]
+ (if (and f (.exists f))
+ (if (.isDirectory f)
+ (if-let [files (seq (.listFiles f))]
+ (recur (concat files paths))
+ (do
+ (.delete f)
+ (recur (rest paths))))
+ (do
+ (.delete f)
+ (recur (rest paths))))
+ (recur (rest paths))))))
+
+(defn clean-up []
+ (let [current-path (File. *swank-compile-path* (str (swank-version)))]
+ (doseq [compiled-path (.listFiles *swank-compile-path*)
+ :when (not= current-path compiled-path)]
+ (delete-file-recursive compiled-path))))
+
+(defn swank-ns? [ns]
+ (.startsWith (name (ns-name ns)) "swank."))
+
+(defn all-swank-ns []
+ (filter swank-ns? (all-ns)))
+
+(defn compile-swank [#^String path]
+ (binding [*compile-path* path]
+ (doseq [sym (swank-packages)]
+ (println "Compiling" (name sym))
+ (compile sym))))
+
+(defn init []
+ (let [path (File. *swank-compile-path* (str (swank-version)))
+ path-already-exists? (.exists path)]
+ (when-not path-already-exists?
+ (.mkdirs path))
+ (add-classpath (-> path .toURI .toURL))
+ (when-not path-already-exists?
+ (compile-swank (str path)))))