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()) import->emit(e);
45 for (const auto& import : imports()) import->emit(e);
46 for (const auto& decl : decls()) decl->emit(e);
47}
48
49void Import::emit(Emitter& e) const { module()->emit(e); }
50
51/*
52 * Ptrn::emit_value
53 */
54
55const Def* ErrorPtrn::emit_value(Emitter&, const Def* def) const { return def; }
56
57const Def* IdPtrn::emit_value(Emitter& e, const Def* def) const {
58 emit_type(e);
59 return def_ = def->set(dbg());
60}
61
62const Def* GrpPtrn::emit_value(Emitter&, const Def* def) const { return def_ = def->set(dbg()); }
63
64const Def* AliasPtrn::emit_value(Emitter& e, const Def* def) const {
65 return def_ = ptrn()->emit_value(e, def)->set(dbg());
66}
67
68const Def* TuplePtrn::emit_value(Emitter& e, const Def* def) const {
69 auto _ = e.world().push(loc());
70 emit_type(e);
71 for (size_t i = 0, n = num_ptrns(); i != n; ++i) ptrn(i)->emit_value(e, def->proj(n, i));
72 return def_ = def;
73}
74
75/*
76 * Ptrn::emit_Type
77 */
78
79const Def* ErrorPtrn::emit_type(Emitter&) const { fe::unreachable(); }
80
81const Def* IdPtrn::emit_type(Emitter& e) const {
82 auto _ = e.world().push(loc());
83 return type() ? type()->emit(e) : e.world().mut_hole_type();
84}
85
86const Def* AliasPtrn::emit_type(Emitter& e) const { return ptrn()->emit_type(e); }
87
88const Def* GrpPtrn::emit_type(Emitter& e) const { return id()->emit_type(e); }
89
90const Def* TuplePtrn::emit_type(Emitter& e) const { return emit_body(e, {}); }
91
92const Def* TuplePtrn::emit_body(Emitter& e, const Def* decl) const {
93 auto _ = e.world().push(loc());
94 auto n = num_ptrns();
95 Sigma* sigma;
96 if (decl) {
97 sigma = decl->as_mut<Sigma>();
98 } else {
99 auto type = e.world().type_infer_univ();
100 sigma = e.world().mut_sigma(type, n);
101 }
102 auto var = sigma->var();
103 auto& sym2idx = e.sigma2sym2idx[sigma];
104
105 for (size_t i = 0; i != n; ++i) {
106 sigma->set(i, ptrn(i)->emit_type(e));
107 ptrn(i)->emit_value(e, var->proj(n, i));
108 if (auto id = ptrn(i)->isa<IdPtrn>()) sym2idx[id->dbg().sym()] = i;
109 }
110
111 if (auto imm = sigma->immutabilize()) return imm;
112 return sigma;
113}
114
115const Def* TuplePtrn::emit_decl(Emitter& e, const Def* type) const {
116 auto _ = e.world().push(loc());
117 type = type ? type : e.world().type_infer_univ();
118 return e.world().mut_sigma(type, num_ptrns());
119}
120
121/*
122 * Expr
123 */
124
125const Def* Expr::emit(Emitter& e) const {
126 auto _ = e.world().push(loc());
127 return emit_(e);
128}
129
130const Def* ErrorExpr::emit_(Emitter&) const { fe::unreachable(); }
131const Def* HoleExpr::emit_(Emitter& e) const { return e.world().mut_hole_type(); }
132
133const Def* IdExpr::emit_(Emitter&) const {
134 assert(decl());
135 return decl()->def();
136}
137
138const Def* TypeExpr::emit_(Emitter& e) const {
139 auto l = level()->emit(e);
140 return e.world().type(l);
141}
142
143const Def* PrimaryExpr ::emit_(Emitter& e) const {
144 // clang-format off
145 switch (tag()) {
146 case Tag::K_Univ: return e.world().univ();
147 case Tag::K_Nat: return e.world().type_nat();
148 case Tag::K_Idx: return e.world().type_idx();
149 case Tag::K_Bool: return e.world().type_bool();
150 case Tag::K_ff: return e.world().lit_ff();
151 case Tag::K_tt: return e.world().lit_tt();
152 case Tag::K_i1: return e.world().lit_i1();
153 case Tag::K_i8: return e.world().lit_i8();
154 case Tag::K_i16: return e.world().lit_i16();
155 case Tag::K_i32: return e.world().lit_i32();
156 case Tag::K_i64: return e.world().lit_i64();
157 case Tag::K_I1: return e.world().type_i1();
158 case Tag::K_I8: return e.world().type_i8();
159 case Tag::K_I16: return e.world().type_i16();
160 case Tag::K_I32: return e.world().type_i32();
161 case Tag::K_I64: return e.world().type_i64();
162 case Tag::T_star: return e.world().type<0>();
163 case Tag::T_box: return e.world().type<1>();
164 default: fe::unreachable();
165 }
166 // clang-format on
167}
168
169const Def* LitExpr::emit_(Emitter& e) const {
170 auto t = type() ? type()->emit(e) : nullptr;
171 // clang-format off
172 switch (tag()) {
173 case Tag::L_f:
174 case Tag::L_s:
175 case Tag::L_u: return t ? e.world().lit(t, tok().lit_u()) : e.world().lit_nat(tok().lit_u());
176 case Tag::L_i: return tok().lit_i();
177 case Tag::L_c: return e.world().lit_i8(tok().lit_c());
178 case Tag::L_str: return e.world().tuple(tok().sym());
179 case Tag::T_bot: return t ? e.world().bot(t) : e.world().type_bot();
180 case Tag::T_top: return t ? e.world().top(t) : e.world().type_top();
181 default: fe::unreachable();
182 }
183 // clang-format on
184}
185
186const Def* DeclExpr::emit_(Emitter& e) const {
187 if (is_where())
188 for (const auto& decl : decls() | std::ranges::views::reverse) decl->emit(e);
189 else
190 for (const auto& decl : decls()) decl->emit(e);
191 return expr()->emit(e);
192}
193
194const Def* ArrowExpr::emit_decl(Emitter& e, const Def* type) const {
195 return decl_ = e.world().mut_pi(type, false)->set(loc());
196}
197
198void ArrowExpr::emit_body(Emitter& e, const Def*) const {
199 decl_->set_dom(dom()->emit(e));
200 decl_->set_codom(codom()->emit(e)); // TODO try to immutabilize
201}
202
203const Def* ArrowExpr::emit_(Emitter& e) const {
204 auto d = dom()->emit(e);
205 auto c = codom()->emit(e);
206 return e.world().pi(d, c);
207}
208
209const Def* UnionExpr::emit_(Emitter& e) const {
210 DefVec etypes;
211 for (auto& t : types()) etypes.emplace_back(t->emit(e));
212 return e.world().join(etypes);
213}
214
215const Def* InjExpr::emit_(Emitter& e) const {
216 auto v = value()->emit(e);
217 auto t = type()->emit(e);
218 return e.world().inj(t, v);
219}
220
222 auto _ = e.world().push(loc());
223 auto dom_t = ptrn()->emit_type(e);
224 auto pi = e.world().pi(dom_t, e.world().mut_hole_type());
225 auto lam = e.world().mut_lam(pi);
226 ptrn()->emit_value(e, lam->var());
227 return lam->set(true, body()->emit(e));
228}
229
230const Def* MatchExpr::emit_(Emitter& e) const {
231 DefVec res;
232 res.emplace_back(scrutinee()->emit(e));
233 for (const auto& arm : arms()) res.emplace_back(arm->emit(e));
234 return e.world().match(res);
235}
236
238 pi_ = decl_ ? decl_ : e.world().mut_pi(e.world().type_infer_univ(), is_implicit());
239 auto dom_t = ptrn()->emit_type(e);
240
241 if (ret()) {
242 auto sigma = e.world().mut_sigma(2)->set(loc());
243 auto var = sigma->var()->set(ret()->loc().anew_begin());
244 sigma->set(0, dom_t);
245 ptrn()->emit_value(e, var->proj(2, 0));
246 auto ret_t = e.world().cn(ret()->emit_type(e));
247 sigma->set(1, ret_t);
248
249 if (auto imm = sigma->immutabilize())
250 dom_t = imm;
251 else
252 dom_t = sigma;
253 pi_->set_dom(dom_t);
254 } else {
255 pi_->set_dom(dom_t);
256 ptrn()->emit_value(e, pi_->var());
257 }
258}
259
260const Def* PiExpr::emit_decl(Emitter& e, const Def* type) const {
261 return dom()->decl_ = e.world().mut_pi(type, dom()->is_implicit())->set(loc());
262}
263
264void PiExpr::emit_body(Emitter& e, const Def*) const { emit(e); }
265
266const Def* PiExpr::emit_(Emitter& e) const {
267 dom()->emit_type(e);
268 auto cod = codom() ? codom()->emit(e) : e.world().type_bot();
269 return dom()->pi_->set_codom(cod);
270}
271
272const Def* LamExpr::emit_decl(Emitter& e, const Def*) const { return lam()->emit_decl(e), lam()->def(); }
273void LamExpr::emit_body(Emitter& e, const Def*) const { lam()->emit_body(e); }
274
275const Def* LamExpr::emit_(Emitter& e) const {
276 auto res = emit_decl(e, {});
277 emit_body(e, {});
278 return res;
279}
280
281const Def* AppExpr::emit_(Emitter& e) const {
282 auto c = callee()->emit(e);
283 auto a = arg()->emit(e);
284 return is_explicit() ? e.world().app(c, a) : e.world().implicit_app(c, a);
285}
286
287const Def* RetExpr::emit_(Emitter& e) const {
288 auto c = callee()->emit(e);
289 if (auto cn = Pi::has_ret_pi(c->type())) {
290 auto con = e.world().mut_lam(cn);
291 auto pair = e.world().tuple({arg()->emit(e), con});
292 auto app = e.world().app(c, pair)->set(c->loc() + arg()->loc());
293 ptrn()->emit_value(e, con->var());
294 con->set(false, body()->emit(e));
295 return app;
296 }
297
298 error(c->loc(), "callee of a ret expression must type as a returning continuation but got '{}' of type '{}'", c,
299 c->type());
300}
301
302const Def* SigmaExpr::emit_decl(Emitter& e, const Def* type) const { return ptrn()->emit_decl(e, type); }
303void SigmaExpr::emit_body(Emitter& e, const Def* decl) const { ptrn()->emit_body(e, decl); }
304const Def* SigmaExpr::emit_(Emitter& e) const { return ptrn()->emit_type(e); }
305
306const Def* TupleExpr::emit_(Emitter& e) const {
307 DefVec elems(num_elems(), [&](size_t i) { return elem(i)->emit(e); });
308 return e.world().tuple(elems);
309}
310
311const Def* SeqExpr::emit_(Emitter& e) const {
312 auto s = shape()->emit_type(e);
313 if (shape()->dbg().is_anon()) { // immutable
314 auto b = body()->emit(e);
315 return is_arr() ? e.world().arr(s, b) : e.world().pack(s, b);
316 }
317
318 auto t = e.world().type_infer_univ();
319 auto a = e.world().mut_arr(t);
320 a->set_shape(s);
321
322 if (is_arr()) {
323 auto var = a->var();
324 shape()->emit_value(e, var);
325 a->set_body(body()->emit(e));
326 if (auto imm = a->immutabilize()) return imm;
327 return a;
328 } else {
329 auto p = e.world().mut_pack(a);
330 auto var = p->var();
331 shape()->emit_value(e, var);
332 auto b = body()->emit(e);
333 a->set_body(b->type());
334 p->set(b);
335 if (auto imm = p->immutabilize()) return imm;
336 return p;
337 }
338}
339
341 auto tup = tuple()->emit(e);
342 if (auto dbg = std::get_if<Dbg>(&index())) {
343 if (auto sigma = tup->type()->isa_mut<Sigma>()) {
344 if (auto i = e.sigma2sym2idx.find(sigma); i != e.sigma2sym2idx.end()) {
345 auto sigma = i->first->as_mut<Sigma>();
346 const auto& sym2idx = i->second;
347 if (auto i = sym2idx.find(dbg->sym()); i != sym2idx.end())
348 return e.world().extract(tup, sigma->num_ops(), i->second);
349 }
350 }
351
352 if (decl()) return e.world().extract(tup, decl()->def());
353 error(dbg->loc(), "cannot resolve index '{}' for extraction", *dbg);
354 }
355
356 auto expr = std::get<Ptr<Expr>>(index()).get();
357 auto i = expr->emit(e);
358 return e.world().extract(tup, i);
359}
360
361const Def* InsertExpr::emit_(Emitter& e) const {
362 auto t = tuple()->emit(e);
363 auto i = index()->emit(e);
364 auto v = value()->emit(e);
365 return e.world().insert(t, i, v);
366}
367
368const Def* UniqExpr::emit_(Emitter& e) const { return e.world().uniq(inhabitant()->emit(e)); }
369
370/*
371 * Decl
372 */
373
374void AxmDecl::emit(Emitter& e) const {
375 mim_type_ = type()->emit(e);
376 auto& id = annex_->id;
377
378 std::tie(id.curry, id.trip) = Axm::infer_curry_and_trip(mim_type_);
379 if (curry_) {
380 if (curry_.lit_u() > id.curry)
381 error(curry_.loc(), "curry counter cannot be greater than {}", id.curry);
382 else
383 id.curry = curry_.lit_u();
384 }
385
386 if (trip_) {
387 if (trip_.lit_u() > id.curry)
388 error(trip_.loc(), "trip counter cannot be greater than curry counter '{}'", (int)id.curry);
389 else
390 id.trip = trip_.lit_u();
391 }
392
393 if (num_subs() == 0) {
394 auto norm = e.driver().normalizer(id.plugin, id.tag, 0);
395 auto axm = e.world().axm(norm, id.curry, id.trip, mim_type_, id.plugin, id.tag, 0)->set(dbg());
396 def_ = axm;
397 e.world().register_annex(id.plugin, id.tag, 0, axm);
398 } else {
399 for (sub_t i = 0, n = num_subs(); i != n; ++i) {
400 sub_t s = i + offset_;
401 auto norm = e.driver().normalizer(id.plugin, id.tag, s);
402 auto name = e.world().sym(dbg().sym().str() + "."s + sub(i).front()->dbg().sym().str());
403 auto axm = e.world().axm(norm, id.curry, id.trip, mim_type_, id.plugin, id.tag, s)->set(name);
404 e.world().register_annex(id.plugin, id.tag, s, axm);
405
406 for (const auto& alias : sub(i)) alias->def_ = axm;
407 }
408 }
409}
410
411void LetDecl::emit(Emitter& e) const {
412 auto v = value()->emit(e);
413 def_ = ptrn()->emit_value(e, v);
414 e.register_annex(annex_, sub_, def_);
415}
416
417void RecDecl::emit(Emitter& e) const {
418 for (auto curr = this; curr; curr = curr->next()) curr->emit_decl(e);
419 for (auto curr = this; curr; curr = curr->next()) curr->emit_body(e);
420}
421
423 auto t = type() ? type()->emit(e) : e.world().type_infer_univ();
424 def_ = body()->emit_decl(e, t);
425 def_->set(dbg());
426}
427
429 body()->emit_body(e, def_);
430 // TODO immutabilize?
431 e.register_annex(annex_, sub_, def_);
432}
433
435 lam_ = e.world().mut_lam(pi_);
436 auto var = lam_->var();
437
438 if (ret()) {
439 ptrn()->emit_value(e, var->proj(2, 0));
440 ret()->emit_value(e, var->proj(2, 1));
441 } else {
442 ptrn()->emit_value(e, var);
443 }
444
445 return lam_;
446}
447
449 auto _ = e.world().push(loc());
450 bool is_cps = tag_ == Tag::K_cn || tag_ == Tag::K_con || tag_ == Tag::K_fn || tag_ == Tag::K_fun;
451
452 // Iterate over all doms: Build a Lam for cur dom, by first building a curried Pi for the remaining doms.
453 for (size_t i = 0, n = num_doms(); i != n; ++i) {
454 for (const auto& dom : doms() | std::ranges::views::drop(i)) dom->emit_type(e);
455
456 auto cod = codom() ? codom()->emit(e) : is_cps ? e.world().type_bot() : e.world().mut_hole_type();
457 for (const auto& dom : doms() | std::ranges::views::drop(i) | std::ranges::views::reverse)
458 cod = dom->pi_->set_codom(cod);
459
460 auto cur = dom(i);
461 auto lam = cur->emit_value(e);
462 auto filter = cur->filter() ? cur->filter()->emit(e)
463 : i + 1 == n && is_cps ? e.world().lit_ff()
464 : e.world().lit_tt();
465 lam->set_filter(filter);
466
467 if (i == 0)
468 def_ = lam->set(dbg().sym());
469 else
470 dom(i - 1)->lam_->set_body(lam);
471 }
472}
473
475 auto b = body()->emit(e);
476 doms().back()->lam_->set_body(b);
477
478 for (const auto& dom : doms() | std::ranges::views::reverse) {
479 if (auto imm = dom->pi_->immutabilize()) {
480 auto f = dom->lam_->filter();
481 auto b = dom->lam_->body();
482 dom->lam_->unset()->set_type(imm)->as<Lam>()->set(f, b);
483 }
484 }
485
486 if (is_external()) doms().front()->lam_->make_external();
487 e.register_annex(annex_, sub_, def_);
488}
489
490void CDecl::emit(Emitter& e) const {
491 auto dom_t = dom()->emit_type(e);
492 if (tag() == Tag::K_cfun) {
493 auto ret_t = codom()->emit(e);
494 def_ = e.world().mut_fun(dom_t, ret_t)->set(dbg());
495 } else {
496 def_ = e.world().mut_con(dom_t)->set(dbg());
497 }
498}
499
500} // 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:240
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
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:190
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:82
const Def * register_annex(flags_t f, const Def *)
Definition world.cpp:78
World & world()
Definition ast.h:59
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:64
Dbg dbg() const
Definition ast.h:273
const Def * emit_type(Emitter &) const override
Definition emit.cpp:86
const Ptrn * ptrn() const
Definition ast.h:272
const Def * emit_(Emitter &) const override
Definition emit.cpp:281
bool is_explicit() const
Definition ast.h:649
const Expr * arg() const
Definition ast.h:651
const Expr * callee() const
Definition ast.h:650
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:198
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:194
const Def * emit_(Emitter &) const override
Definition emit.cpp:203
void emit(Emitter &) const override
Definition emit.cpp:374
const Expr * type() const
Definition ast.h:887
Tok trip() const
Definition ast.h:890
size_t num_subs() const
Definition ast.h:885
Tok curry() const
Definition ast.h:889
Dbg dbg() const
Definition ast.h:883
const auto & sub(size_t i) const
Definition ast.h:886
Tok::Tag tag() const
Definition ast.h:1019
const Ptrn * dom() const
Definition ast.h:1020
void emit(Emitter &) const override
Definition emit.cpp:490
const Expr * codom() const
Definition ast.h:1021
Dbg dbg() const
Definition ast.h:1018
const Expr * expr() const
Definition ast.h:417
const Def * emit_(Emitter &) const override
Definition emit.cpp:186
const auto & decls() const
Definition ast.h:415
bool is_where() const
Definition ast.h:416
const Def * def_
Definition ast.h:170
const Def * def() const
Definition ast.h:167
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:130
const Def * emit_type(Emitter &) const override
Definition emit.cpp:79
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:55
const Def * emit(Emitter &) const
Definition emit.cpp:125
virtual void emit_body(Emitter &, const Def *) const
Definition ast.h:155
virtual const Def * emit_(Emitter &) const =0
virtual const Def * emit_decl(Emitter &, const Def *) const
Definition ast.h:154
const Decl * decl() const
Definition ast.h:772
const Def * emit_(Emitter &) const override
Definition emit.cpp:340
const auto & index() const
Definition ast.h:771
const Expr * tuple() const
Definition ast.h:770
const Def * emit_type(Emitter &) const override
Definition emit.cpp:88
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:62
Dbg dbg() const
Definition ast.h:251
const IdPtrn * id() const
Definition ast.h:252
const Def * emit_(Emitter &) const override
Definition emit.cpp:131
const Def * emit_(Emitter &) const override
Definition emit.cpp:133
const Decl * decl() const
Definition ast.h:352
const Def * emit_type(Emitter &) const override
Definition emit.cpp:81
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:57
Dbg dbg() const
Definition ast.h:221
const Expr * type() const
Definition ast.h:222
void emit(Emitter &) const
Definition emit.cpp:49
const Module * module() const
Definition ast.h:1048
const Def * emit_(Emitter &) const override
Definition emit.cpp:215
const Expr * type() const
Definition ast.h:479
const Expr * value() const
Definition ast.h:478
const Expr * index() const
Definition ast.h:795
const Expr * tuple() const
Definition ast.h:794
const Def * emit_(Emitter &) const override
Definition emit.cpp:361
const Expr * value() const
Definition ast.h:796
Lam * emit_value(Emitter &) const
Definition emit.cpp:434
bool is_external() const
Definition ast.h:987
const Ptrs< Dom > & doms() const
Definition ast.h:988
const Expr * codom() const
Definition ast.h:991
void emit_decl(Emitter &) const override
Definition emit.cpp:448
size_t num_doms() const
Definition ast.h:990
void emit_body(Emitter &) const override
Definition emit.cpp:474
const Dom * dom(size_t i) const
Definition ast.h:989
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:273
const Def * emit_(Emitter &) const override
Definition emit.cpp:275
const LamDecl * lam() const
Definition ast.h:627
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:272
const Expr * value() const
Definition ast.h:840
const Ptrn * ptrn() const
Definition ast.h:839
void emit(Emitter &) const override
Definition emit.cpp:411
Tok tok() const
Definition ast.h:392
const Expr * type() const
Definition ast.h:394
const Def * emit_(Emitter &) const override
Definition emit.cpp:169
Tok::Tag tag() const
Definition ast.h:393
Lam * emit(Emitter &) const
Definition emit.cpp:221
const Expr * body() const
Definition ast.h:504
const Ptrn * ptrn() const
Definition ast.h:503
const Def * emit_(Emitter &) const override
Definition emit.cpp:230
const Expr * scrutinee() const
Definition ast.h:520
const Arm * arm(size_t i) const
Definition ast.h:522
const auto & arms() const
Definition ast.h:521
const auto & decls() const
Definition ast.h:1076
void emit(AST &) const
Definition emit.cpp:37
const auto & implicit_imports() const
Definition ast.h:1074
const auto & imports() const
Definition ast.h:1075
Loc loc() const
Definition ast.h:119
virtual void emit_type(Emitter &) const
Definition emit.cpp:237
const IdPtrn * ret() const
Definition ast.h:576
bool is_implicit() const
Definition ast.h:574
const Ptrn * ptrn() const
Definition ast.h:575
const Def * emit_(Emitter &) const override
Definition emit.cpp:266
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:260
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:264
Tok::Tag tag() const
Definition ast.h:373
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:417
Dbg dbg() const
Definition ast.h:917
virtual void emit_body(Emitter &) const
Definition emit.cpp:428
virtual void emit_decl(Emitter &) const
Definition emit.cpp:422
const Expr * body() const
Definition ast.h:919
const Expr * type() const
Definition ast.h:918
const Ptrn * ptrn() const
Definition ast.h:674
const Expr * arg() const
Definition ast.h:676
const Def * emit_(Emitter &) const override
Definition emit.cpp:287
const Expr * body() const
Definition ast.h:677
const Expr * callee() const
Definition ast.h:675
const Expr * body() const
Definition ast.h:745
bool is_arr() const
Definition ast.h:743
const IdPtrn * shape() const
Definition ast.h:744
const Def * emit_(Emitter &) const override
Definition emit.cpp:311
const TuplePtrn * ptrn() const
Definition ast.h:699
const Def * emit_(Emitter &) const override
Definition emit.cpp:304
void emit_body(Emitter &, const Def *decl) const override
Definition emit.cpp:303
const Def * emit_decl(Emitter &, const Def *type) const override
Definition emit.cpp:302
const Lit * lit_i() const
Definition tok.h:164
const Expr * elem(size_t i) const
Definition ast.h:722
const Def * emit_(Emitter &) const override
Definition emit.cpp:306
const auto & elems() const
Definition ast.h:721
size_t num_elems() const
Definition ast.h:723
const Ptrn * ptrn(size_t i) const
Definition ast.h:301
const Def * emit_type(Emitter &) const override
Definition emit.cpp:90
const Def * emit_decl(Emitter &, const Def *type) const
Definition emit.cpp:115
size_t num_ptrns() const
Definition ast.h:302
const Def * emit_value(Emitter &, const Def *) const override
Definition emit.cpp:68
const Def * emit_body(Emitter &, const Def *decl) const
Definition emit.cpp:92
const Def * emit_(Emitter &) const override
Definition emit.cpp:138
const Expr * level() const
Definition ast.h:437
const auto & types() const
Definition ast.h:457
const Def * emit_(Emitter &) const override
Definition emit.cpp:209
const Expr * inhabitant() const
Definition ast.h:816
const Def * emit_(Emitter &) const override
Definition emit.cpp:368
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