aboutsummaryrefslogtreecommitdiff
path: root/src/MoonP/moon_compiler.cpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-02-17 15:46:38 +0800
committerLi Jin <dragon-fly@qq.com>2020-02-17 15:46:38 +0800
commit71d9ad9506524fcd3e124c4b4a460afa8fbf35eb (patch)
tree8283382f37bc7dd9e827e27c830e867a6cb6c270 /src/MoonP/moon_compiler.cpp
parent0091db154bc4d40a0c2d79a2311ddc3711321811 (diff)
downloadyuescript-71d9ad9506524fcd3e124c4b4a460afa8fbf35eb.tar.gz
yuescript-71d9ad9506524fcd3e124c4b4a460afa8fbf35eb.tar.bz2
yuescript-71d9ad9506524fcd3e124c4b4a460afa8fbf35eb.zip
refactor some codes to be safer.
Diffstat (limited to 'src/MoonP/moon_compiler.cpp')
-rw-r--r--src/MoonP/moon_compiler.cpp408
1 files changed, 207 insertions, 201 deletions
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp
index 4406dbd..fa55496 100644
--- a/src/MoonP/moon_compiler.cpp
+++ b/src/MoonP/moon_compiler.cpp
@@ -314,17 +314,17 @@ private:
314 Value_t* singleValueFrom(ast_node* item) const { 314 Value_t* singleValueFrom(ast_node* item) const {
315 Exp_t* exp = nullptr; 315 Exp_t* exp = nullptr;
316 switch (item->getId()) { 316 switch (item->getId()) {
317 case "Exp"_id: 317 case id<Exp_t>():
318 exp = static_cast<Exp_t*>(item); 318 exp = static_cast<Exp_t*>(item);
319 break; 319 break;
320 case "ExpList"_id: { 320 case id<ExpList_t>(): {
321 auto expList = static_cast<ExpList_t*>(item); 321 auto expList = static_cast<ExpList_t*>(item);
322 if (expList->exprs.size() == 1) { 322 if (expList->exprs.size() == 1) {
323 exp = static_cast<Exp_t*>(expList->exprs.front()); 323 exp = static_cast<Exp_t*>(expList->exprs.front());
324 } 324 }
325 break; 325 break;
326 } 326 }
327 case "ExpListLow"_id: { 327 case id<ExpListLow_t>(): {
328 auto expList = static_cast<ExpListLow_t*>(item); 328 auto expList = static_cast<ExpListLow_t*>(item);
329 if (expList->exprs.size() == 1) { 329 if (expList->exprs.size() == 1) {
330 exp = static_cast<Exp_t*>(expList->exprs.front()); 330 exp = static_cast<Exp_t*>(expList->exprs.front());
@@ -459,18 +459,18 @@ private:
459 auto firstItem = chainItems.back(); 459 auto firstItem = chainItems.back();
460 if (auto callable = ast_cast<Callable_t>(firstItem)) { 460 if (auto callable = ast_cast<Callable_t>(firstItem)) {
461 switch (callable->item->getId()) { 461 switch (callable->item->getId()) {
462 case "Variable"_id: 462 case id<Variable_t>():
463 case "SelfName"_id: 463 case id<SelfName_t>():
464 return true; 464 return true;
465 } 465 }
466 } else if (firstItem->getId() == "DotChainItem"_id) { 466 } else if (firstItem->getId() == id<DotChainItem_t>()) {
467 return true; 467 return true;
468 } 468 }
469 } else { 469 } else {
470 auto lastItem = chainItems.back(); 470 auto lastItem = chainItems.back();
471 switch (lastItem->getId()) { 471 switch (lastItem->getId()) {
472 case "DotChainItem"_id: 472 case id<DotChainItem_t>():
473 case "Exp"_id: 473 case id<Exp_t>():
474 return true; 474 return true;
475 } 475 }
476 } 476 }
@@ -481,16 +481,16 @@ private:
481 if (auto value = singleValueFrom(exp)) { 481 if (auto value = singleValueFrom(exp)) {
482 auto item = value->item.get(); 482 auto item = value->item.get();
483 switch (item->getId()) { 483 switch (item->getId()) {
484 case "simple_table"_id: 484 case id<simple_table_t>():
485 return true; 485 return true;
486 case "SimpleValue"_id: { 486 case id<SimpleValue_t>(): {
487 auto simpleValue = static_cast<SimpleValue_t*>(item); 487 auto simpleValue = static_cast<SimpleValue_t*>(item);
488 if (simpleValue->value. is<TableLit_t>()) { 488 if (simpleValue->value. is<TableLit_t>()) {
489 return true; 489 return true;
490 } 490 }
491 return false; 491 return false;
492 } 492 }
493 case "ChainValue"_id: { 493 case id<ChainValue_t>(): {
494 auto chainValue = static_cast<ChainValue_t*>(item); 494 auto chainValue = static_cast<ChainValue_t*>(item);
495 return isAssignable(chainValue->items.objects()); 495 return isAssignable(chainValue->items.objects());
496 } 496 }
@@ -539,7 +539,7 @@ private:
539 } 539 }
540 auto appendix = statement->appendix.get(); 540 auto appendix = statement->appendix.get();
541 switch (appendix->item->getId()) { 541 switch (appendix->item->getId()) {
542 case "if_else_line"_id: { 542 case id<if_else_line_t>(): {
543 auto if_else_line = appendix->item.to<if_else_line_t>(); 543 auto if_else_line = appendix->item.to<if_else_line_t>();
544 auto ifNode = x->new_ptr<If_t>(); 544 auto ifNode = x->new_ptr<If_t>();
545 545
@@ -580,7 +580,7 @@ private:
580 statement->content.set(expListAssign); 580 statement->content.set(expListAssign);
581 break; 581 break;
582 } 582 }
583 case "unless_line"_id: { 583 case id<unless_line_t>(): {
584 auto unless_line = appendix->item.to<unless_line_t>(); 584 auto unless_line = appendix->item.to<unless_line_t>();
585 auto unless = x->new_ptr<Unless_t>(); 585 auto unless = x->new_ptr<Unless_t>();
586 586
@@ -608,7 +608,7 @@ private:
608 statement->content.set(expListAssign); 608 statement->content.set(expListAssign);
609 break; 609 break;
610 } 610 }
611 case "CompInner"_id: { 611 case id<CompInner_t>(): {
612 auto compInner = appendix->item.to<CompInner_t>(); 612 auto compInner = appendix->item.to<CompInner_t>();
613 auto comp = x->new_ptr<Comprehension_t>(); 613 auto comp = x->new_ptr<Comprehension_t>();
614 comp->forLoop.set(compInner); 614 comp->forLoop.set(compInner);
@@ -629,7 +629,7 @@ private:
629 statement->appendix.set(nullptr); 629 statement->appendix.set(nullptr);
630 break; 630 break;
631 } 631 }
632 default: break; 632 default: assert(false); break;
633 } 633 }
634 } 634 }
635 auto content = statement->content.get(); 635 auto content = statement->content.get();
@@ -638,15 +638,15 @@ private:
638 return; 638 return;
639 } 639 }
640 switch (content->getId()) { 640 switch (content->getId()) {
641 case "Import"_id: transformImport(static_cast<Import_t*>(content), out); break; 641 case id<Import_t>(): transformImport(static_cast<Import_t*>(content), out); break;
642 case "While"_id: transformWhile(static_cast<While_t*>(content), out); break; 642 case id<While_t>(): transformWhile(static_cast<While_t*>(content), out); break;
643 case "For"_id: transformFor(static_cast<For_t*>(content), out); break; 643 case id<For_t>(): transformFor(static_cast<For_t*>(content), out); break;
644 case "ForEach"_id: transformForEach(static_cast<ForEach_t*>(content), out); break; 644 case id<ForEach_t>(): transformForEach(static_cast<ForEach_t*>(content), out); break;
645 case "Return"_id: transformReturn(static_cast<Return_t*>(content), out); break; 645 case id<Return_t>(): transformReturn(static_cast<Return_t*>(content), out); break;
646 case "Local"_id: transformLocal(static_cast<Local_t*>(content), out); break; 646 case id<Local_t>(): transformLocal(static_cast<Local_t*>(content), out); break;
647 case "Export"_id: transformExport(static_cast<Export_t*>(content), out); break; 647 case id<Export_t>(): transformExport(static_cast<Export_t*>(content), out); break;
648 case "BreakLoop"_id: transformBreakLoop(static_cast<BreakLoop_t*>(content), out); break; 648 case id<BreakLoop_t>(): transformBreakLoop(static_cast<BreakLoop_t*>(content), out); break;
649 case "ExpListAssign"_id: { 649 case id<ExpListAssign_t>(): {
650 auto expListAssign = static_cast<ExpListAssign_t*>(content); 650 auto expListAssign = static_cast<ExpListAssign_t*>(content);
651 if (expListAssign->action) { 651 if (expListAssign->action) {
652 transformAssignment(expListAssign, out); 652 transformAssignment(expListAssign, out);
@@ -661,16 +661,16 @@ private:
661 auto value = simpleValue->value.get(); 661 auto value = simpleValue->value.get();
662 bool specialSingleValue = true; 662 bool specialSingleValue = true;
663 switch (value->getId()) { 663 switch (value->getId()) {
664 case "If"_id: transformIf(static_cast<If_t*>(value), out, ExpUsage::Common); break; 664 case id<If_t>(): transformIf(static_cast<If_t*>(value), out, ExpUsage::Common); break;
665 case "ClassDecl"_id: transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Common); break; 665 case id<ClassDecl_t>(): transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Common); break;
666 case "Unless"_id: transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Common); break; 666 case id<Unless_t>(): transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Common); break;
667 case "Switch"_id: transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Common); break; 667 case id<Switch_t>(): transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Common); break;
668 case "With"_id: transformWith(static_cast<With_t*>(value), out); break; 668 case id<With_t>(): transformWith(static_cast<With_t*>(value), out); break;
669 case "ForEach"_id: transformForEach(static_cast<ForEach_t*>(value), out); break; 669 case id<ForEach_t>(): transformForEach(static_cast<ForEach_t*>(value), out); break;
670 case "For"_id: transformFor(static_cast<For_t*>(value), out); break; 670 case id<For_t>(): transformFor(static_cast<For_t*>(value), out); break;
671 case "While"_id: transformWhile(static_cast<While_t*>(value), out); break; 671 case id<While_t>(): transformWhile(static_cast<While_t*>(value), out); break;
672 case "Do"_id: transformDo(static_cast<Do_t*>(value), out, ExpUsage::Common); break; 672 case id<Do_t>(): transformDo(static_cast<Do_t*>(value), out, ExpUsage::Common); break;
673 case "Comprehension"_id: transformCompCommon(static_cast<Comprehension_t*>(value), out); break; 673 case id<Comprehension_t>(): transformCompCommon(static_cast<Comprehension_t*>(value), out); break;
674 default: specialSingleValue = false; break; 674 default: specialSingleValue = false; break;
675 } 675 }
676 if (specialSingleValue) { 676 if (specialSingleValue) {
@@ -694,7 +694,7 @@ private:
694 } 694 }
695 break; 695 break;
696 } 696 }
697 default: break; 697 default: assert(false); break;
698 } 698 }
699 } 699 }
700 700
@@ -834,20 +834,20 @@ private:
834 } 834 }
835 } 835 }
836 switch (value->getId()) { 836 switch (value->getId()) {
837 case "If"_id: 837 case id<If_t>():
838 case "Unless"_id: { 838 case id<Unless_t>(): {
839 auto expList = assignment->expList.get(); 839 auto expList = assignment->expList.get();
840 str_list temp; 840 str_list temp;
841 auto defs = transformAssignDefs(expList); 841 auto defs = transformAssignDefs(expList);
842 if (!defs.empty()) temp.push_back(getPredefine(defs) + nll(expList)); 842 if (!defs.empty()) temp.push_back(getPredefine(defs) + nll(expList));
843 switch (value->getId()) { 843 switch (value->getId()) {
844 case "If"_id: transformIf(static_cast<If_t*>(value), temp, ExpUsage::Assignment, expList); break; 844 case id<If_t>(): transformIf(static_cast<If_t*>(value), temp, ExpUsage::Assignment, expList); break;
845 case "Unless"_id: transformUnless(static_cast<Unless_t*>(value), temp, ExpUsage::Assignment, expList); break; 845 case id<Unless_t>(): transformUnless(static_cast<Unless_t*>(value), temp, ExpUsage::Assignment, expList); break;
846 } 846 }
847 out.push_back(join(temp)); 847 out.push_back(join(temp));
848 return; 848 return;
849 } 849 }
850 case "Switch"_id: { 850 case id<Switch_t>(): {
851 auto switchNode = static_cast<Switch_t*>(value); 851 auto switchNode = static_cast<Switch_t*>(value);
852 auto assignList = assignment->expList.get(); 852 auto assignList = assignment->expList.get();
853 std::string preDefine = getPredefine(assignment); 853 std::string preDefine = getPredefine(assignment);
@@ -855,7 +855,7 @@ private:
855 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 855 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
856 return; 856 return;
857 } 857 }
858 case "With"_id: { 858 case id<With_t>(): {
859 auto withNode = static_cast<With_t*>(value); 859 auto withNode = static_cast<With_t*>(value);
860 auto expList = assignment->expList.get(); 860 auto expList = assignment->expList.get();
861 std::string preDefine = getPredefine(assignment); 861 std::string preDefine = getPredefine(assignment);
@@ -863,7 +863,7 @@ private:
863 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 863 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
864 return; 864 return;
865 } 865 }
866 case "Do"_id: { 866 case id<Do_t>(): {
867 auto expList = assignment->expList.get(); 867 auto expList = assignment->expList.get();
868 auto doNode = static_cast<Do_t*>(value); 868 auto doNode = static_cast<Do_t*>(value);
869 std::string preDefine = getPredefine(assignment); 869 std::string preDefine = getPredefine(assignment);
@@ -871,42 +871,42 @@ private:
871 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 871 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
872 return; 872 return;
873 } 873 }
874 case "Comprehension"_id: { 874 case id<Comprehension_t>(): {
875 auto expList = assignment->expList.get(); 875 auto expList = assignment->expList.get();
876 std::string preDefine = getPredefine(assignment); 876 std::string preDefine = getPredefine(assignment);
877 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Assignment, expList); 877 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Assignment, expList);
878 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 878 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
879 return; 879 return;
880 } 880 }
881 case "TblComprehension"_id: { 881 case id<TblComprehension_t>(): {
882 auto expList = assignment->expList.get(); 882 auto expList = assignment->expList.get();
883 std::string preDefine = getPredefine(assignment); 883 std::string preDefine = getPredefine(assignment);
884 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Assignment, expList); 884 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Assignment, expList);
885 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 885 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
886 return; 886 return;
887 } 887 }
888 case "For"_id: { 888 case id<For_t>(): {
889 auto expList = assignment->expList.get(); 889 auto expList = assignment->expList.get();
890 std::string preDefine = getPredefine(assignment); 890 std::string preDefine = getPredefine(assignment);
891 transformForInPlace(static_cast<For_t*>(value), out, expList); 891 transformForInPlace(static_cast<For_t*>(value), out, expList);
892 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 892 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
893 return; 893 return;
894 } 894 }
895 case "ForEach"_id: { 895 case id<ForEach_t>(): {
896 auto expList = assignment->expList.get(); 896 auto expList = assignment->expList.get();
897 std::string preDefine = getPredefine(assignment); 897 std::string preDefine = getPredefine(assignment);
898 transformForEachInPlace(static_cast<ForEach_t*>(value), out, expList); 898 transformForEachInPlace(static_cast<ForEach_t*>(value), out, expList);
899 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 899 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
900 return; 900 return;
901 } 901 }
902 case "ClassDecl"_id: { 902 case id<ClassDecl_t>(): {
903 auto expList = assignment->expList.get(); 903 auto expList = assignment->expList.get();
904 std::string preDefine = getPredefine(assignment); 904 std::string preDefine = getPredefine(assignment);
905 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Assignment, expList); 905 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Assignment, expList);
906 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 906 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
907 return; 907 return;
908 } 908 }
909 case "While"_id: { 909 case id<While_t>(): {
910 auto expList = assignment->expList.get(); 910 auto expList = assignment->expList.get();
911 std::string preDefine = getPredefine(assignment); 911 std::string preDefine = getPredefine(assignment);
912 transformWhileInPlace(static_cast<While_t*>(value), out, expList); 912 transformWhileInPlace(static_cast<While_t*>(value), out, expList);
@@ -1006,12 +1006,12 @@ private:
1006 1006
1007 void transformAssignItem(ast_node* value, str_list& out) { 1007 void transformAssignItem(ast_node* value, str_list& out) {
1008 switch (value->getId()) { 1008 switch (value->getId()) {
1009 case "With"_id: transformWithClosure(static_cast<With_t*>(value), out); break; 1009 case id<With_t>(): transformWithClosure(static_cast<With_t*>(value), out); break;
1010 case "If"_id: transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break; 1010 case id<If_t>(): transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break;
1011 case "Switch"_id: transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break; 1011 case id<Switch_t>(): transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break;
1012 case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), out); break; 1012 case id<TableBlock_t>(): transformTableBlock(static_cast<TableBlock_t*>(value), out); break;
1013 case "Exp"_id: transformExp(static_cast<Exp_t*>(value), out, ExpUsage::Closure); break; 1013 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(value), out, ExpUsage::Closure); break;
1014 default: break; 1014 default: assert(false); break;
1015 } 1015 }
1016 } 1016 }
1017 1017
@@ -1034,7 +1034,7 @@ private:
1034 int index = 0; 1034 int index = 0;
1035 for (auto pair : *tableItems) { 1035 for (auto pair : *tableItems) {
1036 switch (pair->getId()) { 1036 switch (pair->getId()) {
1037 case "Exp"_id: { 1037 case id<Exp_t>(): {
1038 ++index; 1038 ++index;
1039 if (!isAssignable(static_cast<Exp_t*>(pair))) { 1039 if (!isAssignable(static_cast<Exp_t*>(pair))) {
1040 throw std::logic_error(_info.errorMessage("Can't destructure value."sv, pair)); 1040 throw std::logic_error(_info.errorMessage("Can't destructure value."sv, pair));
@@ -1068,7 +1068,7 @@ private:
1068 } 1068 }
1069 break; 1069 break;
1070 } 1070 }
1071 case "variable_pair"_id: { 1071 case id<variable_pair_t>(): {
1072 auto vp = static_cast<variable_pair_t*>(pair); 1072 auto vp = static_cast<variable_pair_t*>(pair);
1073 auto name = _parser.toString(vp->name); 1073 auto name = _parser.toString(vp->name);
1074 if (Keywords.find(name) != Keywords.end()) { 1074 if (Keywords.find(name) != Keywords.end()) {
@@ -1078,7 +1078,7 @@ private:
1078 } 1078 }
1079 break; 1079 break;
1080 } 1080 }
1081 case "normal_pair"_id: { 1081 case id<normal_pair_t>(): {
1082 auto np = static_cast<normal_pair_t*>(pair); 1082 auto np = static_cast<normal_pair_t*>(pair);
1083 auto key = np->key->getByPath<Name_t>(); 1083 auto key = np->key->getByPath<Name_t>();
1084 if (!key) throw std::logic_error(_info.errorMessage("Invalid key for destructure."sv, np)); 1084 if (!key) throw std::logic_error(_info.errorMessage("Invalid key for destructure."sv, np));
@@ -1135,6 +1135,7 @@ private:
1135 } 1135 }
1136 break; 1136 break;
1137 } 1137 }
1138 default: assert(false); break;
1138 } 1139 }
1139 } 1140 }
1140 return pairs; 1141 return pairs;
@@ -1203,7 +1204,7 @@ private:
1203 auto expList = assignment->expList.get(); 1204 auto expList = assignment->expList.get();
1204 auto action = assignment->action.get(); 1205 auto action = assignment->action.get();
1205 switch (action->getId()) { 1206 switch (action->getId()) {
1206 case "Update"_id: { 1207 case id<Update_t>(): {
1207 if (expList->exprs.size() > 1) throw std::logic_error(_info.errorMessage("Can not apply update to multiple values."sv, expList)); 1208 if (expList->exprs.size() > 1) throw std::logic_error(_info.errorMessage("Can not apply update to multiple values."sv, expList));
1208 auto update = static_cast<Update_t*>(action); 1209 auto update = static_cast<Update_t*>(action);
1209 auto leftExp = static_cast<Exp_t*>(expList->exprs.objects().front()); 1210 auto leftExp = static_cast<Exp_t*>(expList->exprs.objects().front());
@@ -1247,7 +1248,7 @@ private:
1247 out.push_back(clearBuf()); 1248 out.push_back(clearBuf());
1248 break; 1249 break;
1249 } 1250 }
1250 case "Assign"_id: { 1251 case id<Assign_t>(): {
1251 bool oneLined = true; 1252 bool oneLined = true;
1252 auto assign = static_cast<Assign_t*>(action); 1253 auto assign = static_cast<Assign_t*>(action);
1253 for (auto val : assign->values.objects()) { 1254 for (auto val : assign->values.objects()) {
@@ -1292,7 +1293,7 @@ private:
1292 } 1293 }
1293 break; 1294 break;
1294 } 1295 }
1295 default: break; 1296 default: assert(false); break;
1296 } 1297 }
1297 } 1298 }
1298 1299
@@ -1344,14 +1345,14 @@ private:
1344 ifCondPairs.emplace_back(); 1345 ifCondPairs.emplace_back();
1345 for (auto node : nodes) { 1346 for (auto node : nodes) {
1346 switch (node->getId()) { 1347 switch (node->getId()) {
1347 case "IfCond"_id: 1348 case id<IfCond_t>():
1348 ifCondPairs.back().first = static_cast<IfCond_t*>(node); 1349 ifCondPairs.back().first = static_cast<IfCond_t*>(node);
1349 break; 1350 break;
1350 case "Body"_id: 1351 case id<Body_t>():
1351 ifCondPairs.back().second = static_cast<Body_t*>(node); 1352 ifCondPairs.back().second = static_cast<Body_t*>(node);
1352 ifCondPairs.emplace_back(); 1353 ifCondPairs.emplace_back();
1353 break; 1354 break;
1354 default: break; 1355 default: assert(false); break;
1355 } 1356 }
1356 } 1357 }
1357 auto assign = ifCondPairs.front().first->assign.get(); 1358 auto assign = ifCondPairs.front().first->assign.get();
@@ -1571,22 +1572,22 @@ private:
1571 void transformValue(Value_t* value, str_list& out) { 1572 void transformValue(Value_t* value, str_list& out) {
1572 auto item = value->item.get(); 1573 auto item = value->item.get();
1573 switch (item->getId()) { 1574 switch (item->getId()) {
1574 case "SimpleValue"_id: transformSimpleValue(static_cast<SimpleValue_t*>(item), out); break; 1575 case id<SimpleValue_t>(): transformSimpleValue(static_cast<SimpleValue_t*>(item), out); break;
1575 case "simple_table"_id: transform_simple_table(static_cast<simple_table_t*>(item), out); break; 1576 case id<simple_table_t>(): transform_simple_table(static_cast<simple_table_t*>(item), out); break;
1576 case "ChainValue"_id: { 1577 case id<ChainValue_t>(): {
1577 auto chainValue = static_cast<ChainValue_t*>(item); 1578 auto chainValue = static_cast<ChainValue_t*>(item);
1578 transformChainValue(chainValue, out, ExpUsage::Closure); 1579 transformChainValue(chainValue, out, ExpUsage::Closure);
1579 break; 1580 break;
1580 } 1581 }
1581 case "String"_id: transformString(static_cast<String_t*>(item), out); break; 1582 case id<String_t>(): transformString(static_cast<String_t*>(item), out); break;
1582 default: break; 1583 default: assert(false); break;
1583 } 1584 }
1584 } 1585 }
1585 1586
1586 void transformCallable(Callable_t* callable, str_list& out, const ast_sel<false,Invoke_t,InvokeArgs_t>& invoke = {}) { 1587 void transformCallable(Callable_t* callable, str_list& out, const ast_sel<false,Invoke_t,InvokeArgs_t>& invoke = {}) {
1587 auto item = callable->item.get(); 1588 auto item = callable->item.get();
1588 switch (item->getId()) { 1589 switch (item->getId()) {
1589 case "Variable"_id: { 1590 case id<Variable_t>(): {
1590 transformVariable(static_cast<Variable_t*>(item), out); 1591 transformVariable(static_cast<Variable_t*>(item), out);
1591 if (_config.lintGlobalVariable && !isDefined(out.back())) { 1592 if (_config.lintGlobalVariable && !isDefined(out.back())) {
1592 if (_globals.find(out.back()) == _globals.end()) { 1593 if (_globals.find(out.back()) == _globals.end()) {
@@ -1595,7 +1596,7 @@ private:
1595 } 1596 }
1596 break; 1597 break;
1597 } 1598 }
1598 case "SelfName"_id: { 1599 case id<SelfName_t>(): {
1599 transformSelfName(static_cast<SelfName_t*>(item), out, invoke); 1600 transformSelfName(static_cast<SelfName_t*>(item), out, invoke);
1600 if (_config.lintGlobalVariable) { 1601 if (_config.lintGlobalVariable) {
1601 std::string self("self"sv); 1602 std::string self("self"sv);
@@ -1607,9 +1608,9 @@ private:
1607 } 1608 }
1608 break; 1609 break;
1609 } 1610 }
1610 case "VarArg"_id: out.push_back(s("..."sv)); break; 1611 case id<VarArg_t>(): out.push_back(s("..."sv)); break;
1611 case "Parens"_id: transformParens(static_cast<Parens_t*>(item), out); break; 1612 case id<Parens_t>(): transformParens(static_cast<Parens_t*>(item), out); break;
1612 default: break; 1613 default: assert(false); break;
1613 } 1614 }
1614 } 1615 }
1615 1616
@@ -1622,23 +1623,23 @@ private:
1622 void transformSimpleValue(SimpleValue_t* simpleValue, str_list& out) { 1623 void transformSimpleValue(SimpleValue_t* simpleValue, str_list& out) {
1623 auto value = simpleValue->value.get(); 1624 auto value = simpleValue->value.get();
1624 switch (value->getId()) { 1625 switch (value->getId()) {
1625 case "const_value"_id: transform_const_value(static_cast<const_value_t*>(value), out); break; 1626 case id<const_value_t>(): transform_const_value(static_cast<const_value_t*>(value), out); break;
1626 case "If"_id: transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break; 1627 case id<If_t>(): transformIf(static_cast<If_t*>(value), out, ExpUsage::Closure); break;
1627 case "Unless"_id: transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Closure); break; 1628 case id<Unless_t>(): transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Closure); break;
1628 case "Switch"_id: transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break; 1629 case id<Switch_t>(): transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Closure); break;
1629 case "With"_id: transformWithClosure(static_cast<With_t*>(value), out); break; 1630 case id<With_t>(): transformWithClosure(static_cast<With_t*>(value), out); break;
1630 case "ClassDecl"_id: transformClassDeclClosure(static_cast<ClassDecl_t*>(value), out); break; 1631 case id<ClassDecl_t>(): transformClassDeclClosure(static_cast<ClassDecl_t*>(value), out); break;
1631 case "ForEach"_id: transformForEachClosure(static_cast<ForEach_t*>(value), out); break; 1632 case id<ForEach_t>(): transformForEachClosure(static_cast<ForEach_t*>(value), out); break;
1632 case "For"_id: transformForClosure(static_cast<For_t*>(value), out); break; 1633 case id<For_t>(): transformForClosure(static_cast<For_t*>(value), out); break;
1633 case "While"_id: transformWhileClosure(static_cast<While_t*>(value), out); break; 1634 case id<While_t>(): transformWhileClosure(static_cast<While_t*>(value), out); break;
1634 case "Do"_id: transformDo(static_cast<Do_t*>(value), out, ExpUsage::Closure); break; 1635 case id<Do_t>(): transformDo(static_cast<Do_t*>(value), out, ExpUsage::Closure); break;
1635 case "unary_exp"_id: transform_unary_exp(static_cast<unary_exp_t*>(value), out); break; 1636 case id<unary_exp_t>(): transform_unary_exp(static_cast<unary_exp_t*>(value), out); break;
1636 case "TblComprehension"_id: transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Closure); break; 1637 case id<TblComprehension_t>(): transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Closure); break;
1637 case "TableLit"_id: transformTableLit(static_cast<TableLit_t*>(value), out); break; 1638 case id<TableLit_t>(): transformTableLit(static_cast<TableLit_t*>(value), out); break;
1638 case "Comprehension"_id: transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Closure); break; 1639 case id<Comprehension_t>(): transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Closure); break;
1639 case "FunLit"_id: transformFunLit(static_cast<FunLit_t*>(value), out); break; 1640 case id<FunLit_t>(): transformFunLit(static_cast<FunLit_t*>(value), out); break;
1640 case "Num"_id: transformNum(static_cast<Num_t*>(value), out); break; 1641 case id<Num_t>(): transformNum(static_cast<Num_t*>(value), out); break;
1641 default: break; 1642 default: assert(false); break;
1642 } 1643 }
1643 } 1644 }
1644 1645
@@ -1882,8 +1883,7 @@ private:
1882 } 1883 }
1883 break; 1884 break;
1884 } 1885 }
1885 default: 1886 default: break;
1886 break;
1887 } 1887 }
1888 if (!nodes.empty()) { 1888 if (!nodes.empty()) {
1889 str_list temp; 1889 str_list temp;
@@ -1909,37 +1909,37 @@ private:
1909 if (auto simpleValue = singleValue->item.as<SimpleValue_t>()) { 1909 if (auto simpleValue = singleValue->item.as<SimpleValue_t>()) {
1910 auto value = simpleValue->value.get(); 1910 auto value = simpleValue->value.get();
1911 switch (value->getId()) { 1911 switch (value->getId()) {
1912 case "Comprehension"_id: 1912 case id<Comprehension_t>():
1913 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Return); 1913 transformComprehension(static_cast<Comprehension_t*>(value), out, ExpUsage::Return);
1914 return; 1914 return;
1915 case "TblComprehension"_id: 1915 case id<TblComprehension_t>():
1916 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Return); 1916 transformTblComprehension(static_cast<TblComprehension_t*>(value), out, ExpUsage::Return);
1917 return; 1917 return;
1918 case "With"_id: 1918 case id<With_t>():
1919 transformWith(static_cast<With_t*>(value), out, nullptr, true); 1919 transformWith(static_cast<With_t*>(value), out, nullptr, true);
1920 return; 1920 return;
1921 case "ClassDecl"_id: 1921 case id<ClassDecl_t>():
1922 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Return); 1922 transformClassDecl(static_cast<ClassDecl_t*>(value), out, ExpUsage::Return);
1923 return; 1923 return;
1924 case "Do"_id: 1924 case id<Do_t>():
1925 transformDo(static_cast<Do_t*>(value), out, ExpUsage::Return); 1925 transformDo(static_cast<Do_t*>(value), out, ExpUsage::Return);
1926 return; 1926 return;
1927 case "Switch"_id: 1927 case id<Switch_t>():
1928 transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Return); 1928 transformSwitch(static_cast<Switch_t*>(value), out, ExpUsage::Return);
1929 return; 1929 return;
1930 case "While"_id: 1930 case id<While_t>():
1931 transformWhileInPlace(static_cast<While_t*>(value), out); 1931 transformWhileInPlace(static_cast<While_t*>(value), out);
1932 return; 1932 return;
1933 case "For"_id: 1933 case id<For_t>():
1934 transformForInPlace(static_cast<For_t*>(value), out); 1934 transformForInPlace(static_cast<For_t*>(value), out);
1935 return; 1935 return;
1936 case "ForEach"_id: 1936 case id<ForEach_t>():
1937 transformForEachInPlace(static_cast<ForEach_t*>(value), out); 1937 transformForEachInPlace(static_cast<ForEach_t*>(value), out);
1938 return; 1938 return;
1939 case "If"_id: 1939 case id<If_t>():
1940 transformIf(static_cast<If_t*>(value), out, ExpUsage::Return); 1940 transformIf(static_cast<If_t*>(value), out, ExpUsage::Return);
1941 return; 1941 return;
1942 case "Unless"_id: 1942 case id<Unless_t>():
1943 transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Return); 1943 transformUnless(static_cast<Unless_t*>(value), out, ExpUsage::Return);
1944 return; 1944 return;
1945 } 1945 }
@@ -1998,34 +1998,35 @@ private:
1998 auto def = static_cast<FnArgDef_t*>(_def); 1998 auto def = static_cast<FnArgDef_t*>(_def);
1999 auto& arg = argItems.emplace_back(); 1999 auto& arg = argItems.emplace_back();
2000 switch (def->name->getId()) { 2000 switch (def->name->getId()) {
2001 case "Variable"_id: arg.name = _parser.toString(def->name); break; 2001 case id<Variable_t>(): arg.name = _parser.toString(def->name); break;
2002 case "SelfName"_id: { 2002 case id<SelfName_t>(): {
2003 assignSelf = true; 2003 assignSelf = true;
2004 auto selfName = static_cast<SelfName_t*>(def->name.get()); 2004 auto selfName = static_cast<SelfName_t*>(def->name.get());
2005 switch (selfName->name->getId()) { 2005 switch (selfName->name->getId()) {
2006 case "self_class_name"_id: { 2006 case id<self_class_name_t>(): {
2007 auto clsName = static_cast<self_class_name_t*>(selfName->name.get()); 2007 auto clsName = static_cast<self_class_name_t*>(selfName->name.get());
2008 arg.name = _parser.toString(clsName->name); 2008 arg.name = _parser.toString(clsName->name);
2009 arg.assignSelf = s("self.__class."sv) + arg.name; 2009 arg.assignSelf = s("self.__class."sv) + arg.name;
2010 break; 2010 break;
2011 } 2011 }
2012 case "self_class"_id: 2012 case id<self_class_t>():
2013 arg.name = "self.__class"sv; 2013 arg.name = "self.__class"sv;
2014 break; 2014 break;
2015 case "self_name"_id: { 2015 case id<self_name_t>(): {
2016 2016
2017 auto sfName = static_cast<self_name_t*>(selfName->name.get()); 2017 auto sfName = static_cast<self_name_t*>(selfName->name.get());
2018 arg.name = _parser.toString(sfName->name); 2018 arg.name = _parser.toString(sfName->name);
2019 arg.assignSelf = s("self."sv) + arg.name; 2019 arg.assignSelf = s("self."sv) + arg.name;
2020 break; 2020 break;
2021 } 2021 }
2022 case "self"_id: 2022 case id<self_t>():
2023 arg.name = "self"sv; 2023 arg.name = "self"sv;
2024 break; 2024 break;
2025 default: break; 2025 default: assert(false); break;
2026 } 2026 }
2027 break; 2027 break;
2028 } 2028 }
2029 default: assert(false); break;
2029 } 2030 }
2030 forceAddToScope(arg.name); 2031 forceAddToScope(arg.name);
2031 if (def->defaultValue) { 2032 if (def->defaultValue) {
@@ -2075,7 +2076,7 @@ private:
2075 auto x = selfName; 2076 auto x = selfName;
2076 auto name = selfName->name.get(); 2077 auto name = selfName->name.get();
2077 switch (name->getId()) { 2078 switch (name->getId()) {
2078 case "self_class_name"_id: { 2079 case id<self_class_name_t>(): {
2079 auto clsName = static_cast<self_class_name_t*>(name); 2080 auto clsName = static_cast<self_class_name_t*>(name);
2080 auto nameStr = _parser.toString(clsName->name); 2081 auto nameStr = _parser.toString(clsName->name);
2081 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) { 2082 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) {
@@ -2093,10 +2094,10 @@ private:
2093 } 2094 }
2094 break; 2095 break;
2095 } 2096 }
2096 case "self_class"_id: 2097 case id<self_class_t>():
2097 out.push_back(s("self.__class"sv)); 2098 out.push_back(s("self.__class"sv));
2098 break; 2099 break;
2099 case "self_name"_id: { 2100 case id<self_name_t>(): {
2100 auto sfName = static_cast<self_class_name_t*>(name); 2101 auto sfName = static_cast<self_class_name_t*>(name);
2101 auto nameStr = _parser.toString(sfName->name); 2102 auto nameStr = _parser.toString(sfName->name);
2102 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) { 2103 if (LuaKeywords.find(nameStr) != LuaKeywords.end()) {
@@ -2114,9 +2115,10 @@ private:
2114 } 2115 }
2115 break; 2116 break;
2116 } 2117 }
2117 case "self"_id: 2118 case id<self_t>():
2118 out.push_back(s("self"sv)); 2119 out.push_back(s("self"sv));
2119 break; 2120 break;
2121 default: assert(false); break;
2120 } 2122 }
2121 } 2123 }
2122 2124
@@ -2344,8 +2346,8 @@ private:
2344 } 2346 }
2345 auto baseChain = x->new_ptr<ChainValue_t>(); 2347 auto baseChain = x->new_ptr<ChainValue_t>();
2346 switch (chainList.front()->getId()) { 2348 switch (chainList.front()->getId()) {
2347 case "DotChainItem"_id: 2349 case id<DotChainItem_t>():
2348 case "ColonChainItem"_id: 2350 case id<ColonChainItem_t>():
2349 if (_withVars.empty()) { 2351 if (_withVars.empty()) {
2350 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, chainList.front())); 2352 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, chainList.front()));
2351 } else { 2353 } else {
@@ -2426,8 +2428,8 @@ private:
2426 auto x = chainList.front(); 2428 auto x = chainList.front();
2427 str_list temp; 2429 str_list temp;
2428 switch (x->getId()) { 2430 switch (x->getId()) {
2429 case "DotChainItem"_id: 2431 case id<DotChainItem_t>():
2430 case "ColonChainItem"_id: 2432 case id<ColonChainItem_t>():
2431 if (_withVars.empty()) { 2433 if (_withVars.empty()) {
2432 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, x)); 2434 throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, x));
2433 } else { 2435 } else {
@@ -2438,13 +2440,13 @@ private:
2438 for (auto it = chainList.begin(); it != chainList.end(); ++it) { 2440 for (auto it = chainList.begin(); it != chainList.end(); ++it) {
2439 auto item = *it; 2441 auto item = *it;
2440 switch (item->getId()) { 2442 switch (item->getId()) {
2441 case "Invoke"_id: 2443 case id<Invoke_t>():
2442 transformInvoke(static_cast<Invoke_t*>(item), temp); 2444 transformInvoke(static_cast<Invoke_t*>(item), temp);
2443 break; 2445 break;
2444 case "DotChainItem"_id: 2446 case id<DotChainItem_t>():
2445 transformDotChainItem(static_cast<DotChainItem_t*>(item), temp); 2447 transformDotChainItem(static_cast<DotChainItem_t*>(item), temp);
2446 break; 2448 break;
2447 case "ColonChainItem"_id: { 2449 case id<ColonChainItem_t>(): {
2448 auto colonItem = static_cast<ColonChainItem_t*>(item); 2450 auto colonItem = static_cast<ColonChainItem_t*>(item);
2449 auto current = it; 2451 auto current = it;
2450 auto next = current; ++next; 2452 auto next = current; ++next;
@@ -2469,8 +2471,8 @@ private:
2469 { 2471 {
2470 auto chainValue = x->new_ptr<ChainValue_t>(); 2472 auto chainValue = x->new_ptr<ChainValue_t>();
2471 switch (chainList.front()->getId()) { 2473 switch (chainList.front()->getId()) {
2472 case "DotChainItem"_id: 2474 case id<DotChainItem_t>():
2473 case "ColonChainItem"_id: 2475 case id<ColonChainItem_t>():
2474 chainValue->items.push_back(toAst<Callable_t>(_withVars.top(), x)); 2476 chainValue->items.push_back(toAst<Callable_t>(_withVars.top(), x));
2475 break; 2477 break;
2476 } 2478 }
@@ -2559,10 +2561,10 @@ private:
2559 transformColonChainItem(colonItem, temp); 2561 transformColonChainItem(colonItem, temp);
2560 break; 2562 break;
2561 } 2563 }
2562 case "Slice"_id: 2564 case id<Slice_t>():
2563 transformSlice(static_cast<Slice_t*>(item), temp); 2565 transformSlice(static_cast<Slice_t*>(item), temp);
2564 break; 2566 break;
2565 case "Callable"_id: { 2567 case id<Callable_t>(): {
2566 auto next = it; ++next; 2568 auto next = it; ++next;
2567 auto followItem = next != chainList.end() ? *next : nullptr; 2569 auto followItem = next != chainList.end() ? *next : nullptr;
2568 ast_sel<false, Invoke_t, InvokeArgs_t> invoke; 2570 ast_sel<false, Invoke_t, InvokeArgs_t> invoke;
@@ -2572,16 +2574,16 @@ private:
2572 transformCallable(static_cast<Callable_t*>(item), temp, invoke); 2574 transformCallable(static_cast<Callable_t*>(item), temp, invoke);
2573 break; 2575 break;
2574 } 2576 }
2575 case "String"_id: 2577 case id<String_t>():
2576 transformString(static_cast<String_t*>(item), temp); 2578 transformString(static_cast<String_t*>(item), temp);
2577 temp.back() = s("("sv) + temp.back() + s(")"sv); 2579 temp.back() = s("("sv) + temp.back() + s(")"sv);
2578 break; 2580 break;
2579 case "Exp"_id: 2581 case id<Exp_t>():
2580 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 2582 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
2581 temp.back() = s("["sv) + temp.back() + s("]"sv); 2583 temp.back() = s("["sv) + temp.back() + s("]"sv);
2582 break; 2584 break;
2583 case "InvokeArgs"_id: transformInvokeArgs(static_cast<InvokeArgs_t*>(item), temp); break; 2585 case id<InvokeArgs_t>(): transformInvokeArgs(static_cast<InvokeArgs_t*>(item), temp); break;
2584 default: break; 2586 default: assert(false); break;
2585 } 2587 }
2586 } 2588 }
2587 switch (usage) { 2589 switch (usage) {
@@ -2637,11 +2639,11 @@ private:
2637 str_list temp; 2639 str_list temp;
2638 for (auto arg : invoke->args.objects()) { 2640 for (auto arg : invoke->args.objects()) {
2639 switch (arg->getId()) { 2641 switch (arg->getId()) {
2640 case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break; 2642 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break;
2641 case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(arg), temp); break; 2643 case id<SingleString_t>(): transformSingleString(static_cast<SingleString_t*>(arg), temp); break;
2642 case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(arg), temp); break; 2644 case id<DoubleString_t>(): transformDoubleString(static_cast<DoubleString_t*>(arg), temp); break;
2643 case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(arg), temp); break; 2645 case id<LuaString_t>(): transformLuaString(static_cast<LuaString_t*>(arg), temp); break;
2644 default: break; 2646 default: assert(false); break;
2645 } 2647 }
2646 } 2648 }
2647 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); 2649 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv));
@@ -2672,17 +2674,18 @@ private:
2672 auto compInner = comp->forLoop.get(); 2674 auto compInner = comp->forLoop.get();
2673 for (auto item : compInner->items.objects()) { 2675 for (auto item : compInner->items.objects()) {
2674 switch (item->getId()) { 2676 switch (item->getId()) {
2675 case "CompForEach"_id: 2677 case id<CompForEach_t>():
2676 transformCompForEach(static_cast<CompForEach_t*>(item), temp); 2678 transformCompForEach(static_cast<CompForEach_t*>(item), temp);
2677 break; 2679 break;
2678 case "CompFor"_id: 2680 case id<CompFor_t>():
2679 transformCompFor(static_cast<CompFor_t*>(item), temp); 2681 transformCompFor(static_cast<CompFor_t*>(item), temp);
2680 break; 2682 break;
2681 case "Exp"_id: 2683 case id<Exp_t>():
2682 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 2684 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
2683 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); 2685 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item);
2684 pushScope(); 2686 pushScope();
2685 break; 2687 break;
2688 default: assert(false); break;
2686 } 2689 }
2687 } 2690 }
2688 if (auto stmt = comp->value.as<Statement_t>()) { 2691 if (auto stmt = comp->value.as<Statement_t>()) {
@@ -2724,17 +2727,18 @@ private:
2724 auto compInner = comp->forLoop.get(); 2727 auto compInner = comp->forLoop.get();
2725 for (auto item : compInner->items.objects()) { 2728 for (auto item : compInner->items.objects()) {
2726 switch (item->getId()) { 2729 switch (item->getId()) {
2727 case "CompForEach"_id: 2730 case id<CompForEach_t>():
2728 transformCompForEach(static_cast<CompForEach_t*>(item), temp); 2731 transformCompForEach(static_cast<CompForEach_t*>(item), temp);
2729 break; 2732 break;
2730 case "CompFor"_id: 2733 case id<CompFor_t>():
2731 transformCompFor(static_cast<CompFor_t*>(item), temp); 2734 transformCompFor(static_cast<CompFor_t*>(item), temp);
2732 break; 2735 break;
2733 case "Exp"_id: 2736 case id<Exp_t>():
2734 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 2737 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
2735 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); 2738 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item);
2736 pushScope(); 2739 pushScope();
2737 break; 2740 break;
2741 default: assert(false); break;
2738 } 2742 }
2739 } 2743 }
2740 { 2744 {
@@ -2802,22 +2806,22 @@ private:
2802 for (auto _item : nameList->items.objects()) { 2806 for (auto _item : nameList->items.objects()) {
2803 auto item = static_cast<NameOrDestructure_t*>(_item)->item.get(); 2807 auto item = static_cast<NameOrDestructure_t*>(_item)->item.get();
2804 switch (item->getId()) { 2808 switch (item->getId()) {
2805 case "Variable"_id: 2809 case id<Variable_t>():
2806 transformVariable(static_cast<Variable_t*>(item), vars); 2810 transformVariable(static_cast<Variable_t*>(item), vars);
2807 varAfter.push_back(vars.back()); 2811 varAfter.push_back(vars.back());
2808 break; 2812 break;
2809 case "TableLit"_id: { 2813 case id<TableLit_t>(): {
2810 auto desVar = getUnusedName("_des_"sv); 2814 auto desVar = getUnusedName("_des_"sv);
2811 destructPairs.emplace_back(item, toAst<Exp_t>(desVar, x)); 2815 destructPairs.emplace_back(item, toAst<Exp_t>(desVar, x));
2812 vars.push_back(desVar); 2816 vars.push_back(desVar);
2813 varAfter.push_back(desVar); 2817 varAfter.push_back(desVar);
2814 break; 2818 break;
2815 } 2819 }
2816 default: break; 2820 default: assert(false); break;
2817 } 2821 }
2818 } 2822 }
2819 switch (loopTarget->getId()) { 2823 switch (loopTarget->getId()) {
2820 case "star_exp"_id: { 2824 case id<star_exp_t>(): {
2821 auto star_exp = static_cast<star_exp_t*>(loopTarget); 2825 auto star_exp = static_cast<star_exp_t*>(loopTarget);
2822 auto listVar = singleVariableFrom(star_exp->value); 2826 auto listVar = singleVariableFrom(star_exp->value);
2823 auto indexVar = getUnusedName("_index_"); 2827 auto indexVar = getUnusedName("_index_");
@@ -2902,17 +2906,17 @@ private:
2902 } 2906 }
2903 break; 2907 break;
2904 } 2908 }
2905 case "Exp"_id: 2909 case id<Exp_t>():
2906 transformExp(static_cast<Exp_t*>(loopTarget), temp, ExpUsage::Closure); 2910 transformExp(static_cast<Exp_t*>(loopTarget), temp, ExpUsage::Closure);
2907 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget); 2911 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget);
2908 out.push_back(clearBuf()); 2912 out.push_back(clearBuf());
2909 break; 2913 break;
2910 case "ExpList"_id: 2914 case id<ExpList_t>():
2911 transformExpList(static_cast<ExpList_t*>(loopTarget), temp); 2915 transformExpList(static_cast<ExpList_t*>(loopTarget), temp);
2912 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget); 2916 _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget);
2913 out.push_back(clearBuf()); 2917 out.push_back(clearBuf());
2914 break; 2918 break;
2915 default: break; 2919 default: assert(false); break;
2916 } 2920 }
2917 for (auto& var : varBefore) addToScope(var); 2921 for (auto& var : varBefore) addToScope(var);
2918 pushScope(); 2922 pushScope();
@@ -2947,9 +2951,9 @@ private:
2947 str_list temp; 2951 str_list temp;
2948 for (auto arg : invokeArgs->args.objects()) { 2952 for (auto arg : invokeArgs->args.objects()) {
2949 switch (arg->getId()) { 2953 switch (arg->getId()) {
2950 case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break; 2954 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(arg), temp, ExpUsage::Closure); break;
2951 case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(arg), temp); break; 2955 case id<TableBlock_t>(): transformTableBlock(static_cast<TableBlock_t*>(arg), temp); break;
2952 default: break; 2956 default: assert(false); break;
2953 } 2957 }
2954 } 2958 }
2955 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); 2959 out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv));
@@ -2979,10 +2983,10 @@ private:
2979 str_list temp; 2983 str_list temp;
2980 bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) { 2984 bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) {
2981 switch (node->getId()) { 2985 switch (node->getId()) {
2982 case "For"_id: 2986 case id<For_t>():
2983 case "ForEach"_id: 2987 case id<ForEach_t>():
2984 return traversal::Return; 2988 return traversal::Return;
2985 case "BreakLoop"_id: { 2989 case id<BreakLoop_t>(): {
2986 return _parser.toString(node) == "continue"sv ? 2990 return _parser.toString(node) == "continue"sv ?
2987 traversal::Stop : traversal::Return; 2991 traversal::Stop : traversal::Return;
2988 } 2992 }
@@ -3156,31 +3160,31 @@ private:
3156 auto key = pair->key.get(); 3160 auto key = pair->key.get();
3157 str_list temp; 3161 str_list temp;
3158 switch (key->getId()) { 3162 switch (key->getId()) {
3159 case "KeyName"_id: { 3163 case id<KeyName_t>(): {
3160 transformKeyName(static_cast<KeyName_t*>(key), temp); 3164 transformKeyName(static_cast<KeyName_t*>(key), temp);
3161 if (LuaKeywords.find(temp.back()) != LuaKeywords.end()) { 3165 if (LuaKeywords.find(temp.back()) != LuaKeywords.end()) {
3162 temp.back() = s("[\""sv) + temp.back() + s("\"]"); 3166 temp.back() = s("[\""sv) + temp.back() + s("\"]");
3163 } 3167 }
3164 break; 3168 break;
3165 } 3169 }
3166 case "Exp"_id: 3170 case id<Exp_t>():
3167 transformExp(static_cast<Exp_t*>(key), temp, ExpUsage::Closure); 3171 transformExp(static_cast<Exp_t*>(key), temp, ExpUsage::Closure);
3168 temp.back() = s("["sv) + temp.back() + s("]"sv); 3172 temp.back() = s("["sv) + temp.back() + s("]"sv);
3169 break; 3173 break;
3170 case "DoubleString"_id: 3174 case id<DoubleString_t>():
3171 transformDoubleString(static_cast<DoubleString_t*>(key), temp); 3175 transformDoubleString(static_cast<DoubleString_t*>(key), temp);
3172 temp.back() = s("["sv) + temp.back() + s("]"sv); 3176 temp.back() = s("["sv) + temp.back() + s("]"sv);
3173 break; 3177 break;
3174 case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(key), temp); 3178 case id<SingleString_t>(): transformSingleString(static_cast<SingleString_t*>(key), temp);
3175 temp.back() = s("["sv) + temp.back() + s("]"sv); 3179 temp.back() = s("["sv) + temp.back() + s("]"sv);
3176 break; 3180 break;
3177 default: break; 3181 default: assert(false); break;
3178 } 3182 }
3179 auto value = pair->value.get(); 3183 auto value = pair->value.get();
3180 switch (value->getId()) { 3184 switch (value->getId()) {
3181 case "Exp"_id: transformExp(static_cast<Exp_t*>(value), temp, ExpUsage::Closure); break; 3185 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(value), temp, ExpUsage::Closure); break;
3182 case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), temp); break; 3186 case id<TableBlock_t>(): transformTableBlock(static_cast<TableBlock_t*>(value), temp); break;
3183 default: break; 3187 default: assert(false); break;
3184 } 3188 }
3185 out.push_back(temp.front() + s(" = "sv) + temp.back()); 3189 out.push_back(temp.front() + s(" = "sv) + temp.back());
3186 } 3190 }
@@ -3188,9 +3192,9 @@ private:
3188 void transformKeyName(KeyName_t* keyName, str_list& out) { 3192 void transformKeyName(KeyName_t* keyName, str_list& out) {
3189 auto name = keyName->name.get(); 3193 auto name = keyName->name.get();
3190 switch (name->getId()) { 3194 switch (name->getId()) {
3191 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(name), out); break; 3195 case id<SelfName_t>(): transformSelfName(static_cast<SelfName_t*>(name), out); break;
3192 case "Name"_id: out.push_back(_parser.toString(name)); break; 3196 case id<Name_t>(): out.push_back(_parser.toString(name)); break;
3193 default: break; 3197 default: assert(false); break;
3194 } 3198 }
3195 } 3199 }
3196 3200
@@ -3214,18 +3218,18 @@ private:
3214 auto seg = static_cast<double_string_content_t*>(_seg); 3218 auto seg = static_cast<double_string_content_t*>(_seg);
3215 auto content = seg->content.get(); 3219 auto content = seg->content.get();
3216 switch (content->getId()) { 3220 switch (content->getId()) {
3217 case "double_string_inner"_id: { 3221 case id<double_string_inner_t>(): {
3218 auto str = _parser.toString(content); 3222 auto str = _parser.toString(content);
3219 Utils::replace(str, "\r"sv, ""); 3223 Utils::replace(str, "\r"sv, "");
3220 Utils::replace(str, "\n"sv, "\\n"sv); 3224 Utils::replace(str, "\n"sv, "\\n"sv);
3221 temp.push_back(s("\""sv) + str + s("\""sv)); 3225 temp.push_back(s("\""sv) + str + s("\""sv));
3222 break; 3226 break;
3223 } 3227 }
3224 case "Exp"_id: 3228 case id<Exp_t>():
3225 transformExp(static_cast<Exp_t*>(content), temp, ExpUsage::Closure); 3229 transformExp(static_cast<Exp_t*>(content), temp, ExpUsage::Closure);
3226 temp.back() = s("tostring("sv) + temp.back() + s(")"sv); 3230 temp.back() = s("tostring("sv) + temp.back() + s(")"sv);
3227 break; 3231 break;
3228 default: break; 3232 default: assert(false); break;
3229 } 3233 }
3230 } 3234 }
3231 out.push_back(temp.empty() ? s("\"\""sv) : join(temp, " .. "sv)); 3235 out.push_back(temp.empty() ? s("\"\""sv) : join(temp, " .. "sv));
@@ -3234,10 +3238,10 @@ private:
3234 void transformString(String_t* string, str_list& out) { 3238 void transformString(String_t* string, str_list& out) {
3235 auto str = string->str.get(); 3239 auto str = string->str.get();
3236 switch (str->getId()) { 3240 switch (str->getId()) {
3237 case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(str), out); break; 3241 case id<SingleString_t>(): transformSingleString(static_cast<SingleString_t*>(str), out); break;
3238 case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(str), out); break; 3242 case id<DoubleString_t>(): transformDoubleString(static_cast<DoubleString_t*>(str), out); break;
3239 case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(str), out); break; 3243 case id<LuaString_t>(): transformLuaString(static_cast<LuaString_t*>(str), out); break;
3240 default: break; 3244 default: assert(false); break;
3241 } 3245 }
3242 } 3246 }
3243 3247
@@ -3370,7 +3374,7 @@ private:
3370 std::list<ClassMember> members; 3374 std::list<ClassMember> members;
3371 for (auto content : classDecl->body->contents.objects()) { 3375 for (auto content : classDecl->body->contents.objects()) {
3372 switch (content->getId()) { 3376 switch (content->getId()) {
3373 case "class_member_list"_id: { 3377 case id<class_member_list_t>(): {
3374 size_t inc = transform_class_member_list(static_cast<class_member_list_t*>(content), members, classVar); 3378 size_t inc = transform_class_member_list(static_cast<class_member_list_t*>(content), members, classVar);
3375 auto it = members.end(); 3379 auto it = members.end();
3376 for (size_t i = 0; i < inc; ++i, --it); 3380 for (size_t i = 0; i < inc; ++i, --it);
@@ -3384,10 +3388,10 @@ private:
3384 } 3388 }
3385 break; 3389 break;
3386 } 3390 }
3387 case "Statement"_id: 3391 case id<Statement_t>():
3388 transformStatement(static_cast<Statement_t*>(content), statements); 3392 transformStatement(static_cast<Statement_t*>(content), statements);
3389 break; 3393 break;
3390 default: break; 3394 default: assert(false); break;
3391 } 3395 }
3392 } 3396 }
3393 for (auto& member : members) { 3397 for (auto& member : members) {
@@ -3530,7 +3534,7 @@ private:
3530 } 3534 }
3531 } 3535 }
3532 normal_pair->value->traverse([&](ast_node* node) { 3536 normal_pair->value->traverse([&](ast_node* node) {
3533 if (node->getId() == "ClassDecl"_id) return traversal::Return; 3537 if (node->getId() == id<ClassDecl_t>()) return traversal::Return;
3534 if (auto chainValue = ast_cast<ChainValue_t>(node)) { 3538 if (auto chainValue = ast_cast<ChainValue_t>(node)) {
3535 if (auto callable = ast_cast<Callable_t>(chainValue->items.front())) { 3539 if (auto callable = ast_cast<Callable_t>(chainValue->items.front())) {
3536 auto var = callable->item.get(); 3540 auto var = callable->item.get();
@@ -3538,12 +3542,12 @@ private:
3538 auto insertSelfToArguments = [&](ast_node* item) { 3542 auto insertSelfToArguments = [&](ast_node* item) {
3539 auto x = item; 3543 auto x = item;
3540 switch (item->getId()) { 3544 switch (item->getId()) {
3541 case "InvokeArgs"_id: { 3545 case id<InvokeArgs_t>(): {
3542 auto invoke = static_cast<InvokeArgs_t*>(item); 3546 auto invoke = static_cast<InvokeArgs_t*>(item);
3543 invoke->args.push_front(toAst<Exp_t>("self"sv, x)); 3547 invoke->args.push_front(toAst<Exp_t>("self"sv, x));
3544 return true; 3548 return true;
3545 } 3549 }
3546 case "Invoke"_id: { 3550 case id<Invoke_t>(): {
3547 auto invoke = static_cast<Invoke_t*>(item); 3551 auto invoke = static_cast<Invoke_t*>(item);
3548 invoke->args.push_front(toAst<Exp_t>("self"sv, x)); 3552 invoke->args.push_front(toAst<Exp_t>("self"sv, x));
3549 return true; 3553 return true;
@@ -3584,12 +3588,13 @@ private:
3584 decIndentOffset(); 3588 decIndentOffset();
3585 } 3589 }
3586 switch (keyValue->getId()) { 3590 switch (keyValue->getId()) {
3587 case "variable_pair"_id: 3591 case id<variable_pair_t>():
3588 transform_variable_pair(static_cast<variable_pair_t*>(keyValue), temp); 3592 transform_variable_pair(static_cast<variable_pair_t*>(keyValue), temp);
3589 break; 3593 break;
3590 case "normal_pair"_id: 3594 case id<normal_pair_t>():
3591 transform_normal_pair(static_cast<normal_pair_t*>(keyValue), temp); 3595 transform_normal_pair(static_cast<normal_pair_t*>(keyValue), temp);
3592 break; 3596 break;
3597 default: assert(false); break;
3593 } 3598 }
3594 if (type == MemType::Property) { 3599 if (type == MemType::Property) {
3595 incIndentOffset(); 3600 incIndentOffset();
@@ -3605,10 +3610,10 @@ private:
3605 void transformAssignable(Assignable_t* assignable, str_list& out) { 3610 void transformAssignable(Assignable_t* assignable, str_list& out) {
3606 auto item = assignable->item.get(); 3611 auto item = assignable->item.get();
3607 switch (item->getId()) { 3612 switch (item->getId()) {
3608 case "AssignableChain"_id: transformAssignableChain(static_cast<AssignableChain_t*>(item), out); break; 3613 case id<AssignableChain_t>(): transformAssignableChain(static_cast<AssignableChain_t*>(item), out); break;
3609 case "Variable"_id: transformVariable(static_cast<Variable_t*>(item), out); break; 3614 case id<Variable_t>(): transformVariable(static_cast<Variable_t*>(item), out); break;
3610 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(item), out); break; 3615 case id<SelfName_t>(): transformSelfName(static_cast<SelfName_t*>(item), out); break;
3611 default: break; 3616 default: assert(false); break;
3612 } 3617 }
3613 } 3618 }
3614 3619
@@ -3771,23 +3776,23 @@ private:
3771 auto x = exportNode; 3776 auto x = exportNode;
3772 auto item = exportNode->item.get(); 3777 auto item = exportNode->item.get();
3773 switch (item->getId()) { 3778 switch (item->getId()) {
3774 case "ClassDecl"_id: { 3779 case id<ClassDecl_t>(): {
3775 auto classDecl = static_cast<ClassDecl_t*>(item); 3780 auto classDecl = static_cast<ClassDecl_t*>(item);
3776 if (classDecl->name && classDecl->name->item->getId() == "Variable"_id) { 3781 if (classDecl->name && classDecl->name->item->getId() == id<Variable_t>()) {
3777 markVarExported(ExportMode::Any, true); 3782 markVarExported(ExportMode::Any, true);
3778 addExportedVar(_parser.toString(classDecl->name->item)); 3783 addExportedVar(_parser.toString(classDecl->name->item));
3779 } 3784 }
3780 transformClassDecl(classDecl, out, ExpUsage::Common); 3785 transformClassDecl(classDecl, out, ExpUsage::Common);
3781 break; 3786 break;
3782 } 3787 }
3783 case "export_op"_id: 3788 case id<export_op_t>():
3784 if (_parser.toString(item) == "*"sv) { 3789 if (_parser.toString(item) == "*"sv) {
3785 markVarExported(ExportMode::Any, false); 3790 markVarExported(ExportMode::Any, false);
3786 } else { 3791 } else {
3787 markVarExported(ExportMode::Capital, false); 3792 markVarExported(ExportMode::Capital, false);
3788 } 3793 }
3789 break; 3794 break;
3790 case "export_values"_id: { 3795 case id<export_values_t>(): {
3791 markVarExported(ExportMode::Any, true); 3796 markVarExported(ExportMode::Any, true);
3792 auto values = exportNode->item.to<export_values_t>(); 3797 auto values = exportNode->item.to<export_values_t>();
3793 if (values->valueList) { 3798 if (values->valueList) {
@@ -3817,8 +3822,7 @@ private:
3817 } 3822 }
3818 break; 3823 break;
3819 } 3824 }
3820 default: 3825 default: assert(false); break;
3821 break;
3822 } 3826 }
3823 } 3827 }
3824 3828
@@ -3831,9 +3835,10 @@ private:
3831 pushScope(); 3835 pushScope();
3832 for (auto pair : pairs) { 3836 for (auto pair : pairs) {
3833 switch (pair->getId()) { 3837 switch (pair->getId()) {
3834 case "Exp"_id: transformExp(static_cast<Exp_t*>(pair), temp, ExpUsage::Closure); break; 3838 case id<Exp_t>(): transformExp(static_cast<Exp_t*>(pair), temp, ExpUsage::Closure); break;
3835 case "variable_pair"_id: transform_variable_pair(static_cast<variable_pair_t*>(pair), temp); break; 3839 case id<variable_pair_t>(): transform_variable_pair(static_cast<variable_pair_t*>(pair), temp); break;
3836 case "normal_pair"_id: transform_normal_pair(static_cast<normal_pair_t*>(pair), temp); break; 3840 case id<normal_pair_t>(): transform_normal_pair(static_cast<normal_pair_t*>(pair), temp); break;
3841 default: assert(false); break;
3837 } 3842 }
3838 temp.back() = indent() + temp.back() + (pair == pairs.back() ? Empty : s(","sv)) + nll(pair); 3843 temp.back() = indent() + temp.back() + (pair == pairs.back() ? Empty : s(","sv)) + nll(pair);
3839 } 3844 }
@@ -3863,17 +3868,18 @@ private:
3863 auto compInner = comp->forLoop.get(); 3868 auto compInner = comp->forLoop.get();
3864 for (auto item : compInner->items.objects()) { 3869 for (auto item : compInner->items.objects()) {
3865 switch (item->getId()) { 3870 switch (item->getId()) {
3866 case "CompForEach"_id: 3871 case id<CompForEach_t>():
3867 transformCompForEach(static_cast<CompForEach_t*>(item), temp); 3872 transformCompForEach(static_cast<CompForEach_t*>(item), temp);
3868 break; 3873 break;
3869 case "CompFor"_id: 3874 case id<CompFor_t>():
3870 transformCompFor(static_cast<CompFor_t*>(item), temp); 3875 transformCompFor(static_cast<CompFor_t*>(item), temp);
3871 break; 3876 break;
3872 case "Exp"_id: 3877 case id<Exp_t>():
3873 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure); 3878 transformExp(static_cast<Exp_t*>(item), temp, ExpUsage::Closure);
3874 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); 3879 temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item);
3875 pushScope(); 3880 pushScope();
3876 break; 3881 break;
3882 default: assert(false); break;
3877 } 3883 }
3878 } 3884 }
3879 transformExp(comp->key, kv, ExpUsage::Closure); 3885 transformExp(comp->key, kv, ExpUsage::Closure);
@@ -3989,7 +3995,7 @@ private:
3989 auto assign = x->new_ptr<Assign_t>(); 3995 auto assign = x->new_ptr<Assign_t>();
3990 for (auto name : import->names.objects()) { 3996 for (auto name : import->names.objects()) {
3991 switch (name->getId()) { 3997 switch (name->getId()) {
3992 case "Variable"_id: { 3998 case id<Variable_t>(): {
3993 auto var = ast_to<Variable_t>(name); 3999 auto var = ast_to<Variable_t>(name);
3994 { 4000 {
3995 auto callable = toAst<Callable_t>(objVar, x); 4001 auto callable = toAst<Callable_t>(objVar, x);
@@ -4015,7 +4021,7 @@ private:
4015 expList->exprs.push_back(exp); 4021 expList->exprs.push_back(exp);
4016 break; 4022 break;
4017 } 4023 }
4018 case "colon_import_name"_id: { 4024 case id<colon_import_name_t>(): {
4019 auto var = static_cast<colon_import_name_t*>(name)->name.get(); 4025 auto var = static_cast<colon_import_name_t*>(name)->name.get();
4020 { 4026 {
4021 auto nameNode = var->name.get(); 4027 auto nameNode = var->name.get();
@@ -4042,6 +4048,7 @@ private:
4042 expList->exprs.push_back(exp); 4048 expList->exprs.push_back(exp);
4043 break; 4049 break;
4044 } 4050 }
4051 default: assert(false); break;
4045 } 4052 }
4046 } 4053 }
4047 if (objAssign) { 4054 if (objAssign) {
@@ -4101,14 +4108,13 @@ private:
4101 void transformImport(Import_t* import, str_list& out) { 4108 void transformImport(Import_t* import, str_list& out) {
4102 auto content = import->content.get(); 4109 auto content = import->content.get();
4103 switch (content->getId()) { 4110 switch (content->getId()) {
4104 case "ImportAs"_id: 4111 case id<ImportAs_t>():
4105 transformImportAs(static_cast<ImportAs_t*>(content), out); 4112 transformImportAs(static_cast<ImportAs_t*>(content), out);
4106 break; 4113 break;
4107 case "ImportFrom"_id: 4114 case id<ImportFrom_t>():
4108 transformImportFrom(static_cast<ImportFrom_t*>(content), out); 4115 transformImportFrom(static_cast<ImportFrom_t*>(content), out);
4109 break; 4116 break;
4110 default: 4117 default: assert(false); break;
4111 break;
4112 } 4118 }
4113 } 4119 }
4114 4120