aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-02-15 12:08:55 +0800
committerLi Jin <dragon-fly@qq.com>2020-02-15 12:08:55 +0800
commit0091db154bc4d40a0c2d79a2311ddc3711321811 (patch)
tree0cb82e4b455f2d109a171bfdff41c92b2f308c47 /src
parent65180a2d3e00931226d6c90a3b7ccf9db14722ae (diff)
downloadyuescript-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.cpp50
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
31const char* moonScriptVersion() { 31const char* moonScriptVersion() {
32 return "0.5.0-r0.1.1"; 32 return "0.5.0-r0.1.2";
33} 33}
34 34
35class MoonCompiler { 35class 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 }