| 1 | // _gen/yaks/yaks.asdl.cc is generated by asdl_main.py
 | 
| 2 | 
 | 
| 3 | #include "_gen/yaks/yaks.asdl.h"
 | 
| 4 | #include <assert.h>
 | 
| 5 | #include "prebuilt/asdl/runtime.mycpp.h"  // generated code uses wrappers here
 | 
| 6 | 
 | 
| 7 | // Generated code uses these types
 | 
| 8 | using hnode_asdl::hnode;
 | 
| 9 | using hnode_asdl::Field;
 | 
| 10 | using hnode_asdl::color_e;
 | 
| 11 | 
 | 
| 12 | 
 | 
| 13 | namespace yaks_asdl {
 | 
| 14 | 
 | 
| 15 | 
 | 
| 16 | hnode_t* Token::PrettyTree(Dict<int, bool>* seen) {
 | 
| 17 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 18 |   int heap_id = ObjectId(this);
 | 
| 19 |   if (dict_contains(seen, heap_id)) {
 | 
| 20 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 21 |   }
 | 
| 22 |   seen->set(heap_id, true);
 | 
| 23 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Token"));
 | 
| 24 |   List<Field*>* L = out_node->fields;
 | 
| 25 | 
 | 
| 26 |   hnode_t* x0 = runtime::NewLeaf(this->path, color_e::StringConst);
 | 
| 27 |   L->append(Alloc<Field>(StrFromC("path"), x0));
 | 
| 28 | 
 | 
| 29 |   hnode_t* x1 = runtime::NewLeaf(this->chunk, color_e::StringConst);
 | 
| 30 |   L->append(Alloc<Field>(StrFromC("chunk"), x1));
 | 
| 31 | 
 | 
| 32 |   hnode_t* x2 = Alloc<hnode::Leaf>(str(this->start), color_e::OtherConst);
 | 
| 33 |   L->append(Alloc<Field>(StrFromC("start"), x2));
 | 
| 34 | 
 | 
| 35 |   hnode_t* x3 = Alloc<hnode::Leaf>(str(this->length), color_e::OtherConst);
 | 
| 36 |   L->append(Alloc<Field>(StrFromC("length"), x3));
 | 
| 37 | 
 | 
| 38 |   return out_node;
 | 
| 39 | }
 | 
| 40 | 
 | 
| 41 | 
 | 
| 42 | hnode_t* Bool::PrettyTree(Dict<int, bool>* seen) {
 | 
| 43 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 44 |   int heap_id = ObjectId(this);
 | 
| 45 |   if (dict_contains(seen, heap_id)) {
 | 
| 46 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 47 |   }
 | 
| 48 |   seen->set(heap_id, true);
 | 
| 49 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Bool"));
 | 
| 50 |   List<Field*>* L = out_node->fields;
 | 
| 51 | 
 | 
| 52 |   hnode_t* x0 = Alloc<hnode::Leaf>(this->b ? runtime::TRUE_STR :
 | 
| 53 |                                    runtime::FALSE_STR, color_e::OtherConst);
 | 
| 54 |   L->append(Alloc<Field>(StrFromC("b"), x0));
 | 
| 55 | 
 | 
| 56 |   hnode_t* x1 = this->loc->PrettyTree(seen);
 | 
| 57 |   L->append(Alloc<Field>(StrFromC("loc"), x1));
 | 
| 58 | 
 | 
| 59 |   return out_node;
 | 
| 60 | }
 | 
| 61 | 
 | 
| 62 | 
 | 
| 63 | hnode_t* Int::PrettyTree(Dict<int, bool>* seen) {
 | 
| 64 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 65 |   int heap_id = ObjectId(this);
 | 
| 66 |   if (dict_contains(seen, heap_id)) {
 | 
| 67 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 68 |   }
 | 
| 69 |   seen->set(heap_id, true);
 | 
| 70 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Int"));
 | 
| 71 |   List<Field*>* L = out_node->fields;
 | 
| 72 | 
 | 
| 73 |   hnode_t* x0 = Alloc<hnode::Leaf>(str(this->i), color_e::OtherConst);
 | 
| 74 |   L->append(Alloc<Field>(StrFromC("i"), x0));
 | 
| 75 | 
 | 
| 76 |   hnode_t* x1 = this->loc->PrettyTree(seen);
 | 
| 77 |   L->append(Alloc<Field>(StrFromC("loc"), x1));
 | 
| 78 | 
 | 
| 79 |   return out_node;
 | 
| 80 | }
 | 
| 81 | 
 | 
| 82 | 
 | 
| 83 | hnode_t* Str::PrettyTree(Dict<int, bool>* seen) {
 | 
| 84 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 85 |   int heap_id = ObjectId(this);
 | 
| 86 |   if (dict_contains(seen, heap_id)) {
 | 
| 87 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 88 |   }
 | 
| 89 |   seen->set(heap_id, true);
 | 
| 90 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Str"));
 | 
| 91 |   List<Field*>* L = out_node->fields;
 | 
| 92 | 
 | 
| 93 |   hnode_t* x0 = runtime::NewLeaf(this->s, color_e::StringConst);
 | 
| 94 |   L->append(Alloc<Field>(StrFromC("s"), x0));
 | 
| 95 | 
 | 
| 96 |   hnode_t* x1 = this->loc->PrettyTree(seen);
 | 
| 97 |   L->append(Alloc<Field>(StrFromC("loc"), x1));
 | 
| 98 | 
 | 
| 99 |   return out_node;
 | 
| 100 | }
 | 
| 101 | 
 | 
| 102 | 
 | 
| 103 | hnode_t* MultiStr::PrettyTree(Dict<int, bool>* seen) {
 | 
| 104 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 105 |   int heap_id = ObjectId(this);
 | 
| 106 |   if (dict_contains(seen, heap_id)) {
 | 
| 107 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 108 |   }
 | 
| 109 |   seen->set(heap_id, true);
 | 
| 110 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("MultiStr"));
 | 
| 111 |   List<Field*>* L = out_node->fields;
 | 
| 112 | 
 | 
| 113 |   if (this->lines != nullptr) {  // List
 | 
| 114 |     hnode::Array* x0 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 115 |     for (ListIter<Token*> it(this->lines); !it.Done(); it.Next()) {
 | 
| 116 |       Token* i0 = it.Value();
 | 
| 117 |       hnode_t* h = (i0 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 118 |                     color_e::OtherConst) : i0->PrettyTree(seen);
 | 
| 119 |       x0->children->append(h);
 | 
| 120 |     }
 | 
| 121 |     L->append(Alloc<Field>(StrFromC("lines"), x0));
 | 
| 122 |   }
 | 
| 123 | 
 | 
| 124 |   return out_node;
 | 
| 125 | }
 | 
| 126 | 
 | 
| 127 | BigStr* op_str(op_e tag, bool dot) {
 | 
| 128 |   char buf[32];
 | 
| 129 |   const char* v = nullptr;
 | 
| 130 |   switch (tag) {
 | 
| 131 |   case op_e::Plus:
 | 
| 132 |     v = "Plus"; break;
 | 
| 133 |   case op_e::Minus:
 | 
| 134 |     v = "Minus"; break;
 | 
| 135 |   default:
 | 
| 136 |     assert(0);
 | 
| 137 |   }
 | 
| 138 |   if (dot) {
 | 
| 139 |     snprintf(buf, 32, "op.%s", v);
 | 
| 140 |     return StrFromC(buf);
 | 
| 141 |   } else {
 | 
| 142 |     return StrFromC(v);
 | 
| 143 |   }
 | 
| 144 | }
 | 
