aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/lang/analysis/reference.lux
diff options
context:
space:
mode:
Diffstat (limited to 'new-luxc/source/luxc/lang/analysis/reference.lux')
-rw-r--r--new-luxc/source/luxc/lang/analysis/reference.lux53
1 files changed, 53 insertions, 0 deletions
diff --git a/new-luxc/source/luxc/lang/analysis/reference.lux b/new-luxc/source/luxc/lang/analysis/reference.lux
new file mode 100644
index 000000000..5bc1f96c9
--- /dev/null
+++ b/new-luxc/source/luxc/lang/analysis/reference.lux
@@ -0,0 +1,53 @@
+(;module:
+ lux
+ (lux (control monad)
+ [meta]
+ (meta [code]
+ (type ["tc" check])))
+ (luxc ["&" base]
+ (lang ["la" analysis #+ Analysis]
+ [";L" variable #+ Variable])
+ ["&;" scope]))
+
+## [Analysers]
+(def: (analyse-definition def-name)
+ (-> Ident (Meta Analysis))
+ (do meta;Monad<Meta>
+ [actualT (meta;find-def-type def-name)
+ expectedT meta;expected-type
+ _ (&;with-type-env
+ (tc;check expectedT actualT))]
+ (wrap (code;symbol def-name))))
+
+(def: (analyse-variable var-name)
+ (-> Text (Meta (Maybe Analysis)))
+ (do meta;Monad<Meta>
+ [?var (&scope;find var-name)]
+ (case ?var
+ (#;Some [actualT ref])
+ (do @
+ [expectedT meta;expected-type
+ _ (&;with-type-env
+ (tc;check expectedT actualT))]
+ (wrap (#;Some (` ((~ (code;int (variableL;from-ref ref))))))))
+
+ #;None
+ (wrap #;None))))
+
+(def: #export (analyse-reference reference)
+ (-> Ident (Meta Analysis))
+ (case reference
+ ["" simple-name]
+ (do meta;Monad<Meta>
+ [?var (analyse-variable simple-name)]
+ (case ?var
+ (#;Some analysis)
+ (wrap analysis)
+
+ #;None
+ (do @
+ [this-module meta;current-module-name]
+ (analyse-definition [this-module simple-name]))))
+
+ _
+ (analyse-definition reference)))