aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--spec/inputs/existential.moon3
-rw-r--r--src/MoonP/moon_compiler.cpp41
2 files changed, 31 insertions, 13 deletions
diff --git a/spec/inputs/existential.moon b/spec/inputs/existential.moon
index eaa3266..e8e2249 100644
--- a/spec/inputs/existential.moon
+++ b/spec/inputs/existential.moon
@@ -17,4 +17,5 @@ with abc?!\func?!
17if {:x} = a?.if?\then?(123)? @?\function 998 17if {:x} = a?.if?\then?(123)? @?\function 998
18 print x 18 print x
19 19
20 20res = b.function\do!\while("OK")\if("def",998)\f?
21print res
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp
index ca0ab5b..020e561 100644
--- a/src/MoonP/moon_compiler.cpp
+++ b/src/MoonP/moon_compiler.cpp
@@ -426,20 +426,31 @@ private:
426 return ast_is<InvokeArgs_t, Invoke_t>(chainValue->items.back()); 426 return ast_is<InvokeArgs_t, Invoke_t>(chainValue->items.back());
427 } 427 }
428 428
429 bool isSpecialChainValue(ChainValue_t* chainValue) { 429 enum class ChainType {
430 Common,
431 EndWithColon,
432 EndWithEOP,
433 HasEOP,
434 HasKeyword
435 };
436
437 ChainType specialChainValue(ChainValue_t* chainValue) {
430 if (ast_is<ColonChainItem_t>(chainValue->items.back())) { 438 if (ast_is<ColonChainItem_t>(chainValue->items.back())) {
431 return true; 439 return ChainType::EndWithColon;
440 }
441 if (ast_is<existential_op_t>(chainValue->items.back())) {
442 return ChainType::EndWithEOP;
432 } 443 }
433 for (auto item : chainValue->items.objects()) { 444 for (auto item : chainValue->items.objects()) {
434 if (auto colonChain = ast_cast<ColonChainItem_t>(item)) { 445 if (auto colonChain = ast_cast<ColonChainItem_t>(item)) {
435 if (ast_is<LuaKeyword_t>(colonChain->name)) { 446 if (ast_is<LuaKeyword_t>(colonChain->name)) {
436 return true; 447 return ChainType::HasKeyword;
437 } 448 }
438 } else if (ast_is<existential_op_t>(item) && item != chainValue->items.back()) { 449 } else if (ast_is<existential_op_t>(item) && item != chainValue->items.back()) {
439 return true; 450 return ChainType::HasEOP;
440 } 451 }
441 } 452 }
442 return false; 453 return ChainType::Common;
443 } 454 }
444 455
445 std::string singleVariableFrom(ChainValue_t* chainValue) { 456 std::string singleVariableFrom(ChainValue_t* chainValue) {
@@ -998,16 +1009,22 @@ private:
998 auto exp = ast_cast<Exp_t>(value); 1009 auto exp = ast_cast<Exp_t>(value);
999 BREAK_IF(!exp); 1010 BREAK_IF(!exp);
1000 if (auto chainValue = exp->value->item.as<ChainValue_t>()) { 1011 if (auto chainValue = exp->value->item.as<ChainValue_t>()) {
1001 if (isSpecialChainValue(chainValue)) { 1012 auto type = specialChainValue(chainValue);
1002 auto expList = assignment->expList.get(); 1013 auto expList = assignment->expList.get();
1003 if (ast_is<ColonChainItem_t>(chainValue->items.back())) { 1014 switch (type) {
1015 case ChainType::HasEOP:
1016 case ChainType::EndWithColon: {
1004 std::string preDefine = getPredefine(assignment); 1017 std::string preDefine = getPredefine(assignment);
1005 transformChainValue(chainValue, out, ExpUsage::Assignment, expList); 1018 transformChainValue(chainValue, out, ExpUsage::Assignment, expList);
1006 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment)); 1019 out.back().insert(0, preDefine.empty() ? Empty : preDefine + nll(assignment));
1007 } else { 1020 return;
1008 transformChainValue(chainValue, out, ExpUsage::Assignment, expList);
1009 } 1021 }
1010 return; 1022 case ChainType::HasKeyword:
1023 transformChainValue(chainValue, out, ExpUsage::Assignment, expList);
1024 return;
1025 case ChainType::Common:
1026 case ChainType::EndWithEOP:
1027 break;
1011 } 1028 }
1012 } 1029 }
1013 BLOCK_END 1030 BLOCK_END
@@ -1858,7 +1875,7 @@ private:
1858 } 1875 }
1859 } 1876 }
1860 if (auto chainValue = singleValue->item.as<ChainValue_t>()) { 1877 if (auto chainValue = singleValue->item.as<ChainValue_t>()) {
1861 if (isSpecialChainValue(chainValue)) { 1878 if (specialChainValue(chainValue) != ChainType::Common) {
1862 transformChainValue(chainValue, out, ExpUsage::Return); 1879 transformChainValue(chainValue, out, ExpUsage::Return);
1863 return; 1880 return;
1864 } 1881 }