(;module: lux (lux [io] (control [monad #+ do] pipe) (data ["e" error]) ["r" math/random] [meta #+ Monad] (meta [type "type/" Eq]) test) (luxc ["&;" scope] ["&;" module] (lang ["~" analysis] (analysis [";A" expression] ["@" reference] ["@;" common]))) (.. common) (test/luxc common)) (context: "References" (<| (times +100) (do @ [[ref-type _] gen-primitive module-name (r;text +5) scope-name (r;text +5) var-name (r;text +5)] ($_ seq (test "Can analyse variable." (|> (&scope;with-scope scope-name (&scope;with-local [var-name ref-type] (@common;with-unknown-type (@;analyse-reference ["" var-name])))) (meta;run (init-compiler [])) (case> (^ (#e;Success [_type (^code ((~ [_ (#;Int var)])))])) (type/= ref-type _type) _ false))) (test "Can analyse definition." (|> (do Monad [_ (&module;create +0 module-name) _ (&module;define [module-name var-name] [ref-type (' {}) (:! Void [])])] (@common;with-unknown-type (@;analyse-reference [module-name var-name]))) (meta;run (init-compiler [])) (case> (#e;Success [_type [_ (#;Symbol def-name)]]) (type/= ref-type _type) _ false))) ))))