Module: Jade::Frontend::TypeChecking::Loader
Instance Method Summary collapse
- #add_imported_symbol(env, sym, registry) ⇒ Object
- #load(entry, registry, env: Env.empty) ⇒ Object
- #load_imports(env, entry, registry) ⇒ Object
- #load_local_bindings(env, entry, registry) ⇒ Object
- #load_local_definitions(env, entry, registry) ⇒ Object
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 |