diff options
author | Li Jin <dragon-fly@qq.com> | 2022-04-06 17:54:23 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2022-04-06 17:54:23 +0800 |
commit | fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8 (patch) | |
tree | ee57ba1d65531101e273cfe41d4a32ae87964724 | |
parent | 49f44f799b39dcc4ffe69502638108398732f8df (diff) | |
download | yuescript-fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8.tar.gz yuescript-fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8.tar.bz2 yuescript-fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8.zip |
doing the mixing after the class object initialized.
-rw-r--r-- | spec/outputs/class.lua | 26 | ||||
-rwxr-xr-x | src/yuescript/yue_compiler.cpp | 21 |
2 files changed, 24 insertions, 23 deletions
diff --git a/spec/outputs/class.lua b/spec/outputs/class.lua index 8db5a8a..bb14ad8 100644 --- a/spec/outputs/class.lua +++ b/spec/outputs/class.lua | |||
@@ -1090,19 +1090,6 @@ do | |||
1090 | if _base_0.__index == nil then | 1090 | if _base_0.__index == nil then |
1091 | _base_0.__index = _base_0 | 1091 | _base_0.__index = _base_0 |
1092 | end | 1092 | end |
1093 | local _list_0 = { | ||
1094 | B, | ||
1095 | C, | ||
1096 | D | ||
1097 | } | ||
1098 | for _index_0 = 1, #_list_0 do | ||
1099 | local _mixin_0 = _list_0[_index_0] | ||
1100 | for _key_0, _val_0 in pairs(_mixin_0.__base) do | ||
1101 | if _key_0 ~= "__class" then | ||
1102 | _base_0[_key_0] = _val_0 | ||
1103 | end | ||
1104 | end | ||
1105 | end | ||
1106 | _class_0 = setmetatable({ | 1093 | _class_0 = setmetatable({ |
1107 | __init = function() end, | 1094 | __init = function() end, |
1108 | __base = _base_0, | 1095 | __base = _base_0, |
@@ -1117,6 +1104,19 @@ do | |||
1117 | }) | 1104 | }) |
1118 | _base_0.__class = _class_0 | 1105 | _base_0.__class = _class_0 |
1119 | A = _class_0 | 1106 | A = _class_0 |
1107 | local _list_0 = { | ||
1108 | B, | ||
1109 | C, | ||
1110 | D | ||
1111 | } | ||
1112 | for _index_0 = 1, #_list_0 do | ||
1113 | local _mixin_0 = _list_0[_index_0] | ||
1114 | for _key_0, _val_0 in pairs(_mixin_0.__base) do | ||
1115 | if _base_0[_key_0] == nil then | ||
1116 | _base_0[_key_0] = _val_0 | ||
1117 | end | ||
1118 | end | ||
1119 | end | ||
1120 | end | 1120 | end |
1121 | do | 1121 | do |
1122 | local _class_0 | 1122 | local _class_0 |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 3394f1f..3e9c048 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -5338,16 +5338,6 @@ private: | |||
5338 | temp.back() += "{ }"s + nll(classDecl); | 5338 | temp.back() += "{ }"s + nll(classDecl); |
5339 | } | 5339 | } |
5340 | transformAssignment(toAst<ExpListAssign_t>(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp); | 5340 | transformAssignment(toAst<ExpListAssign_t>(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp); |
5341 | if (classDecl->mixes) { | ||
5342 | auto mixin = getUnusedName("_mixin_"sv); | ||
5343 | auto key = getUnusedName("_key_"sv); | ||
5344 | auto val = getUnusedName("_val_"sv); | ||
5345 | auto mixins = _parser.toString(classDecl->mixes); | ||
5346 | _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv; | ||
5347 | _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base\n"sv; | ||
5348 | _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << key << "~=\"__class\""sv; | ||
5349 | transformBlock(toAst<Block_t>(clearBuf(), x), temp, ExpUsage::Common); | ||
5350 | } | ||
5351 | str_list tmp; | 5341 | str_list tmp; |
5352 | if (usage == ExpUsage::Assignment) { | 5342 | if (usage == ExpUsage::Assignment) { |
5353 | auto assign = x->new_ptr<Assign_t>(); | 5343 | auto assign = x->new_ptr<Assign_t>(); |
@@ -5421,6 +5411,17 @@ private: | |||
5421 | if (!assignItem.empty()) { | 5411 | if (!assignItem.empty()) { |
5422 | _buf << indent() << assignItem << " = "sv << classVar << nll(classDecl); | 5412 | _buf << indent() << assignItem << " = "sv << classVar << nll(classDecl); |
5423 | } | 5413 | } |
5414 | temp.push_back(clearBuf()); | ||
5415 | if (classDecl->mixes) { | ||
5416 | auto mixin = getUnusedName("_mixin_"sv); | ||
5417 | auto key = getUnusedName("_key_"sv); | ||
5418 | auto val = getUnusedName("_val_"sv); | ||
5419 | auto mixins = _parser.toString(classDecl->mixes); | ||
5420 | _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv; | ||
5421 | _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base\n"sv; | ||
5422 | _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << baseVar << '[' << key << "]==nil"sv; | ||
5423 | transformBlock(toAst<Block_t>(clearBuf(), x), temp, ExpUsage::Common); | ||
5424 | } | ||
5424 | switch (usage) { | 5425 | switch (usage) { |
5425 | case ExpUsage::Return: { | 5426 | case ExpUsage::Return: { |
5426 | _buf << indent() << "return "sv << classVar << nlr(classDecl); | 5427 | _buf << indent() << "return "sv << classVar << nlr(classDecl); |