From 0b2294bc184b1ed3e82dc00096e9971245239e2c Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Sat, 1 Oct 2022 18:39:48 -0400 Subject: New format for extensions [part 1] --- stdlib/source/library/lux.lux | 3 + stdlib/source/library/lux/math.lux | 2 +- .../library/lux/meta/compiler/default/init.lux | 6 +- .../lux/meta/compiler/language/lux/analysis.lux | 8 +- .../compiler/language/lux/analysis/evaluation.lux | 24 ++-- .../lux/meta/compiler/language/lux/declaration.lux | 4 +- .../lux/meta/compiler/language/lux/generation.lux | 2 +- .../compiler/language/lux/phase/declaration.lux | 11 +- .../language/lux/phase/extension/analysis/jvm.lux | 157 ++++++++++----------- .../language/lux/phase/extension/analysis/lux.lux | 19 ++- .../lux/phase/extension/declaration/jvm.lux | 12 +- .../lux/phase/extension/declaration/lux.lux | 81 +++++------ .../lux/phase/extension/generation/jvm/common.lux | 2 +- .../lux/phase/extension/generation/jvm/host.lux | 2 +- .../language/lux/phase/generation/extension.lux | 2 +- .../compiler/language/lux/phase/generation/jvm.lux | 2 +- .../language/lux/phase/generation/jvm/function.lux | 2 +- .../jvm/function/field/variable/foreign.lux | 2 +- .../phase/generation/jvm/function/method/apply.lux | 2 +- .../phase/generation/jvm/function/method/init.lux | 2 +- .../phase/generation/jvm/function/method/new.lux | 2 +- .../phase/generation/jvm/function/method/reset.lux | 2 +- .../language/lux/phase/generation/jvm/loop.lux | 2 +- .../lux/phase/generation/jvm/structure.lux | 2 +- .../language/lux/phase/generation/jvm/when.lux | 2 +- .../meta/compiler/language/lux/phase/synthesis.lux | 74 +++++++--- .../language/lux/phase/synthesis/function.lux | 2 +- .../compiler/language/lux/phase/synthesis/loop.lux | 2 +- .../language/lux/phase/synthesis/variable.lux | 2 +- .../compiler/language/lux/phase/synthesis/when.lux | 2 +- .../lux/meta/compiler/language/lux/synthesis.lux | 3 +- .../compiler/meta/cache/dependency/artifact.lux | 2 +- stdlib/source/library/lux/meta/extension.lux | 3 +- .../lux/meta/compiler/language/lux/synthesis.lux | 2 +- stdlib/source/test/lux/meta/extension.lux | 45 +++--- 35 files changed, 275 insertions(+), 217 deletions(-) (limited to 'stdlib') diff --git a/stdlib/source/library/lux.lux b/stdlib/source/library/lux.lux index 62a51de98..249e77569 100644 --- a/stdlib/source/library/lux.lux +++ b/stdlib/source/library/lux.lux @@ -5878,5 +5878,8 @@ _ (failure (..wrong_syntax_error (symbol ..Rec))))))) +(def .public Synthesis + (Primitive "#Synthesis")) + (def .public Generation (Primitive "#Generation")) diff --git a/stdlib/source/library/lux/math.lux b/stdlib/source/library/lux/math.lux index eecff5842..a43b14b69 100644 --- a/stdlib/source/library/lux/math.lux +++ b/stdlib/source/library/lux/math.lux @@ -51,7 +51,7 @@ (when <+> [_ {.#Text $}] (phase#in (list#mix (function (_ left right) - {analysis.#Extension $ (list left right)}) + {analysis.#Extension ["" $] (list left right)}) last prevs)) diff --git a/stdlib/source/library/lux/meta/compiler/default/init.lux b/stdlib/source/library/lux/meta/compiler/default/init.lux index 128e66ae2..b496058e6 100644 --- a/stdlib/source/library/lux/meta/compiler/default/init.lux +++ b/stdlib/source/library/lux/meta/compiler/default/init.lux @@ -68,14 +68,16 @@ (let [synthesis_state [synthesisE.bundle ///synthesis.init] generation_state [generation_bundle (///generation.state host module)] lux (///analysis.state (///analysis.info version.latest target configuration)) - eval (///analysis/evaluation.evaluator expander synthesis_state generation_state (generate extender lux)) + eval (///analysis/evaluation.evaluator expander + [synthesis_state (synthesisP.phase extender lux)] + [generation_state (generate extender lux)]) analysis_state [(analysisE.bundle eval anchor,expression,declaration host_analysis) lux]] [extension.empty [///declaration.#analysis [///declaration.#state analysis_state ///declaration.#phase (analysisP.phase expander)] ///declaration.#synthesis [///declaration.#state synthesis_state - ///declaration.#phase synthesisP.phase] + ///declaration.#phase (synthesisP.phase extender)] ///declaration.#generation [///declaration.#state generation_state ///declaration.#phase (generate extender)]]])) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/analysis.lux b/stdlib/source/library/lux/meta/compiler/language/lux/analysis.lux index 2b8a26b2b..47fbb877c 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/analysis.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/analysis.lux @@ -24,6 +24,7 @@ ["r" rev] ["f" frac]]] [meta + ["[0]" symbol] ["[0]" location] ["[0]" configuration (.only Configuration)] ["[0]" code @@ -64,7 +65,7 @@ {#When Analysis (Match' Analysis)} {#Function (Environment Analysis) Analysis} {#Apply Analysis Analysis} - {#Extension (Extension Analysis)}))) + {#Extension [Symbol (List Analysis)]}))) (type .public Branch (Branch' Analysis)) @@ -109,7 +110,8 @@ (= reference_abstraction sample_abstraction)) [{#Extension reference} {#Extension sample}] - (at (extension.equivalence =) = reference sample) + ... (at (extension.equivalence =) = reference sample) + (at (product.equivalence symbol.equivalence (list.equivalence =)) = reference sample) _ false)))) @@ -241,7 +243,7 @@ (|> parameters (list#each format) (text.interposed " ") - (%.format (%.text name) " ") + (%.format (%.symbol name) " ") (text.enclosed ["(" ")"])))) (with_template [ ] diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/analysis/evaluation.lux b/stdlib/source/library/lux/meta/compiler/language/lux/analysis/evaluation.lux index 402cf563a..95fba2a56 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/analysis/evaluation.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/analysis/evaluation.lux @@ -24,7 +24,6 @@ [// [phase ["[0]P" extension] - ["[0]P" synthesis] ["[0]P" analysis] [// ["[0]" synthesis] @@ -42,29 +41,34 @@ (Atom (Dictionary module.ID Nat)) (atom.atom (dictionary.empty n.hash))) -(def .public (evaluator expander synthesis_state generation_state generate) +(def .public (evaluator expander + [synthesis_state synthesis] + [generation_state generation]) (All (_ anchor expression artifact) (-> Expander - synthesis.State+ - (generation.State+ anchor expression artifact) - (generation.Phase anchor expression artifact) + [synthesis.State+ + synthesis.Phase] + [(generation.State+ anchor expression artifact) + (generation.Phase anchor expression artifact)] Eval)) - (let [analyze (analysisP.phase expander)] + (let [analysis (analysisP.phase expander)] (function (eval archive type exprC) (do phase.monad [exprA (<| (//type.expecting type) //scope.reset - (analyze archive exprC)) + (analysis archive exprC)) module (extensionP.lifted meta.current_module_name)] (<| phase.lifted (do try.monad - [exprS (|> exprA (synthesisP.phase archive) (phase.result synthesis_state))]) + [exprS (|> exprA + (synthesis archive) + (phase.result synthesis_state))]) (phase.result generation_state) (do phase.monad [@module (sharing [anchor expression artifact] (is (generation.Phase anchor expression artifact) - generate) + generation) (is (generation.Operation anchor expression artifact module.ID) (generation.module_id module archive))) .let [[evals _] (io.run! (atom.update! (dictionary.revised' @module 0 ++) ..evals)) @@ -73,5 +77,5 @@ ("lux i64 left-shift" 16) ("lux i64 or" @eval) ("lux i64 left-shift" 32))) - (generate archive exprS))] + (generation archive exprS))] (generation.evaluate! [@module @eval] [{.#None} exprO]))))))) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux b/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux index 822c33d1d..132df96b9 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux @@ -31,7 +31,7 @@ [#analysis (Component analysis.State+ analysis.Phase) #synthesis (Component synthesis.State+ - synthesis.Phase) + (-> Lux synthesis.Phase)) #generation (Component (generation.State+ anchor expression declaration) (-> Lux (generation.Phase anchor expression declaration)))])) @@ -74,7 +74,7 @@ {try.#Success [[bundle state] (the [ ..#phase] state)]}))] [analysis ..#analysis analysis.Phase] - [synthesis ..#synthesis synthesis.Phase] + [synthesis ..#synthesis (-> Lux synthesis.Phase)] [generation ..#generation (-> Lux (generation.Phase anchor expression declaration))] ) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/generation.lux b/stdlib/source/library/lux/meta/compiler/language/lux/generation.lux index 78587f280..71caea7e7 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/generation.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/generation.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except #module #counter #host symbol) + [lux (.except Synthesis #module #counter #host symbol) [abstract [monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux index 4cd838c6f..4bfc09f26 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux @@ -86,11 +86,12 @@ [state //.state .let [compiler_eval (meta_eval archive (the [//extension.#state /.#analysis /.#state //extension.#bundle] state) - (evaluation.evaluator expander - (the [//extension.#state /.#synthesis /.#state] state) - (the [//extension.#state /.#generation /.#state] state) - ((the [//extension.#state /.#generation /.#phase] state) - (the [//extension.#state /.#analysis /.#state //extension.#state] state)))) + (let [analysis_state (the [//extension.#state /.#analysis /.#state //extension.#state] state)] + (evaluation.evaluator expander + [(the [//extension.#state /.#synthesis /.#state] state) + ((the [//extension.#state /.#synthesis /.#phase] state) analysis_state)] + [(the [//extension.#state /.#generation /.#state] state) + ((the [//extension.#state /.#generation /.#phase] state) analysis_state)]))) extension_eval (as Eval (wrapper (as_expected compiler_eval)))] _ (//.with (has [//extension.#state /.#analysis /.#state //extension.#state .#eval] extension_eval state))] (when code diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/jvm.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/jvm.lux index eecfece1f..596336ddc 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/jvm.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/jvm.lux @@ -465,7 +465,7 @@ ..reflection) (list)}) (analyse archive arrayC))] - (in {/////analysis.#Extension extension_name (list arrayA)})) + (in {/////analysis.#Extension ["" extension_name] (list arrayA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 1 (list.size args)])))) @@ -486,8 +486,8 @@ :read: (typeA.check (check.clean (list) :read:)) :write: (typeA.check (check.clean (list) :write:)) arrayJT (jvm_array_type (.type_literal (array.Array' :read: :write:)))] - (in {/////analysis.#Extension extension_name (list (/////analysis.text (..signature arrayJT)) - arrayA)}))) + (in {/////analysis.#Extension ["" extension_name] (list (/////analysis.text (..signature arrayJT)) + arrayA)}))) _ (/////analysis.except ///.incorrect_arity [extension_name 1 (list.size args)])))) @@ -502,7 +502,7 @@ (analyse archive lengthC)) _ (typeA.inference {.#Primitive (|> (jvm.array primitive_type) ..reflection) (list)})] - (in {/////analysis.#Extension extension_name (list lengthA)})) + (in {/////analysis.#Extension ["" extension_name] (list lengthA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 1 (list.size args)])))) @@ -523,8 +523,8 @@ {.#None} (/////analysis.except ..non_array expectedT))] - (in {/////analysis.#Extension extension_name (list (/////analysis.text (..signature elementJT)) - lengthA)})) + (in {/////analysis.#Extension ["" extension_name] (list (/////analysis.text (..signature elementJT)) + lengthA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 1 (list.size args)])))) @@ -703,7 +703,7 @@ arrayA (<| (typeA.expecting {.#Primitive (|> (jvm.array jvm_type) ..reflection) (list)}) (analyse archive arrayC))] - (in {/////analysis.#Extension extension_name (list idxA arrayA)})) + (in {/////analysis.#Extension ["" extension_name] (list idxA arrayA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 2 (list.size args)])))) @@ -726,9 +726,9 @@ :read: (typeA.check (check.clean (list) :read:)) :write: (typeA.check (check.clean (list) :write:)) arrayJT (jvm_array_type (.type_literal (array.Array' :read: :write:)))] - (in {/////analysis.#Extension extension_name (list (/////analysis.text (..signature arrayJT)) - idxA - arrayA)}))) + (in {/////analysis.#Extension ["" extension_name] (list (/////analysis.text (..signature arrayJT)) + idxA + arrayA)}))) _ (/////analysis.except ///.incorrect_arity [extension_name 2 (list.size args)])))) @@ -748,9 +748,9 @@ (analyse archive valueC)) arrayA (<| (typeA.expecting array_type) (analyse archive arrayC))] - (in {/////analysis.#Extension extension_name (list idxA - valueA - arrayA)})) + (in {/////analysis.#Extension ["" extension_name] (list idxA + valueA + arrayA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 3 (list.size args)]))))) @@ -775,10 +775,10 @@ :read: (typeA.check (check.clean (list) :read:)) :write: (typeA.check (check.clean (list) :write:)) arrayJT (jvm_array_type (.type_literal (array.Array' :read: :write:)))] - (in {/////analysis.#Extension extension_name (list (/////analysis.text (..signature arrayJT)) - idxA - valueA - arrayA)}))) + (in {/////analysis.#Extension ["" extension_name] (list (/////analysis.text (..signature arrayJT)) + idxA + valueA + arrayA)}))) _ (/////analysis.except ///.incorrect_arity [extension_name 3 (list.size args)])))) @@ -842,7 +842,7 @@ [expectedT (///.lifted meta.expected_type) [_ :object:] (check_object expectedT) _ (typeA.inference :object:)] - (in {/////analysis.#Extension extension_name (list)})) + (in {/////analysis.#Extension ["" extension_name] (list)})) _ (/////analysis.except ///.incorrect_arity [extension_name 0 (list.size args)])))) @@ -857,7 +857,7 @@ [objectT objectA] (typeA.inferring (analyse archive objectC)) _ (check_object objectT)] - (in {/////analysis.#Extension extension_name (list objectA)})) + (in {/////analysis.#Extension ["" extension_name] (list objectA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 1 (list.size args)])))) @@ -872,7 +872,7 @@ (analyse archive monitorC)) _ (check_object monitorT) exprA (analyse archive exprC)] - (in {/////analysis.#Extension extension_name (list monitorA exprA)})) + (in {/////analysis.#Extension ["" extension_name] (list monitorA exprA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 2 (list.size args)])))) @@ -892,7 +892,7 @@ (if ? (in []) (/////analysis.except non_throwable exception_class)))] - (in {/////analysis.#Extension extension_name (list exceptionA)})) + (in {/////analysis.#Extension ["" extension_name] (list exceptionA)})) _ (/////analysis.except ///.incorrect_arity [extension_name 1 (list.size args)])))) @@ -908,7 +908,7 @@ [_ (..ensure_fresh_class! class_loader class) _ (typeA.inference {.#Primitive "java.lang.Class" (list {.#Primitive class (list)})}) _ (phase.lifted (reflection!.load class_loader class))] - (in {/////analysis.#Extension extension_name (list (/////analysis.text class))})) + (in {/////analysis.#Extension ["" extension_name] (list (/////analysis.text class))})) _ (/////analysis.except ///.invalid_syntax [extension_name %.code args])) @@ -929,7 +929,7 @@ [object_class _] (check_object objectT) ? (phase.lifted (reflection!.sub? class_loader object_class sub_class))] (if ? - (in {/////analysis.#Extension extension_name (list (/////analysis.text sub_class) objectA)}) + (in {/////analysis.#Extension ["" extension_name] (list (/////analysis.text sub_class) objectA)}) (/////analysis.except cannot_possibly_be_an_instance (format sub_class " !<= " object_class)))))])) (def (class_candidate_parents class_loader from_name fromT to_name to_class) @@ -1018,9 +1018,9 @@ _ false)))))))] (if can_cast? - (in {/////analysis.#Extension extension_name (list (/////analysis.text from_name) - (/////analysis.text to_name) - fromA)}) + (in {/////analysis.#Extension ["" extension_name] (list (/////analysis.text from_name) + (/////analysis.text to_name) + fromA)}) (/////analysis.except ..cannot_cast [fromJT toJT fromC]))) _ @@ -1054,7 +1054,7 @@ (not deprecated?)) fieldT (reflection_type luxT.fresh fieldJT) _ (typeA.inference fieldT)] - (in (<| {/////analysis.#Extension extension_name} + (in (<| {/////analysis.#Extension ["" extension_name]} (list (/////analysis.text class) (/////analysis.text field) (/////analysis.text (..signature fieldJT)))))))])) @@ -1078,7 +1078,7 @@ fieldT (reflection_type luxT.fresh fieldJT) valueA (<| (typeA.expecting fieldT) (analyse archive valueC))] - (in (<| {/////analysis.#Extension extension_name} + (in (<| {/////analysis.#Extension ["" extension_name]} (list (/////analysis.text class) (/////analysis.text field) (/////analysis.text (..signature fieldJT)) @@ -1103,7 +1103,7 @@ (not deprecated?)) fieldT (reflection_type mapping fieldJT) _ (typeA.inference fieldT)] - (in (<| {/////analysis.#Extension extension_name} + (in (<| {/////analysis.#Extension ["" extension_name]} (list (/////analysis.text class) (/////analysis.text field) (/////analysis.text (..signature fieldJT)) @@ -1132,7 +1132,7 @@ fieldT (reflection_type mapping fieldJT) valueA (<| (typeA.expecting fieldT) (analyse archive valueC))] - (in (<| {/////analysis.#Extension extension_name} + (in (<| {/////analysis.#Extension ["" extension_name]} (list (/////analysis.text class) (/////analysis.text field) (/////analysis.text (..signature fieldJT)) @@ -1518,10 +1518,10 @@ (not deprecated?)) [outputT argsA] (inference.general archive analyse methodT (list#each product.right argsTC)) outputJT (check_return outputT)] - (in {/////analysis.#Extension extension_name (list.partial (/////analysis.text (..signature (jvm.class class (list)))) - (/////analysis.text method) - (/////analysis.text (..signature outputJT)) - (decorate_inputs argsT argsA))})))])) + (in {/////analysis.#Extension ["" extension_name] (list.partial (/////analysis.text (..signature (jvm.class class (list)))) + (/////analysis.text method) + (/////analysis.text (..signature outputJT)) + (decorate_inputs argsT argsA))})))])) (def (invoke::virtual class_loader) (-> java/lang/ClassLoader Handler) @@ -1542,11 +1542,11 @@ _ (undefined))] outputJT (check_return outputT)] - (in {/////analysis.#Extension extension_name (list.partial (/////analysis.text (..signature (jvm.class class (list)))) - (/////analysis.text method) - (/////analysis.text (..signature outputJT)) - objectA - (decorate_inputs argsT argsA))})))])) + (in {/////analysis.#Extension ["" extension_name] (list.partial (/////analysis.text (..signature (jvm.class class (list)))) + (/////analysis.text method) + (/////analysis.text (..signature outputJT)) + objectA + (decorate_inputs argsT argsA))})))])) (def (invoke::special class_loader) (-> java/lang/ClassLoader Handler) @@ -1567,11 +1567,11 @@ _ (undefined))] outputJT (check_return outputT)] - (in {/////analysis.#Extension extension_name (list.partial (/////analysis.text (..signature (jvm.class class (list)))) - (/////analysis.text method) - (/////analysis.text (..signature outputJT)) - objectA - (decorate_inputs argsT argsA))})))])) + (in {/////analysis.#Extension ["" extension_name] (list.partial (/////analysis.text (..signature (jvm.class class (list)))) + (/////analysis.text method) + (/////analysis.text (..signature outputJT)) + objectA + (decorate_inputs argsT argsA))})))])) (def (invoke::interface class_loader) (-> java/lang/ClassLoader Handler) @@ -1595,7 +1595,7 @@ _ (undefined))] outputJT (check_return outputT)] - (in {/////analysis.#Extension extension_name + (in {/////analysis.#Extension ["" extension_name] (list.partial (/////analysis.text (..signature (jvm.class class_name (list)))) (/////analysis.text method) (/////analysis.text (..signature outputJT)) @@ -1614,8 +1614,8 @@ _ (phase.assertion ..deprecated_method [class ..constructor_method methodT] (not deprecated?)) [outputT argsA] (inference.general archive analyse methodT (list#each product.right argsTC))] - (in {/////analysis.#Extension extension_name (list.partial (/////analysis.text (..signature (jvm.class class (list)))) - (decorate_inputs argsT argsA))})))])) + (in {/////analysis.#Extension ["" extension_name] (list.partial (/////analysis.text (..signature (jvm.class class (list)))) + (decorate_inputs argsT argsA))})))])) (def (bundle::member class_loader) (-> java/lang/ClassLoader Bundle) @@ -1745,7 +1745,7 @@ (with_template [] [(exception.def .public ( [expected actual]) (exception.Exception [(List [(Type Class) Text (Type Method)]) - (List [(Type Class) Text (Type Method)])]) + (List [(Type Class) Text (Type Method)])]) (let [%method (is (%.Format [(Type Class) Text (Type Method)]) (function (_ [super name type]) (format (..signature super) " :: " (%.text name) " " (..signature type))))] @@ -1957,8 +1957,7 @@ (with_fake_parameter abstraction)} {/////analysis.#Extension name parameters} - {/////analysis.#Extension name - (list#each with_fake_parameter parameters)})) + {/////analysis.#Extension name (list#each with_fake_parameter parameters)})) (def .public (hidden_method_body arity bodyA) (-> Nat Analysis Analysis) @@ -2584,18 +2583,18 @@ (if strict_floating_point? method.strict modifier.empty)) - ..constructor_name - false (jvm.method [variables (list#each product.right arguments) jvm.void exceptions]) - (list) - {.#Some (all _.composite - (_.aload 0) - (|> constructor_arguments - (list#each (|>> product.left ..mock_value)) - (monad.all _.monad)) - (|> (jvm.method [(list) (list#each product.left constructor_arguments) jvm.void (list)]) - (_.invokespecial super ..constructor_name)) - _.return - )}) + ..constructor_name + false (jvm.method [variables (list#each product.right arguments) jvm.void exceptions]) + (list) + {.#Some (all _.composite + (_.aload 0) + (|> constructor_arguments + (list#each (|>> product.left ..mock_value)) + (monad.all _.monad)) + (|> (jvm.method [(list) (list#each product.left constructor_arguments) jvm.void (list)]) + (_.invokespecial super ..constructor_name)) + _.return + )}) {#Overriden_Method [super name strict_floating_point? annotations variables self arguments return exceptions @@ -2605,10 +2604,10 @@ (if strict_floating_point? method.strict modifier.empty)) - name - false (jvm.method [variables (list#each product.right arguments) return exceptions]) - (list) - {.#Some (..mock_return return)}) + name + false (jvm.method [variables (list#each product.right arguments) return exceptions]) + (list) + {.#Some (..mock_return return)}) {#Virtual_Method [name privacy final? strict_floating_point? annotations variables self arguments return exceptions @@ -2621,10 +2620,10 @@ (if final? method.final modifier.empty)) - name - false (jvm.method [variables (list#each product.right arguments) return exceptions]) - (list) - {.#Some (..mock_return return)}) + name + false (jvm.method [variables (list#each product.right arguments) return exceptions]) + (list) + {.#Some (..mock_return return)}) {#Static_Method [name privacy strict_floating_point? annotations variables arguments return exceptions @@ -2635,20 +2634,20 @@ (if strict_floating_point? method.strict modifier.empty)) - name - false (jvm.method [variables (list#each product.right arguments) return exceptions]) - (list) - {.#Some (..mock_return return)}) + name + false (jvm.method [variables (list#each product.right arguments) return exceptions]) + (list) + {.#Some (..mock_return return)}) {#Abstract_Method [name privacy annotations variables arguments return exceptions]} (method.method (all modifier#composite method.abstract (..method_privacy privacy)) - name - false (jvm.method [variables (list#each product.right arguments) return exceptions]) - (list) - {.#None}) + name + false (jvm.method [variables (list#each product.right arguments) return exceptions]) + (list) + {.#None}) )) (def (mock declaration super interfaces inheritance fields methods) @@ -2710,7 +2709,7 @@ .let [supers {.#Item super_class super_interfaces}] _ (..require_complete_method_concretion class_loader supers methods) methodsA (monad.each ! (analyse_overriden_method analyse archive selfT mapping supers) methods)] - (in {/////analysis.#Extension extension_name + (in {/////analysis.#Extension ["" extension_name] (list (class_analysis super_class) (/////analysis.tuple (list#each class_analysis super_interfaces)) (/////analysis.tuple (list#each typed_analysis constructor_argsA+)) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux index f2e202be9..edde397d7 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux @@ -31,6 +31,7 @@ ["[1][0]" analysis (.only Analysis Operation Phase Handler Bundle) [evaluation (.only Eval)] ["[0]A" type]] + ["[0]" synthesis] ["[0]" generation] [/// ["[1]" phase] @@ -63,7 +64,7 @@ (<| (typeA.expecting argT) (analyse archive argC))) (list.zipped_2 inputsT+ args))] - (in {////analysis.#Extension extension_name argsA})) + (in {////analysis.#Extension ["" extension_name] argsA})) (////analysis.except ///.incorrect_arity [extension_name num_expected num_actual])))))) (def .public (nullary valueT) @@ -123,7 +124,7 @@ (list (////analysis.tuple (list#each (|>> ////analysis.nat) cases)) branch)))) (list.partial input else) - {////analysis.#Extension extension_name}))))]))) + {////analysis.#Extension ["" extension_name]}))))]))) ... "lux is" represents reference/pointer equality. (def lux::is @@ -148,7 +149,7 @@ (|> opC (analyse archive) (typeA.expecting (type_literal (-> .Any :var:))) - (at ! each (|>> list {////analysis.#Extension extension_name}))))) + (at ! each (|>> list {////analysis.#Extension ["" extension_name]}))))) _ (////analysis.except ///.incorrect_arity [extension_name 1 (list.size args)])))) @@ -274,6 +275,17 @@ (///bundle.install "clip" (trinary Nat Nat Text Text)) ))) +(def synthesis_extension + Handler + (..custom + [.any + (function (_ extension_name phase archive [it]) + (do [! ////.monad] + [it (<| (typeA.expecting synthesis.Handler) + (phase archive it)) + _ (typeA.inference .Synthesis)] + (in it)))])) + (def (generation_extension [anchor expression declaration]) (-> [Type Type Type] Handler) (..custom @@ -289,6 +301,7 @@ (-> [Type Type Type] Bundle) (<| (///bundle.prefix "extension") (|> ///bundle.empty + (///bundle.install "synthesis" synthesis_extension) (///bundle.install "generation" (generation_extension anchor,expression,declaration)) ))) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux index 1d4f70473..8a3f5727d 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type Definition Primitive) + [lux (.except Type Definition Primitive Synthesis) ["[0]" ffi (.only import)] [abstract ["[0]" monad (.only do)]] @@ -896,11 +896,11 @@ parameters) selfT {.#Primitive name (list#each product.right parameters)}] state (extension.lifted phase.state) - methods (monad.each ! (..method_definition archive super interfaces [mapping selfT] - [(the [declaration.#analysis declaration.#phase] state) - (the [declaration.#synthesis declaration.#phase] state) - ((the [declaration.#generation declaration.#phase] state) - (the [declaration.#analysis declaration.#state extension.#state] state))]) + methods (monad.each ! (let [analysis_state (the [declaration.#analysis declaration.#state extension.#state] state)] + (..method_definition archive super interfaces [mapping selfT] + [(the [declaration.#analysis declaration.#phase] state) + ((the [declaration.#synthesis declaration.#phase] state) analysis_state) + ((the [declaration.#generation declaration.#phase] state) analysis_state)])) methods) .let [all_dependencies (cache.all (list#each product.left methods))] bytecode (<| (at ! each (\\format.result class.format)) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux index b88520b8d..d7a42d308 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract ["[0]" monad (.only do)]] [control @@ -79,7 +79,7 @@ [@module (n.- (++ @artifact) 0)]) ... TODO: Inline "evaluate!'" into "evaluate!" ASAP -(def (evaluate!' archive generate code//type codeS) +(def (evaluate!' archive generation code//type codeS) (All (_ anchor expression declaration) (-> Archive (/////generation.Phase anchor expression declaration) @@ -90,7 +90,7 @@ (do phase.monad [module /////generation.module id /////generation.next - codeG (generate archive codeS) + codeG (generation archive codeS) @module (/////generation.module_id module archive) codeV (/////generation.evaluate! (..context [@module id]) [{.#None} codeG])] (in [code//type codeG codeV])))) @@ -100,21 +100,21 @@ (-> Archive Type Code (Operation anchor expression declaration [Type expression Any]))) (do phase.monad [state (///.lifted phase.state) - .let [analyse (the [/////declaration.#analysis /////declaration.#phase] state) - synthesize (the [/////declaration.#synthesis /////declaration.#phase] state) - generate ((the [/////declaration.#generation /////declaration.#phase] state) - (the [/////declaration.#analysis /////declaration.#state ///.#state] state))] + .let [analysis_state (the [/////declaration.#analysis /////declaration.#state ///.#state] state) + analysis (the [/////declaration.#analysis /////declaration.#phase] state) + synthesis ((the [/////declaration.#synthesis /////declaration.#phase] state) analysis_state) + generation ((the [/////declaration.#generation /////declaration.#phase] state) analysis_state)] [_ codeA] (<| /////declaration.lifted_analysis scope.with typeA.fresh (typeA.expecting type) - (analyse archive codeC)) + (analysis archive codeC)) codeS (/////declaration.lifted_synthesis - (synthesize archive codeA))] - (evaluate!' archive generate type codeS))) + (synthesis archive codeA))] + (evaluate!' archive generation type codeS))) ... TODO: Inline "definition'" into "definition" ASAP -(def (definition' archive generate [module name] code//type codeS) +(def (definition' archive generation [module name] code//type codeS) (All (_ anchor expression declaration) (-> Archive (/////generation.Phase anchor expression declaration) @@ -126,7 +126,7 @@ (do phase.monad [dependencies (cache/artifact.dependencies archive codeS) [interim_artifacts codeG] (/////generation.with_interim_artifacts archive - (generate archive codeS)) + (generation archive codeS)) .let [@abstraction (when codeS (/////synthesis.function/abstraction [env arity body]) (|> interim_artifacts @@ -147,10 +147,10 @@ (Operation anchor expression declaration [Type expression Any]))) (do [! phase.monad] [state (///.lifted phase.state) - .let [analyse (the [/////declaration.#analysis /////declaration.#phase] state) - synthesize (the [/////declaration.#synthesis /////declaration.#phase] state) - generate ((the [/////declaration.#generation /////declaration.#phase] state) - (the [/////declaration.#analysis /////declaration.#state ///.#state] state))] + .let [analysis_state (the [/////declaration.#analysis /////declaration.#state ///.#state] state) + analysis (the [/////declaration.#analysis /////declaration.#phase] state) + synthesis ((the [/////declaration.#synthesis /////declaration.#phase] state) analysis_state) + generation ((the [/////declaration.#generation /////declaration.#phase] state) analysis_state)] [_ code//type codeA] (/////declaration.lifted_analysis (scope.with (typeA.fresh @@ -158,22 +158,22 @@ {.#None} (do ! [[code//type codeA] (typeA.inferring - (analyse archive codeC)) + (analysis archive codeC)) code//type (typeA.check (check.clean (list) code//type))] (in [code//type codeA])) {.#Some expected} (do ! [codeA (<| (typeA.expecting expected) - (analyse archive codeC))] + (analysis archive codeC))] (in [expected codeA])))))) codeS (/////declaration.lifted_synthesis - (synthesize archive codeA))] - (definition' archive generate name code//type codeS))) + (synthesis archive codeA))] + (definition' archive generation name code//type codeS))) (with_template [ ] [... TODO: Inline "" into "" ASAP - (def ( archive generate extension codeT codeS) + (def ( archive generation extension codeT codeS) (All (_ anchor expression declaration) (-> Archive (/////generation.Phase anchor expression declaration) @@ -188,7 +188,7 @@ (do phase.monad [dependencies (cache/artifact.dependencies archive codeS) [interim_artifacts codeG] (/////generation.with_interim_artifacts archive - (generate archive codeS)) + (generation archive codeS)) @module (phase.lifted (archive.id current_module archive)) @self ( extension (list#mix set.has dependencies interim_artifacts)) [target_name value declaration] (/////generation.define! [@module @self] {.#None} [{.#None} codeG]) @@ -201,18 +201,18 @@ (Operation anchor expression declaration [expression Any]))) (do phase.monad [state (///.lifted phase.state) - .let [analyse (the [/////declaration.#analysis /////declaration.#phase] state) - synthesize (the [/////declaration.#synthesis /////declaration.#phase] state) - generate ((the [/////declaration.#generation /////declaration.#phase] state) - (the [/////declaration.#analysis /////declaration.#state ///.#state] state))] + .let [analysis_state (the [/////declaration.#analysis /////declaration.#state ///.#state] state) + analysis (the [/////declaration.#analysis /////declaration.#phase] state) + synthesis ((the [/////declaration.#synthesis /////declaration.#phase] state) analysis_state) + generation ((the [/////declaration.#generation /////declaration.#phase] state) analysis_state)] [_ codeA] (<| /////declaration.lifted_analysis scope.with typeA.fresh (typeA.expecting codeT) - (analyse archive codeC)) + (analysis archive codeC)) codeS (/////declaration.lifted_synthesis - (synthesize archive codeA))] - ( archive generate extension codeT codeS)))] + (synthesis archive codeA))] + ( archive generation extension codeT codeS)))] [analyser analyser' /////generation.learn_analyser] [synthesizer synthesizer' /////generation.learn_synthesizer] @@ -226,11 +226,12 @@ (-> Expander [Type Type Type] /////analysis.Bundle (Operation anchor expression declaration Any))) (do phase.monad [[bundle state] phase.state - .let [eval (/////analysis/evaluation.evaluator expander - (the [/////declaration.#synthesis /////declaration.#state] state) - (the [/////declaration.#generation /////declaration.#state] state) - ((the [/////declaration.#generation /////declaration.#phase] state) - (the [/////declaration.#analysis /////declaration.#state ///.#state] state))) + .let [analysis_state (the [/////declaration.#analysis /////declaration.#state ///.#state] state) + eval (/////analysis/evaluation.evaluator expander + [(the [/////declaration.#synthesis /////declaration.#state] state) + ((the [/////declaration.#synthesis /////declaration.#phase] state) analysis_state)] + [(the [/////declaration.#generation /////declaration.#state] state) + ((the [/////declaration.#generation /////declaration.#phase] state) analysis_state)]) previous_analysis_extensions (the [/////declaration.#analysis /////declaration.#state ///.#bundle] state)]] (phase.with [bundle (revised [/////declaration.#analysis /////declaration.#state] @@ -408,16 +409,6 @@ /////analysis.Handler /////analysis.Handler /////declaration.lifted_analysis ..analyser] - ["Synthesis" - def_synthesis - /////synthesis.Handler /////synthesis.Handler - /////declaration.lifted_synthesis - ..synthesizer] - ["Generation" - def_generation - (/////generation.Handler anchorT expressionT declarationT) (/////generation.Handler anchor expression declaration) - /////declaration.lifted_generation - ..generator] ["Declaration" def_declaration (/////declaration.Handler anchorT expressionT declarationT) (/////declaration.Handler anchor expression declaration) @@ -438,8 +429,6 @@ (dictionary.has "module" def_module) (dictionary.has "alias" def_alias) (dictionary.has "analysis" (def_analysis anchor,expression,declaration extender)) - (dictionary.has "synthesis" (def_synthesis anchor,expression,declaration extender)) - (dictionary.has "generation" (def_generation anchor,expression,declaration extender)) (dictionary.has "declaration" (def_declaration anchor,expression,declaration extender)) ))) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/common.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/common.lux index bc81d188e..10b7d920b 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/common.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/common.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type Label Primitive) + [lux (.except Type Label Primitive Synthesis) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/host.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/host.lux index ecb42ed93..eeb793ab2 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/host.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/generation/jvm/host.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type Primitive) + [lux (.except Type Primitive Synthesis) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/extension.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/extension.lux index 3566da9bf..321e8ca7b 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/extension.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/extension.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract ["[0]" monad (.only do)]] [data diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux index 77274bc83..4272682cb 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract [monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function.lux index c6b9dac3a..e7fa794d8 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type Label with) + [lux (.except Type Label Synthesis with) [abstract ["[0]" monad (.only do)]] [data diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/field/variable/foreign.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/field/variable/foreign.lux index b8f01c6f1..ae7170923 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/field/variable/foreign.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/field/variable/foreign.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type) + [lux (.except Type Synthesis) [data [collection ["[0]" list]]] diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/apply.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/apply.lux index ae502cbee..2efd2e739 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/apply.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/apply.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type Label) + [lux (.except Type Label Synthesis) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/init.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/init.lux index 6a2b7432e..220755282 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/init.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/init.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type type) + [lux (.except Type Synthesis type) [abstract ["[0]" monad]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/new.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/new.lux index 13dd6b6ee..fc53686f7 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/new.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/new.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type) + [lux (.except Type Synthesis) [abstract ["[0]" monad (.only do)]] [data diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/reset.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/reset.lux index fcb94a4ee..7f8154ed8 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/reset.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/function/method/reset.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type type) + [lux (.except Type Synthesis type) [data [collection ["[0]" list (.use "[1]#[0]" functor)]]] diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/loop.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/loop.lux index 495882117..a4dedf683 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/loop.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/loop.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/structure.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/structure.lux index 1dfafd509..a05e38434 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/structure.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/structure.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Variant Tuple) + [lux (.except Variant Tuple Synthesis) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/when.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/when.lux index 767a48216..e66312fbd 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/when.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm/when.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Type Label if let exec when int) + [lux (.except Type Label Synthesis if let exec when int) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux index 24c8189a3..3208a7b7d 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux @@ -1,18 +1,23 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract ["[0]" monad (.only do)]] [control ["[0]" pipe] - ["[0]" try]] + ["[0]" try] + ["[0]" exception (.only Exception)]] [data + [text + ["%" \\format]] [collection ["[0]" list (.use "[1]#[0]" functor)] ["[0]" dictionary (.only Dictionary)]]] - [meta + ["[0]" meta (.only) [macro - ["^" pattern]]]]] + ["^" pattern]] + [type + ["[0]" check]]]]] ["[0]" / ["[1][0]" function] ["[1][0]" when] @@ -20,7 +25,7 @@ ["/[1]" // ["[1][0]" extension] ["/[1]" // - ["/" synthesis (.only Synthesis Phase) + ["/" synthesis (.only Synthesis Operation Phase Extender) ["[1][0]" simple]] ["[1][0]" analysis (.only Analysis) ["[2][0]" simple] @@ -28,7 +33,9 @@ [/// ["[0]" phase (.use "[1]#[0]" monad)] [reference (.only) - [variable (.only)]]]]]]) + [variable (.only)]] + [meta + [archive (.only Archive)]]]]]]) (def (simple analysis) (-> ///simple.Simple /simple.Simple) @@ -50,8 +57,33 @@ [///simple.#Int /simple.#I64] [///simple.#Rev /simple.#I64]))) -(def (optimization archive) - Phase +(exception.def .public (not_an_extension [name expected actual]) + (Exception [Symbol Type Type]) + (exception.report + (list ["Name" (%.symbol name)] + ["Expected" (%.type expected)] + ["Actual" (%.type actual)]))) + +(def (extension_application extender lux + phase archive + name parameters) + (-> Extender Lux + (-> Extender Lux Phase) Archive + Symbol (List Analysis) + (Operation Synthesis)) + (when (|> name + meta.export + (meta.result lux)) + {try.#Success [exported? type value]} + (if (check.subsumes? .Synthesis type) + ((extender value) "" (phase extender lux) archive parameters) + (phase.except ..not_an_extension [name .Synthesis type])) + + {try.#Failure error} + (phase.failure error))) + +(def (optimization phase extender lux archive) + (-> Phase Extender Lux Phase) (function (optimization' analysis) (when analysis {///analysis.#Simple analysis'} @@ -75,22 +107,22 @@ {///analysis.#When inputA branchesAB+} (/.with_currying? false - (/when.synthesize optimization branchesAB+ archive inputA)) + (/when.synthesize (optimization phase extender lux) branchesAB+ archive inputA)) (///analysis.no_op value) (optimization' value) {///analysis.#Apply _} (/.with_currying? false - (/function.apply optimization archive analysis)) + (/function.apply (optimization phase extender lux) archive analysis)) {///analysis.#Function environmentA bodyA} - (/function.abstraction optimization environmentA archive bodyA) + (/function.abstraction (optimization phase extender lux) environmentA archive bodyA) - {///analysis.#Extension name args} + {///analysis.#Extension ["" name] args} (/.with_currying? false (function (_ state) - (|> (//extension.apply archive optimization [name args]) + (|> (//extension.apply archive (optimization phase extender lux) [name args]) (phase.result' state) (pipe.when {try.#Failure _} @@ -101,10 +133,16 @@ success success)))) + + {///analysis.#Extension name parameters} + (extension_application extender lux + (optimization phase) archive + name parameters) ))) -(def .public (phase archive analysis) - Phase - (do phase.monad - [synthesis (..optimization archive analysis)] - (phase.lifted (/variable.optimization synthesis)))) +(def .public (phase extender lux) + (-> Extender Lux Phase) + (function (phase archive analysis) + (do phase.monad + [synthesis (..optimization phase extender lux archive analysis)] + (phase.lifted (/variable.optimization synthesis))))) diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/function.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/function.lux index 95fc2cc39..7d7c30660 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/function.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/function.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract ["[0]" monad (.only do)] ["[0]" enum]] diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux index 99eddb022..4b78390ac 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/variable.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/variable.lux index 553a7e662..2ae6884e2 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/variable.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/variable.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except) + [lux (.except Synthesis) [abstract ["[0]" monad (.only do)]] [control diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/when.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/when.lux index c41a41da0..19ffdf596 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/when.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/when.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Pattern) + [lux (.except Pattern Synthesis) [abstract [equivalence (.only Equivalence)] ["[0]" monad (.only do)]] diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux b/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux index 090832274..22c0e171d 100644 --- a/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux +++ b/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except Scope #Function #Apply #locals i64) + [lux (.except Scope Synthesis #Function #Apply #locals i64) [abstract [monad (.only do)] [equivalence (.only Equivalence)] @@ -141,6 +141,7 @@ [Phase extension.Phase] [Handler extension.Handler] [Bundle extension.Bundle] + [Extender extension.Extender] ) (type .public Path diff --git a/stdlib/source/library/lux/meta/compiler/meta/cache/dependency/artifact.lux b/stdlib/source/library/lux/meta/compiler/meta/cache/dependency/artifact.lux index 26f28d451..831a6e282 100644 --- a/stdlib/source/library/lux/meta/compiler/meta/cache/dependency/artifact.lux +++ b/stdlib/source/library/lux/meta/compiler/meta/cache/dependency/artifact.lux @@ -1,7 +1,7 @@ ... https://en.wikipedia.org/wiki/Tree_shaking (.require [library - [lux (.except all) + [lux (.except Synthesis all) [abstract [hash (.only Hash)] ["[0]" monad (.only do)]] diff --git a/stdlib/source/library/lux/meta/extension.lux b/stdlib/source/library/lux/meta/extension.lux index b8c707ddf..ef086411b 100644 --- a/stdlib/source/library/lux/meta/extension.lux +++ b/stdlib/source/library/lux/meta/extension.lux @@ -64,8 +64,6 @@ )))))))))] [.any .end .and .result "lux def analysis" analysis] - [.any .end .and .result "lux def synthesis" synthesis] - ... [.any .end .and .result "lux def generation" generation] [.any .end .and .result "lux def declaration" declaration] ) @@ -97,5 +95,6 @@ (phase.failure (, g!error))) )))))))))] + [.any .end .and .result "lux extension synthesis" synthesis .Synthesis] [.any .end .and .result "lux extension generation" generation .Generation] ) diff --git a/stdlib/source/parser/lux/meta/compiler/language/lux/synthesis.lux b/stdlib/source/parser/lux/meta/compiler/language/lux/synthesis.lux index 2cb179d28..66b41582e 100644 --- a/stdlib/source/parser/lux/meta/compiler/language/lux/synthesis.lux +++ b/stdlib/source/parser/lux/meta/compiler/language/lux/synthesis.lux @@ -1,6 +1,6 @@ (.require [library - [lux (.except function loop i64 local) + [lux (.except Synthesis function loop i64 local) [abstract [monad (.only do)]] [control diff --git a/stdlib/source/test/lux/meta/extension.lux b/stdlib/source/test/lux/meta/extension.lux index 419570970..44d884440 100644 --- a/stdlib/source/test/lux/meta/extension.lux +++ b/stdlib/source/test/lux/meta/extension.lux @@ -94,14 +94,16 @@ (phase archive pass_through)) ... Synthesis + (def my_synthesis|synthesis + Synthesis + (synthesis (_ self phase archive [pass_through .any]) + (phase archive pass_through))) + (analysis (..my_synthesis self phase archive [parameters (<>.some .any)]) (let [! phase.monad] (|> parameters (monad.each ! (phase archive)) - (at ! each (|>> {analysis.#Extension self}))))) - - (synthesis (..my_synthesis self phase archive [pass_through .any]) - (phase archive pass_through)) + (at ! each (|>> {analysis.#Extension (symbol ..my_synthesis|synthesis)}))))) ... Generation (def my_generation|generation @@ -109,17 +111,19 @@ (generation (_ self phase archive [pass_through .any]) (phase archive pass_through))) - (analysis (..my_generation self phase archive [parameters (<>.some .any)]) - (let [! phase.monad] - (|> parameters - (monad.each ! (phase archive)) - (at ! each (|>> {analysis.#Extension self}))))) + (def my_generation|synthesis + Synthesis + (synthesis (_ self phase archive [parameters (<>.some .any)]) + (let [! phase.monad] + (|> parameters + (monad.each ! (phase archive)) + (at ! each (|>> {synthesis.#Extension (symbol ..my_generation|generation)})))))) - (synthesis (..my_generation self phase archive [parameters (<>.some .any)]) + (analysis (..my_generation self phase archive [parameters (<>.some .any)]) (let [! phase.monad] (|> parameters (monad.each ! (phase archive)) - (at ! each (|>> {synthesis.#Extension (symbol ..my_generation|generation)}))))) + (at ! each (|>> {analysis.#Extension (symbol ..my_generation|synthesis)}))))) (def dummy_generation|generation Generation @@ -134,11 +138,13 @@ @.php (php.string self) @.scheme (scheme.string self)))))) - (analysis (..dummy_generation self phase archive []) - (at phase.monad in {analysis.#Extension self (list)})) + (def dummy_generation|synthesis + Synthesis + (synthesis (_ self phase archive []) + (at phase.monad in {synthesis.#Extension (symbol ..dummy_generation|generation) (list)}))) - (synthesis (..dummy_generation self phase archive []) - (at phase.monad in {synthesis.#Extension (symbol ..dummy_generation|generation) (list)})) + (analysis (..dummy_generation self phase archive []) + (at phase.monad in {analysis.#Extension (symbol ..dummy_generation|synthesis) (list)})) ... Declaration (declaration (..my_declaration self phase archive [expression .any]) @@ -148,13 +154,14 @@ (type.expecting .Any) (analysis_phase archive expression)) - synthesis_phase declaration.synthesis - expressionS (declaration.lifted_synthesis - (synthesis_phase archive expressionA)) - lux (<| declaration.lifted_analysis extension.lifted meta.compiler_state) + + synthesis_phase declaration.synthesis + expressionS (declaration.lifted_synthesis + (synthesis_phase lux archive expressionA)) + generation_phase declaration.generation expressionG (declaration.lifted_generation (generation_phase lux archive expressionS)) -- cgit v1.2.3