aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-02-15 17:35:59 +0800
committerLi Jin <dragon-fly@qq.com>2020-02-15 17:35:59 +0800
commited994e0217192b3d416b29f61c7d0a60a6890787 (patch)
treee36705c282b459e1a0612a4552e5d12335ff3597
parent2c54137e9775173ec3dd33343c67dc225ded9d35 (diff)
downloadyuescript-0.5.0.tar.gz
yuescript-0.5.0.tar.bz2
yuescript-0.5.0.zip
force forward declaration of variable for assigning local function.0.5.0
-rw-r--r--spec/inputs/unless_else.moon2
-rw-r--r--src/MoonP/moon_compiler.cpp28
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 @@
1if a 1if a
2 unless b 2 unless b or d
3 print "hi" 3 print "hi"
4 elseif c 4 elseif c
5 print "not hi" 5 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:
1283 break; 1283 break;
1284 } 1284 }
1285 case "Assign"_id: { 1285 case "Assign"_id: {
1286 auto defs = getAssignDefs(expList); 1286 auto assign = static_cast<Assign_t*>(action);
1287 bool oneLined = defs.size() == expList->exprs.objects().size() && 1287 bool oneLined = true;
1288 traversal::Stop != action->traverse([&](ast_node* n) { 1288 for (auto val : assign->values.objects()) {
1289 if (n->getId() == "Callable"_id) { 1289 if (auto value = singleValueFrom(val)) {
1290 if (auto name = n->getByPath<Variable_t>()) { 1290 if (auto spValue = value->item.as<SimpleValue_t>()) {
1291 for (const auto& def : defs) { 1291 if (spValue->value.is<FunLit_t>()) {
1292 if (def == toString(name)) { 1292 oneLined = false;
1293 return traversal::Stop; 1293 break;
1294 }
1295 } 1294 }
1296 } 1295 }
1297 } 1296 }
1298 return traversal::Continue; 1297 }
1299 }); 1298 auto defs = getAssignDefs(expList);
1300 if (oneLined) { 1299 if (oneLined && defs.size() == expList->exprs.objects().size()) {
1301 auto assign = static_cast<Assign_t*>(action);
1302 for (auto value : assign->values.objects()) { 1300 for (auto value : assign->values.objects()) {
1303 transformAssignItem(value, temp); 1301 transformAssignItem(value, temp);
1304 } 1302 }
@@ -1314,8 +1312,7 @@ private:
1314 } else { 1312 } else {
1315 out.push_back(preDefine + s(" = "sv) + join(temp, ", "sv) + nll(assignment)); 1313 out.push_back(preDefine + s(" = "sv) + join(temp, ", "sv) + nll(assignment));
1316 } 1314 }
1317 } 1315 } else {
1318 else {
1319 std::string preDefine = getPredefine(defs); 1316 std::string preDefine = getPredefine(defs);
1320 for (const auto& def : defs) { 1317 for (const auto& def : defs) {
1321 addToScope(def); 1318 addToScope(def);
@@ -1323,7 +1320,6 @@ private:
1323 transformExpList(expList, temp); 1320 transformExpList(expList, temp);
1324 std::string left = temp.back(); 1321 std::string left = temp.back();
1325 temp.pop_back(); 1322 temp.pop_back();
1326 auto assign = static_cast<Assign_t*>(action);
1327 for (auto value : assign->values.objects()) { 1323 for (auto value : assign->values.objects()) {
1328 transformAssignItem(value, temp); 1324 transformAssignItem(value, temp);
1329 } 1325 }