diff options
| author | Li Jin <dragon-fly@qq.com> | 2025-03-23 17:25:28 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2025-03-23 17:25:28 +0800 |
| commit | 08b68269ff6d6f868242dcefce75e1db26e4de61 (patch) | |
| tree | 3c63e851edc5baa49ad0d180021c2ddecd77f013 | |
| parent | 28bae6517f43c384a828df62b727517e26b3af9b (diff) | |
| download | yuescript-08b68269ff6d6f868242dcefce75e1db26e4de61.tar.gz yuescript-08b68269ff6d6f868242dcefce75e1db26e4de61.tar.bz2 yuescript-08b68269ff6d6f868242dcefce75e1db26e4de61.zip | |
Fixed issue #198.
| -rw-r--r-- | spec/outputs/class.lua | 44 | ||||
| -rw-r--r-- | spec/outputs/codes_from_doc.lua | 10 | ||||
| -rw-r--r-- | spec/outputs/codes_from_doc_zh.lua | 10 | ||||
| -rw-r--r-- | spec/outputs/cond.lua | 14 | ||||
| -rw-r--r-- | spec/outputs/unicode/cond.lua | 16 | ||||
| -rw-r--r-- | spec/outputs/unicode/with.lua | 20 | ||||
| -rw-r--r-- | spec/outputs/with.lua | 20 | ||||
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 15 |
8 files changed, 63 insertions, 86 deletions
diff --git a/spec/outputs/class.lua b/spec/outputs/class.lua index aaea33c..07efde4 100644 --- a/spec/outputs/class.lua +++ b/spec/outputs/class.lua | |||
| @@ -1231,30 +1231,28 @@ do | |||
| 1231 | end | 1231 | end |
| 1232 | do | 1232 | do |
| 1233 | local CX | 1233 | local CX |
| 1234 | do | 1234 | local _class_0 |
| 1235 | local _class_0 | 1235 | local _base_0 = { } |
| 1236 | local _base_0 = { } | 1236 | if _base_0.__index == nil then |
| 1237 | if _base_0.__index == nil then | 1237 | _base_0.__index = _base_0 |
| 1238 | _base_0.__index = _base_0 | ||
| 1239 | end | ||
| 1240 | _class_0 = setmetatable({ | ||
| 1241 | __init = function(self) end, | ||
| 1242 | __base = _base_0, | ||
| 1243 | __name = "CX" | ||
| 1244 | }, { | ||
| 1245 | __index = _base_0, | ||
| 1246 | __call = function(cls, ...) | ||
| 1247 | local _self_0 = setmetatable({ }, _base_0) | ||
| 1248 | cls.__init(_self_0, ...) | ||
| 1249 | return _self_0 | ||
| 1250 | end | ||
| 1251 | }) | ||
| 1252 | _base_0.__class = _class_0 | ||
| 1253 | local self = _class_0; | ||
| 1254 | xa = 1 | ||
| 1255 | xb = 1 | ||
| 1256 | CX = _class_0 | ||
| 1257 | end | 1238 | end |
| 1239 | _class_0 = setmetatable({ | ||
| 1240 | __init = function(self) end, | ||
| 1241 | __base = _base_0, | ||
| 1242 | __name = "CX" | ||
| 1243 | }, { | ||
| 1244 | __index = _base_0, | ||
| 1245 | __call = function(cls, ...) | ||
| 1246 | local _self_0 = setmetatable({ }, _base_0) | ||
| 1247 | cls.__init(_self_0, ...) | ||
| 1248 | return _self_0 | ||
| 1249 | end | ||
| 1250 | }) | ||
| 1251 | _base_0.__class = _class_0 | ||
| 1252 | local self = _class_0; | ||
| 1253 | xa = 1 | ||
| 1254 | xb = 1 | ||
| 1255 | CX = _class_0 | ||
| 1258 | end | 1256 | end |
| 1259 | do | 1257 | do |
| 1260 | local CY | 1258 | local CY |
diff --git a/spec/outputs/codes_from_doc.lua b/spec/outputs/codes_from_doc.lua index a37b459..27f8de5 100644 --- a/spec/outputs/codes_from_doc.lua +++ b/spec/outputs/codes_from_doc.lua | |||
| @@ -486,17 +486,16 @@ end | |||
| 486 | do | 486 | do |
| 487 | a = 1 | 487 | a = 1 |
| 488 | print("declare all variables as globals") | 488 | print("declare all variables as globals") |
| 489 | local x | ||
| 490 | x = function() | 489 | x = function() |
| 491 | return 1 + y + z | 490 | return 1 + y + z |
| 492 | end | 491 | end |
| 493 | local y, z = 2, 3 | 492 | y, z = 2, 3 |
| 494 | end | 493 | end |
| 495 | do | 494 | do |
| 496 | X = 1 | 495 | X = 1 |
| 497 | print("only declare upper case variables as globals") | 496 | print("only declare upper case variables as globals") |
| 498 | local a = 1 | 497 | local a = 1 |
| 499 | local B = 2 | 498 | B = 2 |
| 500 | local Temp = "a local value" | 499 | local Temp = "a local value" |
| 501 | end | 500 | end |
| 502 | local thing = { | 501 | local thing = { |
| @@ -2494,17 +2493,16 @@ end | |||
| 2494 | do | 2493 | do |
| 2495 | a = 1 | 2494 | a = 1 |
| 2496 | print("declare all variables as globals") | 2495 | print("declare all variables as globals") |
| 2497 | local x | ||
| 2498 | x = function() | 2496 | x = function() |
| 2499 | return 1 + y + z | 2497 | return 1 + y + z |
| 2500 | end | 2498 | end |
| 2501 | local y, z = 2, 3 | 2499 | y, z = 2, 3 |
| 2502 | end | 2500 | end |
| 2503 | do | 2501 | do |
| 2504 | X = 1 | 2502 | X = 1 |
| 2505 | print("only declare upper case variables as globals") | 2503 | print("only declare upper case variables as globals") |
| 2506 | local a = 1 | 2504 | local a = 1 |
| 2507 | local B = 2 | 2505 | B = 2 |
| 2508 | local Temp = "a local value" | 2506 | local Temp = "a local value" |
| 2509 | end | 2507 | end |
| 2510 | local thing = { | 2508 | local thing = { |
diff --git a/spec/outputs/codes_from_doc_zh.lua b/spec/outputs/codes_from_doc_zh.lua index a23044d..ffa0483 100644 --- a/spec/outputs/codes_from_doc_zh.lua +++ b/spec/outputs/codes_from_doc_zh.lua | |||
| @@ -486,17 +486,16 @@ end | |||
| 486 | do | 486 | do |
| 487 | a = 1 | 487 | a = 1 |
| 488 | print("预先声明所有变量为全局变量") | 488 | print("预先声明所有变量为全局变量") |
| 489 | local x | ||
| 490 | x = function() | 489 | x = function() |
| 491 | return 1 + y + z | 490 | return 1 + y + z |
| 492 | end | 491 | end |
| 493 | local y, z = 2, 3 | 492 | y, z = 2, 3 |
| 494 | end | 493 | end |
| 495 | do | 494 | do |
| 496 | x = 1 | 495 | x = 1 |
| 497 | print("只预先声明大写的变量为全局变量") | 496 | print("只预先声明大写的变量为全局变量") |
| 498 | local a = 1 | 497 | local a = 1 |
| 499 | local B = 2 | 498 | B = 2 |
| 500 | local Temp = "一个局部值" | 499 | local Temp = "一个局部值" |
| 501 | end | 500 | end |
| 502 | local thing = { | 501 | local thing = { |
| @@ -2488,17 +2487,16 @@ end | |||
| 2488 | do | 2487 | do |
| 2489 | a = 1 | 2488 | a = 1 |
| 2490 | print("预先声明所有变量为全局变量") | 2489 | print("预先声明所有变量为全局变量") |
| 2491 | local x | ||
| 2492 | x = function() | 2490 | x = function() |
| 2493 | return 1 + y + z | 2491 | return 1 + y + z |
| 2494 | end | 2492 | end |
| 2495 | local y, z = 2, 3 | 2493 | y, z = 2, 3 |
| 2496 | end | 2494 | end |
| 2497 | do | 2495 | do |
| 2498 | x = 1 | 2496 | x = 1 |
| 2499 | print("只预先声明大写的变量为全局变量") | 2497 | print("只预先声明大写的变量为全局变量") |
| 2500 | local a = 1 | 2498 | local a = 1 |
| 2501 | local B = 2 | 2499 | B = 2 |
| 2502 | local Temp = "一个局部值" | 2500 | local Temp = "一个局部值" |
| 2503 | end | 2501 | end |
| 2504 | local thing = { | 2502 | local thing = { |
diff --git a/spec/outputs/cond.lua b/spec/outputs/cond.lua index 083419a..e194909 100644 --- a/spec/outputs/cond.lua +++ b/spec/outputs/cond.lua | |||
| @@ -313,14 +313,12 @@ do | |||
| 313 | end | 313 | end |
| 314 | end | 314 | end |
| 315 | do | 315 | do |
| 316 | do | 316 | local _des_0 = { } |
| 317 | local _des_0 = { } | 317 | if _des_0 then |
| 318 | if _des_0 then | 318 | _M = _des_0 |
| 319 | _M = _des_0 | 319 | local Thing = _M.Thing |
| 320 | local Thing = _M.Thing | 320 | local _obj_0 = _M |
| 321 | local _obj_0 = _M | 321 | a, b = _obj_0.a, _obj_0.b |
| 322 | a, b = _obj_0.a, _obj_0.b | ||
| 323 | end | ||
| 324 | end | 322 | end |
| 325 | end | 323 | end |
| 326 | do | 324 | do |
diff --git a/spec/outputs/unicode/cond.lua b/spec/outputs/unicode/cond.lua index 7229001..5e86228 100644 --- a/spec/outputs/unicode/cond.lua +++ b/spec/outputs/unicode/cond.lua | |||
| @@ -314,15 +314,13 @@ do | |||
| 314 | end | 314 | end |
| 315 | end | 315 | end |
| 316 | do | 316 | do |
| 317 | do | 317 | local _des_0 = { } |
| 318 | local _des_0 = { } | 318 | if _des_0 then |
| 319 | if _des_0 then | 319 | __u6a21_u5757 = _des_0 |
| 320 | __u6a21_u5757 = _des_0 | 320 | local _u4e1c_u897f = __u6a21_u5757["东西"] |
| 321 | local _u4e1c_u897f = __u6a21_u5757["东西"] | 321 | local a_u529f_u80fd, b_u529f_u80fd |
| 322 | local a_u529f_u80fd, b_u529f_u80fd | 322 | local _obj_0 = __u6a21_u5757 |
| 323 | local _obj_0 = __u6a21_u5757 | 323 | a_u529f_u80fd, b_u529f_u80fd = _obj_0["a功能"], _obj_0["b功能"] |
| 324 | a_u529f_u80fd, b_u529f_u80fd = _obj_0["a功能"], _obj_0["b功能"] | ||
| 325 | end | ||
| 326 | end | 324 | end |
| 327 | end | 325 | end |
| 328 | do | 326 | do |
diff --git a/spec/outputs/unicode/with.lua b/spec/outputs/unicode/with.lua index 7a5ba00..3a32a27 100644 --- a/spec/outputs/unicode/with.lua +++ b/spec/outputs/unicode/with.lua | |||
| @@ -161,17 +161,15 @@ do | |||
| 161 | } | 161 | } |
| 162 | end | 162 | end |
| 163 | do | 163 | do |
| 164 | do | 164 | local _with_0 = _u5b9e_u5fc3_u77e9_u5f62({ |
| 165 | local _with_0 = _u5b9e_u5fc3_u77e9_u5f62({ | 165 | ["宽"] = w, |
| 166 | ["宽"] = w, | 166 | ["高"] = h, |
| 167 | ["高"] = h, | 167 | ["颜色"] = 0x66000000 |
| 168 | ["颜色"] = 0x66000000 | 168 | }) |
| 169 | }) | 169 | _u63a9_u7801 = _with_0 |
| 170 | _u63a9_u7801 = _with_0 | 170 | if _with_0 ~= nil then |
| 171 | if _with_0 ~= nil then | 171 | _with_0["触摸启用"] = true |
| 172 | _with_0["触摸启用"] = true | 172 | _with_0["吞噬触摸"] = true |
| 173 | _with_0["吞噬触摸"] = true | ||
| 174 | end | ||
| 175 | end | 173 | end |
| 176 | end | 174 | end |
| 177 | do | 175 | do |
diff --git a/spec/outputs/with.lua b/spec/outputs/with.lua index 5d33bdb..1a795c1 100644 --- a/spec/outputs/with.lua +++ b/spec/outputs/with.lua | |||
| @@ -158,17 +158,15 @@ do | |||
| 158 | } | 158 | } |
| 159 | end | 159 | end |
| 160 | do | 160 | do |
| 161 | do | 161 | local _with_0 = SolidRect({ |
| 162 | local _with_0 = SolidRect({ | 162 | width = w, |
| 163 | width = w, | 163 | height = h, |
| 164 | height = h, | 164 | color = 0x66000000 |
| 165 | color = 0x66000000 | 165 | }) |
| 166 | }) | 166 | mask = _with_0 |
| 167 | mask = _with_0 | 167 | if _with_0 ~= nil then |
| 168 | if _with_0 ~= nil then | 168 | _with_0.touchEnabled = true |
| 169 | _with_0.touchEnabled = true | 169 | _with_0.swallowTouches = true |
| 170 | _with_0.swallowTouches = true | ||
| 171 | end | ||
| 172 | end | 170 | end |
| 173 | end | 171 | end |
| 174 | do | 172 | do |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 3d98fbc..e3c9d31 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
| @@ -75,7 +75,7 @@ static std::unordered_set<std::string> Metamethods = { | |||
| 75 | "close"s // Lua 5.4 | 75 | "close"s // Lua 5.4 |
| 76 | }; | 76 | }; |
| 77 | 77 | ||
| 78 | const std::string_view version = "0.27.1"sv; | 78 | const std::string_view version = "0.27.2"sv; |
| 79 | const std::string_view extension = "yue"sv; | 79 | const std::string_view extension = "yue"sv; |
| 80 | 80 | ||
| 81 | class CompileError : public std::logic_error { | 81 | class CompileError : public std::logic_error { |
| @@ -437,7 +437,6 @@ private: | |||
| 437 | #endif | 437 | #endif |
| 438 | std::unique_ptr<std::unordered_map<std::string, VarType>> vars; | 438 | std::unique_ptr<std::unordered_map<std::string, VarType>> vars; |
| 439 | std::unique_ptr<std::unordered_set<std::string>> allows; | 439 | std::unique_ptr<std::unordered_set<std::string>> allows; |
| 440 | std::unique_ptr<std::unordered_set<std::string>> globals; | ||
| 441 | }; | 440 | }; |
| 442 | std::list<Scope> _scopes; | 441 | std::list<Scope> _scopes; |
| 443 | static const std::string Empty; | 442 | static const std::string Empty; |
| @@ -516,10 +515,8 @@ private: | |||
| 516 | int mode = int(std::isupper(name[0]) ? GlobalMode::Capital : GlobalMode::Any); | 515 | int mode = int(std::isupper(name[0]) ? GlobalMode::Capital : GlobalMode::Any); |
| 517 | const auto& current = _scopes.back(); | 516 | const auto& current = _scopes.back(); |
| 518 | if (int(current.mode) >= mode) { | 517 | if (int(current.mode) >= mode) { |
| 519 | if (!current.globals) { | 518 | isDefined = true; |
| 520 | isDefined = true; | 519 | current.vars->insert_or_assign(name, VarType::Global); |
| 521 | current.vars->insert_or_assign(name, VarType::Global); | ||
| 522 | } | ||
| 523 | } | 520 | } |
| 524 | decltype(_scopes.back().allows.get()) allows = nullptr; | 521 | decltype(_scopes.back().allows.get()) allows = nullptr; |
| 525 | for (auto it = _scopes.rbegin(); it != _scopes.rend(); ++it) { | 522 | for (auto it = _scopes.rbegin(); it != _scopes.rend(); ++it) { |
| @@ -892,10 +889,6 @@ private: | |||
| 892 | void addGlobalVar(const std::string& name, ast_node* x) { | 889 | void addGlobalVar(const std::string& name, ast_node* x) { |
| 893 | if (isLocal(name)) throw CompileError("can not declare a local variable to be global"sv, x); | 890 | if (isLocal(name)) throw CompileError("can not declare a local variable to be global"sv, x); |
| 894 | auto& scope = _scopes.back(); | 891 | auto& scope = _scopes.back(); |
| 895 | if (!scope.globals) { | ||
| 896 | scope.globals = std::make_unique<std::unordered_set<std::string>>(); | ||
| 897 | } | ||
| 898 | scope.globals->insert(name); | ||
| 899 | scope.vars->insert_or_assign(name, VarType::Global); | 892 | scope.vars->insert_or_assign(name, VarType::Global); |
| 900 | } | 893 | } |
| 901 | 894 | ||
| @@ -9401,7 +9394,6 @@ private: | |||
| 9401 | auto classDecl = static_cast<ClassDecl_t*>(item); | 9394 | auto classDecl = static_cast<ClassDecl_t*>(item); |
| 9402 | if (classDecl->name) { | 9395 | if (classDecl->name) { |
| 9403 | if (auto var = classDecl->name->item.as<Variable_t>()) { | 9396 | if (auto var = classDecl->name->item.as<Variable_t>()) { |
| 9404 | markVarsGlobal(GlobalMode::Any); | ||
| 9405 | addGlobalVar(variableToString(var), classDecl->name->item); | 9397 | addGlobalVar(variableToString(var), classDecl->name->item); |
| 9406 | } | 9398 | } |
| 9407 | } | 9399 | } |
| @@ -9416,7 +9408,6 @@ private: | |||
| 9416 | } | 9408 | } |
| 9417 | break; | 9409 | break; |
| 9418 | case id<GlobalValues_t>(): { | 9410 | case id<GlobalValues_t>(): { |
| 9419 | markVarsGlobal(GlobalMode::Any); | ||
| 9420 | auto values = global->item.to<GlobalValues_t>(); | 9411 | auto values = global->item.to<GlobalValues_t>(); |
| 9421 | if (values->valueList) { | 9412 | if (values->valueList) { |
| 9422 | auto expList = x->new_ptr<ExpList_t>(); | 9413 | auto expList = x->new_ptr<ExpList_t>(); |
