Module: Jade::Frontend
- Extended by:
- Frontend
- Included in:
- Frontend
- Defined in:
- lib/jade/frontend.rb,
lib/jade/frontend/desugaring.rb,
lib/jade/frontend/fixity_fixer.rb,
lib/jade/frontend/type_checking.rb,
lib/jade/frontend/usage_analysis.rb,
lib/jade/frontend/unused_analysis.rb,
lib/jade/frontend/comment_attacher.rb,
lib/jade/frontend/pattern_analysis.rb,
lib/jade/frontend/semantic_analysis.rb,
lib/jade/frontend/type_checking/env.rb,
lib/jade/frontend/desugaring/resolved.rb,
lib/jade/frontend/forward_declaration.rb,
lib/jade/frontend/type_checking/state.rb,
lib/jade/frontend/type_checking/loader.rb,
lib/jade/frontend/type_checking/result.rb,
lib/jade/frontend/type_checking/scheme.rb,
lib/jade/frontend/type_checking/var_gen.rb,
lib/jade/frontend/desugaring/placeholder.rb,
lib/jade/frontend/semantic_analysis/body.rb,
lib/jade/frontend/semantic_analysis/list.rb,
lib/jade/frontend/type_checking/expected.rb,
lib/jade/frontend/pattern_analysis/matrix.rb,
lib/jade/frontend/semantic_analysis/error.rb,
lib/jade/frontend/semantic_analysis/tuple.rb,
lib/jade/frontend/forward_declaration/body.rb,
lib/jade/frontend/semantic_analysis/assign.rb,
lib/jade/frontend/semantic_analysis/helper.rb,
lib/jade/frontend/semantic_analysis/lambda.rb,
lib/jade/frontend/type_checking/definition.rb,
lib/jade/frontend/semantic_analysis/case_of.rb,
lib/jade/frontend/semantic_analysis/literal.rb,
lib/jade/frontend/type_checking/constraints.rb,
lib/jade/frontend/type_checking/generalizer.rb,
lib/jade/frontend/type_checking/placeholder.rb,
lib/jade/frontend/type_checking/unification.rb,
lib/jade/frontend/forward_declaration/helper.rb,
lib/jade/frontend/forward_declaration/module.rb,
lib/jade/frontend/semantic_analysis/grouping.rb,
lib/jade/frontend/type_checking/canonicalize.rb,
lib/jade/frontend/type_checking/substitution.rb,
lib/jade/frontend/type_checking/instantiation.rb,
lib/jade/frontend/semantic_analysis/keyed_call.rb,
lib/jade/frontend/type_checking/generalization.rb,
lib/jade/frontend/type_checking/inference/body.rb,
lib/jade/frontend/type_checking/inference/list.rb,
lib/jade/frontend/semantic_analysis/module_node.rb,
lib/jade/frontend/type_checking/port_resolution.rb,
lib/jade/frontend/semantic_analysis/char_literal.rb,
lib/jade/frontend/semantic_analysis/if_then_else.rb,
lib/jade/frontend/semantic_analysis/pattern_list.rb,
lib/jade/frontend/semantic_analysis/record_field.rb,
lib/jade/frontend/type_checking/inference/assign.rb,
lib/jade/frontend/type_checking/inference/lambda.rb,
lib/jade/frontend/type_checking/inference/module.rb,
lib/jade/frontend/usage_analysis/reference_index.rb,
lib/jade/frontend/pattern_analysis/exhaustiveness.rb,
lib/jade/frontend/semantic_analysis/function_call.rb,
lib/jade/frontend/semantic_analysis/member_access.rb,
lib/jade/frontend/semantic_analysis/record_access.rb,
lib/jade/frontend/semantic_analysis/record_update.rb,
lib/jade/frontend/type_checking/inference/case_of.rb,
lib/jade/frontend/type_checking/inference/helpers.rb,
lib/jade/frontend/type_checking/inference/literal.rb,
lib/jade/frontend/type_checking/inference/pattern.rb,
lib/jade/frontend/semantic_analysis/case_of_branch.rb,
lib/jade/frontend/semantic_analysis/implementation.rb,
lib/jade/frontend/semantic_analysis/pattern_record.rb,
lib/jade/frontend/semantic_analysis/record_literal.rb,
lib/jade/frontend/type_checking/inference/grouping.rb,
lib/jade/frontend/semantic_analysis/pattern_binding.rb,
lib/jade/frontend/semantic_analysis/pattern_literal.rb,
lib/jade/frontend/type_checking/error/type_mismatch.rb,
lib/jade/frontend/forward_declaration/implementation.rb,
lib/jade/frontend/semantic_analysis/pattern_wildcard.rb,
lib/jade/frontend/semantic_analysis/qualified_access.rb,
lib/jade/frontend/semantic_analysis/type_declaration.rb,
lib/jade/frontend/type_checking/constraints/deriving.rb,
lib/jade/frontend/forward_declaration/error/bad_import.rb,
lib/jade/frontend/forward_declaration/type_declaration.rb,
lib/jade/frontend/semantic_analysis/import_declaration.rb,
lib/jade/frontend/semantic_analysis/struct_declaration.rb,
lib/jade/frontend/semantic_analysis/variable_reference.rb,
lib/jade/frontend/type_checking/error/missing_patterns.rb,
lib/jade/frontend/type_checking/inference/if_then_else.rb,
lib/jade/frontend/type_checking/inference/record_field.rb,
lib/jade/frontend/semantic_analysis/error/missing_field.rb,
lib/jade/frontend/semantic_analysis/error/non_task_port.rb,
lib/jade/frontend/semantic_analysis/error/unknown_field.rb,
lib/jade/frontend/semantic_analysis/pattern_constructor.rb,
lib/jade/frontend/semantic_analysis/variant_declaration.rb,
lib/jade/frontend/type_checking/constraints/deriving/eq.rb,
lib/jade/frontend/type_checking/error/derivation_failed.rb,
lib/jade/frontend/type_checking/inference/function_call.rb,
lib/jade/frontend/type_checking/inference/record_access.rb,
lib/jade/frontend/type_checking/inference/record_update.rb,
lib/jade/frontend/forward_declaration/import_declaration.rb,
lib/jade/frontend/forward_declaration/struct_declaration.rb,
lib/jade/frontend/semantic_analysis/function_declaration.rb,
lib/jade/frontend/type_checking/error/port_not_decodable.rb,
lib/jade/frontend/type_checking/inference/implementation.rb,
lib/jade/frontend/type_checking/inference/record_literal.rb,
lib/jade/frontend/semantic_analysis/constructor_reference.rb,
lib/jade/frontend/semantic_analysis/error/duplicate_field.rb,
lib/jade/frontend/semantic_analysis/error/shadowing_error.rb,
lib/jade/frontend/semantic_analysis/interface_declaration.rb,
lib/jade/frontend/semantic_analysis/keyed_call/validation.rb,
lib/jade/frontend/forward_declaration/error/type_not_found.rb,
lib/jade/frontend/forward_declaration/function_declaration.rb,
lib/jade/frontend/semantic_analysis/error/circular_extends.rb,
lib/jade/frontend/semantic_analysis/error/module_not_found.rb,
lib/jade/frontend/semantic_analysis/error/nested_task_port.rb,
lib/jade/frontend/type_checking/inference/qualified_access.rb,
lib/jade/frontend/type_checking/inference/type_declaration.rb,
lib/jade/frontend/forward_declaration/interface_declaration.rb,
lib/jade/frontend/semantic_analysis/error/value_not_exposed.rb,
lib/jade/frontend/semantic_analysis/implementation_function.rb,
lib/jade/frontend/type_checking/error/pattern_type_mismatch.rb,
lib/jade/frontend/type_checking/error/unresolved_constraint.rb,
lib/jade/frontend/forward_declaration/error/module_not_found.rb,
lib/jade/frontend/semantic_analysis/error/type_args_mismatch.rb,
lib/jade/frontend/semantic_analysis/error/undefined_variable.rb,
lib/jade/frontend/semantic_analysis/error/variable_not_found.rb,
lib/jade/frontend/type_checking/constraints/deriving/helpers.rb,
lib/jade/frontend/type_checking/error/missing_implementation.rb,
lib/jade/frontend/type_checking/inference/import_declaration.rb,
lib/jade/frontend/type_checking/inference/struct_declaration.rb,
lib/jade/frontend/type_checking/inference/variable_reference.rb,
lib/jade/frontend/forward_declaration/implementation_function.rb,
lib/jade/frontend/semantic_analysis/error/type_param_required.rb,
lib/jade/frontend/type_checking/error/if_branch_type_mismatch.rb,
lib/jade/frontend/type_checking/error/list_item_type_mismatch.rb,
lib/jade/frontend/forward_declaration/error/type_not_lowerable.rb,
lib/jade/frontend/semantic_analysis/interop_import_declaration.rb,
lib/jade/frontend/type_checking/constraints/deriving/decodable.rb,
lib/jade/frontend/type_checking/constraints/deriving/encodable.rb,
lib/jade/frontend/type_checking/inference/function_declaration.rb,
lib/jade/frontend/semantic_analysis/error/constant_not_callable.rb,
lib/jade/frontend/semantic_analysis/error/constructor_not_found.rb,
lib/jade/frontend/semantic_analysis/error/orphan_implementation.rb,
lib/jade/frontend/semantic_analysis/error/unbound_type_variable.rb,
lib/jade/frontend/type_checking/error/if_branches_type_mismatch.rb,
lib/jade/frontend/type_checking/inference/constructor_reference.rb,
lib/jade/frontend/type_checking/inference/interface_declaration.rb,
lib/jade/frontend/forward_declaration/error/tuple_arity_overflow.rb,
lib/jade/frontend/forward_declaration/interop_import_declaration.rb,
lib/jade/frontend/semantic_analysis/error/duplicate_record_field.rb,
lib/jade/frontend/type_checking/error/if_condition_type_mismatch.rb,
lib/jade/frontend/semantic_analysis/error/missing_exposing_clause.rb,
lib/jade/frontend/type_checking/error/function_body_type_mismatch.rb,
lib/jade/frontend/type_checking/error/function_call_type_mismatch.rb,
lib/jade/frontend/type_checking/error/record_access_type_mismatch.rb,
lib/jade/frontend/forward_declaration/error/exposed_type_not_found.rb,
lib/jade/frontend/forward_declaration/error/private_type_expansion.rb,
lib/jade/frontend/type_checking/error/implementation_type_mismatch.rb,
lib/jade/frontend/forward_declaration/error/exposed_value_not_found.rb,
lib/jade/frontend/semantic_analysis/error/invalid_list_rest_pattern.rb,
lib/jade/frontend/semantic_analysis/error/kwargs_on_non_constructor.rb,
lib/jade/frontend/semantic_analysis/error/predicate_must_return_bool.rb,
lib/jade/frontend/semantic_analysis/error/predicate_name_not_allowed.rb,
lib/jade/frontend/type_checking/error/case_of_branches_type_mismatch.rb,
lib/jade/frontend/type_checking/inference/interop_import_declaration.rb,
lib/jade/frontend/forward_declaration/error/unknown_extends_interface.rb,
lib/jade/frontend/semantic_analysis/error/unused_interface_type_param.rb,
lib/jade/frontend/semantic_analysis/error/duplicate_function_declaration.rb,
lib/jade/frontend/semantic_analysis/error/missing_extends_implementation.rb,
lib/jade/frontend/semantic_analysis/error/missing_implementation_function.rb,
lib/jade/frontend/semantic_analysis/error/unknown_implementation_function.rb,
lib/jade/frontend/semantic_analysis/error/constructor_pattern_arity_mismatch.rb
Defined Under Namespace
Modules: CommentAttacher, Desugaring, FixityFixer, ForwardDeclaration, PatternAnalysis, SemanticAnalysis, TypeChecking, UnusedAnalysis, UsageAnalysis
Instance Method Summary collapse
- #entry_with_basics(ast) ⇒ Object
- #run(ast) ⇒ Object
-
#run_entry(initial, registry) ⇒ Object
On error, wraps the failure as ‘[latest_processed_entry, errors]` so tolerant callers can recover the AST as of the last successful stage instead of falling back to the original pre-frontend entry.
- #run_repl(ast, registry, current_entry, scope, env, var_gen) ⇒ Object
- #run_up_to_semantic_analysis(ast) ⇒ Object
Instance Method Details
#entry_with_basics(ast) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/jade/frontend.rb', line 85 def entry_with_basics(ast) entry = case ast in AST::Module(name:) name else '__Test__' end .then { Registry.entry(it).with(ast:) } Stdlib.load(Registry.new) .add_module(entry) .then { Stdlib.apply(it) } .then { [it, it.modules[entry.name]] } end |
#run(ast) ⇒ Object
40 41 42 43 44 45 46 47 |
# File 'lib/jade/frontend.rb', line 40 def run(ast) run_up_to_semantic_analysis(ast) .and_then do |(entry, registry)| TypeChecking .check(entry, registry) .map { [it.ast, registry.update_module(it)] } end end |
#run_entry(initial, registry) ⇒ Object
On error, wraps the failure as ‘[latest_processed_entry, errors]` so tolerant callers can recover the AST as of the last successful stage instead of falling back to the original pre-frontend entry.
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/jade/frontend.rb', line 24 def run_entry(initial, registry) latest = initial capture = ->(entry) { latest = entry } initial .then { FixityFixer.fix_entry(it).tap(&capture) } .then { Desugaring.desugar_entry(it).tap(&capture) } .then { ForwardDeclaration.declare_entry(it, registry).map { it.tap(&capture) } } .and_then { SemanticAnalysis.analyze(it, registry.update_module(it)).map { it.tap(&capture) } } .map { Desugaring.desugar_resolved_entry(it, registry.update_module(it)).tap(&capture) } .map { UsageAnalysis.analyze(it, registry.update_module(it)).tap(&capture) } .map { UnusedAnalysis.analyze(it, registry.update_module(it)).tap(&capture) } .and_then { TypeChecking.check(it, registry.update_module(it)).map { it.tap(&capture) } } .map_error { |errs| [latest, errs] } end |
#run_repl(ast, registry, current_entry, scope, env, var_gen) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/jade/frontend.rb', line 49 def run_repl(ast, registry, current_entry, scope, env, var_gen) registry ||= registry_with_basics current_entry ||= entry_with_basics('JadeRepl') scope ||= SemanticAnalysis::Scope.new env ||= TypeChecking::Env.new var_gen ||= TypeChecking::VarGen.new ForwardDeclaration .declare(ast, registry, current_entry) .then { |entry| FixityFixer.fix(ast).then { [it, entry] } } .then do |fixed_ast, updated_entry| updated_registry = registry.update_module(updated_entry) SemanticAnalysis .analyze_repl(fixed_ast, updated_registry, scope, updated_entry) .and_then do |(enhanced_ast, new_scope)| enhanced_ast = Desugaring.desugar_resolved(enhanced_ast, updated_registry) TypeChecking.check_repl(enhanced_ast, updated_registry, env, var_gen) .map { |type, new_env| [enhanced_ast, type, updated_registry, updated_entry, new_scope, new_env] } end end end |
#run_up_to_semantic_analysis(ast) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/jade/frontend.rb', line 71 def run_up_to_semantic_analysis(ast) registry, current_entry = entry_with_basics(ast) FixityFixer.fix(ast) .then { Desugaring.desugar(it) } .then { |enh_ast| ForwardDeclaration.declare(enh_ast, registry, current_entry).map { [enh_ast, it] } } .and_then do |enh_ast, entry| SemanticAnalysis.analyze(entry.with(ast: enh_ast), registry.update_module(entry)) end .map { Desugaring.desugar_resolved_entry(it, registry.update_module(it)) } .map { UsageAnalysis.analyze(it, registry.update_module(it)) } .map { [it, registry.update_module(it)] } end |