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 /src | |
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 'src')
-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 | } |