diff options
| author | Li Jin <dragon-fly@qq.com> | 2020-02-15 12:08:55 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2020-02-15 12:08:55 +0800 |
| commit | 0091db154bc4d40a0c2d79a2311ddc3711321811 (patch) | |
| tree | 0cb82e4b455f2d109a171bfdff41c92b2f308c47 | |
| parent | 65180a2d3e00931226d6c90a3b7ccf9db14722ae (diff) | |
| download | yuescript-0091db154bc4d40a0c2d79a2311ddc3711321811.tar.gz yuescript-0091db154bc4d40a0c2d79a2311ddc3711321811.tar.bz2 yuescript-0091db154bc4d40a0c2d79a2311ddc3711321811.zip | |
force forward declaration of variable for assigning local function.
Diffstat (limited to '')
| -rw-r--r-- | src/MoonP/moon_compiler.cpp | 50 |
1 files changed, 13 insertions, 37 deletions
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) { | |||
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | const char* moonScriptVersion() { | 31 | const char* moonScriptVersion() { |
| 32 | return "0.5.0-r0.1.1"; | 32 | return "0.5.0-r0.1.2"; |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | class MoonCompiler { | 35 | class MoonCompiler { |
| @@ -1248,42 +1248,20 @@ private: | |||
| 1248 | break; | 1248 | break; |
| 1249 | } | 1249 | } |
| 1250 | case "Assign"_id: { | 1250 | case "Assign"_id: { |
| 1251 | auto defs = getAssignDefs(expList); | 1251 | bool oneLined = true; |
| 1252 | bool oneLined = defs.size() == expList->exprs.objects().size() && | 1252 | auto assign = static_cast<Assign_t*>(action); |
| 1253 | traversal::Stop != action->traverse([&](ast_node* n) { | 1253 | for (auto val : assign->values.objects()) { |
| 1254 | switch (n->getId()) { | 1254 | if (auto value = singleValueFrom(val)) { |
| 1255 | case "ChainValue"_id: { | 1255 | if (auto spValue = value->item.as<SimpleValue_t>()) { |
| 1256 | auto chainValue = static_cast<ChainValue_t*>(n); | 1256 | if (spValue->value.is<FunLit_t>()) { |
| 1257 | const auto& items = chainValue->items.objects(); | 1257 | oneLined = false; |
| 1258 | BLOCK_START | 1258 | break; |
| 1259 | auto callable = ast_cast<Callable_t>(*items.begin()); | ||
| 1260 | BREAK_IF(!callable); | ||
| 1261 | auto next = items.begin(); ++next; | ||
| 1262 | BREAK_IF(next == items.end()); | ||
| 1263 | BREAK_IF((!ast_is<Invoke_t,InvokeArgs_t>(*next))); | ||
| 1264 | for (const auto& def : defs) { | ||
| 1265 | switch (callable->item->getId()) { | ||
| 1266 | case "Variable"_id: | ||
| 1267 | if (def == _parser.toString(callable->item)) { | ||
| 1268 | return traversal::Stop; | ||
| 1269 | } | ||
| 1270 | return traversal::Return; | ||
| 1271 | case "SelfName"_id: | ||
| 1272 | if (def == "self"sv) { | ||
| 1273 | return traversal::Stop; | ||
| 1274 | } | ||
| 1275 | return traversal::Return; | ||
| 1276 | } | ||
| 1277 | } | 1259 | } |
| 1278 | BLOCK_END | ||
| 1279 | return traversal::Continue; | ||
| 1280 | } | 1260 | } |
| 1281 | default: | ||
| 1282 | return traversal::Continue; | ||
| 1283 | } | 1261 | } |
| 1284 | }); | 1262 | } |
| 1285 | if (oneLined) { | 1263 | auto defs = getAssignDefs(expList); |
| 1286 | auto assign = static_cast<Assign_t*>(action); | 1264 | if (oneLined && defs.size() == expList->exprs.objects().size()) { |
| 1287 | for (auto value : assign->values.objects()) { | 1265 | for (auto value : assign->values.objects()) { |
| 1288 | transformAssignItem(value, temp); | 1266 | transformAssignItem(value, temp); |
| 1289 | } | 1267 | } |
| @@ -1299,8 +1277,7 @@ private: | |||
| 1299 | } else { | 1277 | } else { |
| 1300 | out.push_back(preDefine + s(" = "sv) + join(temp, ", "sv) + nll(assignment)); | 1278 | out.push_back(preDefine + s(" = "sv) + join(temp, ", "sv) + nll(assignment)); |
| 1301 | } | 1279 | } |
| 1302 | } | 1280 | } else { |
| 1303 | else { | ||
| 1304 | std::string preDefine = getPredefine(defs); | 1281 | std::string preDefine = getPredefine(defs); |
| 1305 | for (const auto& def : defs) { | 1282 | for (const auto& def : defs) { |
| 1306 | addToScope(def); | 1283 | addToScope(def); |
| @@ -1308,7 +1285,6 @@ private: | |||
| 1308 | transformExpList(expList, temp); | 1285 | transformExpList(expList, temp); |
| 1309 | std::string left = temp.back(); | 1286 | std::string left = temp.back(); |
| 1310 | temp.pop_back(); | 1287 | temp.pop_back(); |
| 1311 | auto assign = static_cast<Assign_t*>(action); | ||
| 1312 | for (auto value : assign->values.objects()) { | 1288 | for (auto value : assign->values.objects()) { |
| 1313 | transformAssignItem(value, temp); | 1289 | transformAssignItem(value, temp); |
| 1314 | } | 1290 | } |
