aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/lang/extension
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--new-luxc/source/luxc/lang/extension.lux19
-rw-r--r--new-luxc/source/luxc/lang/extension/statement.lux19
2 files changed, 27 insertions, 11 deletions
diff --git a/new-luxc/source/luxc/lang/extension.lux b/new-luxc/source/luxc/lang/extension.lux
index 248bfbb71..ff3a4d24e 100644
--- a/new-luxc/source/luxc/lang/extension.lux
+++ b/new-luxc/source/luxc/lang/extension.lux
@@ -6,7 +6,9 @@
[text]
(coll [dict #+ Dict]))
[macro])
- [//])
+ [//]
+ (// ["la" analysis]
+ ["ls" synthesis]))
(exception: #export Unknown-Analysis)
(exception: #export Unknown-Synthesis)
@@ -24,7 +26,9 @@
(List Code) (Meta Code)))
(type: #export Synthesis
- (-> (List Code) (Meta Code)))
+ (-> (-> la.Analysis ls.Synthesis) (List Code) Code))
+
+(type: #export Syntheses (Dict Text Synthesis))
(type: #export Translation
(-> (List Code) (Meta Code)))
@@ -34,7 +38,7 @@
(type: #export Extensions
{#analysis (Dict Text Analysis)
- #synthesis (Dict Text Synthesis)
+ #synthesis Syntheses
#translation (Dict Text Translation)
#statement (Dict Text Statement)})
@@ -75,6 +79,15 @@
[find-statement Statement #statement Unknown-Statement]
)
+(do-template [<name> <type> <category>]
+ [(def: #export <name>
+ (Meta <type>)
+ (|> ..get
+ (:: macro.Monad<Meta> map (get@ <category>))))]
+
+ [all-syntheses (Dict Text Synthesis) #synthesis]
+ )
+
(do-template [<name> <type> <category> <exception>]
[(def: #export (<name> name extension)
(-> Text <type> (Meta Unit))
diff --git a/new-luxc/source/luxc/lang/extension/statement.lux b/new-luxc/source/luxc/lang/extension/statement.lux
index afabf867b..7eb2b36bf 100644
--- a/new-luxc/source/luxc/lang/extension/statement.lux
+++ b/new-luxc/source/luxc/lang/extension/statement.lux
@@ -9,7 +9,7 @@
[macro]
(lang (type ["tc" check]))
[io #+ IO])
- [//]
+ [// #+ Syntheses]
(luxc [lang]
(lang [".L" host]
[".L" scope]
@@ -36,13 +36,13 @@
(format "\n " (%n idx) " " (%code inputC))))
(text.join-with "")) "\n")))
-(def: (process-annotations annsC)
- (-> Code (Meta [$.Inst Code]))
+(def: (process-annotations syntheses annsC)
+ (-> Syntheses Code (Meta [$.Inst Code]))
(do macro.Monad<Meta>
[[_ annsA] (lang.with-scope
(lang.with-type Code
(expressionA.analyser evalL.eval annsC)))
- annsI (expressionT.translate (expressionS.synthesize annsA))
+ annsI (expressionT.translate (expressionS.synthesize syntheses annsA))
annsV (evalT.eval annsI)]
(wrap [annsI (:! Code annsV)])))
@@ -64,7 +64,8 @@
(hostL.with-context def-name
(lang.with-fresh-type-env
(do macro.Monad<Meta>
- [[annotationsI annotationsV] (process-annotations annotationsC)]
+ [syntheses //.all-syntheses
+ [annotationsI annotationsV] (process-annotations syntheses annotationsC)]
(case (macro.get-symbol-ann (ident-for #.alias) annotationsV)
(#.Some real-def)
(do @
@@ -85,7 +86,7 @@
(expressionA.analyser evalL.eval valueC))))
valueT (lang.with-type-env
(tc.clean valueT))
- valueI (expressionT.translate (expressionS.synthesize valueA))
+ valueI (expressionT.translate (expressionS.synthesize syntheses valueA))
_ (lang.with-scope
(statementT.translate-def def-name valueT valueI annotationsI annotationsV))]
(wrap []))))))
@@ -103,7 +104,8 @@
(scopeL.with-local [args (type (List Text))])
(lang.with-type (type (IO Unit)))
(expressionA.analyser evalL.eval programC))
- programI (expressionT.translate (expressionS.synthesize programA))
+ syntheses //.all-syntheses
+ programI (expressionT.translate (expressionS.synthesize syntheses programA))
_ (statementT.translate-program programI)]
(wrap []))
@@ -120,7 +122,8 @@
[[_ valueA] (lang.with-scope
(lang.with-type <type>
(expressionA.analyser evalL.eval valueC)))
- valueI (expressionT.translate (expressionS.synthesize valueA))
+ syntheses //.all-syntheses
+ valueI (expressionT.translate (expressionS.synthesize syntheses valueA))
valueV (evalT.eval valueI)
_ (<installer> name (:! <type> valueV))]
(wrap []))