diff options
| author | Li Jin <dragon-fly@qq.com> | 2020-02-15 17:35:59 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2020-02-15 17:35:59 +0800 |
| commit | ed994e0217192b3d416b29f61c7d0a60a6890787 (patch) | |
| tree | e36705c282b459e1a0612a4552e5d12335ff3597 | |
| parent | 2c54137e9775173ec3dd33343c67dc225ded9d35 (diff) | |
| download | yuescript-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.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 | } |
