diff options
author | Li Jin <dragon-fly@qq.com> | 2020-01-13 13:09:24 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2020-01-13 13:09:24 +0800 |
commit | ccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b (patch) | |
tree | 85c785561954599e9abc784f17ef1ed82f6b8921 | |
parent | 5c4de3eb820ba6167ab0a98481b8ace362910073 (diff) | |
download | yuescript-ccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b.tar.gz yuescript-ccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b.tar.bz2 yuescript-ccb3381cdfc84a4dd37f5b7aea9ff21d6558c14b.zip |
fix Moonscript issue 384.
-rw-r--r-- | spec/inputs/plus.moon | 2 | ||||
-rw-r--r-- | src/MoonP/moon_compiler.cpp | 53 |
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 | ||
6 | c.repeat.if\then("xyz")\else res | 6 | c.repeat.if\then("xyz")\else res |
7 | 7 | ||
8 | print @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 | } |