diff options
author | Eduardo Julian | 2015-09-11 22:16:58 -0400 |
---|---|---|
committer | Eduardo Julian | 2015-09-11 22:16:58 -0400 |
commit | 5148900e02c8e05808afc8a3ec7fc51a901bcc7b (patch) | |
tree | 8ea4d23410b23369f8498660f1089a68ebcf8827 | |
parent | 5a26c40dc215dfb22a77cad28455deff28ca9976 (diff) |
- Abandoned the old format for classes of having module names separated by underscores, and now using slashes and putting submodules inside the directories of their parent modules.
Diffstat (limited to '')
-rw-r--r-- | src/lux/analyser/module.clj | 2 | ||||
-rw-r--r-- | src/lux/compiler.clj | 2 | ||||
-rw-r--r-- | src/lux/compiler/base.clj | 8 | ||||
-rw-r--r-- | src/lux/compiler/cache.clj | 17 | ||||
-rw-r--r-- | src/lux/compiler/package.clj | 18 | ||||
-rw-r--r-- | src/lux/host.clj | 13 |
6 files changed, 35 insertions, 25 deletions
diff --git a/src/lux/analyser/module.clj b/src/lux/analyser/module.clj index 6740d6515..97365ba08 100644 --- a/src/lux/analyser/module.clj +++ b/src/lux/analyser/module.clj @@ -204,7 +204,7 @@ [exported? (&/$ValueD ?type _)] ((|do [_ (&type/check &type/Macro ?type) ^ClassLoader loader &/loader - :let [macro (-> (.loadClass loader (str (&host/->module-class module) "." (&/normalize-name name))) + :let [macro (-> (.loadClass loader (str (&host/->class-name module) "." (&/normalize-name name))) (.getField &/datum-field) (.get nil))]] (fn [state*] diff --git a/src/lux/compiler.clj b/src/lux/compiler.clj index e16a84b20..da9896bd5 100644 --- a/src/lux/compiler.clj +++ b/src/lux/compiler.clj @@ -392,7 +392,7 @@ .visitEnd))] _ (&&/save-class! (str id) bytecode) loader &/loader] - (-> (.loadClass ^ClassLoader loader (str (&host/->module-class module) "." id)) + (-> (.loadClass ^ClassLoader loader (str (&host/->class-name module) "." id)) (.getField &/eval-field) (.get nil) return)))) diff --git a/src/lux/compiler/base.clj b/src/lux/compiler/base.clj index edb1441ca..7c1297aad 100644 --- a/src/lux/compiler/base.clj +++ b/src/lux/compiler/base.clj @@ -26,8 +26,8 @@ ;; [Constants] (def ^String version "0.3") (def ^String input-dir "source") -(def ^String output-dir "target/jvm") -(def ^String output-package (str output-dir "/program.jar")) +(def ^String output-dir "target/jvm/") +(def ^String output-package (str output-dir "program.jar")) (def ^String function-class "lux/Function") ;; Formats @@ -55,7 +55,7 @@ (defn ^:private write-output [module name data] (let [module* (&host/->module-class module) - module-dir (str output-dir "/" module*)] + module-dir (str output-dir module*)] (.mkdirs (File. module-dir)) (write-file (str module-dir "/" name ".class") data))) @@ -69,7 +69,7 @@ module &/get-module-name loader &/loader !classes &/classes - :let [real-name (str (&host/->module-class module) "." name) + :let [real-name (str (&host/->class-name module) "." name) _ (swap! !classes assoc real-name bytecode) _ (when (not eval?) (write-output module name bytecode)) diff --git a/src/lux/compiler/cache.clj b/src/lux/compiler/cache.clj index da7ce35e9..e47da2678 100644 --- a/src/lux/compiler/cache.clj +++ b/src/lux/compiler/cache.clj @@ -32,11 +32,9 @@ (defn ^:private clean-file [^File file] "(-> File (,))" - (if (.isDirectory file) - (do (doseq [f (seq (.listFiles file))] - (clean-file f)) - (.delete file)) - (.delete file))) + (doseq [f (seq (.listFiles file)) + :when (not (.isDirectory f))] + (.delete f))) (defn ^:private get-field [^String field-name ^Class class] "(-> Text Class Object)" @@ -45,12 +43,12 @@ ;; [Resources] (defn cached? [module] "(-> Text Bool)" - (.exists (new File (str &&/output-dir "/" (&host/->module-class module) "/_.class")))) + (.exists (new File (str &&/output-dir (&host/->module-class module) "/" &/module-class-name ".class")))) (defn delete [module] "(-> Text (Lux (,)))" (fn [state] - (do (clean-file (new File (str &&/output-dir "/" (&host/->module-class module)))) + (do (clean-file (new File (str &&/output-dir (&host/->module-class module)))) (return* state nil)))) (defn clean [state] @@ -80,8 +78,8 @@ (return true) (if (cached? module) (do ;; (prn 'load/HASH module module-hash) - (let [module* (&host/->module-class module) - module-path (str &&/output-dir "/" module*) + (let [module* (&host/->class-name module) + module-path (str &&/output-dir module) class-name (str module* "._") ^Class module-meta (do (swap! !classes assoc class-name (read-file (File. (str module-path "/_.class")))) (&&/load-class! loader class-name))] @@ -98,6 +96,7 @@ (&/->list imports)))] (if (->> loads &/->seq (every? true?)) (do (doseq [^File file (seq (.listFiles (File. module-path))) + :when (not (.isDirectory file)) :let [file-name (.getName file)] :when (not= "_.class" file-name)] (let [real-name (second (re-find #"^(.*)\.class$" file-name)) diff --git a/src/lux/compiler/package.clj b/src/lux/compiler/package.clj index b1468e540..4f703f5d1 100644 --- a/src/lux/compiler/package.clj +++ b/src/lux/compiler/package.clj @@ -30,6 +30,7 @@ (defn ^:private write-class! [^String path ^File file ^JarOutputStream out] "(-> Text File JarOutputStream Unit)" + ;; (prn 'write-class! path file) (with-open [in (new BufferedInputStream (new FileInputStream file))] (let [buffer (byte-array (* 10 kilobyte))] (doto out @@ -42,11 +43,18 @@ )) )) -(defn ^:private write-module! [^File file ^JarOutputStream out] - "(-> File JarOutputStream Unit)" - (let [module-name (.getName file)] - (doseq [$class (.listFiles file)] - (write-class! module-name $class out)))) +(let [output-dir-size (.length &&/output-dir)] + (defn ^:private write-module! [^File file ^JarOutputStream out] + "(-> File JarOutputStream Unit)" + (let [module-name (.substring (.getPath file) output-dir-size) ;; (.getName file) + ;; _ (prn 'write-module! module-name file (.getPath file) (.substring (.getPath file) output-dir-size)) + inner-files (.listFiles file) + inner-modules (filter #(.isDirectory %) inner-files) + inner-classes (filter #(not (.isDirectory %)) inner-files)] + (doseq [$class inner-classes] + (write-class! module-name $class out)) + (doseq [$module inner-modules] + (write-module! $module out))))) ;; [Resources] (defn package [module] diff --git a/src/lux/host.clj b/src/lux/host.clj index 3d61eec6a..2290f2f0a 100644 --- a/src/lux/host.clj +++ b/src/lux/host.clj @@ -10,12 +10,15 @@ clojure.core.match.array (lux [base :as & :refer [|do return* return fail fail* |let |case]] [type :as &type])) - (:import (java.lang.reflect Field Method Modifier))) + (:import (java.lang.reflect Field Method Modifier) + java.util.regex.Pattern)) ;; [Constants] (def prefix "lux.") (def function-class (str prefix "Function")) -(def module-separator "_") +(def module-separator "/") +(def class-name-separator ".") +(def class-separator "/") ;; [Utils] (defn ^:private class->type [^Class class] @@ -35,13 +38,13 @@ ;; [Resources] (defn ^String ->class [class] - (string/replace class #"\." "/")) + (string/replace class (-> class-name-separator Pattern/quote re-pattern) class-separator)) (defn ^String ->class-name [module] - (string/replace module #"/" ".")) + (string/replace module (-> module-separator Pattern/quote re-pattern) class-name-separator)) (defn ^String ->module-class [module-name] - (string/replace module-name #"/" module-separator)) + (string/replace module-name (-> module-separator Pattern/quote re-pattern) class-separator)) (def ->package ->module-class) |