Module: Jade::Frontend::TypeChecking::Loader

Extended by:
Loader
Included in:
Loader
Defined in:
lib/jade/frontend/type_checking/loader.rb

Instance Method Summary collapse

Instance Method Details

#add_imported_symbol(env, sym, registry) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/jade/frontend/type_checking/loader.rb', line 54

def add_imported_symbol(env, sym, registry)
  case sym
  in Symbol::ValueRef
    return env if env.bindings[sym.qualified_name]

    upstream_env = registry.get(sym.module_name)&.env
    return env unless upstream_env

    upstream_env
      .bindings[sym.qualified_name]
      &.then { env.bind(sym.qualified_name, it) } || env

  in Symbol::TypeRef
    return env if env.lookup_def(sym.qualified_name)

    Definition
      .from_symbol(sym, registry)
      .then { env.define(sym.qualified_name, it) }

  else
    env
  end
end

#load(entry, registry, env: Env.empty) ⇒ Object



7
8
9
10
11
12
13
# File 'lib/jade/frontend/type_checking/loader.rb', line 7

def load(entry, registry, env: Env.empty)
  env
    .with(entry_name: entry.name)
    .then { load_local_bindings(it, entry, registry) }
    .then { load_local_definitions(it, entry, registry) }
    .then { load_imports(it, entry, registry) }
end

#load_imports(env, entry, registry) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/jade/frontend/type_checking/loader.rb', line 44

def load_imports(env, entry, registry)
  entry
    .imports
    .reduce(env) do |e, import_entry|
      import_entry.qualified_symbols.reduce(e) do |acc, sym|
        add_imported_symbol(acc, sym, registry)
      end
    end
end

#load_local_bindings(env, entry, registry) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/jade/frontend/type_checking/loader.rb', line 15

def load_local_bindings(env, entry, registry)
  entry
    .defined_values
    .reduce(env) do |e, (_, sym)|
      case sym
      in Symbol::Function
        Type
          .from_symbol(sym, registry, e.var_gen)
          .then { Placeholder[*it] }

      else
        Type
          .from_symbol(sym, registry, e.var_gen)
          .then { Inference::Helpers.generalize(e, *it) }
      end
        .then { e.bind(sym.qualified_name, it) }
    end
end

#load_local_definitions(env, entry, registry) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/jade/frontend/type_checking/loader.rb', line 34

def load_local_definitions(env, entry, registry)
  entry
    .types
    .reduce(env) do |e, (_, sym)|
      Definition
        .from_symbol(sym, registry)
        .then { e.define(sym.qualified_name, it) }
    end
end