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

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