From de91fff7af15ae9c4a27d34b5b9266f900412a29 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Mon, 16 May 2022 10:25:19 +0800 Subject: fix issue #101 by supporting metamethod syntax in class block. --- src/yuescript/yue_ast.h | 2 +- src/yuescript/yue_compiler.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/yuescript/yue_ast.h b/src/yuescript/yue_ast.h index d255236..38e97ad 100755 --- a/src/yuescript/yue_ast.h +++ b/src/yuescript/yue_ast.h @@ -639,7 +639,7 @@ AST_END(TableBlock, "table_block"sv) AST_NODE(class_member_list) ast_ptr sep; - ast_sel_list values; + ast_sel_list values; AST_MEMBER(class_member_list, &sep, &values) AST_END(class_member_list, "class_member_list"sv) diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 6d90d24..51ece7c 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -60,7 +60,7 @@ using namespace parserlib; typedef std::list str_list; -const std::string_view version = "0.10.21"sv; +const std::string_view version = "0.10.22"sv; const std::string_view extension = "yue"sv; class YueCompilerImpl { @@ -5985,6 +5985,30 @@ private: size_t count = 0; for (auto keyValue : class_member_list->values.objects()) { MemType type = MemType::Common; + ast_ptr ref; + switch (keyValue->getId()) { + case id(): { + auto mtPair = static_cast(keyValue); + auto nameStr = _parser.toString(mtPair->name); + ref.set(toAst("__"s + nameStr + ':' + nameStr, keyValue)); + keyValue = ref.get(); + break; + } + case id(): { + auto mtPair = static_cast(keyValue); + auto normal_pair = keyValue->new_ptr(); + if (auto name = mtPair->key.as()) { + auto nameStr = _parser.toString(name); + normal_pair->key.set(toAst("__"s + nameStr, keyValue)); + } else { + normal_pair->key.set(mtPair->key); + } + normal_pair->value.set(mtPair->value); + ref.set(normal_pair); + keyValue = ref.get(); + break; + } + } BLOCK_START auto normal_pair = ast_cast(keyValue); BREAK_IF(!normal_pair); -- cgit v1.2.3-55-g6feb