(.require [library [lux (.except Definition) [program (.only program:)] ["[0]" ffi (.only import)] [abstract [monad (.only do)]] [control ["[0]" io (.only IO)] ["[0]" try (.only Try)] [concurrency ["[0]" async (.only Async)]]] [data ["[0]" product] [text ["%" \\format (.only format)]] [collection [array (.only Array)]]] [meta ["@" target (.only) ["[0]" jvm [bytecode (.only Bytecode)] ["[1]/[0]" type ["[1]/[0]" box]]]]] ["[0]" world ["[0]" file] ["[1]/[0]" environment]] [tool [compiler (.only) ["[0]" phase] [default ["[0]" platform (.only Platform)]] [meta [archive (.only Archive)] ["[0]" context] ["[0]" cli] ["[0]" packager ["[1]" jvm]]] [language [lux [generation (.only Operation)] [analysis [macro (.only Expander)]] [phase ["[0]" extension (.only) ["[0]" analysis ["[1]" jvm]] ["[0]" generation ["[1]" jvm]] ["[0]" declaration ["[1]" jvm]]] [generation ["/" jvm (.only) ["[1][0]" runtime (.only Anchor Definition)] ["[1][0]" host] ["[1][0]" program]]]]]]]]]] [program ["[0]" compositor]]) (import java/lang/reflect/Method "[1]::[0]" (invoke [java/lang/Object [java/lang/Object]] "try" java/lang/Object)) (import java/lang/ClassLoader "[1]::[0]") (import (java/lang/Class c) "[1]::[0]" (getMethod [java/lang/String [(java/lang/Class java/lang/Object)]] "try" java/lang/reflect/Method)) (import java/lang/Object "[1]::[0]" (getClass [] (java/lang/Class java/lang/Object))) (def _object_class (java/lang/Class java/lang/Object) (ffi.class_for java/lang/Object)) (def _apply2_args (Array (java/lang/Class java/lang/Object)) (|> (ffi.array (java/lang/Class java/lang/Object) 2) (ffi.write! 0 _object_class) (ffi.write! 1 _object_class))) (def _apply5_args (Array (java/lang/Class java/lang/Object)) (|> (ffi.array (java/lang/Class java/lang/Object) 5) (ffi.write! 0 _object_class) (ffi.write! 1 _object_class) (ffi.write! 2 _object_class) (ffi.write! 3 _object_class) (ffi.write! 4 _object_class))) (def .public (expander macro inputs lux) Expander (do try.monad [apply_method (|> macro (as java/lang/Object) (java/lang/Object::getClass) (java/lang/Class::getMethod "apply" _apply2_args))] (as (Try (Try [Lux (List Code)])) (java/lang/reflect/Method::invoke (as java/lang/Object macro) (|> (ffi.array java/lang/Object 2) (ffi.write! 0 (as java/lang/Object inputs)) (ffi.write! 1 (as java/lang/Object lux))) apply_method)))) (def (phase_wrapper archive) (-> Archive (Operation Anchor (Bytecode Any) Definition phase.Wrapper)) (at phase.monad in (|>>))) (def .public platform (IO [java/lang/ClassLoader /runtime.Host (Platform Anchor (Bytecode Any) Definition)]) (do io.monad [[loader host] /host.host] (in [loader host [platform.#file_system (file.async file.default) platform.#host host platform.#phase /.generate platform.#runtime /runtime.generate platform.#phase_wrapper ..phase_wrapper platform.#write product.right]]))) (def (extender phase_wrapper) (-> phase.Wrapper extension.Extender) ... TODO: Stop relying on coercions ASAP. (<| (as extension.Extender) (function (@self handler)) (as extension.Handler) (function (@self name phase)) (as extension.Phase) (function (@self archive parameters)) (as extension.Operation) (function (@self state)) (as Try) try.trusted (as Try) (do try.monad [method (|> handler (as java/lang/Object) (java/lang/Object::getClass) (java/lang/Class::getMethod "apply" _apply5_args))] (java/lang/reflect/Method::invoke (as java/lang/Object handler) (|> (ffi.array java/lang/Object 5) (ffi.write! 0 (as java/lang/Object name)) (ffi.write! 1 (as java/lang/Object (phase_wrapper phase))) (ffi.write! 2 (as java/lang/Object archive)) (ffi.write! 3 (as java/lang/Object parameters)) (ffi.write! 4 (as java/lang/Object state))) method)))) (def (declare_success! _) (-> Any (Async Any)) (async.future (at world/environment.default exit +0))) (def (lux_compiler it) (-> Any platform.Custom) (as_expected it)) (program: [service cli.service] (let [context (context.jvm (cli.target service))] (exec (do async.monad [[loader host platform] (async.future ..platform) _ (compositor.compiler ..lux_compiler context ..expander (analysis.bundle loader host) (io.io platform) generation.bundle (|>> ..extender (declaration.bundle loader)) (/program.program /runtime.class_name) [Anchor (type_literal (Bytecode Any)) Definition] ..extender service [(packager.package context) (format (cli.target service) (at file.default separator) "program.jar")])] (..declare_success! [])) (io.io []))))