| 145 | BigStr* kexpr_str(int tag, bool dot) {
 | 
| 146 |   char buf[32];
 | 
| 147 |   const char* v = nullptr;
 | 
| 148 |   switch (tag) {
 | 
| 149 |   case kexpr_e::Bool:
 | 
| 150 |     v = "Bool"; break;
 | 
| 151 |   case kexpr_e::Int:
 | 
| 152 |     v = "Int"; break;
 | 
| 153 |   case kexpr_e::Str:
 | 
| 154 |     v = "Str"; break;
 | 
| 155 |   case kexpr_e::MultiStr:
 | 
| 156 |     v = "MultiStr"; break;
 | 
| 157 |   case kexpr_e::Unary:
 | 
| 158 |     v = "Unary"; break;
 | 
| 159 |   case kexpr_e::Binary:
 | 
| 160 |     v = "Binary"; break;
 | 
| 161 |   case kexpr_e::Ternary:
 | 
| 162 |     v = "Ternary"; break;
 | 
| 163 |   case kexpr_e::Call:
 | 
| 164 |     v = "Call"; break;
 | 
| 165 |   default:
 | 
| 166 |     assert(0);
 | 
| 167 |   }
 | 
| 168 |   if (dot) {
 | 
| 169 |     snprintf(buf, 32, "kexpr.%s", v);
 | 
| 170 |     return StrFromC(buf);
 | 
| 171 |   } else {
 | 
| 172 |     return StrFromC(v);
 | 
| 173 |   }
 | 
| 174 | }
 | 
| 175 | 
 | 
| 176 | hnode_t* kexpr__Unary::PrettyTree(Dict<int, bool>* seen) {
 | 
| 177 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 178 |   int heap_id = ObjectId(this);
 | 
| 179 |   if (dict_contains(seen, heap_id)) {
 | 
| 180 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 181 |   }
 | 
| 182 |   seen->set(heap_id, true);
 | 
| 183 |   hnode::Record* out_node = runtime::NewRecord(kexpr_str(this->tag()));
 | 
| 184 |   List<Field*>* L = out_node->fields;
 | 
| 185 | 
 | 
| 186 |   hnode_t* x0 = this->op->PrettyTree(seen);
 | 
| 187 |   L->append(Alloc<Field>(StrFromC("op"), x0));
 | 
| 188 | 
 | 
| 189 |   hnode_t* x1 = this->child->PrettyTree(seen);
 | 
| 190 |   L->append(Alloc<Field>(StrFromC("child"), x1));
 | 
| 191 | 
 | 
| 192 |   return out_node;
 | 
| 193 | }
 | 
| 194 | 
 | 
| 195 | 
 | 
| 196 | hnode_t* kexpr__Binary::PrettyTree(Dict<int, bool>* seen) {
 | 
| 197 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 198 |   int heap_id = ObjectId(this);
 | 
| 199 |   if (dict_contains(seen, heap_id)) {
 | 
| 200 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 201 |   }
 | 
| 202 |   seen->set(heap_id, true);
 | 
| 203 |   hnode::Record* out_node = runtime::NewRecord(kexpr_str(this->tag()));
 | 
| 204 |   List<Field*>* L = out_node->fields;
 | 
| 205 | 
 | 
| 206 |   hnode_t* x0 = this->op->PrettyTree(seen);
 | 
| 207 |   L->append(Alloc<Field>(StrFromC("op"), x0));
 | 
| 208 | 
 | 
| 209 |   hnode_t* x1 = this->left->PrettyTree(seen);
 | 
| 210 |   L->append(Alloc<Field>(StrFromC("left"), x1));
 | 
| 211 | 
 | 
| 212 |   hnode_t* x2 = this->right->PrettyTree(seen);
 | 
| 213 |   L->append(Alloc<Field>(StrFromC("right"), x2));
 | 
| 214 | 
 | 
| 215 |   return out_node;
 | 
| 216 | }
 | 
| 217 | 
 | 
| 218 | 
 | 
| 219 | hnode_t* kexpr__Ternary::PrettyTree(Dict<int, bool>* seen) {
 | 
| 220 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 221 |   int heap_id = ObjectId(this);
 | 
| 222 |   if (dict_contains(seen, heap_id)) {
 | 
| 223 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 224 |   }
 | 
| 225 |   seen->set(heap_id, true);
 | 
| 226 |   hnode::Record* out_node = runtime::NewRecord(kexpr_str(this->tag()));
 | 
| 227 |   List<Field*>* L = out_node->fields;
 | 
| 228 | 
 | 
| 229 |   hnode_t* x0 = this->op->PrettyTree(seen);
 | 
| 230 |   L->append(Alloc<Field>(StrFromC("op"), x0));
 | 
| 231 | 
 | 
| 232 |   hnode_t* x1 = this->left->PrettyTree(seen);
 | 
| 233 |   L->append(Alloc<Field>(StrFromC("left"), x1));
 | 
| 234 | 
 | 
| 235 |   hnode_t* x2 = this->cond->PrettyTree(seen);
 | 
| 236 |   L->append(Alloc<Field>(StrFromC("cond"), x2));
 | 
| 237 | 
 | 
| 238 |   hnode_t* x3 = this->right->PrettyTree(seen);
 | 
| 239 |   L->append(Alloc<Field>(StrFromC("right"), x3));
 | 
| 240 | 
 | 
| 241 |   return out_node;
 | 
| 242 | }
 | 
| 243 | 
 | 
| 244 | 
 | 
| 245 | hnode_t* kexpr__Call::PrettyTree(Dict<int, bool>* seen) {
 | 
| 246 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 247 |   int heap_id = ObjectId(this);
 | 
| 248 |   if (dict_contains(seen, heap_id)) {
 | 
| 249 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 250 |   }
 | 
| 251 |   seen->set(heap_id, true);
 | 
| 252 |   hnode::Record* out_node = runtime::NewRecord(kexpr_str(this->tag()));
 | 
| 253 |   List<Field*>* L = out_node->fields;
 | 
| 254 | 
 | 
| 255 |   hnode_t* x0 = this->f->PrettyTree(seen);
 | 
| 256 |   L->append(Alloc<Field>(StrFromC("f"), x0));
 | 
| 257 | 
 | 
| 258 |   if (this->args != nullptr) {  // List
 | 
| 259 |     hnode::Array* x1 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 260 |     for (ListIter<kexpr_t*> it(this->args); !it.Done(); it.Next()) {
 | 
| 261 |       kexpr_t* i1 = it.Value();
 | 
| 262 |       hnode_t* h = (i1 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 263 |                     color_e::OtherConst) : i1->PrettyTree(seen);
 | 
| 264 |       x1->children->append(h);
 | 
| 265 |     }
 | 
| 266 |     L->append(Alloc<Field>(StrFromC("args"), x1));
 | 
| 267 |   }
 | 
| 268 | 
 | 
| 269 |   return out_node;
 | 
| 270 | }
 | 
| 271 | 
 | 
| 272 | 
 | 
