Module: Jade::Frontend::ForwardDeclaration::TypeDeclaration

Extended by:
Helper, TypeDeclaration
Included in:
TypeDeclaration
Defined in:
lib/jade/frontend/forward_declaration/type_declaration.rb

Instance Method Summary collapse

Methods included from Helper

deep_declare_node, figure_out_type, shallow_declare_node

Instance Method Details

#deep(node, entry, _) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/jade/frontend/forward_declaration/type_declaration.rb', line 20

def deep(node, entry, _)
  node => AST::TypeDeclaration(name:, variants:)

  symbol = entry.lookup_type(name)

  variants
    .map do |var|
      var.args.map { figure_out_type(entry, it) }
        .then { Results.sequence(it) }
        .map { Symbol.constructor(var.name, it, symbol.to_ref, var.range) }
    end
    .then { Results.sequence(it) }
    .map do |variant_symbols|
      variant_symbols
        .reduce(entry) { |acc_entry, sym| acc_entry.define(sym) }
        .then { it.define(symbol.with(variants: variant_symbols.map(&:to_ref))) }
    end
    .then { to_declaration_result(entry, it) }
end

#shallow(node, registry, entry) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/jade/frontend/forward_declaration/type_declaration.rb', line 8

def shallow(node, registry, entry)
  node => AST::TypeDeclaration(name:, type_params:, variants:)

  predeclared_variants = variants
    .map { |var| Symbol.predeclared_constructor(var.name, var.range) }

  type_params.map { Symbol.var(it.name, it.range) }
    .then { Symbol.union(name, it, predeclared_variants, node.range) }
    .then { entry.define(it) }
    .then { Result[it, []] }
end