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