| 273 | hnode_t* kexpr_t::PrettyTree(Dict<int, bool>* seen) {
 | 
| 274 |   switch (this->tag()) {
 | 
| 275 |   case kexpr_e::Bool: {
 | 
| 276 |     Bool* obj = static_cast<Bool*>(this);
 | 
| 277 |     return obj->PrettyTree(seen);
 | 
| 278 |   }
 | 
| 279 |   case kexpr_e::Int: {
 | 
| 280 |     Int* obj = static_cast<Int*>(this);
 | 
| 281 |     return obj->PrettyTree(seen);
 | 
| 282 |   }
 | 
| 283 |   case kexpr_e::Str: {
 | 
| 284 |     Str* obj = static_cast<Str*>(this);
 | 
| 285 |     return obj->PrettyTree(seen);
 | 
| 286 |   }
 | 
| 287 |   case kexpr_e::MultiStr: {
 | 
| 288 |     MultiStr* obj = static_cast<MultiStr*>(this);
 | 
| 289 |     return obj->PrettyTree(seen);
 | 
| 290 |   }
 | 
| 291 |   case kexpr_e::Unary: {
 | 
| 292 |     kexpr__Unary* obj = static_cast<kexpr__Unary*>(this);
 | 
| 293 |     return obj->PrettyTree(seen);
 | 
| 294 |   }
 | 
| 295 |   case kexpr_e::Binary: {
 | 
| 296 |     kexpr__Binary* obj = static_cast<kexpr__Binary*>(this);
 | 
| 297 |     return obj->PrettyTree(seen);
 | 
| 298 |   }
 | 
| 299 |   case kexpr_e::Ternary: {
 | 
| 300 |     kexpr__Ternary* obj = static_cast<kexpr__Ternary*>(this);
 | 
| 301 |     return obj->PrettyTree(seen);
 | 
| 302 |   }
 | 
| 303 |   case kexpr_e::Call: {
 | 
| 304 |     kexpr__Call* obj = static_cast<kexpr__Call*>(this);
 | 
| 305 |     return obj->PrettyTree(seen);
 | 
| 306 |   }
 | 
| 307 |   default:
 | 
| 308 |     assert(0);
 | 
| 309 |   }
 | 
| 310 | }
 | 
| 311 | 
 | 
| 312 | hnode_t* Field_::PrettyTree(Dict<int, bool>* seen) {
 | 
| 313 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 314 |   int heap_id = ObjectId(this);
 | 
| 315 |   if (dict_contains(seen, heap_id)) {
 | 
| 316 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 317 |   }
 | 
| 318 |   seen->set(heap_id, true);
 | 
| 319 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Field_"));
 | 
| 320 |   List<Field*>* L = out_node->fields;
 | 
| 321 | 
 | 
| 322 |   hnode_t* x0 = runtime::NewLeaf(this->name, color_e::StringConst);
 | 
| 323 |   L->append(Alloc<Field>(StrFromC("name"), x0));
 | 
| 324 | 
 | 
| 325 |   hnode_t* x1 = this->typ->PrettyTree(seen);
 | 
| 326 |   L->append(Alloc<Field>(StrFromC("typ"), x1));
 | 
| 327 | 
 | 
| 328 |   return out_node;
 | 
| 329 | }
 | 
| 330 | 
 | 
| 331 | 
 | 
| 332 | hnode_t* variant::PrettyTree(Dict<int, bool>* seen) {
 | 
| 333 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 334 |   int heap_id = ObjectId(this);
 | 
| 335 |   if (dict_contains(seen, heap_id)) {
 | 
| 336 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 337 |   }
 | 
| 338 |   seen->set(heap_id, true);
 | 
| 339 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("variant"));
 | 
| 340 |   List<Field*>* L = out_node->fields;
 | 
| 341 | 
 | 
| 342 |   if (this->fields != nullptr) {  // List
 | 
| 343 |     hnode::Array* x0 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 344 |     for (ListIter<Field_*> it(this->fields); !it.Done(); it.Next()) {
 | 
| 345 |       Field_* i0 = it.Value();
 | 
| 346 |       hnode_t* h = (i0 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 347 |                     color_e::OtherConst) : i0->PrettyTree(seen);
 | 
| 348 |       x0->children->append(h);
 | 
| 349 |     }
 | 
| 350 |     L->append(Alloc<Field>(StrFromC("fields"), x0));
 | 
| 351 |   }
 | 
| 352 | 
 | 
| 353 |   return out_node;
 | 
| 354 | }
 | 
| 355 | 
 | 
| 356 | BigStr* ktype_str(int tag, bool dot) {
 | 
| 357 |   char buf[32];
 | 
| 358 |   const char* v = nullptr;
 | 
| 359 |   switch (tag) {
 | 
| 360 |   case ktype_e::Bool:
 | 
| 361 |     v = "Bool"; break;
 | 
| 362 |   case ktype_e::Int:
 | 
| 363 |     v = "Int"; break;
 | 
| 364 |   case ktype_e::Str:
 | 
| 365 |     v = "Str"; break;
 | 
| 366 |   case ktype_e::List:
 | 
| 367 |     v = "List"; break;
 | 
| 368 |   case ktype_e::Dict:
 | 
| 369 |     v = "Dict"; break;
 | 
| 370 |   case ktype_e::Class:
 | 
| 371 |     v = "Class"; break;
 | 
| 372 |   case ktype_e::Data:
 | 
| 373 |     v = "Data"; break;
 | 
| 374 |   case ktype_e::Enum:
 | 
| 375 |     v = "Enum"; break;
 | 
| 376 |   default:
 | 
| 377 |     assert(0);
 | 
| 378 |   }
 | 
| 379 |   if (dot) {
 | 
| 380 |     snprintf(buf, 32, "ktype.%s", v);
 | 
| 381 |     return StrFromC(buf);
 | 
| 382 |   } else {
 | 
| 383 |     return StrFromC(v);
 | 
| 384 |   }
 | 
| 385 | }
 | 
| 386 | 
 | 
| 387 | ktype__Bool* ktype::Bool = &gktype__Bool.obj;
 | 
| 388 | 
 | 
| 389 | GcGlobal<ktype__Bool> gktype__Bool = 
 | 
| 390 |   { ObjHeader::Global(ktype_e::Bool) };
 | 
| 391 | 
 | 
| 392 | ktype__Int* ktype::Int = &gktype__Int.obj;
 | 
| 393 | 
 | 
| 394 | GcGlobal<ktype__Int> gktype__Int = 
 | 
| 395 |   { ObjHeader::Global(ktype_e::Int) };
 | 
| 396 | 
 | 
| 397 | ktype__Str* ktype::Str = &gktype__Str.obj;
 | 
| 398 | 
 | 
| 399 | GcGlobal<ktype__Str> gktype__Str = 
 | 
| 400 |   { ObjHeader::Global(ktype_e::Str) };
 | 
| 401 | 
 | 
| 402 | hnode_t* ktype__Bool::PrettyTree(Dict<int, bool>* seen) {
 | 
| 403 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 404 |   int heap_id = ObjectId(this);
 | 
| 405 |   if (dict_contains(seen, heap_id)) {
 | 
| 406 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 407 |   }
 | 
| 408 |   seen->set(heap_id, true);
 | 
| 409 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 410 |   return out_node;
 | 
| 411 | }
 | 
| 412 | 
 | 
| 413 | 
 | 
| 414 | hnode_t* ktype__Int::PrettyTree(Dict<int, bool>* seen) {
 | 
| 415 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 416 |   int heap_id = ObjectId(this);
 | 
| 417 |   if (dict_contains(seen, heap_id)) {
 | 
| 418 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 419 |   }
 | 
| 420 |   seen->set(heap_id, true);
 | 
| 421 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 422 |   return out_node;
 | 
| 423 | }
 | 
| 424 | 
 | 
| 425 | 
 | 
| 426 | hnode_t* ktype__Str::PrettyTree(Dict<int, bool>* seen) {
 | 
| 427 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 428 |   int heap_id = ObjectId(this);
 | 
| 429 |   if (dict_contains(seen, heap_id)) {
 | 
| 430 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 431 |   }
 | 
| 432 |   seen->set(heap_id, true);
 | 
| 433 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 434 |   return out_node;
 | 
| 435 | }
 | 
| 436 | 
 | 
| 437 | 
 | 
