(.module: lux (lux (control monad) [macro] (macro [code]) (lang (type ["tc" check]))) (luxc ["&" lang] (lang ["&." scope] ["la" analysis #+ Analysis] [".L" variable #+ Variable]))) ## [Analysers] (def: (analyse-definition def-name) (-> Ident (Meta Analysis)) (do macro.Monad [[actualT def-anns _] (&.with-error-tracking (macro.find-def def-name))] (case (macro.get-symbol-ann (ident-for #.alias) def-anns) (#.Some real-def-name) (analyse-definition real-def-name) _ (do @ [_ (&.infer actualT) def-name (macro.normalize def-name)] (wrap (code.symbol def-name)))))) (def: (analyse-variable var-name) (-> Text (Meta (Maybe Analysis))) (do macro.Monad [?var (&scope.find var-name)] (case ?var (#.Some [actualT ref]) (do @ [_ (&.infer 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 macro.Monad [?var (analyse-variable simple-name)] (case ?var (#.Some varA) (wrap varA) #.None (do @ [this-module macro.current-module-name] (analyse-definition [this-module simple-name])))) _ (analyse-definition reference)))