aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-01-13 13:09:24 +0800
committerLi Jin <dragon-fly@qq.com>2020-01-13 13:09:24 +0800
commitccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b (patch)
tree85c785561954599e9abc784f17ef1ed82f6b8921
parent5c4de3eb820ba6167ab0a98481b8ace362910073 (diff)
downloadyuescript-ccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b.tar.gz
yuescript-ccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b.tar.bz2
yuescript-ccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b.zip
fix Moonscript issue 384.
-rw-r--r--spec/inputs/plus.moon2
-rw-r--r--src/MoonP/moon_compiler.cpp53
2 files changed, 44 insertions, 11 deletions
diff --git a/spec/inputs/plus.moon b/spec/inputs/plus.moon
index fdca8be..7b9ef05 100644
--- a/spec/inputs/plus.moon
+++ b/spec/inputs/plus.moon
@@ -5,3 +5,5 @@ res = b.function\do!\while("OK")\if "def",998
5 5
6c.repeat.if\then("xyz")\else res 6c.repeat.if\then("xyz")\else res
7 7
8print @for,@@function 123
9
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp
index f9a86a6..e015939 100644
--- a/src/MoonP/moon_compiler.cpp
+++ b/src/MoonP/moon_compiler.cpp
@@ -437,7 +437,7 @@ private:
437 auto callable = ast_cast<Callable_t>(chainValue->items.front()); 437 auto callable = ast_cast<Callable_t>(chainValue->items.front());
438 BREAK_IF(!callable || !callable->item.is<Variable_t>()); 438 BREAK_IF(!callable || !callable->item.is<Variable_t>());
439 str_list tmp; 439 str_list tmp;
440 transformCallable(callable, tmp, false); 440 transformCallable(callable, tmp);
441 return tmp.back(); 441 return tmp.back();
442 BLOCK_END 442 BLOCK_END
443 return Empty; 443 return Empty;
@@ -1552,7 +1552,7 @@ private:
1552 } 1552 }
1553 } 1553 }
1554 1554
1555 void transformCallable(Callable_t* callable, str_list& out, bool invoke) { 1555 void transformCallable(Callable_t* callable, str_list& out, const ast_sel<false,Invoke_t,InvokeArgs_t>& invoke = {}) {
1556 auto item = callable->item.get(); 1556 auto item = callable->item.get();
1557 switch (item->getId()) { 1557 switch (item->getId()) {
1558 case "Variable"_id: { 1558 case "Variable"_id: {
@@ -1564,7 +1564,8 @@ private:
1564 } 1564 }
1565 break; 1565 break;
1566 } 1566 }
1567 case "SelfName"_id: { transformSelfName(static_cast<SelfName_t*>(item), out, invoke); 1567 case "SelfName"_id: {
1568 transformSelfName(static_cast<SelfName_t*>(item), out, invoke);
1568 if (_config.lintGlobalVariable) { 1569 if (_config.lintGlobalVariable) {
1569 std::string self("self"sv); 1570 std::string self("self"sv);
1570 if (!isDefined(self)) { 1571 if (!isDefined(self)) {
@@ -1938,12 +1939,26 @@ private:
1938 out.push_back(initCodes); 1939 out.push_back(initCodes);
1939 } 1940 }
1940 1941
1941 void transformSelfName(SelfName_t* selfName, str_list& out, bool invoke) { 1942 void transformSelfName(SelfName_t* selfName, str_list& out, const ast_sel<false,Invoke_t,InvokeArgs_t>& invoke = {}) {
1943 auto x = selfName;
1942 auto name = selfName->name.get(); 1944 auto name = selfName->name.get();
1943 switch (name->getId()) { 1945 switch (name->getId()) {
1944 case "self_class_name"_id: { 1946 case "self_class_name"_id: {
1945 auto clsName = static_cast<self_class_name_t*>(name); 1947 auto clsName = static_cast<self_class_name_t*>(name);
1946 out.push_back(s("self.__class"sv) + s(invoke ? ":"sv : "."sv) + toString(clsName->name)); 1948 auto nameStr = toString(clsName->name);
1949 if (State::luaKeywords.find(nameStr) != State::luaKeywords.end()) {
1950 out.push_back(s("self.__class[\""sv) + nameStr + s("\"]"));
1951 if (invoke) {
1952 if (auto invokePtr = invoke.as<Invoke_t>()) {
1953 invokePtr->args.push_front(toAst<Exp_t>("self.__class"sv, Exp, x));
1954 } else {
1955 auto invokeArgsPtr = invoke.as<InvokeArgs_t>();
1956 invokeArgsPtr->args.push_front(toAst<Exp_t>("self.__class"sv, Exp, x));
1957 }
1958 }
1959 } else {
1960 out.push_back(s("self.__class"sv) + s(invoke ? ":"sv : "."sv) + nameStr);
1961 }
1947 break; 1962 break;
1948 } 1963 }
1949 case "self_class"_id: 1964 case "self_class"_id:
@@ -1951,7 +1966,20 @@ private:
1951 break; 1966 break;
1952 case "self_name"_id: { 1967 case "self_name"_id: {
1953 auto sfName = static_cast<self_class_name_t*>(name); 1968 auto sfName = static_cast<self_class_name_t*>(name);
1954 out.push_back(s("self"sv) + s(invoke ? ":"sv : "."sv) + toString(sfName->name)); 1969 auto nameStr = toString(sfName->name);
1970 if (State::luaKeywords.find(nameStr) != State::luaKeywords.end()) {
1971 out.push_back(s("self[\""sv) + nameStr + s("\"]"));
1972 if (invoke) {
1973 if (auto invokePtr = invoke.as<Invoke_t>()) {
1974 invokePtr->args.push_front(toAst<Exp_t>("self"sv, Exp, x));
1975 } else {
1976 auto invokeArgsPtr = invoke.as<InvokeArgs_t>();
1977 invokeArgsPtr->args.push_front(toAst<Exp_t>("self"sv, Exp, x));
1978 }
1979 }
1980 } else {
1981 out.push_back(s("self"sv) + s(invoke ? ":"sv : "."sv) + nameStr);
1982 }
1955 break; 1983 break;
1956 } 1984 }
1957 case "self"_id: 1985 case "self"_id:
@@ -2191,8 +2219,11 @@ private:
2191 case "Callable"_id: { 2219 case "Callable"_id: {
2192 auto next = it; ++next; 2220 auto next = it; ++next;
2193 auto followItem = next != chainList.end() ? *next : nullptr; 2221 auto followItem = next != chainList.end() ? *next : nullptr;
2194 transformCallable(static_cast<Callable_t*>(item), temp, 2222 ast_sel<false, Invoke_t, InvokeArgs_t> invoke;
2195 followItem && ast_is<Invoke_t, InvokeArgs_t>(followItem)); 2223 if (ast_is<Invoke_t, InvokeArgs_t>(followItem)) {
2224 invoke.set(followItem);
2225 }
2226 transformCallable(static_cast<Callable_t*>(item), temp, invoke);
2196 break; 2227 break;
2197 } 2228 }
2198 case "String"_id: 2229 case "String"_id:
@@ -2440,7 +2471,7 @@ private:
2440 endWithSlice = true; 2471 endWithSlice = true;
2441 if (listVar.empty() && chainList.size() == 2 && 2472 if (listVar.empty() && chainList.size() == 2 &&
2442 ast_is<Callable_t>(chainList.front())) { 2473 ast_is<Callable_t>(chainList.front())) {
2443 transformCallable(static_cast<Callable_t*>(chainList.front()), temp, false); 2474 transformCallable(static_cast<Callable_t*>(chainList.front()), temp);
2444 listVar = temp.back(); 2475 listVar = temp.back();
2445 temp.pop_back(); 2476 temp.pop_back();
2446 } 2477 }
@@ -2796,7 +2827,7 @@ private:
2796 void transformKeyName(KeyName_t* keyName, str_list& out) { 2827 void transformKeyName(KeyName_t* keyName, str_list& out) {
2797 auto name = keyName->name.get(); 2828 auto name = keyName->name.get();
2798 switch (name->getId()) { 2829 switch (name->getId()) {
2799 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(name), out, false); break; 2830 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(name), out); break;
2800 case "Name"_id: out.push_back(toString(name)); break; 2831 case "Name"_id: out.push_back(toString(name)); break;
2801 default: break; 2832 default: break;
2802 } 2833 }
@@ -3223,7 +3254,7 @@ private:
3223 switch (item->getId()) { 3254 switch (item->getId()) {
3224 case "AssignableChain"_id: transformAssignableChain(static_cast<AssignableChain_t*>(item), out); break; 3255 case "AssignableChain"_id: transformAssignableChain(static_cast<AssignableChain_t*>(item), out); break;
3225 case "Variable"_id: transformVariable(static_cast<Variable_t*>(item), out); break; 3256 case "Variable"_id: transformVariable(static_cast<Variable_t*>(item), out); break;
3226 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(item), out, false); break; 3257 case "SelfName"_id: transformSelfName(static_cast<SelfName_t*>(item), out); break;
3227 default: break; 3258 default: break;
3228 } 3259 }
3229 } 3260 }