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