| 438 | hnode_t* ktype__List::PrettyTree(Dict<int, bool>* seen) {
 | 
| 439 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 440 |   int heap_id = ObjectId(this);
 | 
| 441 |   if (dict_contains(seen, heap_id)) {
 | 
| 442 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 443 |   }
 | 
| 444 |   seen->set(heap_id, true);
 | 
| 445 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 446 |   List<Field*>* L = out_node->fields;
 | 
| 447 | 
 | 
| 448 |   hnode_t* x0 = this->T->PrettyTree(seen);
 | 
| 449 |   L->append(Alloc<Field>(StrFromC("T"), x0));
 | 
| 450 | 
 | 
| 451 |   return out_node;
 | 
| 452 | }
 | 
| 453 | 
 | 
| 454 | 
 | 
| 455 | hnode_t* ktype__Dict::PrettyTree(Dict<int, bool>* seen) {
 | 
| 456 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 457 |   int heap_id = ObjectId(this);
 | 
| 458 |   if (dict_contains(seen, heap_id)) {
 | 
| 459 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 460 |   }
 | 
| 461 |   seen->set(heap_id, true);
 | 
| 462 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 463 |   List<Field*>* L = out_node->fields;
 | 
| 464 | 
 | 
| 465 |   hnode_t* x0 = this->K->PrettyTree(seen);
 | 
| 466 |   L->append(Alloc<Field>(StrFromC("K"), x0));
 | 
| 467 | 
 | 
| 468 |   hnode_t* x1 = this->V->PrettyTree(seen);
 | 
| 469 |   L->append(Alloc<Field>(StrFromC("V"), x1));
 | 
| 470 | 
 | 
| 471 |   return out_node;
 | 
| 472 | }
 | 
| 473 | 
 | 
| 474 | 
 | 
| 475 | hnode_t* ktype__Class::PrettyTree(Dict<int, bool>* seen) {
 | 
| 476 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 477 |   int heap_id = ObjectId(this);
 | 
| 478 |   if (dict_contains(seen, heap_id)) {
 | 
| 479 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 480 |   }
 | 
| 481 |   seen->set(heap_id, true);
 | 
| 482 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 483 |   List<Field*>* L = out_node->fields;
 | 
| 484 | 
 | 
| 485 |   hnode_t* x0 = runtime::NewLeaf(this->name, color_e::StringConst);
 | 
| 486 |   L->append(Alloc<Field>(StrFromC("name"), x0));
 | 
| 487 | 
 | 
| 488 |   return out_node;
 | 
| 489 | }
 | 
| 490 | 
 | 
| 491 | 
 | 
| 492 | hnode_t* ktype__Data::PrettyTree(Dict<int, bool>* seen) {
 | 
| 493 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 494 |   int heap_id = ObjectId(this);
 | 
| 495 |   if (dict_contains(seen, heap_id)) {
 | 
| 496 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 497 |   }
 | 
| 498 |   seen->set(heap_id, true);
 | 
| 499 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 500 |   List<Field*>* L = out_node->fields;
 | 
| 501 | 
 | 
| 502 |   if (this->fields != nullptr) {  // List
 | 
| 503 |     hnode::Array* x0 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 504 |     for (ListIter<Field_*> it(this->fields); !it.Done(); it.Next()) {
 | 
| 505 |       Field_* i0 = it.Value();
 | 
| 506 |       hnode_t* h = (i0 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 507 |                     color_e::OtherConst) : i0->PrettyTree(seen);
 | 
| 508 |       x0->children->append(h);
 | 
| 509 |     }
 | 
| 510 |     L->append(Alloc<Field>(StrFromC("fields"), x0));
 | 
| 511 |   }
 | 
| 512 | 
 | 
| 513 |   return out_node;
 | 
| 514 | }
 | 
| 515 | 
 | 
| 516 | 
 | 
| 517 | hnode_t* ktype__Enum::PrettyTree(Dict<int, bool>* seen) {
 | 
| 518 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 519 |   int heap_id = ObjectId(this);
 | 
| 520 |   if (dict_contains(seen, heap_id)) {
 | 
| 521 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 522 |   }
 | 
| 523 |   seen->set(heap_id, true);
 | 
| 524 |   hnode::Record* out_node = runtime::NewRecord(ktype_str(this->tag()));
 | 
| 525 |   List<Field*>* L = out_node->fields;
 | 
| 526 | 
 | 
| 527 |   if (this->variants != nullptr) {  // List
 | 
| 528 |     hnode::Array* x0 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 529 |     for (ListIter<variant*> it(this->variants); !it.Done(); it.Next()) {
 | 
| 530 |       variant* i0 = it.Value();
 | 
| 531 |       hnode_t* h = (i0 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 532 |                     color_e::OtherConst) : i0->PrettyTree(seen);
 | 
| 533 |       x0->children->append(h);
 | 
| 534 |     }
 | 
| 535 |     L->append(Alloc<Field>(StrFromC("variants"), x0));
 | 
| 536 |   }
 | 
| 537 | 
 | 
| 538 |   return out_node;
 | 
| 539 | }
 | 
| 540 | 
 | 
| 541 | 
 | 
| 542 | hnode_t* ktype_t::PrettyTree(Dict<int, bool>* seen) {
 | 
| 543 |   switch (this->tag()) {
 | 
| 544 |   case ktype_e::Bool: {
 | 
| 545 |     ktype__Bool* obj = static_cast<ktype__Bool*>(this);
 | 
| 546 |     return obj->PrettyTree(seen);
 | 
| 547 |   }
 | 
| 548 |   case ktype_e::Int: {
 | 
| 549 |     ktype__Int* obj = static_cast<ktype__Int*>(this);
 | 
| 550 |     return obj->PrettyTree(seen);
 | 
| 551 |   }
 | 
| 552 |   case ktype_e::Str: {
 | 
| 553 |     ktype__Str* obj = static_cast<ktype__Str*>(this);
 | 
| 554 |     return obj->PrettyTree(seen);
 | 
| 555 |   }
 | 
| 556 |   case ktype_e::List: {
 | 
| 557 |     ktype__List* obj = static_cast<ktype__List*>(this);
 | 
| 558 |     return obj->PrettyTree(seen);
 | 
| 559 |   }
 | 
| 560 |   case ktype_e::Dict: {
 | 
| 561 |     ktype__Dict* obj = static_cast<ktype__Dict*>(this);
 | 
| 562 |     return obj->PrettyTree(seen);
 | 
| 563 |   }
 | 
| 564 |   case ktype_e::Class: {
 | 
| 565 |     ktype__Class* obj = static_cast<ktype__Class*>(this);
 | 
| 566 |     return obj->PrettyTree(seen);
 | 
| 567 |   }
 | 
| 568 |   case ktype_e::Data: {
 | 
| 569 |     ktype__Data* obj = static_cast<ktype__Data*>(this);
 | 
| 570 |     return obj->PrettyTree(seen);
 | 
| 571 |   }
 | 
| 572 |   case ktype_e::Enum: {
 | 
| 573 |     ktype__Enum* obj = static_cast<ktype__Enum*>(this);
 | 
| 574 |     return obj->PrettyTree(seen);
 | 
| 575 |   }
 | 
| 576 |   default:
 | 
| 577 |     assert(0);
 | 
| 578 |   }
 | 
| 579 | }
 | 
| 580 | 
 | 
| 581 | hnode_t* NameType::PrettyTree(Dict<int, bool>* seen) {
 | 
| 582 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 583 |   int heap_id = ObjectId(this);
 | 
| 584 |   if (dict_contains(seen, heap_id)) {
 | 
| 585 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 586 |   }
 | 
| 587 |   seen->set(heap_id, true);
 | 
| 588 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("NameType"));
 | 
| 589 |   List<Field*>* L = out_node->fields;
 | 
| 590 | 
 | 
| 591 |   hnode_t* x0 = runtime::NewLeaf(this->name, color_e::StringConst);
 | 
| 592 |   L->append(Alloc<Field>(StrFromC("name"), x0));
 | 
| 593 | 
 | 
