aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lux/analyser/module.clj2
-rw-r--r--src/lux/compiler.clj2
-rw-r--r--src/lux/compiler/base.clj8
-rw-r--r--src/lux/compiler/cache.clj17
-rw-r--r--src/lux/compiler/package.clj18
-rw-r--r--src/lux/host.clj13
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)