From ed994e0217192b3d416b29f61c7d0a60a6890787 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Sat, 15 Feb 2020 17:35:59 +0800 Subject: force forward declaration of variable for assigning local function. --- spec/inputs/unless_else.moon | 2 +- src/MoonP/moon_compiler.cpp | 28 ++++++++++++---------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/spec/inputs/unless_else.moon b/spec/inputs/unless_else.moon index fe96c0b..987b60b 100644 --- a/spec/inputs/unless_else.moon +++ b/spec/inputs/unless_else.moon @@ -1,5 +1,5 @@ if a - unless b + unless b or d print "hi" elseif c print "not hi" diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index 0a5babe..f2ca493 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp @@ -1283,22 +1283,20 @@ private: break; } case "Assign"_id: { - auto defs = getAssignDefs(expList); - bool oneLined = defs.size() == expList->exprs.objects().size() && - traversal::Stop != action->traverse([&](ast_node* n) { - if (n->getId() == "Callable"_id) { - if (auto name = n->getByPath()) { - for (const auto& def : defs) { - if (def == toString(name)) { - return traversal::Stop; - } + auto assign = static_cast(action); + bool oneLined = true; + for (auto val : assign->values.objects()) { + if (auto value = singleValueFrom(val)) { + if (auto spValue = value->item.as()) { + if (spValue->value.is()) { + oneLined = false; + break; } } } - return traversal::Continue; - }); - if (oneLined) { - auto assign = static_cast(action); + } + auto defs = getAssignDefs(expList); + if (oneLined && defs.size() == expList->exprs.objects().size()) { for (auto value : assign->values.objects()) { transformAssignItem(value, temp); } @@ -1314,8 +1312,7 @@ private: } else { out.push_back(preDefine + s(" = "sv) + join(temp, ", "sv) + nll(assignment)); } - } - else { + } else { std::string preDefine = getPredefine(defs); for (const auto& def : defs) { addToScope(def); @@ -1323,7 +1320,6 @@ private: transformExpList(expList, temp); std::string left = temp.back(); temp.pop_back(); - auto assign = static_cast(action); for (auto value : assign->values.objects()) { transformAssignItem(value, temp); } -- cgit v1.2.3-55-g6feb