| 594 |   hnode_t* x1 = this->typ->PrettyTree(seen);
 | 
| 595 |   L->append(Alloc<Field>(StrFromC("typ"), x1));
 | 
| 596 | 
 | 
| 597 |   return out_node;
 | 
| 598 | }
 | 
| 599 | 
 | 
| 600 | BigStr* stmt_str(int tag, bool dot) {
 | 
| 601 |   char buf[32];
 | 
| 602 |   const char* v = nullptr;
 | 
| 603 |   switch (tag) {
 | 
| 604 |   case stmt_e::VarDecl:
 | 
| 605 |     v = "VarDecl"; break;
 | 
| 606 |   case stmt_e::PlaceMutation:
 | 
| 607 |     v = "PlaceMutation"; break;
 | 
| 608 |   case stmt_e::If:
 | 
| 609 |     v = "If"; break;
 | 
| 610 |   case stmt_e::Switch:
 | 
| 611 |     v = "Switch"; break;
 | 
| 612 |   case stmt_e::For:
 | 
| 613 |     v = "For"; break;
 | 
| 614 |   case stmt_e::While:
 | 
| 615 |     v = "While"; break;
 | 
| 616 |   case stmt_e::Break:
 | 
| 617 |     v = "Break"; break;
 | 
| 618 |   case stmt_e::Continue:
 | 
| 619 |     v = "Continue"; break;
 | 
| 620 |   case stmt_e::Return:
 | 
| 621 |     v = "Return"; break;
 | 
| 622 |   case stmt_e::Try:
 | 
| 623 |     v = "Try"; break;
 | 
| 624 |   case stmt_e::With:
 | 
| 625 |     v = "With"; break;
 | 
| 626 |   default:
 | 
| 627 |     assert(0);
 | 
| 628 |   }
 | 
| 629 |   if (dot) {
 | 
| 630 |     snprintf(buf, 32, "stmt.%s", v);
 | 
| 631 |     return StrFromC(buf);
 | 
| 632 |   } else {
 | 
| 633 |     return StrFromC(v);
 | 
| 634 |   }
 | 
| 635 | }
 | 
| 636 | 
 | 
| 637 | stmt__If* stmt::If = &gstmt__If.obj;
 | 
| 638 | 
 | 
| 639 | GcGlobal<stmt__If> gstmt__If = 
 | 
| 640 |   { ObjHeader::Global(stmt_e::If) };
 | 
| 641 | 
 | 
| 642 | stmt__Switch* stmt::Switch = &gstmt__Switch.obj;
 | 
| 643 | 
 | 
| 644 | GcGlobal<stmt__Switch> gstmt__Switch = 
 | 
| 645 |   { ObjHeader::Global(stmt_e::Switch) };
 | 
| 646 | 
 | 
| 647 | stmt__For* stmt::For = &gstmt__For.obj;
 | 
| 648 | 
 | 
| 649 | GcGlobal<stmt__For> gstmt__For = 
 | 
| 650 |   { ObjHeader::Global(stmt_e::For) };
 | 
| 651 | 
 | 
| 652 | stmt__While* stmt::While = &gstmt__While.obj;
 | 
| 653 | 
 | 
| 654 | GcGlobal<stmt__While> gstmt__While = 
 | 
| 655 |   { ObjHeader::Global(stmt_e::While) };
 | 
| 656 | 
 | 
| 657 | stmt__Break* stmt::Break = &gstmt__Break.obj;
 | 
| 658 | 
 | 
| 659 | GcGlobal<stmt__Break> gstmt__Break = 
 | 
| 660 |   { ObjHeader::Global(stmt_e::Break) };
 | 
| 661 | 
 | 
| 662 | stmt__Continue* stmt::Continue = &gstmt__Continue.obj;
 | 
| 663 | 
 | 
| 664 | GcGlobal<stmt__Continue> gstmt__Continue = 
 | 
| 665 |   { ObjHeader::Global(stmt_e::Continue) };
 | 
| 666 | 
 | 
| 667 | stmt__Try* stmt::Try = &gstmt__Try.obj;
 | 
| 668 | 
 | 
| 669 | GcGlobal<stmt__Try> gstmt__Try = 
 | 
| 670 |   { ObjHeader::Global(stmt_e::Try) };
 | 
| 671 | 
 | 
| 672 | stmt__With* stmt::With = &gstmt__With.obj;
 | 
| 673 | 
 | 
| 674 | GcGlobal<stmt__With> gstmt__With = 
 | 
| 675 |   { ObjHeader::Global(stmt_e::With) };
 | 
| 676 | 
 | 
| 677 | hnode_t* stmt__VarDecl::PrettyTree(Dict<int, bool>* seen) {
 | 
| 678 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 679 |   int heap_id = ObjectId(this);
 | 
| 680 |   if (dict_contains(seen, heap_id)) {
 | 
| 681 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 682 |   }
 | 
| 683 |   seen->set(heap_id, true);
 | 
| 684 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 685 |   List<Field*>* L = out_node->fields;
 | 
| 686 | 
 | 
| 687 |   hnode_t* x0 = this->keyword->PrettyTree(seen);
 | 
| 688 |   L->append(Alloc<Field>(StrFromC("keyword"), x0));
 | 
| 689 | 
 | 
| 690 |   return out_node;
 | 
| 691 | }
 | 
| 692 | 
 | 
| 693 | 
 | 
| 694 | hnode_t* stmt__PlaceMutation::PrettyTree(Dict<int, bool>* seen) {
 | 
| 695 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 696 |   int heap_id = ObjectId(this);
 | 
| 697 |   if (dict_contains(seen, heap_id)) {
 | 
| 698 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 699 |   }
 | 
| 700 |   seen->set(heap_id, true);
 | 
| 701 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 702 |   List<Field*>* L = out_node->fields;
 | 
| 703 | 
 | 
| 704 |   hnode_t* x0 = this->keyword->PrettyTree(seen);
 | 
| 705 |   L->append(Alloc<Field>(StrFromC("keyword"), x0));
 | 
| 706 | 
 | 
| 707 |   return out_node;
 | 
| 708 | }
 | 
| 709 | 
 | 
| 710 | 
 | 
| 711 | hnode_t* stmt__If::PrettyTree(Dict<int, bool>* seen) {
 | 
| 712 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 713 |   int heap_id = ObjectId(this);
 | 
| 714 |   if (dict_contains(seen, heap_id)) {
 | 
| 715 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 716 |   }
 | 
| 717 |   seen->set(heap_id, true);
 | 
| 718 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 719 |   return out_node;
 | 
| 720 | }
 | 
| 721 | 
 | 
| 722 | 
 | 
| 723 | hnode_t* stmt__Switch::PrettyTree(Dict<int, bool>* seen) {
 | 
| 724 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 725 |   int heap_id = ObjectId(this);
 | 
| 726 |   if (dict_contains(seen, heap_id)) {
 | 
| 727 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 728 |   }
 | 
| 729 |   seen->set(heap_id, true);
 | 
| 730 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 731 |   return out_node;
 | 
| 732 | }
 | 
| 733 | 
 | 
| 734 | 
 | 
| 735 | hnode_t* stmt__For::PrettyTree(Dict<int, bool>* seen) {
 | 
| 736 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 737 |   int heap_id = ObjectId(this);
 | 
| 738 |   if (dict_contains(seen, heap_id)) {
 | 
| 739 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 740 |   }
 | 
| 741 |   seen->set(heap_id, true);
 | 
| 742 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 743 |   return out_node;
 | 
| 744 | }
 | 
| 745 | 
 | 
| 746 | 
 | 
