(.module: [lux #* [abstract [monad (#+ do)]] [control ["ex" exception (#+ exception:)] ["." io]] [data ["." error (#+ Error)] ["." text ("#/." hash) format] [collection ["." dictionary (#+ Dictionary)]]] ["." macro] [host (#+ import:)] [world [binary (#+ Binary)]] [tool [compiler [reference (#+ Register)] ["." name] ["." phase]]]] ## [luxc ## [lang ## [host ## ["." jvm ## [type]]]]] ) ## (def: #export (with-artifacts action) ## (All [a] (-> (Meta a) (Meta [Artifacts a]))) ## (function (_ state) ## (case (action (update@ #.host ## (|>> (:coerce Host) ## (set@ #artifacts (dictionary.new text.hash)) ## (:coerce Nothing)) ## state)) ## (#error.Success [state' output]) ## (#error.Success [(update@ #.host ## (|>> (:coerce Host) ## (set@ #artifacts (|> (get@ #.host state) (:coerce Host) (get@ #artifacts))) ## (:coerce Nothing)) ## state') ## [(|> state' (get@ #.host) (:coerce Host) (get@ #artifacts)) ## output]]) ## (#error.Error error) ## (#error.Error error)))) ## (def: #export (load-definition state) ## (-> Lux (-> Name Binary (Error Any))) ## (function (_ (^@ def-name [def-module def-name]) def-bytecode) ## (let [normal-name (format (name.normalize def-name) (%n (text/hash def-name))) ## class-name (format (text.replace-all "/" "." def-module) "." normal-name)] ## (<| (macro.run state) ## (do macro.monad ## [_ (..store-class class-name def-bytecode) ## class (..load-class class-name)] ## (case (do error.monad ## [field (Class::getField [..value-field] class)] ## (Field::get [#.None] field)) ## (#error.Success (#.Some def-value)) ## (wrap def-value) ## (#error.Success #.None) ## (phase.throw invalid-definition-value (%name def-name)) ## (#error.Error error) ## (phase.throw cannot-load-definition ## (format "Definition: " (%name def-name) "\n" ## "Error:\n" ## error))))))))