MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
emit.cpp
Go to the documentation of this file.
1#include "mim/def.h"
2
3#include "mim/ast/ast.h"
4
5using namespace std::literals;
6
7namespace mim::ast {
8
9using Tag = Tok::Tag;
10
11class Emitter {
12public:
14 : ast_(ast) {}
15
16 AST& ast() const { return ast_; }
17 World& world() { return ast().world(); }
18 Driver& driver() { return world().driver(); }
19
20 void register_annex(AnnexInfo* annex, sub_t sub, const Def* def) {
21 if (annex) {
22 const auto& id = annex->id;
23 world().register_annex(id.plugin | (id.tag << 8) | sub, def);
24 }
25 }
26
27 absl::node_hash_map<Sigma*, fe::SymMap<size_t>, GIDHash<const Def*>> sigma2sym2idx;
28
29private:
30 AST& ast_;
31};
32
33/*
34 * Module
35 */
36
37void Module::emit(AST& ast) const {
38 auto emitter = Emitter(ast);
39 emit(emitter);
40}
41
42void Module::emit(Emitter& e) const {
43 auto _ = e.world().push(loc());
44 for (const auto& import : implicit_imports())
45 import->emit(e);
46 for (const auto& import : imports())
47 import->emit(e);
48 for (const auto& decl : decls())
49 decl->emit(e);
50}
51
52void Import::emit(Emitter& e) const { module()->emit(e); }
53
54/*
55 * Ptrn::emit_value
56 */
57
58const Def* ErrorPtrn::emit_value(Emitter&, const Def* def) const { return def; }
59
60const Def* IdPtrn::emit_value(Emitter& e, const Def* def) const {
61 emit_type(e);
62 return def_ = def->set(dbg());
63}
64
65const Def* GrpPtrn::emit_value(Emitter&, const Def* def) const { return def_ = def->set(dbg()); }
66
67const Def* AliasPtrn::emit_value(Emitter& e, const Def* def) const {
68 return def_ = ptrn()->emit_value(e, def)->set(dbg());
69}
70
71const Def* TuplePtrn::emit_value(Emitter& e, const Def* def) const {
72 auto _ = e.world().push(loc());
73 emit_type(e);
74 for (size_t i = 0, n = num_ptrns(); i != n; ++i)
75 ptrn(i)->emit_value(e, def->proj(n, i));
76 return def_ = def;
77}
78
79/*
80 * Ptrn::emit_Type
81 */
82
83const Def* ErrorPtrn::emit_type(Emitter&) const { fe::unreachable(); }
84
85const Def* IdPtrn::emit_type(Emitter& e) const {
86 auto _ = e.world().push(loc());
87 return type() ? type()->emit(e) : e.world().mut_hole_type();
88}
89
90const Def* AliasPtrn::emit_type(Emitter& e) const { return ptrn()->emit_type(e); }
91
92const Def* GrpPtrn::emit_type(Emitter& e) const { return id()->emit_type(e); }
93
94const Def* TuplePtrn::emit_type(Emitter& e) const { return emit_body(e, {}); }
95
96const Def* TuplePtrn::emit_body(Emitter& e, const Def* decl) const {
97 auto _ = e.world().push(loc());
98 auto n = num_ptrns();
99 Sigma* sigma;
100 if (decl) {
101 sigma = decl->as_mut<Sigma>();
102 } else {
103 auto type = e.world().type_infer_univ();
104 sigma = e.world().mut_sigma(type, n);
105 }
106 auto var = sigma->var();
107 auto& sym2idx = e.sigma2sym2idx[sigma];
108
109 for (size_t i = 0; i != n; ++i) {
110 sigma->set(i, ptrn(i)->emit_type(e));
111 ptrn(i)->emit_value(e, var->proj(n, i));
112 if (auto id = ptrn(i)->isa<IdPtrn>()) sym2idx[id->dbg().sym()] = i;
113 }
114
115 if (auto imm = sigma->immutabilize()) return imm;
116 return sigma;
117}
118
119const Def* TuplePtrn::emit_decl(Emitter& e, const Def* type) const {
120 auto _ = e.world().push(loc());
121 type = type ? type : e.world().type_infer_univ();
122 return e.world().mut_sigma(type, num_ptrns());
123}
124
125/*
126 * Expr
127 */
128
129const Def* Expr::emit(Emitter& e) const {
130 auto _ = e.world().push(loc());
131 return emit_(e);
132}
133
134const Def* ErrorExpr::emit_(Emitter&) const { fe::unreachable(); }
135const Def* HoleExpr::emit_(Emitter& e) const { return e.world().mut_hole_type(); }
136
137const Def* IdExpr::emit_(Emitter&) const {
138 assert(decl());
139 return decl()->def();
140}
141
142const Def* TypeExpr::emit_(Emitter& e) const {
143 auto l = level()->emit(e);
144 return e.world().type(l);
145}
146
147const Def* PrimaryExpr ::emit_(Emitter& e) const {
148 // clang-format off
149 switch (tag()) {
150 case Tag::K_Univ: return e.world().univ();
151 case Tag::K_Nat: return e.world().type_nat();
152 case Tag::K_Idx: return e.world().type_idx();
153 case Tag::K_Bool: return e.world().type_bool();
154 case Tag::K_ff: return e.world().lit_ff();
155 case Tag::K_tt: return e.world().lit_tt();
156 case Tag::K_i1: return e.world().lit_i1();
157 case Tag::K_i8: return e.world().lit_i8();
158 case Tag::K_i16: return e.world().lit_i16();
159 case Tag::K_i32: return e.world().lit_i32();
160 case Tag::K_i64: return e.world().lit_i64();
161 case Tag::K_I1: return e.world().type_i1();
162 case Tag::K_I8: return e.world().type_i8();
163 case Tag::K_I16: return e.world().type_i16();
164 case Tag::K_I32: return e.world().type_i32();
165 case Tag::K_I64: return e.world().type_i64();
166 case Tag::T_star: return e.world().type<0>();
167 case Tag::T_box: return e.world().type<1>();
168 default: fe::unreachable();
169 }
170 // clang-format on
171}
172
173const Def* LitExpr::emit_(Emitter& e) const {
174 auto t = type() ? type()->emit(e) : nullptr;
175 // clang-format off
176 switch (tag()) {
177 case Tag::L_f:
178 case Tag::L_s:
179 case Tag::L_u: return t ? e.world().lit(t, tok().lit_u()) : e.world().lit_nat(tok().lit_u());
180 case Tag::L_i: return tok().lit_i();
181 case Tag::L_c: return e.world().lit_i8(tok().lit_c());
182 case Tag::L_str: return e.world().tuple(tok().sym());
183 case Tag::T_bot: return t ? e.world().bot(t) : e.world().type_bot();
184 case Tag::T_top: return t ? e.world().top(t) : e.world().type_top();
185 default: fe::unreachable();
186 }
187 // clang-format on
188}
189
190const Def* DeclExpr::emit_(Emitter& e) const {
191 if (is_where())
192 for (const auto& decl : decls() | std::ranges::views::reverse)
193 decl->emit(e);
194 else
195 for (const auto& decl : decls())
196 decl->emit(e);
197 return expr()->emit(e);
198}
199
200const Def* ArrowExpr::emit_decl(Emitter& e, const Def* type) const {
201 return decl_ = e.world().mut_pi(type, false)->set(loc());
202}
203
204void ArrowExpr::emit_body(Emitter& e, const Def*) const {
205 decl_->set_dom(dom()->emit(e));
206 decl_->set_codom(codom()->emit(e)); // TODO try to immutabilize
207}
208
209const Def* ArrowExpr::emit_(Emitter& e) const {
210 auto d = dom()->emit(e);
211 auto c = codom()->emit(e);
212 return e.world().pi(d, c);
213}
214
215const Def* UnionExpr::emit_(Emitter& e) const {
216 DefVec etypes;
217 for (auto& t : types())
218 etypes.emplace_back(t->emit(e));
219 return e.world().join(etypes);
220}
221
222const Def* InjExpr::emit_(Emitter& e) const {
223 auto v = value()->emit(e);
224 auto t = type()->emit(e);
225 return e.world().inj(t, v);
226}
227
229 auto _ = e.world().push(loc());
230 auto dom_t = ptrn()->emit_type(e);
231 auto pi = e.world().pi(dom_t, e.world().mut_hole_type());
232 auto lam = e.world().mut_lam(pi);
233 ptrn()->emit_value(e, lam->var());
234 return lam->set(true, body()->emit(e));
235}
236
237const Def* MatchExpr::emit_(Emitter& e) const {
238 DefVec res;
239 res.emplace_back(scrutinee()->emit(e));
240 for (const auto& arm : arms())
241 res.emplace_back(arm->emit(e));
242 return e.world().match(res);
243}
244
246 pi_ = decl_ ? decl_ : e.world().mut_pi(e.world().type_infer_univ(), is_implicit());
247 auto dom_t = ptrn()->emit_type(e);
248
249 if (ret()) {
250 auto sigma = e.world().mut_sigma(2)->set(loc());
251 auto var = sigma->var()->set(ret()->loc().anew_begin());
252 sigma->set(0, dom_t);
253 ptrn()->emit_value(e, var->proj(2, 0));
254 auto ret_t = e.world().cn(ret()->emit_type(e));
255 sigma->set(1, ret_t);
256
257 if (auto imm = sigma->immutabilize())
258 dom_t = imm;
259 else
260 dom_t = sigma;
261 pi_->set_dom(dom_t);
262 } else {
263 pi_->set_dom(dom_t);
264 ptrn()->emit_value(e, pi_->var());
265 }
266}
267
268const Def* PiExpr::emit_decl(Emitter& e, const Def* type) const {
269 return dom()->decl_ = e.world().mut_pi(type, dom()->is_implicit())->set(loc());
270}
271
272void PiExpr::emit_body(Emitter& e, const Def*) const { emit(e); }
273
274const Def* PiExpr::emit_(Emitter& e) const {
275 dom()->emit_type(e);
276 auto cod = codom() ? codom()->emit(e) : e.world().type_bot();
277 return dom()->pi_->set_codom(cod);
278}
279
280const Def* LamExpr::emit_decl(Emitter& e, const Def*) const { return lam()->emit_decl(e), lam()->def(); }
281void LamExpr::emit_body(Emitter& e, const Def*) const { lam()->emit_body(e); }
282
283const Def* LamExpr::emit_(Emitter& e) const {
284 auto res = emit_decl(e, {});
285 emit_body(e, {});
286 return res;
287}
288
289const Def* AppExpr::emit_(Emitter& e) const {
290 auto c = callee()->emit(e);
291 auto a = arg()->emit(e);
292 return is_explicit() ? e.world().app(c, a) : e.world().implicit_app(c, a);
293}
294
295const Def* RetExpr::emit_(Emitter& e) const {
296 auto c = callee()->emit(e);
297 if (auto cn = Pi::has_ret_pi(c->type())) {
298 auto con = e.world().mut_lam(cn);
299 auto pair = e.world().tuple({arg()->emit(e), con});
300 auto app = e.world().app(c, pair)->set(c->loc() + arg()->loc());
301 ptrn()->emit_value(e, con->var());
302 con->set(false, body()->emit(e));
303 return app;
304 }
305
306 error(c->loc(), "callee of a ret expression must type as a returning continuation but got '{}' of type '{}'", c,
307 c->type());
308}
309
310const Def* SigmaExpr::emit_decl(Emitter& e, const Def* type) const { return ptrn()->emit_decl(e, type); }
311void SigmaExpr::emit_body(Emitter& e, const Def* decl) const { ptrn()->emit_body(e, decl); }
312const Def* SigmaExpr::emit_(Emitter& e) const { return ptrn()->emit_type(e); }
313
314const Def* TupleExpr::emit_(Emitter& e) const {
315 DefVec elems(num_elems(), [&](size_t i) { return elem(i)->emit(e); });
316 return e.world().tuple(elems);
317}
318
319const Def* SeqExpr::emit_(Emitter& e) const {
320 auto s = arity()->emit_type(e);
321 if (arity()->dbg().is_anon()) { // immutable
322 auto b = body()->emit(e);
323 return is_arr() ? e.world().arr(s, b) : e.world().pack(s, b);
324 }
325
326 auto t = e.world().type_infer_univ();
327 auto a = e.world().mut_arr(t);
328 a->set_arity(s);
329
330 if (is_arr()) {
331 auto var = a->var();
332 arity()->emit_value(e, var);
333 a->set_body(body()->emit(e));
334 if (auto imm = a->immutabilize()) return imm;
335 return a;
336 } else {
337 auto p = e.world().mut_pack(a);
338 auto var = p->var();
339 arity()->emit_value(e, var);
340 auto b = body()->emit(e);
341 a->set_body(b->type());
342 p->set(b);
343 if (auto imm = p->immutabilize()) return imm;
344 return p;
345 }
346}
347
349 auto tup = tuple()->emit(e);
350 if (auto dbg = std::get_if<Dbg>(&index())) {
351 if (auto sigma = tup->type()->isa_mut<Sigma>()) {
352 if (auto i = e.sigma2sym2idx.find(sigma); i != e.sigma2sym2idx.end()) {
353 auto sigma = i->first->as_mut<Sigma>();
354 const auto& sym2idx = i->second;
355 if (auto i = sym2idx.find(dbg->sym()); i != sym2idx.end())
356 return e.world().extract(tup, sigma->num_ops(), i->second);
357 }
358 }
359
360 if (decl()) return e.world().extract(tup, decl()->def());
361 error(dbg->loc(), "cannot resolve index '{}' for extraction", *dbg);
362 }
363
364 auto expr = std::get<Ptr<Expr>>(index()).get();
365 auto i = expr->emit(e);
366 return e.world().extract(tup, i);
367}
368
369const Def* InsertExpr::emit_(Emitter& e) const {
370 auto t = tuple()->emit(e);
371 auto i = index()->emit(e);
372 auto v = value()->emit(e);
373 return e.world().insert(t, i, v);
374}
375
376const Def* UniqExpr::emit_(Emitter& e) const { return e.world().uniq(inhabitant()->emit(e)); }
377
378/*
379 * Decl
380 */
381
382void AxmDecl::emit(Emitter& e) const {
383 mim_type_ = type()->emit(e);
384 auto& id = annex_->id;
385
386 std::tie(id.curry, id.trip) = Axm::infer_curry_and_trip(mim_type_);
387 if (curry_) {
388 if (curry_.lit_u() > id.curry)
389 error(curry_.loc(), "curry counter cannot be greater than {}", id.curry);
390 else
391 id.curry = curry_.lit_u();
392 }
393
394 if (trip_) {
395 if (trip_.lit_u() > id.curry)
396 error(trip_.loc(), "trip counter cannot be greater than curry counter '{}'", (int)id.curry);
397 else
398 id.trip = trip_.lit_u();
399 }
400
401 if (num_subs() == 0) {
402 auto norm = e.driver().normalizer(id.plugin, id.tag, 0);
403 auto axm = e.world().axm(norm, id.curry, id.trip, mim_type_, id.plugin, id.tag, 0)->set(dbg());
404 def_ = axm;
405 e.world().register_annex(id.plugin, id.tag, 0, axm);
406 } else {
407 for (sub_t i = 0, n = num_subs(); i != n; ++i) {
408 sub_t s = i + offset_;
409 auto norm = e.driver().normalizer(id.plugin, id.tag, s);
410 auto name = e.world().sym(dbg().sym().str() + "."s + sub(i).front()->dbg().sym().str());
411 auto axm = e.world().axm(norm, id.curry, id.trip, mim_type_, id.plugin, id.tag, s)->set(name);
412 e.world().register_annex(id.plugin, id.tag, s, axm);
413
414 for (const auto& alias : sub(i))
415 alias->def_ = axm;
416 }
417 }
418}
419
420void LetDecl::emit(Emitter& e) const {
421 auto v = value()->emit(e);
422 def_ = ptrn()->emit_value(e, v);
423 e.register_annex(annex_, sub_, def_);
424}
425
426void RecDecl::emit(Emitter& e) const {
427 for (auto curr = this; curr; curr = curr->next())
428 curr->emit_decl(e);
429 for (auto curr = this; curr; curr = curr->next())
430 curr->emit_body(e);
431}
432
434 auto t = type() ? type()->emit(e) : e.world().type_infer_univ();
435 def_ = body()->emit_decl(e, t);
436 def_->set(dbg());
437}
438
440 body()->emit_body(e, def_);
441 // TODO immutabilize?
442 e.register_annex(annex_, sub_, def_);
443}
444
446 lam_ = e.world().mut_lam(pi_);
447 auto var = lam_->var();
448
449 if (ret()) {
450 ptrn()->emit_value(e, var->proj(2, 0));
451 ret()->emit_value(e, var->proj(2, 1));
452 } else {
453 ptrn()->emit_value(e, var);
454 }
455
456 return lam_;
457}
458
460 auto _ = e.world().push(loc());
461 bool is_cps = tag_ == Tag::K_cn || tag_ == Tag::K_con || tag_ == Tag::K_fn || tag_ == Tag::K_fun;
462
463 // Iterate over all doms: Build a Lam for cur dom, by first building a curried Pi for the remaining doms.
464 for (size_t i = 0, n = num_doms(); i != n; ++i) {
465 for (const auto& dom : doms() | std::ranges::views::drop(i))
466 dom->emit_type(e);
467
468 auto cod = codom() ? codom()->emit(e) : is_cps ? e.world().type_bot() : e.world().mut_hole_type();
469 for (const auto& dom : doms() | std::ranges::views::drop(i) | std::ranges::views::reverse)
470 cod = dom->pi_->set_codom(cod);
471
472 auto cur = dom(i);
473 auto lam = cur->emit_value(e);
474 auto filter = cur->filter() ? cur->filter()->emit(e)
475 : i + 1 == n && is_cps ? e.world().lit_ff()
476 : e.world().lit_tt();
477 lam->set_filter(filter);
478
479 if (i == 0)
480 def_ = lam->set(dbg().sym());
481 else
482 dom(i - 1)->lam_->set_body(lam);
483 }
484}
485
487 auto b = body()->emit(e);
488 doms().back()->lam_->set_body(b);
489
490 for (const auto& dom : doms() | std::ranges::views::reverse) {
491 if (auto imm = dom->pi_->immutabilize()) {
492 auto f = dom->lam_->filter();
493 auto b = dom->lam_->body();
494 dom->lam_->unset()->set_type(imm)->as<Lam>()->set(f, b);
495 }
496 }
497
498 if (is_external()) doms().front()->lam_->make_external();
499 e.register_annex(annex_, sub_, def_);
500}
501
502void CDecl::emit(Emitter& e) const {
503 auto dom_t = dom()->emit_type(e);
504 if (tag() == Tag::K_cfun) {
505 auto ret_t = codom()->emit(e);
506 def_ = e.world().mut_fun(dom_t, ret_t)->set(dbg());
507 } else {
508 def_ = e.world().mut_con(dom_t)->set(dbg());
509 }
510}
511
512} // namespace mim::ast
static std::pair< u8, u8 > infer_curry_and_trip(const Def *type)
Definition axm.cpp:14
Base class for all Defs.
Definition def.h:216
Def * set(size_t i, const Def *)
Successively set from left to right.
Definition def.cpp:244
T * as_mut() const
Asserts that this is a mutable, casts constness away and performs a static_cast to T.
Definition def.h:454
const Def * var(nat_t a, nat_t i) noexcept
Definition def.h:394
Some "global" variables needed all over the place.
Definition driver.h:17
A function.
Definition lam.h:107
static const Pi * has_ret_pi(const Def *d)
Yields the Pi::ret_pi() of d, if it is in fact a Pi.
Definition lam.h:56
A dependent tuple type.
Definition tuple.h:20
const Def * immutabilize() final
Tries to make an immutable from a mutable.
Definition def.cpp:192
Sigma * set(size_t i, const Def *def)
Definition tuple.h:32
The World represents the whole program and manages creation of MimIR nodes (Defs).
Definition world.h:34
const Driver & driver() const
Definition world.h:83
const Def * register_annex(flags_t f, const Def *)
Definition world.cpp:77
World & world()
Definition ast.h:61
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:67
Dbg dbg() const
Definition ast.h:276
const Def * emit_type(Emitter &) const override
Definition emit.cpp:90
const Ptrn * ptrn() const
Definition ast.h:275
const Def * emit_(Emitter &) const override
Definition emit.cpp:289
bool is_explicit() const
Definition ast.h:652
const Expr * arg() const
Definition ast.h:654
const Expr * callee() const
Definition ast.h:653
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:204
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:200
const Def * emit_(Emitter &) const override
Definition emit.cpp:209
void emit(Emitter &) const override
Definition emit.cpp:382
const Expr * type() const
Definition ast.h:890
Tok trip() const
Definition ast.h:893
size_t num_subs() const
Definition ast.h:888
Tok curry() const
Definition ast.h:892
Dbg dbg() const
Definition ast.h:886
const auto & sub(size_t i) const
Definition ast.h:889
Tok::Tag tag() const
Definition ast.h:1022
const Ptrn * dom() const
Definition ast.h:1023
void emit(Emitter &) const override
Definition emit.cpp:502
const Expr * codom() const
Definition ast.h:1024
Dbg dbg() const
Definition ast.h:1021
const Expr * expr() const
Definition ast.h:420
const Def * emit_(Emitter &) const override
Definition emit.cpp:190
const auto & decls() const
Definition ast.h:418
bool is_where() const
Definition ast.h:419
const Def * def_
Definition ast.h:173
const Def * def() const
Definition ast.h:170
AST & ast() const
Definition emit.cpp:16
World & world()
Definition emit.cpp:17
Emitter(AST &ast)
Definition emit.cpp:13
void register_annex(AnnexInfo *annex, sub_t sub, const Def *def)
Definition emit.cpp:20
absl::node_hash_map< Sigma *, fe::SymMap< size_t >, GIDHash< const Def * > > sigma2sym2idx
Definition emit.cpp:27
Driver & driver()
Definition emit.cpp:18
const Def * emit_(Emitter &) const override
Definition emit.cpp:134
const Def * emit_type(Emitter &) const override
Definition emit.cpp:83
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:58
const Def * emit(Emitter &) const
Definition emit.cpp:129
virtual void emit_body(Emitter &, const Def *) const
Definition ast.h:158
virtual const Def * emit_(Emitter &) const =0
virtual const Def * emit_decl(Emitter &, const Def *) const
Definition ast.h:157
const Decl * decl() const
Definition ast.h:775
const Def * emit_(Emitter &) const override
Definition emit.cpp:348
const auto & index() const
Definition ast.h:774
const Expr * tuple() const
Definition ast.h:773
const Def * emit_type(Emitter &) const override
Definition emit.cpp:92
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:65
Dbg dbg() const
Definition ast.h:254
const IdPtrn * id() const
Definition ast.h:255
const Def * emit_(Emitter &) const override
Definition emit.cpp:135
const Def * emit_(Emitter &) const override
Definition emit.cpp:137
const Decl * decl() const
Definition ast.h:355
const Def * emit_type(Emitter &) const override
Definition emit.cpp:85
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:60
Dbg dbg() const
Definition ast.h:224
const Expr * type() const
Definition ast.h:225
void emit(Emitter &) const
Definition emit.cpp:52
const Module * module() const
Definition ast.h:1051
const Def * emit_(Emitter &) const override
Definition emit.cpp:222
const Expr * type() const
Definition ast.h:482
const Expr * value() const
Definition ast.h:481
const Expr * index() const
Definition ast.h:798
const Expr * tuple() const
Definition ast.h:797
const Def * emit_(Emitter &) const override
Definition emit.cpp:369
const Expr * value() const
Definition ast.h:799
Lam * emit_value(Emitter &) const
Definition emit.cpp:445
bool is_external() const
Definition ast.h:990
const Ptrs< Dom > & doms() const
Definition ast.h:991
const Expr * codom() const
Definition ast.h:994
void emit_decl(Emitter &) const override
Definition emit.cpp:459
size_t num_doms() const
Definition ast.h:993
void emit_body(Emitter &) const override
Definition emit.cpp:486
const Dom * dom(size_t i) const
Definition ast.h:992
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:281
const Def * emit_(Emitter &) const override
Definition emit.cpp:283
const LamDecl * lam() const
Definition ast.h:630
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:280
const Expr * value() const
Definition ast.h:843
const Ptrn * ptrn() const
Definition ast.h:842
void emit(Emitter &) const override
Definition emit.cpp:420
Tok tok() const
Definition ast.h:395
const Expr * type() const
Definition ast.h:397
const Def * emit_(Emitter &) const override
Definition emit.cpp:173
Tok::Tag tag() const
Definition ast.h:396
Lam * emit(Emitter &) const
Definition emit.cpp:228
const Expr * body() const
Definition ast.h:507
const Ptrn * ptrn() const
Definition ast.h:506
const Def * emit_(Emitter &) const override
Definition emit.cpp:237
const Expr * scrutinee() const
Definition ast.h:523
const Arm * arm(size_t i) const
Definition ast.h:525
const auto & arms() const
Definition ast.h:524
const auto & decls() const
Definition ast.h:1079
void emit(AST &) const
Definition emit.cpp:37
const auto & implicit_imports() const
Definition ast.h:1077
const auto & imports() const
Definition ast.h:1078
Loc loc() const
Definition ast.h:122
virtual void emit_type(Emitter &) const
Definition emit.cpp:245
const IdPtrn * ret() const
Definition ast.h:579
bool is_implicit() const
Definition ast.h:577
const Ptrn * ptrn() const
Definition ast.h:578
const Def * emit_(Emitter &) const override
Definition emit.cpp:274
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:268
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:272
Tok::Tag tag() const
Definition ast.h:376
virtual const Def * emit_value(Emitter &, const Def *) const =0
virtual const Def * emit_type(Emitter &) const =0
void emit(Emitter &) const override
Definition emit.cpp:426
Dbg dbg() const
Definition ast.h:920
virtual void emit_body(Emitter &) const
Definition emit.cpp:439
virtual void emit_decl(Emitter &) const
Definition emit.cpp:433
const Expr * body() const
Definition ast.h:922
const Expr * type() const
Definition ast.h:921
const Ptrn * ptrn() const
Definition ast.h:677
const Expr * arg() const
Definition ast.h:679
const Def * emit_(Emitter &) const override
Definition emit.cpp:295
const Expr * body() const
Definition ast.h:680
const Expr * callee() const
Definition ast.h:678
const Expr * body() const
Definition ast.h:748
const IdPtrn * arity() const
Definition ast.h:747
bool is_arr() const
Definition ast.h:746
const Def * emit_(Emitter &) const override
Definition emit.cpp:319
const TuplePtrn * ptrn() const
Definition ast.h:702
const Def * emit_(Emitter &) const override
Definition emit.cpp:312
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:311
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:310
const Lit * lit_i() const
Definition tok.h:164
const Expr * elem(size_t i) const
Definition ast.h:725
const Def * emit_(Emitter &) const override
Definition emit.cpp:314
const auto & elems() const
Definition ast.h:724
size_t num_elems() const
Definition ast.h:726
const Ptrn * ptrn(size_t i) const
Definition ast.h:304
const Def * emit_type(Emitter &) const override
Definition emit.cpp:94
const Def * emit_decl(Emitter &, const Def *type) const
Definition emit.cpp:119
size_t num_ptrns() const
Definition ast.h:305
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:71
const Def * emit_body(Emitter &, const Def *decl) const
Definition emit.cpp:96
const Def * emit_(Emitter &) const override
Definition emit.cpp:142
const Expr * level() const
Definition ast.h:440
const auto & types() const
Definition ast.h:460
const Def * emit_(Emitter &) const override
Definition emit.cpp:215
const Expr * inhabitant() const
Definition ast.h:819
const Def * emit_(Emitter &) const override
Definition emit.cpp:376
Definition ast.h:14
Tok::Tag Tag
Definition bind.cpp:7
Vector< const Def * > DefVec
Definition def.h:52
u8 sub_t
Definition types.h:48
void error(Loc loc, const char *f, Args &&... args)
Definition dbg.h:125
constexpr decltype(auto) get(Span< T, N > span) noexcept
Definition span.h:115
struct mim::ast::AnnexInfo::@177100250272201136376142224053244231100060214216 id