| 747 | hnode_t* stmt__While::PrettyTree(Dict<int, bool>* seen) {
 | 
| 748 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 749 |   int heap_id = ObjectId(this);
 | 
| 750 |   if (dict_contains(seen, heap_id)) {
 | 
| 751 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 752 |   }
 | 
| 753 |   seen->set(heap_id, true);
 | 
| 754 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 755 |   return out_node;
 | 
| 756 | }
 | 
| 757 | 
 | 
| 758 | 
 | 
| 759 | hnode_t* stmt__Break::PrettyTree(Dict<int, bool>* seen) {
 | 
| 760 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 761 |   int heap_id = ObjectId(this);
 | 
| 762 |   if (dict_contains(seen, heap_id)) {
 | 
| 763 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 764 |   }
 | 
| 765 |   seen->set(heap_id, true);
 | 
| 766 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 767 |   return out_node;
 | 
| 768 | }
 | 
| 769 | 
 | 
| 770 | 
 | 
| 771 | hnode_t* stmt__Continue::PrettyTree(Dict<int, bool>* seen) {
 | 
| 772 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 773 |   int heap_id = ObjectId(this);
 | 
| 774 |   if (dict_contains(seen, heap_id)) {
 | 
| 775 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 776 |   }
 | 
| 777 |   seen->set(heap_id, true);
 | 
| 778 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 779 |   return out_node;
 | 
| 780 | }
 | 
| 781 | 
 | 
| 782 | 
 | 
| 783 | hnode_t* stmt__Return::PrettyTree(Dict<int, bool>* seen) {
 | 
| 784 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 785 |   int heap_id = ObjectId(this);
 | 
| 786 |   if (dict_contains(seen, heap_id)) {
 | 
| 787 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 788 |   }
 | 
| 789 |   seen->set(heap_id, true);
 | 
| 790 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 791 |   List<Field*>* L = out_node->fields;
 | 
| 792 | 
 | 
| 793 |   hnode_t* x0 = this->e->PrettyTree(seen);
 | 
| 794 |   L->append(Alloc<Field>(StrFromC("e"), x0));
 | 
| 795 | 
 | 
| 796 |   return out_node;
 | 
| 797 | }
 | 
| 798 | 
 | 
| 799 | 
 | 
| 800 | hnode_t* stmt__Try::PrettyTree(Dict<int, bool>* seen) {
 | 
| 801 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 802 |   int heap_id = ObjectId(this);
 | 
| 803 |   if (dict_contains(seen, heap_id)) {
 | 
| 804 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 805 |   }
 | 
| 806 |   seen->set(heap_id, true);
 | 
| 807 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 808 |   return out_node;
 | 
| 809 | }
 | 
| 810 | 
 | 
| 811 | 
 | 
| 812 | hnode_t* stmt__With::PrettyTree(Dict<int, bool>* seen) {
 | 
| 813 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 814 |   int heap_id = ObjectId(this);
 | 
| 815 |   if (dict_contains(seen, heap_id)) {
 | 
| 816 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 817 |   }
 | 
| 818 |   seen->set(heap_id, true);
 | 
| 819 |   hnode::Record* out_node = runtime::NewRecord(stmt_str(this->tag()));
 | 
| 820 |   return out_node;
 | 
| 821 | }
 | 
| 822 | 
 | 
| 823 | 
 | 
| 824 | hnode_t* stmt_t::PrettyTree(Dict<int, bool>* seen) {
 | 
| 825 |   switch (this->tag()) {
 | 
| 826 |   case stmt_e::VarDecl: {
 | 
| 827 |     stmt__VarDecl* obj = static_cast<stmt__VarDecl*>(this);
 | 
| 828 |     return obj->PrettyTree(seen);
 | 
| 829 |   }
 | 
| 830 |   case stmt_e::PlaceMutation: {
 | 
| 831 |     stmt__PlaceMutation* obj = static_cast<stmt__PlaceMutation*>(this);
 | 
| 832 |     return obj->PrettyTree(seen);
 | 
| 833 |   }
 | 
| 834 |   case stmt_e::If: {
 | 
| 835 |     stmt__If* obj = static_cast<stmt__If*>(this);
 | 
| 836 |     return obj->PrettyTree(seen);
 | 
| 837 |   }
 | 
| 838 |   case stmt_e::Switch: {
 | 
| 839 |     stmt__Switch* obj = static_cast<stmt__Switch*>(this);
 | 
| 840 |     return obj->PrettyTree(seen);
 | 
| 841 |   }
 | 
| 842 |   case stmt_e::For: {
 | 
| 843 |     stmt__For* obj = static_cast<stmt__For*>(this);
 | 
| 844 |     return obj->PrettyTree(seen);
 | 
| 845 |   }
 | 
| 846 |   case stmt_e::While: {
 | 
| 847 |     stmt__While* obj = static_cast<stmt__While*>(this);
 | 
| 848 |     return obj->PrettyTree(seen);
 | 
| 849 |   }
 | 
| 850 |   case stmt_e::Break: {
 | 
| 851 |     stmt__Break* obj = static_cast<stmt__Break*>(this);
 | 
| 852 |     return obj->PrettyTree(seen);
 | 
| 853 |   }
 | 
| 854 |   case stmt_e::Continue: {
 | 
| 855 |     stmt__Continue* obj = static_cast<stmt__Continue*>(this);
 | 
| 856 |     return obj->PrettyTree(seen);
 | 
| 857 |   }
 | 
| 858 |   case stmt_e::Return: {
 | 
| 859 |     stmt__Return* obj = static_cast<stmt__Return*>(this);
 | 
| 860 |     return obj->PrettyTree(seen);
 | 
| 861 |   }
 | 
| 862 |   case stmt_e::Try: {
 | 
| 863 |     stmt__Try* obj = static_cast<stmt__Try*>(this);
 | 
| 864 |     return obj->PrettyTree(seen);
 | 
| 865 |   }
 | 
| 866 |   case stmt_e::With: {
 | 
| 867 |     stmt__With* obj = static_cast<stmt__With*>(this);
 | 
| 868 |     return obj->PrettyTree(seen);
 | 
| 869 |   }
 | 
| 870 |   default:
 | 
| 871 |     assert(0);
 | 
| 872 |   }
 | 
| 873 | }
 | 
| 874 | BigStr* class_def_str(class_def_e tag, bool dot) {
 | 
| 875 |   char buf[32];
 | 
| 876 |   const char* v = nullptr;
 | 
| 877 |   switch (tag) {
 | 
| 878 |   case class_def_e::Constructor:
 | 
| 879 |     v = "Constructor"; break;
 | 
| 880 |   case class_def_e::Destructor:
 | 
| 881 |     v = "Destructor"; break;
 | 
| 882 |   case class_def_e::Method:
 | 
| 883 |     v = "Method"; break;
 | 
| 884 |   case class_def_e::Field:
 | 
| 885 |     v = "Field"; break;
 | 
| 886 |   default:
 | 
| 887 |     assert(0);
 | 
| 888 |   }
 | 
| 889 |   if (dot) {
 | 
| 890 |     snprintf(buf, 32, "class_def.%s", v);
 | 
| 891 |     return StrFromC(buf);
 | 
| 892 |   } else {
 | 
| 893 |     return StrFromC(v);
 | 
| 894 |   }
 | 
| 895 | }
 | 
| 896 | 
 | 
