aboutsummaryrefslogtreecommitdiff
path: root/src/lux/analyser/module.clj
diff options
context:
space:
mode:
authorEduardo Julian2015-06-12 08:04:59 -0400
committerEduardo Julian2015-06-12 08:04:59 -0400
commit082ef348efef7c4f1941c48f94b58e22fea724a4 (patch)
tree855cec47c1dc9a79f6a793044b0c68c3589ee57d /src/lux/analyser/module.clj
parentc6a120dd8324a306190b593ff1541046e1963e2d (diff)
- Added imports.
- Now storing information about definitions & imports inside the .class files.
Diffstat (limited to '')
-rw-r--r--src/lux/analyser/module.clj53
1 files changed, 48 insertions, 5 deletions
diff --git a/src/lux/analyser/module.clj b/src/lux/analyser/module.clj
index cfa39f008..1fd96ce0a 100644
--- a/src/lux/analyser/module.clj
+++ b/src/lux/analyser/module.clj
@@ -1,23 +1,38 @@
(ns lux.analyser.module
(:require [clojure.core.match :as M :refer [matchv]]
clojure.core.match.array
- (lux [base :as & :refer [|do return return* fail fail*]]
+ (lux [base :as & :refer [|let |do return return* fail fail*]]
[type :as &type]
[host :as &host])
[lux.analyser.base :as &&]))
;; [Utils]
-(def ^:private $ALIASES 0)
-(def ^:private $DEFS 1)
+(def ^:private $DEFS 0)
+(def ^:private $ALIASES 1)
+(def ^:private $IMPORTS 2)
;; [Exports]
(def init-module
- (&/R ;; "lux;aliases"
+ (&/R ;; "lux;defs"
(&/|table)
- ;; "lux;defs"
+ ;; "lux;module-aliases"
(&/|table)
+ ;; "lux;imports"
+ (&/|list)
))
+(defn add-import [module]
+ "(-> Text (Lux (,)))"
+ (|do [current-module &/get-module-name]
+ (fn [state]
+ (return* (&/update$ &/$MODULES
+ (fn [ms]
+ (&/|update current-module
+ (fn [m] (&/update$ $IMPORTS (partial &/|cons module) m))
+ ms))
+ state)
+ nil))))
+
(defn define [module name def-data type]
(fn [state]
(matchv ::M/objects [(&/get$ &/$ENVS state)]
@@ -69,6 +84,7 @@
(fail* "[Analyser Error] Can't alias a global definition outside of a global environment."))))
(defn exists? [name]
+ "(-> Text (Lux Bool))"
(fn [state]
(return* state
(->> state (&/get$ &/$MODULES) (&/|contains? name)))))
@@ -174,3 +190,30 @@
[_]
(fail* "[Analyser Error] Can't export a global definition outside of a global environment."))))
+
+(def defs
+ (|do [module &/get-module-name]
+ (fn [state]
+ (return* state
+ (&/|map (fn [kv]
+ (|let [[k v] kv]
+ (matchv ::M/objects [v]
+ [[?exported? ?def]]
+ (matchv ::M/objects [?def]
+ [["lux;AliasD" [?r-module ?r-name]]]
+ (&/T ?exported? k (str "A" ?r-module ";" ?r-name))
+
+ [["lux;MacroD" _]]
+ (&/T ?exported? k "M")
+
+ [["lux;TypeD" _]]
+ (&/T ?exported? k "T")
+
+ [_]
+ (&/T ?exported? k "V")))))
+ (->> state (&/get$ &/$MODULES) (&/|get module) (&/get$ $DEFS)))))))
+
+(def imports
+ (|do [module &/get-module-name]
+ (fn [state]
+ (return* state (->> state (&/get$ &/$MODULES) (&/|get module) (&/get$ $IMPORTS))))))