From 71d9ad9506524fcd3e124c4b4a460afa8fbf35eb Mon Sep 17 00:00:00 2001 From: Li Jin Date: Mon, 17 Feb 2020 15:46:38 +0800 Subject: refactor some codes to be safer. --- .gitignore | 2 + src/MoonP/moon_ast.h | 227 ++++++++++++------------ src/MoonP/moon_compiler.cpp | 408 ++++++++++++++++++++++---------------------- src/MoonP/parser.hpp | 11 -- src/moonp.cpp | 66 ++++--- 5 files changed, 358 insertions(+), 356 deletions(-) diff --git a/.gitignore b/.gitignore index d3acf45..27acefe 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ moonp build build.luarocks spec/outputs +moonplus-*.rock* +!moonplus-dev-1.rockspec diff --git a/src/MoonP/moon_ast.h b/src/MoonP/moon_ast.h index 86f5ef3..4525df1 100644 --- a/src/MoonP/moon_ast.h +++ b/src/MoonP/moon_ast.h @@ -13,19 +13,28 @@ using namespace parserlib; namespace MoonP { -#define AST_LEAF(type, id) \ +// str hash helper functions (djb2) +inline constexpr size_t hash(char const* input) { + return *input ? *input + 33ull * hash(input + 1) : 5381; +} + +template +constexpr typename std::enable_if::value,size_t>::type +id() { return 0; } + +#define AST_LEAF(type) \ class type##_t : public ast_node \ { \ public: \ virtual int get_type() override { return ast_type(); } \ - virtual size_t getId() const override { return id; } \ + virtual size_t getId() const override { return hash(#type); } -#define AST_NODE(type, id) \ +#define AST_NODE(type) \ class type##_t : public ast_container \ { \ public: \ virtual int get_type() override { return ast_type(); } \ - virtual size_t getId() const override { return id; } \ + virtual size_t getId() const override { return hash(#type); } \ #define AST_MEMBER(type, ...) \ type##_t() { \ @@ -33,73 +42,74 @@ public: \ } #define AST_END(type) \ -}; +}; \ +template<> constexpr size_t id() { return hash(#type); } -AST_LEAF(Num, "Num"_id) +AST_LEAF(Num) AST_END(Num) -AST_LEAF(Name, "Name"_id) +AST_LEAF(Name) AST_END(Name) -AST_NODE(Variable, "Variable"_id) +AST_NODE(Variable) ast_ptr name; AST_MEMBER(Variable, &name) AST_END(Variable) -AST_NODE(LuaKeyword, "LuaKeyword"_id) +AST_NODE(LuaKeyword) ast_ptr name; AST_MEMBER(LuaKeyword, &name) AST_END(LuaKeyword) -AST_LEAF(self, "self"_id) +AST_LEAF(self) AST_END(self) -AST_NODE(self_name, "self_name"_id) +AST_NODE(self_name) ast_ptr name; AST_MEMBER(self_name, &name) AST_END(self_name) -AST_LEAF(self_class, "self_class"_id) +AST_LEAF(self_class) AST_END(self_class) -AST_NODE(self_class_name, "self_class_name"_id) +AST_NODE(self_class_name) ast_ptr name; AST_MEMBER(self_class_name, &name) AST_END(self_class_name) -AST_NODE(SelfName, "SelfName"_id) +AST_NODE(SelfName) ast_sel name; AST_MEMBER(SelfName, &name) AST_END(SelfName) -AST_NODE(KeyName, "KeyName"_id) +AST_NODE(KeyName) ast_sel name; AST_MEMBER(KeyName, &name) AST_END(KeyName) -AST_LEAF(VarArg, "VarArg"_id) +AST_LEAF(VarArg) AST_END(VarArg) -AST_LEAF(local_flag, "local_flag"_id) +AST_LEAF(local_flag) AST_END(local_flag) -AST_LEAF(Seperator, "Seperator"_id) +AST_LEAF(Seperator) AST_END(Seperator) -AST_NODE(NameList, "NameList"_id) +AST_NODE(NameList) ast_ptr sep; ast_list names; AST_MEMBER(NameList, &sep, &names) AST_END(NameList) -AST_NODE(Local, "Local"_id) +AST_NODE(Local) ast_sel name; std::list forceDecls; std::list decls; AST_MEMBER(Local, &name) AST_END(Local) -AST_NODE(colon_import_name, "colon_import_name"_id) +AST_NODE(colon_import_name) ast_ptr name; AST_MEMBER(colon_import_name, &name) AST_END(colon_import_name) @@ -107,29 +117,29 @@ AST_END(colon_import_name) class Exp_t; class TableLit_t; -AST_LEAF(import_literal_inner, "import_literal_inner"_id) +AST_LEAF(import_literal_inner) AST_END(import_literal_inner) -AST_NODE(ImportLiteral, "ImportLiteral"_id) +AST_NODE(ImportLiteral) ast_ptr sep; ast_sel_list inners; AST_MEMBER(ImportLiteral, &sep, &inners) AST_END(ImportLiteral) -AST_NODE(ImportAs, "ImportAs"_id) +AST_NODE(ImportAs) ast_ptr literal; ast_sel target; AST_MEMBER(ImportAs, &literal, &target) AST_END(ImportAs) -AST_NODE(ImportFrom, "ImportFrom"_id) +AST_NODE(ImportFrom) ast_ptr sep; ast_sel_list names; ast_ptr exp; AST_MEMBER(ImportFrom, &sep, &names, &exp) AST_END(ImportFrom) -AST_NODE(Import, "Import"_id) +AST_NODE(Import) ast_sel content; AST_MEMBER(Import, &content) AST_END(Import) @@ -137,25 +147,25 @@ AST_END(Import) class FnArgsDef_t; class ChainValue_t; -AST_NODE(Backcall, "Backcall"_id) +AST_NODE(Backcall) ast_ptr argsDef; ast_ptr value; AST_MEMBER(Backcall, &argsDef, &value) AST_END(Backcall) -AST_NODE(ExpListLow, "ExpListLow"_id) +AST_NODE(ExpListLow) ast_ptr sep; ast_list exprs; AST_MEMBER(ExpListLow, &sep, &exprs) AST_END(ExpListLow) -AST_NODE(ExpList, "ExpList"_id) +AST_NODE(ExpList) ast_ptr sep; ast_list exprs; AST_MEMBER(ExpList, &sep, &exprs) AST_END(ExpList) -AST_NODE(Return, "Return"_id) +AST_NODE(Return) ast_ptr valueList; AST_MEMBER(Return, &valueList) AST_END(Return) @@ -163,20 +173,20 @@ AST_END(Return) class Assign_t; class Body_t; -AST_NODE(With, "With"_id) +AST_NODE(With) ast_ptr valueList; ast_ptr assigns; ast_ptr body; AST_MEMBER(With, &valueList, &assigns, &body) AST_END(With) -AST_NODE(SwitchCase, "SwitchCase"_id) +AST_NODE(SwitchCase) ast_ptr valueList; ast_ptr body; AST_MEMBER(SwitchCase, &valueList, &body) AST_END(SwitchCase) -AST_NODE(Switch, "Switch"_id) +AST_NODE(Switch) ast_ptr target; ast_ptr sep; ast_list branches; @@ -184,36 +194,36 @@ AST_NODE(Switch, "Switch"_id) AST_MEMBER(Switch, &target, &sep, &branches, &lastBranch) AST_END(Switch) -AST_NODE(IfCond, "IfCond"_id) +AST_NODE(IfCond) ast_ptr condition; ast_ptr assign; AST_MEMBER(IfCond, &condition, &assign) AST_END(IfCond) -AST_NODE(If, "If"_id) +AST_NODE(If) ast_ptr sep; ast_sel_list nodes; AST_MEMBER(If, &sep, &nodes) AST_END(If) -AST_NODE(Unless, "Unless"_id) +AST_NODE(Unless) ast_ptr sep; ast_sel_list nodes; AST_MEMBER(Unless, &sep, &nodes) AST_END(Unless) -AST_NODE(While, "While"_id) +AST_NODE(While) ast_ptr condition; ast_ptr body; AST_MEMBER(While, &condition, &body) AST_END(While) -AST_NODE(for_step_value, "for_step_value"_id) +AST_NODE(for_step_value) ast_ptr value; AST_MEMBER(for_step_value, &value) AST_END(for_step_value) -AST_NODE(For, "For"_id) +AST_NODE(For) ast_ptr varName; ast_ptr startValue; ast_ptr stopValue; @@ -225,14 +235,14 @@ AST_END(For) class AssignableNameList_t; class star_exp_t; -AST_NODE(ForEach, "ForEach"_id) +AST_NODE(ForEach) ast_ptr nameList; ast_sel loopValue; ast_ptr body; AST_MEMBER(ForEach, &nameList, &loopValue, &body) AST_END(ForEach) -AST_NODE(Do, "Do"_id) +AST_NODE(Do) ast_ptr body; AST_MEMBER(Do, &body) AST_END(Do) @@ -240,36 +250,36 @@ AST_END(Do) class CompInner_t; class Statement_t; -AST_NODE(Comprehension, "Comprehension"_id) +AST_NODE(Comprehension) ast_sel value; ast_ptr forLoop; AST_MEMBER(Comprehension, &value, &forLoop) AST_END(Comprehension) -AST_NODE(comp_value, "comp_value"_id) +AST_NODE(comp_value) ast_ptr value; AST_MEMBER(comp_value, &value) AST_END(comp_value) -AST_NODE(TblComprehension, "TblComprehension"_id) +AST_NODE(TblComprehension) ast_ptr key; ast_ptr value; ast_ptr forLoop; AST_MEMBER(TblComprehension, &key, &value, &forLoop) AST_END(TblComprehension) -AST_NODE(star_exp, "star_exp"_id) +AST_NODE(star_exp) ast_ptr value; AST_MEMBER(star_exp, &value) AST_END(star_exp) -AST_NODE(CompForEach, "CompForEach"_id) +AST_NODE(CompForEach) ast_ptr nameList; ast_sel loopValue; AST_MEMBER(CompForEach, &nameList, &loopValue) AST_END(CompForEach) -AST_NODE(CompFor, "CompFor"_id) +AST_NODE(CompFor) ast_ptr varName; ast_ptr startValue; ast_ptr stopValue; @@ -277,7 +287,7 @@ AST_NODE(CompFor, "CompFor"_id) AST_MEMBER(CompFor, &varName, &startValue, &stopValue, &stepValue) AST_END(CompFor) -AST_NODE(CompInner, "CompInner"_id) +AST_NODE(CompInner) ast_ptr sep; ast_sel_list items; AST_MEMBER(CompInner, &sep, &items) @@ -285,43 +295,43 @@ AST_END(CompInner) class TableBlock_t; -AST_NODE(Assign, "Assign"_id) +AST_NODE(Assign) ast_ptr sep; ast_sel_list values; AST_MEMBER(Assign, &sep, &values) AST_END(Assign) -AST_LEAF(update_op, "update_op"_id) +AST_LEAF(update_op) AST_END(update_op) -AST_NODE(Update, "Update"_id) +AST_NODE(Update) ast_ptr op; ast_ptr value; AST_MEMBER(Update, &op, &value) AST_END(Update) -AST_LEAF(BinaryOperator, "BinaryOperator"_id) +AST_LEAF(BinaryOperator) AST_END(BinaryOperator) -AST_LEAF(BackcallOperator, "BackcallOperator"_id) +AST_LEAF(BackcallOperator) AST_END(BackcallOperator) class AssignableChain_t; -AST_NODE(Assignable, "Assignable"_id) +AST_NODE(Assignable) ast_sel item; AST_MEMBER(Assignable, &item) AST_END(Assignable) class Value_t; -AST_NODE(exp_op_value, "exp_op_value"_id) +AST_NODE(exp_op_value) ast_sel op; ast_ptr value; AST_MEMBER(exp_op_value, &op, &value) AST_END(exp_op_value) -AST_NODE(Exp, "Exp"_id) +AST_NODE(Exp) ast_ptr value; ast_list opValues; AST_MEMBER(Exp, &value, &opValues) @@ -329,12 +339,12 @@ AST_END(Exp) class Parens_t; -AST_NODE(Callable, "Callable"_id) +AST_NODE(Callable) ast_sel item; AST_MEMBER(Callable, &item) AST_END(Callable) -AST_NODE(variable_pair, "variable_pair"_id) +AST_NODE(variable_pair) ast_ptr name; AST_MEMBER(variable_pair, &name) AST_END(variable_pair) @@ -342,13 +352,13 @@ AST_END(variable_pair) class DoubleString_t; class SingleString_t; -AST_NODE(normal_pair, "normal_pair"_id) +AST_NODE(normal_pair) ast_sel key; ast_sel value; AST_MEMBER(normal_pair, &key, &value) AST_END(normal_pair) -AST_NODE(simple_table, "simple_table"_id) +AST_NODE(simple_table) ast_ptr sep; ast_sel_list pairs; AST_MEMBER(simple_table, &sep, &pairs) @@ -361,7 +371,7 @@ class unary_exp_t; class TableLit_t; class FunLit_t; -AST_NODE(SimpleValue, "SimpleValue"_id) +AST_NODE(SimpleValue) ast_sel open; ast_ptr content; ast_ptr close; AST_MEMBER(LuaString, &open, &content, &close) AST_END(LuaString) -AST_LEAF(SingleString, "SingleString"_id) +AST_LEAF(SingleString) AST_END(SingleString) -AST_LEAF(double_string_inner, "double_string_inner"_id) +AST_LEAF(double_string_inner) AST_END(double_string_inner) -AST_NODE(double_string_content, "double_string_content"_id) +AST_NODE(double_string_content) ast_sel content; AST_MEMBER(double_string_content, &content) AST_END(double_string_content) -AST_NODE(DoubleString, "DoubleString"_id) +AST_NODE(DoubleString) ast_ptr sep; ast_list segments; AST_MEMBER(DoubleString, &sep, &segments) AST_END(DoubleString) -AST_NODE(String, "String"_id) +AST_NODE(String) ast_sel str; AST_MEMBER(String, &str) AST_END(String) -AST_NODE(DotChainItem, "DotChainItem"_id) +AST_NODE(DotChainItem) ast_ptr name; AST_MEMBER(DotChainItem, &name) AST_END(DotChainItem) -AST_NODE(ColonChainItem, "ColonChainItem"_id) +AST_NODE(ColonChainItem) ast_sel name; bool switchToDot = false; AST_MEMBER(ColonChainItem, &name) @@ -421,180 +431,180 @@ AST_END(ColonChainItem) class default_value_t; -AST_NODE(Slice, "Slice"_id) +AST_NODE(Slice) ast_sel startValue; ast_sel stopValue; ast_sel stepValue; AST_MEMBER(Slice, &startValue, &stopValue, &stepValue) AST_END(Slice) -AST_NODE(Parens, "Parens"_id) +AST_NODE(Parens) ast_ptr expr; AST_MEMBER(Parens, &expr) AST_END(Parens) -AST_NODE(Invoke, "Invoke"_id) +AST_NODE(Invoke) ast_ptr sep; ast_sel_list args; AST_MEMBER(Invoke, &sep, &args) AST_END(Invoke) -AST_LEAF(existential_op, "existential_op"_id) +AST_LEAF(existential_op) AST_END(existential_op) class InvokeArgs_t; -AST_NODE(ChainValue, "ChainValue"_id) +AST_NODE(ChainValue) ast_ptr sep; ast_sel_list items; AST_MEMBER(ChainValue, &sep, &items) AST_END(ChainValue) -AST_NODE(AssignableChain, "AssignableChain"_id) +AST_NODE(AssignableChain) ast_ptr sep; ast_sel_list items; AST_MEMBER(AssignableChain, &sep, &items) AST_END(AssignableChain) -AST_NODE(Value, "Value"_id) +AST_NODE(Value) ast_sel item; AST_MEMBER(Value, &item) AST_END(Value) -AST_LEAF(default_value, "default_value"_id) +AST_LEAF(default_value) AST_END(default_value) -AST_NODE(TableLit, "TableLit"_id) +AST_NODE(TableLit) ast_ptr sep; ast_sel_list values; AST_MEMBER(TableLit, &sep, &values) AST_END(TableLit) -AST_NODE(TableBlock, "TableBlock"_id) +AST_NODE(TableBlock) ast_ptr sep; ast_sel_list values; AST_MEMBER(TableBlock, &sep, &values) AST_END(TableBlock) -AST_NODE(class_member_list, "class_member_list"_id) +AST_NODE(class_member_list) ast_ptr sep; ast_sel_list values; AST_MEMBER(class_member_list, &sep, &values) AST_END(class_member_list) -AST_NODE(ClassBlock, "ClassBlock"_id) +AST_NODE(ClassBlock) ast_ptr sep; ast_sel_list contents; AST_MEMBER(ClassBlock, &sep, &contents) AST_END(ClassBlock) -AST_NODE(ClassDecl, "ClassDecl"_id) +AST_NODE(ClassDecl) ast_ptr name; ast_ptr extend; ast_ptr body; AST_MEMBER(ClassDecl, &name, &extend, &body) AST_END(ClassDecl) -AST_NODE(export_values, "export_values"_id) +AST_NODE(export_values) ast_ptr nameList; ast_ptr valueList; AST_MEMBER(export_values, &nameList, &valueList) AST_END(export_values) -AST_LEAF(export_op, "export_op"_id) +AST_LEAF(export_op) AST_END(export_op) -AST_NODE(Export, "Export"_id) +AST_NODE(Export) ast_sel item; AST_MEMBER(Export, &item) AST_END(Export) -AST_NODE(FnArgDef, "FnArgDef"_id) +AST_NODE(FnArgDef) ast_sel name; ast_ptr defaultValue; AST_MEMBER(FnArgDef, &name, &defaultValue) AST_END(FnArgDef) -AST_NODE(FnArgDefList, "FnArgDefList"_id) +AST_NODE(FnArgDefList) ast_ptr sep; ast_list definitions; ast_ptr varArg; AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg) AST_END(FnArgDefList) -AST_NODE(outer_var_shadow, "outer_var_shadow"_id) +AST_NODE(outer_var_shadow) ast_ptr varList; AST_MEMBER(outer_var_shadow, &varList) AST_END(outer_var_shadow) -AST_NODE(FnArgsDef, "FnArgsDef"_id) +AST_NODE(FnArgsDef) ast_ptr defList; ast_ptr shadowOption; AST_MEMBER(FnArgsDef, &defList, &shadowOption) AST_END(FnArgsDef) -AST_LEAF(fn_arrow, "fn_arrow"_id) +AST_LEAF(fn_arrow) AST_END(fn_arrow) -AST_NODE(FunLit, "FunLit"_id) +AST_NODE(FunLit) ast_ptr argsDef; ast_ptr arrow; ast_ptr body; AST_MEMBER(FunLit, &argsDef, &arrow, &body) AST_END(FunLit) -AST_NODE(NameOrDestructure, "NameOrDestructure"_id) +AST_NODE(NameOrDestructure) ast_sel item; AST_MEMBER(NameOrDestructure, &item) AST_END(NameOrDestructure) -AST_NODE(AssignableNameList, "AssignableNameList"_id) +AST_NODE(AssignableNameList) ast_ptr sep; ast_list items; AST_MEMBER(AssignableNameList, &sep, &items) AST_END(AssignableNameList) -AST_NODE(InvokeArgs, "InvokeArgs"_id) +AST_NODE(InvokeArgs) ast_ptr sep; ast_sel_list args; AST_MEMBER(InvokeArgs, &sep, &args) AST_END(InvokeArgs) -AST_LEAF(const_value, "const_value"_id) +AST_LEAF(const_value) AST_END(const_value) -AST_NODE(unary_exp, "unary_exp"_id) +AST_NODE(unary_exp) ast_ptr item; AST_MEMBER(unary_exp, &item) AST_END(unary_exp) -AST_NODE(ExpListAssign, "ExpListAssign"_id) +AST_NODE(ExpListAssign) ast_ptr expList; ast_sel action; AST_MEMBER(ExpListAssign, &expList, &action) AST_END(ExpListAssign) -AST_NODE(if_else_line, "if_else_line"_id) +AST_NODE(if_else_line) ast_ptr condition; ast_ptr assign; ast_sel elseExpr; AST_MEMBER(if_else_line, &condition, &assign, &elseExpr) AST_END(if_else_line) -AST_NODE(unless_line, "unless_line"_id) +AST_NODE(unless_line) ast_ptr condition; AST_MEMBER(unless_line, &condition) AST_END(unless_line) -AST_NODE(statement_appendix, "statement_appendix"_id) +AST_NODE(statement_appendix) ast_sel item; AST_MEMBER(statement_appendix, &item) AST_END(statement_appendix) -AST_LEAF(BreakLoop, "BreakLoop"_id) +AST_LEAF(BreakLoop) AST_END(BreakLoop) -AST_NODE(Statement, "Statement"_id) +AST_NODE(Statement) ast_sel content; @@ -604,20 +614,21 @@ AST_END(Statement) class Block_t; -AST_NODE(Body, "Body"_id) +AST_NODE(Body) ast_sel content; AST_MEMBER(Body, &content) AST_END(Body) -AST_NODE(Block, "Block"_id) +AST_NODE(Block) ast_ptr sep; ast_list statements; AST_MEMBER(Block, &sep, &statements) AST_END(Block) -AST_NODE(File, "File"_id) +AST_NODE(File) ast_ptr block; AST_MEMBER(File, &block) AST_END(File) } // namespace MoonP + 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: Value_t* singleValueFrom(ast_node* item) const { Exp_t* exp = nullptr; switch (item->getId()) { - case "Exp"_id: + case id(): exp = static_cast(item); break; - case "ExpList"_id: { + case id(): { auto expList = static_cast(item); if (expList->exprs.size() == 1) { exp = static_cast(expList->exprs.front()); } break; } - case "ExpListLow"_id: { + case id(): { auto expList = static_cast(item); if (expList->exprs.size() == 1) { exp = static_cast(expList->exprs.front()); @@ -459,18 +459,18 @@ private: auto firstItem = chainItems.back(); if (auto callable = ast_cast(firstItem)) { switch (callable->item->getId()) { - case "Variable"_id: - case "SelfName"_id: + case id(): + case id(): return true; } - } else if (firstItem->getId() == "DotChainItem"_id) { + } else if (firstItem->getId() == id()) { return true; } } else { auto lastItem = chainItems.back(); switch (lastItem->getId()) { - case "DotChainItem"_id: - case "Exp"_id: + case id(): + case id(): return true; } } @@ -481,16 +481,16 @@ private: if (auto value = singleValueFrom(exp)) { auto item = value->item.get(); switch (item->getId()) { - case "simple_table"_id: + case id(): return true; - case "SimpleValue"_id: { + case id(): { auto simpleValue = static_cast(item); if (simpleValue->value. is()) { return true; } return false; } - case "ChainValue"_id: { + case id(): { auto chainValue = static_cast(item); return isAssignable(chainValue->items.objects()); } @@ -539,7 +539,7 @@ private: } auto appendix = statement->appendix.get(); switch (appendix->item->getId()) { - case "if_else_line"_id: { + case id(): { auto if_else_line = appendix->item.to(); auto ifNode = x->new_ptr(); @@ -580,7 +580,7 @@ private: statement->content.set(expListAssign); break; } - case "unless_line"_id: { + case id(): { auto unless_line = appendix->item.to(); auto unless = x->new_ptr(); @@ -608,7 +608,7 @@ private: statement->content.set(expListAssign); break; } - case "CompInner"_id: { + case id(): { auto compInner = appendix->item.to(); auto comp = x->new_ptr(); comp->forLoop.set(compInner); @@ -629,7 +629,7 @@ private: statement->appendix.set(nullptr); break; } - default: break; + default: assert(false); break; } } auto content = statement->content.get(); @@ -638,15 +638,15 @@ private: return; } switch (content->getId()) { - case "Import"_id: transformImport(static_cast(content), out); break; - case "While"_id: transformWhile(static_cast(content), out); break; - case "For"_id: transformFor(static_cast(content), out); break; - case "ForEach"_id: transformForEach(static_cast(content), out); break; - case "Return"_id: transformReturn(static_cast(content), out); break; - case "Local"_id: transformLocal(static_cast(content), out); break; - case "Export"_id: transformExport(static_cast(content), out); break; - case "BreakLoop"_id: transformBreakLoop(static_cast(content), out); break; - case "ExpListAssign"_id: { + case id(): transformImport(static_cast(content), out); break; + case id(): transformWhile(static_cast(content), out); break; + case id(): transformFor(static_cast(content), out); break; + case id(): transformForEach(static_cast(content), out); break; + case id(): transformReturn(static_cast(content), out); break; + case id(): transformLocal(static_cast(content), out); break; + case id(): transformExport(static_cast(content), out); break; + case id(): transformBreakLoop(static_cast(content), out); break; + case id(): { auto expListAssign = static_cast(content); if (expListAssign->action) { transformAssignment(expListAssign, out); @@ -661,16 +661,16 @@ private: auto value = simpleValue->value.get(); bool specialSingleValue = true; switch (value->getId()) { - case "If"_id: transformIf(static_cast(value), out, ExpUsage::Common); break; - case "ClassDecl"_id: transformClassDecl(static_cast(value), out, ExpUsage::Common); break; - case "Unless"_id: transformUnless(static_cast(value), out, ExpUsage::Common); break; - case "Switch"_id: transformSwitch(static_cast(value), out, ExpUsage::Common); break; - case "With"_id: transformWith(static_cast(value), out); break; - case "ForEach"_id: transformForEach(static_cast(value), out); break; - case "For"_id: transformFor(static_cast(value), out); break; - case "While"_id: transformWhile(static_cast(value), out); break; - case "Do"_id: transformDo(static_cast(value), out, ExpUsage::Common); break; - case "Comprehension"_id: transformCompCommon(static_cast(value), out); break; + case id(): transformIf(static_cast(value), out, ExpUsage::Common); break; + case id(): transformClassDecl(static_cast(value), out, ExpUsage::Common); break; + case id(): transformUnless(static_cast(value), out, ExpUsage::Common); break; + case id(): transformSwitch(static_cast(value), out, ExpUsage::Common); break; + case id(): transformWith(static_cast(value), out); break; + case id(): transformForEach(static_cast(value), out); break; + case id(): transformFor(static_cast(value), out); break; + case id(): transformWhile(static_cast(value), out); break; + case id(): transformDo(static_cast(value), out, ExpUsage::Common); break; + case id(): transformCompCommon(static_cast(value), out); break; default: specialSingleValue = false; break; } if (specialSingleValue) { @@ -694,7 +694,7 @@ private: } break; } - default: break; + default: assert(false); break; } } @@ -834,20 +834,20 @@ private: } } switch (value->getId()) { - case "If"_id: - case "Unless"_id: { + case id(): + case id(): { auto expList = assignment->expList.get(); str_list temp; auto defs = transformAssignDefs(expList); if (!defs.empty()) temp.push_back(getPredefine(defs) + nll(expList)); switch (value->getId()) { - case "If"_id: transformIf(static_cast(value), temp, ExpUsage::Assignment, expList); break; - case "Unless"_id: transformUnless(static_cast(value), temp, ExpUsage::Assignment, expList); break; + case id(): transformIf(static_cast(value), temp, ExpUsage::Assignment, expList); break; + case id(): transformUnless(static_cast(value), temp, ExpUsage::Assignment, expList); break; } out.push_back(join(temp)); return; } - case "Switch"_id: { + case id(): { auto switchNode = static_cast(value); auto assignList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); @@ -855,7 +855,7 @@ private: out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "With"_id: { + case id(): { auto withNode = static_cast(value); auto expList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); @@ -863,7 +863,7 @@ private: out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "Do"_id: { + case id(): { auto expList = assignment->expList.get(); auto doNode = static_cast(value); std::string preDefine = getPredefine(assignment); @@ -871,42 +871,42 @@ private: out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "Comprehension"_id: { + case id(): { auto expList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); transformComprehension(static_cast(value), out, ExpUsage::Assignment, expList); out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "TblComprehension"_id: { + case id(): { auto expList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); transformTblComprehension(static_cast(value), out, ExpUsage::Assignment, expList); out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "For"_id: { + case id(): { auto expList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); transformForInPlace(static_cast(value), out, expList); out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "ForEach"_id: { + case id(): { auto expList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); transformForEachInPlace(static_cast(value), out, expList); out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "ClassDecl"_id: { + case id(): { auto expList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); transformClassDecl(static_cast(value), out, ExpUsage::Assignment, expList); out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); return; } - case "While"_id: { + case id(): { auto expList = assignment->expList.get(); std::string preDefine = getPredefine(assignment); transformWhileInPlace(static_cast(value), out, expList); @@ -1006,12 +1006,12 @@ private: void transformAssignItem(ast_node* value, str_list& out) { switch (value->getId()) { - case "With"_id: transformWithClosure(static_cast(value), out); break; - case "If"_id: transformIf(static_cast(value), out, ExpUsage::Closure); break; - case "Switch"_id: transformSwitch(static_cast(value), out, ExpUsage::Closure); break; - case "TableBlock"_id: transformTableBlock(static_cast(value), out); break; - case "Exp"_id: transformExp(static_cast(value), out, ExpUsage::Closure); break; - default: break; + case id(): transformWithClosure(static_cast(value), out); break; + case id(): transformIf(static_cast(value), out, ExpUsage::Closure); break; + case id(): transformSwitch(static_cast(value), out, ExpUsage::Closure); break; + case id(): transformTableBlock(static_cast(value), out); break; + case id(): transformExp(static_cast(value), out, ExpUsage::Closure); break; + default: assert(false); break; } } @@ -1034,7 +1034,7 @@ private: int index = 0; for (auto pair : *tableItems) { switch (pair->getId()) { - case "Exp"_id: { + case id(): { ++index; if (!isAssignable(static_cast(pair))) { throw std::logic_error(_info.errorMessage("Can't destructure value."sv, pair)); @@ -1068,7 +1068,7 @@ private: } break; } - case "variable_pair"_id: { + case id(): { auto vp = static_cast(pair); auto name = _parser.toString(vp->name); if (Keywords.find(name) != Keywords.end()) { @@ -1078,7 +1078,7 @@ private: } break; } - case "normal_pair"_id: { + case id(): { auto np = static_cast(pair); auto key = np->key->getByPath(); if (!key) throw std::logic_error(_info.errorMessage("Invalid key for destructure."sv, np)); @@ -1135,6 +1135,7 @@ private: } break; } + default: assert(false); break; } } return pairs; @@ -1203,7 +1204,7 @@ private: auto expList = assignment->expList.get(); auto action = assignment->action.get(); switch (action->getId()) { - case "Update"_id: { + case id(): { if (expList->exprs.size() > 1) throw std::logic_error(_info.errorMessage("Can not apply update to multiple values."sv, expList)); auto update = static_cast(action); auto leftExp = static_cast(expList->exprs.objects().front()); @@ -1247,7 +1248,7 @@ private: out.push_back(clearBuf()); break; } - case "Assign"_id: { + case id(): { bool oneLined = true; auto assign = static_cast(action); for (auto val : assign->values.objects()) { @@ -1292,7 +1293,7 @@ private: } break; } - default: break; + default: assert(false); break; } } @@ -1344,14 +1345,14 @@ private: ifCondPairs.emplace_back(); for (auto node : nodes) { switch (node->getId()) { - case "IfCond"_id: + case id(): ifCondPairs.back().first = static_cast(node); break; - case "Body"_id: + case id(): ifCondPairs.back().second = static_cast(node); ifCondPairs.emplace_back(); break; - default: break; + default: assert(false); break; } } auto assign = ifCondPairs.front().first->assign.get(); @@ -1571,22 +1572,22 @@ private: void transformValue(Value_t* value, str_list& out) { auto item = value->item.get(); switch (item->getId()) { - case "SimpleValue"_id: transformSimpleValue(static_cast(item), out); break; - case "simple_table"_id: transform_simple_table(static_cast(item), out); break; - case "ChainValue"_id: { + case id(): transformSimpleValue(static_cast(item), out); break; + case id(): transform_simple_table(static_cast(item), out); break; + case id(): { auto chainValue = static_cast(item); transformChainValue(chainValue, out, ExpUsage::Closure); break; } - case "String"_id: transformString(static_cast(item), out); break; - default: break; + case id(): transformString(static_cast(item), out); break; + default: assert(false); break; } } void transformCallable(Callable_t* callable, str_list& out, const ast_sel& invoke = {}) { auto item = callable->item.get(); switch (item->getId()) { - case "Variable"_id: { + case id(): { transformVariable(static_cast(item), out); if (_config.lintGlobalVariable && !isDefined(out.back())) { if (_globals.find(out.back()) == _globals.end()) { @@ -1595,7 +1596,7 @@ private: } break; } - case "SelfName"_id: { + case id(): { transformSelfName(static_cast(item), out, invoke); if (_config.lintGlobalVariable) { std::string self("self"sv); @@ -1607,9 +1608,9 @@ private: } break; } - case "VarArg"_id: out.push_back(s("..."sv)); break; - case "Parens"_id: transformParens(static_cast(item), out); break; - default: break; + case id(): out.push_back(s("..."sv)); break; + case id(): transformParens(static_cast(item), out); break; + default: assert(false); break; } } @@ -1622,23 +1623,23 @@ private: void transformSimpleValue(SimpleValue_t* simpleValue, str_list& out) { auto value = simpleValue->value.get(); switch (value->getId()) { - case "const_value"_id: transform_const_value(static_cast(value), out); break; - case "If"_id: transformIf(static_cast(value), out, ExpUsage::Closure); break; - case "Unless"_id: transformUnless(static_cast(value), out, ExpUsage::Closure); break; - case "Switch"_id: transformSwitch(static_cast(value), out, ExpUsage::Closure); break; - case "With"_id: transformWithClosure(static_cast(value), out); break; - case "ClassDecl"_id: transformClassDeclClosure(static_cast(value), out); break; - case "ForEach"_id: transformForEachClosure(static_cast(value), out); break; - case "For"_id: transformForClosure(static_cast(value), out); break; - case "While"_id: transformWhileClosure(static_cast(value), out); break; - case "Do"_id: transformDo(static_cast(value), out, ExpUsage::Closure); break; - case "unary_exp"_id: transform_unary_exp(static_cast(value), out); break; - case "TblComprehension"_id: transformTblComprehension(static_cast(value), out, ExpUsage::Closure); break; - case "TableLit"_id: transformTableLit(static_cast(value), out); break; - case "Comprehension"_id: transformComprehension(static_cast(value), out, ExpUsage::Closure); break; - case "FunLit"_id: transformFunLit(static_cast(value), out); break; - case "Num"_id: transformNum(static_cast(value), out); break; - default: break; + case id(): transform_const_value(static_cast(value), out); break; + case id(): transformIf(static_cast(value), out, ExpUsage::Closure); break; + case id(): transformUnless(static_cast(value), out, ExpUsage::Closure); break; + case id(): transformSwitch(static_cast(value), out, ExpUsage::Closure); break; + case id(): transformWithClosure(static_cast(value), out); break; + case id(): transformClassDeclClosure(static_cast(value), out); break; + case id(): transformForEachClosure(static_cast(value), out); break; + case id(): transformForClosure(static_cast(value), out); break; + case id(): transformWhileClosure(static_cast(value), out); break; + case id(): transformDo(static_cast(value), out, ExpUsage::Closure); break; + case id(): transform_unary_exp(static_cast(value), out); break; + case id(): transformTblComprehension(static_cast(value), out, ExpUsage::Closure); break; + case id(): transformTableLit(static_cast(value), out); break; + case id(): transformComprehension(static_cast(value), out, ExpUsage::Closure); break; + case id(): transformFunLit(static_cast(value), out); break; + case id(): transformNum(static_cast(value), out); break; + default: assert(false); break; } } @@ -1882,8 +1883,7 @@ private: } break; } - default: - break; + default: break; } if (!nodes.empty()) { str_list temp; @@ -1909,37 +1909,37 @@ private: if (auto simpleValue = singleValue->item.as()) { auto value = simpleValue->value.get(); switch (value->getId()) { - case "Comprehension"_id: + case id(): transformComprehension(static_cast(value), out, ExpUsage::Return); return; - case "TblComprehension"_id: + case id(): transformTblComprehension(static_cast(value), out, ExpUsage::Return); return; - case "With"_id: + case id(): transformWith(static_cast(value), out, nullptr, true); return; - case "ClassDecl"_id: + case id(): transformClassDecl(static_cast(value), out, ExpUsage::Return); return; - case "Do"_id: + case id(): transformDo(static_cast(value), out, ExpUsage::Return); return; - case "Switch"_id: + case id(): transformSwitch(static_cast(value), out, ExpUsage::Return); return; - case "While"_id: + case id(): transformWhileInPlace(static_cast(value), out); return; - case "For"_id: + case id(): transformForInPlace(static_cast(value), out); return; - case "ForEach"_id: + case id(): transformForEachInPlace(static_cast(value), out); return; - case "If"_id: + case id(): transformIf(static_cast(value), out, ExpUsage::Return); return; - case "Unless"_id: + case id(): transformUnless(static_cast(value), out, ExpUsage::Return); return; } @@ -1998,34 +1998,35 @@ private: auto def = static_cast(_def); auto& arg = argItems.emplace_back(); switch (def->name->getId()) { - case "Variable"_id: arg.name = _parser.toString(def->name); break; - case "SelfName"_id: { + case id(): arg.name = _parser.toString(def->name); break; + case id(): { assignSelf = true; auto selfName = static_cast(def->name.get()); switch (selfName->name->getId()) { - case "self_class_name"_id: { + case id(): { auto clsName = static_cast(selfName->name.get()); arg.name = _parser.toString(clsName->name); arg.assignSelf = s("self.__class."sv) + arg.name; break; } - case "self_class"_id: + case id(): arg.name = "self.__class"sv; break; - case "self_name"_id: { + case id(): { auto sfName = static_cast(selfName->name.get()); arg.name = _parser.toString(sfName->name); arg.assignSelf = s("self."sv) + arg.name; break; } - case "self"_id: + case id(): arg.name = "self"sv; break; - default: break; + default: assert(false); break; } break; } + default: assert(false); break; } forceAddToScope(arg.name); if (def->defaultValue) { @@ -2075,7 +2076,7 @@ private: auto x = selfName; auto name = selfName->name.get(); switch (name->getId()) { - case "self_class_name"_id: { + case id(): { auto clsName = static_cast(name); auto nameStr = _parser.toString(clsName->name); if (LuaKeywords.find(nameStr) != LuaKeywords.end()) { @@ -2093,10 +2094,10 @@ private: } break; } - case "self_class"_id: + case id(): out.push_back(s("self.__class"sv)); break; - case "self_name"_id: { + case id(): { auto sfName = static_cast(name); auto nameStr = _parser.toString(sfName->name); if (LuaKeywords.find(nameStr) != LuaKeywords.end()) { @@ -2114,9 +2115,10 @@ private: } break; } - case "self"_id: + case id(): out.push_back(s("self"sv)); break; + default: assert(false); break; } } @@ -2344,8 +2346,8 @@ private: } auto baseChain = x->new_ptr(); switch (chainList.front()->getId()) { - case "DotChainItem"_id: - case "ColonChainItem"_id: + case id(): + case id(): if (_withVars.empty()) { throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, chainList.front())); } else { @@ -2426,8 +2428,8 @@ private: auto x = chainList.front(); str_list temp; switch (x->getId()) { - case "DotChainItem"_id: - case "ColonChainItem"_id: + case id(): + case id(): if (_withVars.empty()) { throw std::logic_error(_info.errorMessage("Short dot/colon syntax must be called within a with block."sv, x)); } else { @@ -2438,13 +2440,13 @@ private: for (auto it = chainList.begin(); it != chainList.end(); ++it) { auto item = *it; switch (item->getId()) { - case "Invoke"_id: + case id(): transformInvoke(static_cast(item), temp); break; - case "DotChainItem"_id: + case id(): transformDotChainItem(static_cast(item), temp); break; - case "ColonChainItem"_id: { + case id(): { auto colonItem = static_cast(item); auto current = it; auto next = current; ++next; @@ -2469,8 +2471,8 @@ private: { auto chainValue = x->new_ptr(); switch (chainList.front()->getId()) { - case "DotChainItem"_id: - case "ColonChainItem"_id: + case id(): + case id(): chainValue->items.push_back(toAst(_withVars.top(), x)); break; } @@ -2559,10 +2561,10 @@ private: transformColonChainItem(colonItem, temp); break; } - case "Slice"_id: + case id(): transformSlice(static_cast(item), temp); break; - case "Callable"_id: { + case id(): { auto next = it; ++next; auto followItem = next != chainList.end() ? *next : nullptr; ast_sel invoke; @@ -2572,16 +2574,16 @@ private: transformCallable(static_cast(item), temp, invoke); break; } - case "String"_id: + case id(): transformString(static_cast(item), temp); temp.back() = s("("sv) + temp.back() + s(")"sv); break; - case "Exp"_id: + case id(): transformExp(static_cast(item), temp, ExpUsage::Closure); temp.back() = s("["sv) + temp.back() + s("]"sv); break; - case "InvokeArgs"_id: transformInvokeArgs(static_cast(item), temp); break; - default: break; + case id(): transformInvokeArgs(static_cast(item), temp); break; + default: assert(false); break; } } switch (usage) { @@ -2637,11 +2639,11 @@ private: str_list temp; for (auto arg : invoke->args.objects()) { switch (arg->getId()) { - case "Exp"_id: transformExp(static_cast(arg), temp, ExpUsage::Closure); break; - case "SingleString"_id: transformSingleString(static_cast(arg), temp); break; - case "DoubleString"_id: transformDoubleString(static_cast(arg), temp); break; - case "LuaString"_id: transformLuaString(static_cast(arg), temp); break; - default: break; + case id(): transformExp(static_cast(arg), temp, ExpUsage::Closure); break; + case id(): transformSingleString(static_cast(arg), temp); break; + case id(): transformDoubleString(static_cast(arg), temp); break; + case id(): transformLuaString(static_cast(arg), temp); break; + default: assert(false); break; } } out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); @@ -2672,17 +2674,18 @@ private: auto compInner = comp->forLoop.get(); for (auto item : compInner->items.objects()) { switch (item->getId()) { - case "CompForEach"_id: + case id(): transformCompForEach(static_cast(item), temp); break; - case "CompFor"_id: + case id(): transformCompFor(static_cast(item), temp); break; - case "Exp"_id: + case id(): transformExp(static_cast(item), temp, ExpUsage::Closure); temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); pushScope(); break; + default: assert(false); break; } } if (auto stmt = comp->value.as()) { @@ -2724,17 +2727,18 @@ private: auto compInner = comp->forLoop.get(); for (auto item : compInner->items.objects()) { switch (item->getId()) { - case "CompForEach"_id: + case id(): transformCompForEach(static_cast(item), temp); break; - case "CompFor"_id: + case id(): transformCompFor(static_cast(item), temp); break; - case "Exp"_id: + case id(): transformExp(static_cast(item), temp, ExpUsage::Closure); temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); pushScope(); break; + default: assert(false); break; } } { @@ -2802,22 +2806,22 @@ private: for (auto _item : nameList->items.objects()) { auto item = static_cast(_item)->item.get(); switch (item->getId()) { - case "Variable"_id: + case id(): transformVariable(static_cast(item), vars); varAfter.push_back(vars.back()); break; - case "TableLit"_id: { + case id(): { auto desVar = getUnusedName("_des_"sv); destructPairs.emplace_back(item, toAst(desVar, x)); vars.push_back(desVar); varAfter.push_back(desVar); break; } - default: break; + default: assert(false); break; } } switch (loopTarget->getId()) { - case "star_exp"_id: { + case id(): { auto star_exp = static_cast(loopTarget); auto listVar = singleVariableFrom(star_exp->value); auto indexVar = getUnusedName("_index_"); @@ -2902,17 +2906,17 @@ private: } break; } - case "Exp"_id: + case id(): transformExp(static_cast(loopTarget), temp, ExpUsage::Closure); _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget); out.push_back(clearBuf()); break; - case "ExpList"_id: + case id(): transformExpList(static_cast(loopTarget), temp); _buf << indent() << "for "sv << join(vars, ", "sv) << " in "sv << temp.back() << " do"sv << nlr(loopTarget); out.push_back(clearBuf()); break; - default: break; + default: assert(false); break; } for (auto& var : varBefore) addToScope(var); pushScope(); @@ -2947,9 +2951,9 @@ private: str_list temp; for (auto arg : invokeArgs->args.objects()) { switch (arg->getId()) { - case "Exp"_id: transformExp(static_cast(arg), temp, ExpUsage::Closure); break; - case "TableBlock"_id: transformTableBlock(static_cast(arg), temp); break; - default: break; + case id(): transformExp(static_cast(arg), temp, ExpUsage::Closure); break; + case id(): transformTableBlock(static_cast(arg), temp); break; + default: assert(false); break; } } out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); @@ -2979,10 +2983,10 @@ private: str_list temp; bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) { switch (node->getId()) { - case "For"_id: - case "ForEach"_id: + case id(): + case id(): return traversal::Return; - case "BreakLoop"_id: { + case id(): { return _parser.toString(node) == "continue"sv ? traversal::Stop : traversal::Return; } @@ -3156,31 +3160,31 @@ private: auto key = pair->key.get(); str_list temp; switch (key->getId()) { - case "KeyName"_id: { + case id(): { transformKeyName(static_cast(key), temp); if (LuaKeywords.find(temp.back()) != LuaKeywords.end()) { temp.back() = s("[\""sv) + temp.back() + s("\"]"); } break; } - case "Exp"_id: + case id(): transformExp(static_cast(key), temp, ExpUsage::Closure); temp.back() = s("["sv) + temp.back() + s("]"sv); break; - case "DoubleString"_id: + case id(): transformDoubleString(static_cast(key), temp); temp.back() = s("["sv) + temp.back() + s("]"sv); break; - case "SingleString"_id: transformSingleString(static_cast(key), temp); + case id(): transformSingleString(static_cast(key), temp); temp.back() = s("["sv) + temp.back() + s("]"sv); break; - default: break; + default: assert(false); break; } auto value = pair->value.get(); switch (value->getId()) { - case "Exp"_id: transformExp(static_cast(value), temp, ExpUsage::Closure); break; - case "TableBlock"_id: transformTableBlock(static_cast(value), temp); break; - default: break; + case id(): transformExp(static_cast(value), temp, ExpUsage::Closure); break; + case id(): transformTableBlock(static_cast(value), temp); break; + default: assert(false); break; } out.push_back(temp.front() + s(" = "sv) + temp.back()); } @@ -3188,9 +3192,9 @@ private: void transformKeyName(KeyName_t* keyName, str_list& out) { auto name = keyName->name.get(); switch (name->getId()) { - case "SelfName"_id: transformSelfName(static_cast(name), out); break; - case "Name"_id: out.push_back(_parser.toString(name)); break; - default: break; + case id(): transformSelfName(static_cast(name), out); break; + case id(): out.push_back(_parser.toString(name)); break; + default: assert(false); break; } } @@ -3214,18 +3218,18 @@ private: auto seg = static_cast(_seg); auto content = seg->content.get(); switch (content->getId()) { - case "double_string_inner"_id: { + case id(): { auto str = _parser.toString(content); Utils::replace(str, "\r"sv, ""); Utils::replace(str, "\n"sv, "\\n"sv); temp.push_back(s("\""sv) + str + s("\""sv)); break; } - case "Exp"_id: + case id(): transformExp(static_cast(content), temp, ExpUsage::Closure); temp.back() = s("tostring("sv) + temp.back() + s(")"sv); break; - default: break; + default: assert(false); break; } } out.push_back(temp.empty() ? s("\"\""sv) : join(temp, " .. "sv)); @@ -3234,10 +3238,10 @@ private: void transformString(String_t* string, str_list& out) { auto str = string->str.get(); switch (str->getId()) { - case "SingleString"_id: transformSingleString(static_cast(str), out); break; - case "DoubleString"_id: transformDoubleString(static_cast(str), out); break; - case "LuaString"_id: transformLuaString(static_cast(str), out); break; - default: break; + case id(): transformSingleString(static_cast(str), out); break; + case id(): transformDoubleString(static_cast(str), out); break; + case id(): transformLuaString(static_cast(str), out); break; + default: assert(false); break; } } @@ -3370,7 +3374,7 @@ private: std::list members; for (auto content : classDecl->body->contents.objects()) { switch (content->getId()) { - case "class_member_list"_id: { + case id(): { size_t inc = transform_class_member_list(static_cast(content), members, classVar); auto it = members.end(); for (size_t i = 0; i < inc; ++i, --it); @@ -3384,10 +3388,10 @@ private: } break; } - case "Statement"_id: + case id(): transformStatement(static_cast(content), statements); break; - default: break; + default: assert(false); break; } } for (auto& member : members) { @@ -3530,7 +3534,7 @@ private: } } normal_pair->value->traverse([&](ast_node* node) { - if (node->getId() == "ClassDecl"_id) return traversal::Return; + if (node->getId() == id()) return traversal::Return; if (auto chainValue = ast_cast(node)) { if (auto callable = ast_cast(chainValue->items.front())) { auto var = callable->item.get(); @@ -3538,12 +3542,12 @@ private: auto insertSelfToArguments = [&](ast_node* item) { auto x = item; switch (item->getId()) { - case "InvokeArgs"_id: { + case id(): { auto invoke = static_cast(item); invoke->args.push_front(toAst("self"sv, x)); return true; } - case "Invoke"_id: { + case id(): { auto invoke = static_cast(item); invoke->args.push_front(toAst("self"sv, x)); return true; @@ -3584,12 +3588,13 @@ private: decIndentOffset(); } switch (keyValue->getId()) { - case "variable_pair"_id: + case id(): transform_variable_pair(static_cast(keyValue), temp); break; - case "normal_pair"_id: + case id(): transform_normal_pair(static_cast(keyValue), temp); break; + default: assert(false); break; } if (type == MemType::Property) { incIndentOffset(); @@ -3605,10 +3610,10 @@ private: void transformAssignable(Assignable_t* assignable, str_list& out) { auto item = assignable->item.get(); switch (item->getId()) { - case "AssignableChain"_id: transformAssignableChain(static_cast(item), out); break; - case "Variable"_id: transformVariable(static_cast(item), out); break; - case "SelfName"_id: transformSelfName(static_cast(item), out); break; - default: break; + case id(): transformAssignableChain(static_cast(item), out); break; + case id(): transformVariable(static_cast(item), out); break; + case id(): transformSelfName(static_cast(item), out); break; + default: assert(false); break; } } @@ -3771,23 +3776,23 @@ private: auto x = exportNode; auto item = exportNode->item.get(); switch (item->getId()) { - case "ClassDecl"_id: { + case id(): { auto classDecl = static_cast(item); - if (classDecl->name && classDecl->name->item->getId() == "Variable"_id) { + if (classDecl->name && classDecl->name->item->getId() == id()) { markVarExported(ExportMode::Any, true); addExportedVar(_parser.toString(classDecl->name->item)); } transformClassDecl(classDecl, out, ExpUsage::Common); break; } - case "export_op"_id: + case id(): if (_parser.toString(item) == "*"sv) { markVarExported(ExportMode::Any, false); } else { markVarExported(ExportMode::Capital, false); } break; - case "export_values"_id: { + case id(): { markVarExported(ExportMode::Any, true); auto values = exportNode->item.to(); if (values->valueList) { @@ -3817,8 +3822,7 @@ private: } break; } - default: - break; + default: assert(false); break; } } @@ -3831,9 +3835,10 @@ private: pushScope(); for (auto pair : pairs) { switch (pair->getId()) { - case "Exp"_id: transformExp(static_cast(pair), temp, ExpUsage::Closure); break; - case "variable_pair"_id: transform_variable_pair(static_cast(pair), temp); break; - case "normal_pair"_id: transform_normal_pair(static_cast(pair), temp); break; + case id(): transformExp(static_cast(pair), temp, ExpUsage::Closure); break; + case id(): transform_variable_pair(static_cast(pair), temp); break; + case id(): transform_normal_pair(static_cast(pair), temp); break; + default: assert(false); break; } temp.back() = indent() + temp.back() + (pair == pairs.back() ? Empty : s(","sv)) + nll(pair); } @@ -3863,17 +3868,18 @@ private: auto compInner = comp->forLoop.get(); for (auto item : compInner->items.objects()) { switch (item->getId()) { - case "CompForEach"_id: + case id(): transformCompForEach(static_cast(item), temp); break; - case "CompFor"_id: + case id(): transformCompFor(static_cast(item), temp); break; - case "Exp"_id: + case id(): transformExp(static_cast(item), temp, ExpUsage::Closure); temp.back() = indent() + s("if "sv) + temp.back() + s(" then"sv) + nll(item); pushScope(); break; + default: assert(false); break; } } transformExp(comp->key, kv, ExpUsage::Closure); @@ -3989,7 +3995,7 @@ private: auto assign = x->new_ptr(); for (auto name : import->names.objects()) { switch (name->getId()) { - case "Variable"_id: { + case id(): { auto var = ast_to(name); { auto callable = toAst(objVar, x); @@ -4015,7 +4021,7 @@ private: expList->exprs.push_back(exp); break; } - case "colon_import_name"_id: { + case id(): { auto var = static_cast(name)->name.get(); { auto nameNode = var->name.get(); @@ -4042,6 +4048,7 @@ private: expList->exprs.push_back(exp); break; } + default: assert(false); break; } } if (objAssign) { @@ -4101,14 +4108,13 @@ private: void transformImport(Import_t* import, str_list& out) { auto content = import->content.get(); switch (content->getId()) { - case "ImportAs"_id: + case id(): transformImportAs(static_cast(content), out); break; - case "ImportFrom"_id: + case id(): transformImportFrom(static_cast(content), out); break; - default: - break; + default: assert(false); break; } } diff --git a/src/MoonP/parser.hpp b/src/MoonP/parser.hpp index 01d1050..14abe1a 100644 --- a/src/MoonP/parser.hpp +++ b/src/MoonP/parser.hpp @@ -28,17 +28,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND namespace parserlib { -// const str hash helper functions -inline constexpr size_t hash(char const* input) { - return *input ? *input + 33ull * hash(input + 1) : 5381; -} -inline size_t hash(const char* input, int size, int index) { - return index < size ? input[index] + 33ull * hash(input, size, index + 1) : 5381; -} -inline size_t constexpr operator"" _id(const char* s, size_t) { - return hash(s); -} - ///type of the parser's input. typedef std::basic_string input; typedef input::iterator input_it; diff --git a/src/moonp.cpp b/src/moonp.cpp index cb53b55..32d85ed 100644 --- a/src/moonp.cpp +++ b/src/moonp.cpp @@ -37,43 +37,37 @@ int main(int narg, const char** args) { std::string resultFile; std::list files; for (int i = 1; i < narg; ++i) { - switch (hash(args[i])) { - case "-l"_id: - config.reserveLineNumber = true; - break; - case "-p"_id: - writeToFile = false; - break; - case "-t"_id: - ++i; - if (i < narg) { - targetPath = args[i]; - } else { - std::cout << help; - return 1; - } - break; - case "-b"_id: - dumpCompileTime = true; - break; - case "-h"_id: + std::string arg = args[i]; + if (arg == "-l"sv) { + config.reserveLineNumber = true; + } else if (arg == "-p"sv) { + writeToFile = false; + } else if (arg == "-t"sv) { + ++i; + if (i < narg) { + targetPath = args[i]; + } else { std::cout << help; - return 0; - case "-v"_id: - std::cout << "Moonscript version: " << MoonP::moonScriptVersion() << '\n'; - return 0; - case "-o"_id: - ++i; - if (i < narg) { - resultFile = args[i]; - } else { - std::cout << help; - return 1; - } - break; - default: - files.push_back(args[i]); - break; + return 1; + } + } else if (arg == "-b"sv) { + dumpCompileTime = true; + } else if (arg == "-h"sv) { + std::cout << help; + return 0; + } else if (arg == "-v"sv) { + std::cout << "Moonscript version: " << MoonP::moonScriptVersion() << '\n'; + return 0; + } else if (arg == "-o"sv) { + ++i; + if (i < narg) { + resultFile = args[i]; + } else { + std::cout << help; + return 1; + } + } else { + files.push_back(arg); } } if (files.empty()) { -- cgit v1.2.3-55-g6feb