From 0091db154bc4d40a0c2d79a2311ddc3711321811 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Sat, 15 Feb 2020 12:08:55 +0800 Subject: force forward declaration of variable for assigning local function. --- src/MoonP/moon_compiler.cpp | 50 ++++++++++++--------------------------------- 1 file changed, 13 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index d009fc9..4406dbd 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp @@ -29,7 +29,7 @@ inline std::string s(std::string_view sv) { } const char* moonScriptVersion() { - return "0.5.0-r0.1.1"; + return "0.5.0-r0.1.2"; } class MoonCompiler { @@ -1248,42 +1248,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) { - switch (n->getId()) { - case "ChainValue"_id: { - auto chainValue = static_cast(n); - const auto& items = chainValue->items.objects(); - BLOCK_START - auto callable = ast_cast(*items.begin()); - BREAK_IF(!callable); - auto next = items.begin(); ++next; - BREAK_IF(next == items.end()); - BREAK_IF((!ast_is(*next))); - for (const auto& def : defs) { - switch (callable->item->getId()) { - case "Variable"_id: - if (def == _parser.toString(callable->item)) { - return traversal::Stop; - } - return traversal::Return; - case "SelfName"_id: - if (def == "self"sv) { - return traversal::Stop; - } - return traversal::Return; - } + bool oneLined = true; + auto assign = static_cast(action); + for (auto val : assign->values.objects()) { + if (auto value = singleValueFrom(val)) { + if (auto spValue = value->item.as()) { + if (spValue->value.is()) { + oneLined = false; + break; } - BLOCK_END - return traversal::Continue; } - default: - 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); } @@ -1299,8 +1277,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); @@ -1308,7 +1285,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