aboutsummaryrefslogtreecommitdiff
path: root/luxc
diff options
context:
space:
mode:
authorEduardo Julian2019-03-17 12:36:38 -0400
committerEduardo Julian2019-03-17 12:36:38 -0400
commita6f04f38c0170e93e8f1ab2cfcde3cbf59f88b0b (patch)
tree67e4c943658b13e3483db6de1a6fab2242fa03fb /luxc
parente9403bb6364152af447080d41a35891f8d75ff30 (diff)
Added proper aliasing support to the new compiler.
Also improved aliasing support in the old compiler.
Diffstat (limited to 'luxc')
-rw-r--r--luxc/src/lux/analyser.clj8
-rw-r--r--luxc/src/lux/analyser/lux.clj20
2 files changed, 28 insertions, 0 deletions
diff --git a/luxc/src/lux/analyser.clj b/luxc/src/lux/analyser.clj
index 068a321d0..e272bcea4 100644
--- a/luxc/src/lux/analyser.clj
+++ b/luxc/src/lux/analyser.clj
@@ -136,6 +136,14 @@
(&/with-cursor cursor
(&&lux/analyse-def analyse optimize eval! compile-def ?name ?value ?meta)))
+ "lux def alias"
+ (|let [(&/$Cons [_ (&/$Identifier "" ?alias)]
+ (&/$Cons [_ (&/$Identifier ?original)]
+ (&/$Nil)
+ )) parameters]
+ (&/with-cursor cursor
+ (&&lux/analyse-def-alias ?alias ?original)))
+
"lux program"
(|let [(&/$Cons ?program (&/$Nil)) parameters]
(&/with-cursor cursor
diff --git a/luxc/src/lux/analyser/lux.clj b/luxc/src/lux/analyser/lux.clj
index 236eb10a9..dc08ac765 100644
--- a/luxc/src/lux/analyser/lux.clj
+++ b/luxc/src/lux/analyser/lux.clj
@@ -559,6 +559,26 @@
_ &type/reset-mappings]
(return &/$Nil)))
+(def ^:private dummy-cursor
+ (&/T ["" -1 -1]))
+
+(defn ^:private alias-annotations [original-module original-name]
+ (&/T [dummy-cursor
+ (&/$Record (&/$Cons (&/T [(&/T [dummy-cursor (&/$Tag &&meta/alias-tag)])
+ (&/T [dummy-cursor (&/$Identifier (&/T [original-module original-name]))])])
+ &/$Nil))]))
+
+(defn analyse-def-alias [?alias ?original]
+ (|let [[r-module r-name] ?original]
+ (|do [[_ [original-type original-anns original-value]] (&&module/find-def! r-module r-name)
+ module-name &/get-module-name
+ _ (&/without-repl-closure
+ (&&module/define module-name ?alias
+ original-type
+ (alias-annotations r-module r-name)
+ original-value))]
+ (return &/$Nil))))
+
(defn ^:private merge-module-states
"(-> Host Host Host)"
[new old]