diff options
-rw-r--r-- | spec/inputs/unless_else.moon | 2 | ||||
-rw-r--r-- | 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 @@ | |||
1 | if a | 1 | if 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 | } |