| 897 | hnode_t* Signature::PrettyTree(Dict<int, bool>* seen) {
 | 
| 898 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 899 |   int heap_id = ObjectId(this);
 | 
| 900 |   if (dict_contains(seen, heap_id)) {
 | 
| 901 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 902 |   }
 | 
| 903 |   seen->set(heap_id, true);
 | 
| 904 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Signature"));
 | 
| 905 |   List<Field*>* L = out_node->fields;
 | 
| 906 | 
 | 
| 907 |   if (this->params != nullptr) {  // List
 | 
| 908 |     hnode::Array* x0 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 909 |     for (ListIter<NameType*> it(this->params); !it.Done(); it.Next()) {
 | 
| 910 |       NameType* i0 = it.Value();
 | 
| 911 |       hnode_t* h = (i0 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 912 |                     color_e::OtherConst) : i0->PrettyTree(seen);
 | 
| 913 |       x0->children->append(h);
 | 
| 914 |     }
 | 
| 915 |     L->append(Alloc<Field>(StrFromC("params"), x0));
 | 
| 916 |   }
 | 
| 917 | 
 | 
| 918 |   hnode_t* x1 = this->return_type->PrettyTree(seen);
 | 
| 919 |   L->append(Alloc<Field>(StrFromC("return_type"), x1));
 | 
| 920 | 
 | 
| 921 |   return out_node;
 | 
| 922 | }
 | 
| 923 | 
 | 
| 924 | BigStr* mod_def_str(int tag, bool dot) {
 | 
| 925 |   char buf[32];
 | 
| 926 |   const char* v = nullptr;
 | 
| 927 |   switch (tag) {
 | 
| 928 |   case mod_def_e::Global:
 | 
| 929 |     v = "Global"; break;
 | 
| 930 |   case mod_def_e::Func:
 | 
| 931 |     v = "Func"; break;
 | 
| 932 |   case mod_def_e::Class:
 | 
| 933 |     v = "Class"; break;
 | 
| 934 |   case mod_def_e::Import:
 | 
| 935 |     v = "Import"; break;
 | 
| 936 |   case mod_def_e::Include:
 | 
| 937 |     v = "Include"; break;
 | 
| 938 |   case mod_def_e::Data:
 | 
| 939 |     v = "Data"; break;
 | 
| 940 |   case mod_def_e::Enum:
 | 
| 941 |     v = "Enum"; break;
 | 
| 942 |   default:
 | 
| 943 |     assert(0);
 | 
| 944 |   }
 | 
| 945 |   if (dot) {
 | 
| 946 |     snprintf(buf, 32, "mod_def.%s", v);
 | 
| 947 |     return StrFromC(buf);
 | 
| 948 |   } else {
 | 
| 949 |     return StrFromC(v);
 | 
| 950 |   }
 | 
| 951 | }
 | 
| 952 | 
 | 
| 953 | mod_def__Import* mod_def::Import = &gmod_def__Import.obj;
 | 
| 954 | 
 | 
| 955 | GcGlobal<mod_def__Import> gmod_def__Import = 
 | 
| 956 |   { ObjHeader::Global(mod_def_e::Import) };
 | 
| 957 | 
 | 
| 958 | mod_def__Data* mod_def::Data = &gmod_def__Data.obj;
 | 
| 959 | 
 | 
| 960 | GcGlobal<mod_def__Data> gmod_def__Data = 
 | 
| 961 |   { ObjHeader::Global(mod_def_e::Data) };
 | 
| 962 | 
 | 
| 963 | mod_def__Enum* mod_def::Enum = &gmod_def__Enum.obj;
 | 
| 964 | 
 | 
| 965 | GcGlobal<mod_def__Enum> gmod_def__Enum = 
 | 
| 966 |   { ObjHeader::Global(mod_def_e::Enum) };
 | 
| 967 | 
 | 
| 968 | hnode_t* mod_def__Global::PrettyTree(Dict<int, bool>* seen) {
 | 
| 969 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 970 |   int heap_id = ObjectId(this);
 | 
| 971 |   if (dict_contains(seen, heap_id)) {
 | 
| 972 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 973 |   }
 | 
| 974 |   seen->set(heap_id, true);
 | 
| 975 |   hnode::Record* out_node = runtime::NewRecord(mod_def_str(this->tag()));
 | 
| 976 |   List<Field*>* L = out_node->fields;
 | 
| 977 | 
 | 
| 978 |   hnode_t* x0 = this->name_type->PrettyTree(seen);
 | 
| 979 |   L->append(Alloc<Field>(StrFromC("name_type"), x0));
 | 
| 980 | 
 | 
| 981 |   return out_node;
 | 
| 982 | }
 | 
| 983 | 
 | 
| 984 | 
 | 
| 985 | hnode_t* mod_def__Func::PrettyTree(Dict<int, bool>* seen) {
 | 
| 986 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 987 |   int heap_id = ObjectId(this);
 | 
| 988 |   if (dict_contains(seen, heap_id)) {
 | 
| 989 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 990 |   }
 | 
| 991 |   seen->set(heap_id, true);
 | 
| 992 |   hnode::Record* out_node = runtime::NewRecord(mod_def_str(this->tag()));
 | 
| 993 |   List<Field*>* L = out_node->fields;
 | 
| 994 | 
 | 
| 995 |   hnode_t* x0 = runtime::NewLeaf(this->name, color_e::StringConst);
 | 
| 996 |   L->append(Alloc<Field>(StrFromC("name"), x0));
 | 
| 997 | 
 | 
| 998 |   hnode_t* x1 = this->sig->PrettyTree(seen);
 | 
| 999 |   L->append(Alloc<Field>(StrFromC("sig"), x1));
 | 
| 1000 | 
 | 
| 1001 |   if (this->statements != nullptr) {  // List
 | 
| 1002 |     hnode::Array* x2 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 1003 |     for (ListIter<stmt_t*> it(this->statements); !it.Done(); it.Next()) {
 | 
| 1004 |       stmt_t* i2 = it.Value();
 | 
| 1005 |       hnode_t* h = (i2 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 1006 |                     color_e::OtherConst) : i2->PrettyTree(seen);
 | 
| 1007 |       x2->children->append(h);
 | 
| 1008 |     }
 | 
| 1009 |     L->append(Alloc<Field>(StrFromC("statements"), x2));
 | 
| 1010 |   }
 | 
| 1011 | 
 | 
| 1012 |   return out_node;
 | 
| 1013 | }
 | 
| 1014 | 
 | 
| 1015 | 
 | 
| 1016 | hnode_t* mod_def__Class::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1017 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 1018 |   int heap_id = ObjectId(this);
 | 
| 1019 |   if (dict_contains(seen, heap_id)) {
 | 
| 1020 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 1021 |   }
 | 
| 1022 |   seen->set(heap_id, true);
 | 
| 1023 |   hnode::Record* out_node = runtime::NewRecord(mod_def_str(this->tag()));
 | 
| 1024 |   List<Field*>* L = out_node->fields;
 | 
| 1025 | 
 | 
| 1026 |   hnode_t* x0 = runtime::NewLeaf(this->name, color_e::StringConst);
 | 
| 1027 |   L->append(Alloc<Field>(StrFromC("name"), x0));
 | 
| 1028 | 
 | 
| 1029 |   if (this->defs != nullptr) {  // List
 | 
| 1030 |     hnode::Array* x1 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 1031 |     for (ListIter<class_def_t> it(this->defs); !it.Done(); it.Next()) {
 | 
| 1032 |       class_def_t i1 = it.Value();
 | 
| 1033 |       x1->children->append(Alloc<hnode::Leaf>(class_def_str(i1),
 | 
| 1034 |                            color_e::TypeName));
 | 
| 1035 |     }
 | 
| 1036 |     L->append(Alloc<Field>(StrFromC("defs"), x1));
 | 
| 1037 |   }
 | 
| 1038 | 
 | 
| 1039 |   return out_node;
 | 
| 1040 | }
 | 
| 1041 | 
 | 
| 1042 | 
 | 
| 1043 | hnode_t* mod_def__Import::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1044 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 1045 |   int heap_id = ObjectId(this);
 | 
| 1046 |   if (dict_contains(seen, heap_id)) {
 | 
| 1047 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 1048 |   }
 | 
