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. --- spec/inputs/class.yue | 11 +++++++++-- spec/outputs/class.lua | 30 ++++++++++++++++++++++++++++++ src/yuescript/yue_ast.h | 2 +- src/yuescript/yue_compiler.cpp | 26 +++++++++++++++++++++++++- 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/spec/inputs/class.yue b/spec/inputs/class.yue index c7be481..9091d23 100644 --- a/spec/inputs/class.yue +++ b/spec/inputs/class.yue @@ -232,7 +232,14 @@ class extends lapis.Application class A using B, C, D, {value: 123} class Example - @field1 = 1 - @field2 = @field1 + 1 + @field1 = 1 + @field2 = @field1 + 1 + +class Foo + new: (x) => @x = x + mul#: (y) => @x * y + ["dsd-dsd"]#: 123 + :add + :add# nil diff --git a/spec/outputs/class.lua b/spec/outputs/class.lua index 8f7c126..9a61a67 100644 --- a/spec/outputs/class.lua +++ b/spec/outputs/class.lua @@ -1146,4 +1146,34 @@ do self.field2 = self.field1 + 1 Example = _class_0 end +do + local _class_0 + local _base_0 = { + __mul = function(self, y) + return self.x * y + end, + ["dsd-dsd"] = 123, + add = add, + __add = add + } + if _base_0.__index == nil then + _base_0.__index = _base_0 + end + _class_0 = setmetatable({ + __init = function(self, x) + self.x = x + end, + __base = _base_0, + __name = "Foo" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({ }, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + Foo = _class_0 +end return nil 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