Module: Jade::Frontend::ForwardDeclaration::InterfaceDeclaration

Extended by:
Helper, InterfaceDeclaration
Included in:
InterfaceDeclaration
Defined in:
lib/jade/frontend/forward_declaration/interface_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, _registry) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/jade/frontend/forward_declaration/interface_declaration.rb', line 27

def deep(node, entry, _registry)
  node => AST::InterfaceDeclaration(name:, functions:)

  symbol = entry.lookup_type(name)
  interface_ref = symbol.to_ref

  functions
    .map { build_interface_function(entry, interface_ref, it) }
    .then { Results.sequence(it) }
    .map do |fn_symbols|
      fn_symbols
        .reduce(entry) { |acc, fn| acc.define(fn) }
        .then { it.define(symbol.with(functions: fn_symbols)) }
    end
    .then { to_declaration_result(entry, it) }
end

#shallow(node, _registry, entry) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/jade/frontend/forward_declaration/interface_declaration.rb', line 8

def shallow(node, _registry, entry)
  node => AST::InterfaceDeclaration(name:, type_param:, functions:)

  interface_ref = Symbol.type_ref(entry.name, name)
  type_var = Symbol.var(type_param.name, type_param.range)

  functions
    .map do |fn|
      Symbol
        .interface_function(fn.name, interface_ref, [], nil, fn.range)
    end
    .then do |fn_symbols|
      Symbol.interface(name, type_var, fn_symbols, {}, node.range)
        .then { entry.define(it) }
        .then { fn_symbols.reduce(it) { |acc, fn| acc.define(fn) } }
    end
    .then { Result[it, []] }
end