| 1049 |   seen->set(heap_id, true);
 | 
| 1050 |   hnode::Record* out_node = runtime::NewRecord(mod_def_str(this->tag()));
 | 
| 1051 |   return out_node;
 | 
| 1052 | }
 | 
| 1053 | 
 | 
| 1054 | 
 | 
| 1055 | hnode_t* mod_def__Include::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1056 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 1057 |   int heap_id = ObjectId(this);
 | 
| 1058 |   if (dict_contains(seen, heap_id)) {
 | 
| 1059 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 1060 |   }
 | 
| 1061 |   seen->set(heap_id, true);
 | 
| 1062 |   hnode::Record* out_node = runtime::NewRecord(mod_def_str(this->tag()));
 | 
| 1063 |   List<Field*>* L = out_node->fields;
 | 
| 1064 | 
 | 
| 1065 |   hnode_t* x0 = runtime::NewLeaf(this->path, color_e::StringConst);
 | 
| 1066 |   L->append(Alloc<Field>(StrFromC("path"), x0));
 | 
| 1067 | 
 | 
| 1068 |   return out_node;
 | 
| 1069 | }
 | 
| 1070 | 
 | 
| 1071 | 
 | 
| 1072 | hnode_t* mod_def__Data::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1073 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 1074 |   int heap_id = ObjectId(this);
 | 
| 1075 |   if (dict_contains(seen, heap_id)) {
 | 
| 1076 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 1077 |   }
 | 
| 1078 |   seen->set(heap_id, true);
 | 
| 1079 |   hnode::Record* out_node = runtime::NewRecord(mod_def_str(this->tag()));
 | 
| 1080 |   return out_node;
 | 
| 1081 | }
 | 
| 1082 | 
 | 
| 1083 | 
 | 
| 1084 | hnode_t* mod_def__Enum::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1085 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 1086 |   int heap_id = ObjectId(this);
 | 
| 1087 |   if (dict_contains(seen, heap_id)) {
 | 
| 1088 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 1089 |   }
 | 
| 1090 |   seen->set(heap_id, true);
 | 
| 1091 |   hnode::Record* out_node = runtime::NewRecord(mod_def_str(this->tag()));
 | 
| 1092 |   return out_node;
 | 
| 1093 | }
 | 
| 1094 | 
 | 
| 1095 | 
 | 
| 1096 | hnode_t* mod_def_t::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1097 |   switch (this->tag()) {
 | 
| 1098 |   case mod_def_e::Global: {
 | 
| 1099 |     mod_def__Global* obj = static_cast<mod_def__Global*>(this);
 | 
| 1100 |     return obj->PrettyTree(seen);
 | 
| 1101 |   }
 | 
| 1102 |   case mod_def_e::Func: {
 | 
| 1103 |     mod_def__Func* obj = static_cast<mod_def__Func*>(this);
 | 
| 1104 |     return obj->PrettyTree(seen);
 | 
| 1105 |   }
 | 
| 1106 |   case mod_def_e::Class: {
 | 
| 1107 |     mod_def__Class* obj = static_cast<mod_def__Class*>(this);
 | 
| 1108 |     return obj->PrettyTree(seen);
 | 
| 1109 |   }
 | 
| 1110 |   case mod_def_e::Import: {
 | 
| 1111 |     mod_def__Import* obj = static_cast<mod_def__Import*>(this);
 | 
| 1112 |     return obj->PrettyTree(seen);
 | 
| 1113 |   }
 | 
| 1114 |   case mod_def_e::Include: {
 | 
| 1115 |     mod_def__Include* obj = static_cast<mod_def__Include*>(this);
 | 
| 1116 |     return obj->PrettyTree(seen);
 | 
| 1117 |   }
 | 
| 1118 |   case mod_def_e::Data: {
 | 
| 1119 |     mod_def__Data* obj = static_cast<mod_def__Data*>(this);
 | 
| 1120 |     return obj->PrettyTree(seen);
 | 
| 1121 |   }
 | 
| 1122 |   case mod_def_e::Enum: {
 | 
| 1123 |     mod_def__Enum* obj = static_cast<mod_def__Enum*>(this);
 | 
| 1124 |     return obj->PrettyTree(seen);
 | 
| 1125 |   }
 | 
| 1126 |   default:
 | 
| 1127 |     assert(0);
 | 
| 1128 |   }
 | 
| 1129 | }
 | 
| 1130 | 
 | 
| 1131 | hnode_t* Module::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1132 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 1133 |   int heap_id = ObjectId(this);
 | 
| 1134 |   if (dict_contains(seen, heap_id)) {
 | 
| 1135 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 1136 |   }
 | 
| 1137 |   seen->set(heap_id, true);
 | 
| 1138 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Module"));
 | 
| 1139 |   List<Field*>* L = out_node->fields;
 | 
| 1140 | 
 | 
| 1141 |   hnode_t* x0 = runtime::NewLeaf(this->name, color_e::StringConst);
 | 
| 1142 |   L->append(Alloc<Field>(StrFromC("name"), x0));
 | 
| 1143 | 
 | 
| 1144 |   if (this->defs != nullptr) {  // List
 | 
| 1145 |     hnode::Array* x1 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 1146 |     for (ListIter<mod_def_t*> it(this->defs); !it.Done(); it.Next()) {
 | 
| 1147 |       mod_def_t* i1 = it.Value();
 | 
| 1148 |       hnode_t* h = (i1 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 1149 |                     color_e::OtherConst) : i1->PrettyTree(seen);
 | 
| 1150 |       x1->children->append(h);
 | 
| 1151 |     }
 | 
| 1152 |     L->append(Alloc<Field>(StrFromC("defs"), x1));
 | 
| 1153 |   }
 | 
| 1154 | 
 | 
| 1155 |   return out_node;
 | 
| 1156 | }
 | 
| 1157 | 
 | 
| 1158 | 
 | 
| 1159 | hnode_t* Program::PrettyTree(Dict<int, bool>* seen) {
 | 
| 1160 |   seen = seen ? seen : Alloc<Dict<int, bool>>();
 | 
| 1161 |   int heap_id = ObjectId(this);
 | 
| 1162 |   if (dict_contains(seen, heap_id)) {
 | 
| 1163 |     return Alloc<hnode::AlreadySeen>(heap_id);
 | 
| 1164 |   }
 | 
| 1165 |   seen->set(heap_id, true);
 | 
| 1166 |   hnode::Record* out_node = runtime::NewRecord(StrFromC("Program"));
 | 
| 1167 |   List<Field*>* L = out_node->fields;
 | 
| 1168 | 
 | 
| 1169 |   hnode_t* x0 = runtime::NewLeaf(this->main_module, color_e::StringConst);
 | 
| 1170 |   L->append(Alloc<Field>(StrFromC("main_module"), x0));
 | 
| 1171 | 
 | 
| 1172 |   if (this->modules != nullptr) {  // List
 | 
| 1173 |     hnode::Array* x1 = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
 | 
| 1174 |     for (ListIter<Module*> it(this->modules); !it.Done(); it.Next()) {
 | 
| 1175 |       Module* i1 = it.Value();
 | 
| 1176 |       hnode_t* h = (i1 == nullptr) ? Alloc<hnode::Leaf>(StrFromC("_"),
 | 
| 1177 |                     color_e::OtherConst) : i1->PrettyTree(seen);
 | 
| 1178 |       x1->children->append(h);
 | 
| 1179 |     }
 | 
| 1180 |     L->append(Alloc<Field>(StrFromC("modules"), x1));
 | 
| 1181 |   }
 | 
| 1182 | 
 | 
| 1183 |   return out_node;
 | 
| 1184 | }
 | 
| 1185 | 
 | 
| 1186 | 
 | 
| 1187 | }  // namespace yaks_asdl
 |