diff options
| author | Li Jin <dragon-fly@qq.com> | 2019-09-17 13:51:28 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2019-09-17 13:51:28 +0800 |
| commit | ad0b9c911095b402159f51abe4d98a56d2335973 (patch) | |
| tree | 4cea91332b5339d077f240e4c3c300f4874375e0 /MoonParser/moon_ast.cpp | |
| parent | 74c4f6eab47f76b093e17f515204525e00a3b352 (diff) | |
| download | yuescript-ad0b9c911095b402159f51abe4d98a56d2335973.tar.gz yuescript-ad0b9c911095b402159f51abe4d98a56d2335973.tar.bz2 yuescript-ad0b9c911095b402159f51abe4d98a56d2335973.zip | |
clean up some dirty codes.
Diffstat (limited to 'MoonParser/moon_ast.cpp')
| -rw-r--r-- | MoonParser/moon_ast.cpp | 397 |
1 files changed, 145 insertions, 252 deletions
diff --git a/MoonParser/moon_ast.cpp b/MoonParser/moon_ast.cpp index af34395..f7dcae6 100644 --- a/MoonParser/moon_ast.cpp +++ b/MoonParser/moon_ast.cpp | |||
| @@ -82,20 +82,11 @@ AST_IMPL(double_string_content) | |||
| 82 | AST_IMPL(DoubleString) | 82 | AST_IMPL(DoubleString) |
| 83 | AST_IMPL(String) | 83 | AST_IMPL(String) |
| 84 | AST_IMPL(Parens) | 84 | AST_IMPL(Parens) |
| 85 | AST_IMPL(FnArgs) | ||
| 86 | AST_IMPL(chain_call) | ||
| 87 | AST_IMPL(chain_item) | ||
| 88 | AST_IMPL(DotChainItem) | 85 | AST_IMPL(DotChainItem) |
| 89 | AST_IMPL(ColonChainItem) | 86 | AST_IMPL(ColonChainItem) |
| 90 | AST_IMPL(chain_dot_chain) | ||
| 91 | AST_IMPL(ChainItem) | ||
| 92 | AST_IMPL(ChainItems) | ||
| 93 | AST_IMPL(invoke_chain) | ||
| 94 | AST_IMPL(ColonChain) | ||
| 95 | AST_IMPL(default_value) | 87 | AST_IMPL(default_value) |
| 96 | AST_IMPL(Slice) | 88 | AST_IMPL(Slice) |
| 97 | AST_IMPL(Invoke) | 89 | AST_IMPL(Invoke) |
| 98 | AST_IMPL(TableValue) | ||
| 99 | AST_IMPL(TableLit) | 90 | AST_IMPL(TableLit) |
| 100 | AST_IMPL(TableBlock) | 91 | AST_IMPL(TableBlock) |
| 101 | AST_IMPL(class_member_list) | 92 | AST_IMPL(class_member_list) |
| @@ -107,7 +98,6 @@ AST_IMPL(export_op) | |||
| 107 | AST_IMPL(Export) | 98 | AST_IMPL(Export) |
| 108 | AST_IMPL(variable_pair) | 99 | AST_IMPL(variable_pair) |
| 109 | AST_IMPL(normal_pair) | 100 | AST_IMPL(normal_pair) |
| 110 | AST_IMPL(KeyValue) | ||
| 111 | AST_IMPL(FnArgDef) | 101 | AST_IMPL(FnArgDef) |
| 112 | AST_IMPL(FnArgDefList) | 102 | AST_IMPL(FnArgDefList) |
| 113 | AST_IMPL(outer_var_shadow) | 103 | AST_IMPL(outer_var_shadow) |
| @@ -116,8 +106,6 @@ AST_IMPL(fn_arrow) | |||
| 116 | AST_IMPL(FunLit) | 106 | AST_IMPL(FunLit) |
| 117 | AST_IMPL(NameOrDestructure) | 107 | AST_IMPL(NameOrDestructure) |
| 118 | AST_IMPL(AssignableNameList) | 108 | AST_IMPL(AssignableNameList) |
| 119 | AST_IMPL(ArgBlock) | ||
| 120 | AST_IMPL(invoke_args_with_table) | ||
| 121 | AST_IMPL(InvokeArgs) | 109 | AST_IMPL(InvokeArgs) |
| 122 | AST_IMPL(const_value) | 110 | AST_IMPL(const_value) |
| 123 | AST_IMPL(unary_exp) | 111 | AST_IMPL(unary_exp) |
| @@ -354,7 +342,7 @@ private: | |||
| 354 | case "DotChainItem"_id: | 342 | case "DotChainItem"_id: |
| 355 | case "ColonChainItem"_id: | 343 | case "ColonChainItem"_id: |
| 356 | case "Slice"_id: | 344 | case "Slice"_id: |
| 357 | case "Index"_id: | 345 | case "Exp"_id: |
| 358 | case "Callable"_id: | 346 | case "Callable"_id: |
| 359 | case "String"_id: | 347 | case "String"_id: |
| 360 | return traversal::Stop; | 348 | return traversal::Stop; |
| @@ -373,7 +361,7 @@ private: | |||
| 373 | case "DotChainItem"_id: | 361 | case "DotChainItem"_id: |
| 374 | case "ColonChainItem"_id: | 362 | case "ColonChainItem"_id: |
| 375 | case "Slice"_id: | 363 | case "Slice"_id: |
| 376 | case "Index"_id: | 364 | case "Exp"_id: |
| 377 | case "Callable"_id: | 365 | case "Callable"_id: |
| 378 | case "String"_id: | 366 | case "String"_id: |
| 379 | last = node; | 367 | last = node; |
| @@ -389,24 +377,22 @@ private: | |||
| 389 | } | 377 | } |
| 390 | } | 378 | } |
| 391 | 379 | ||
| 392 | std::vector<ast_node*> getChainList(ast_node* chain) { | 380 | std::vector<ast_node*> getChainList(ChainValue_t* chainValue) { |
| 393 | std::vector<ast_node*> list; | 381 | std::vector<ast_node*> temp; |
| 394 | chain->traverse([&](ast_node* node) { | 382 | switch (chainValue->caller->getId()) { |
| 395 | switch (node->getId()) { | 383 | case "Callable"_id: |
| 396 | case "Invoke"_id: | 384 | temp.push_back(chainValue->caller); |
| 397 | case "DotChainItem"_id: | 385 | break; |
| 398 | case "ColonChainItem"_id: | 386 | case "Chain"_id: |
| 399 | case "Slice"_id: | 387 | const auto& items = chainValue->caller.to<Chain_t>()->items.objects(); |
| 400 | case "Index"_id: | 388 | temp.resize(items.size()); |
| 401 | case "Callable"_id: | 389 | std::copy(items.begin(), items.end(), temp.begin()); |
| 402 | case "String"_id: | 390 | break; |
| 403 | list.push_back(node); | 391 | } |
| 404 | return traversal::Return; | 392 | if (chainValue->arguments) { |
| 405 | default: | 393 | temp.push_back(chainValue->arguments); |
| 406 | return traversal::Continue; | 394 | } |
| 407 | } | 395 | return temp; |
| 408 | }); | ||
| 409 | return list; | ||
| 410 | } | 396 | } |
| 411 | 397 | ||
| 412 | void transformStatement(Statement_t* statement, std::vector<std::string>& out) { | 398 | void transformStatement(Statement_t* statement, std::vector<std::string>& out) { |
| @@ -1055,99 +1041,64 @@ private: | |||
| 1055 | } | 1041 | } |
| 1056 | } | 1042 | } |
| 1057 | 1043 | ||
| 1058 | void transformChain(Chain_t* chain, std::vector<std::string>& out) { | 1044 | void transformChain(Chain_t* chain, std::vector<std::string>& out, bool argsFollowed = false) { |
| 1059 | auto item = chain->item.get(); | ||
| 1060 | switch (item->getId()) { | ||
| 1061 | case "chain_call"_id: transform_chain_call(static_cast<chain_call_t*>(item), out); break; | ||
| 1062 | case "chain_item"_id: transformChainItems(static_cast<chain_item_t*>(item)->chain, out); break; | ||
| 1063 | case "chain_dot_chain"_id: transform_chain_dot_chain(item, out); break; | ||
| 1064 | case "ColonChain"_id: transformColonChain(static_cast<ColonChain_t*>(item), out); break; | ||
| 1065 | default: break; | ||
| 1066 | } | ||
| 1067 | } | ||
| 1068 | |||
| 1069 | void transform_chain_call(chain_call_t* chain_call, std::vector<std::string>& out) { | ||
| 1070 | std::vector<std::string> temp; | 1045 | std::vector<std::string> temp; |
| 1071 | auto caller = chain_call->caller.get(); | 1046 | const auto& chainList = chain->items.objects(); |
| 1072 | switch (caller->getId()) { | 1047 | if (!argsFollowed && chainList.size() == 2 && chainList.back()->getId() == "ColonChainItem"_id) { |
| 1073 | case "Callable"_id: { | ||
| 1074 | transformCallable(static_cast<Callable_t*>(caller), temp, startWithInvoke(chain_call->chain)); | ||
| 1075 | break; | ||
| 1076 | } | ||
| 1077 | case "String"_id: transformString(static_cast<String_t*>(caller), temp); break; | ||
| 1078 | default: break; | ||
| 1079 | } | ||
| 1080 | transformChainItems(chain_call->chain, temp); | ||
| 1081 | out.push_back(join(temp)); | ||
| 1082 | } | ||
| 1083 | 1048 | ||
| 1084 | void transformChainItems(ChainItems_t* chainItems, std::vector<std::string>& out) { | ||
| 1085 | std::vector<std::string> temp; | ||
| 1086 | for (auto _chainItem : chainItems->simpleChain.objects()) { | ||
| 1087 | auto chainItem = static_cast<ChainItem_t*>(_chainItem); | ||
| 1088 | transformChainItem(chainItem, temp); | ||
| 1089 | } | 1049 | } |
| 1090 | if (chainItems->colonChain) { | 1050 | for (auto it = chainList.begin(); it != chainList.end(); ++it) { |
| 1091 | transformColonChain(chainItems->colonChain, temp); | 1051 | auto item = *it; |
| 1052 | switch (item->getId()) { | ||
| 1053 | case "Invoke"_id: transformInvoke(static_cast<Invoke_t*>(item), temp); break; | ||
| 1054 | case "DotChainItem"_id: transformDotChainItem(static_cast<DotChainItem_t*>(item), temp); break; | ||
| 1055 | case "ColonChainItem"_id: transformColonChainItem(static_cast<ColonChainItem_t*>(item), temp); break; | ||
| 1056 | case "Slice"_id: transformSlice(static_cast<Slice_t*>(item), temp); break; | ||
| 1057 | case "Callable"_id: { | ||
| 1058 | auto next = it; ++next; | ||
| 1059 | auto followItem = next != chainList.end() ? *next : nullptr; | ||
| 1060 | transformCallable(static_cast<Callable_t*>(item), temp, | ||
| 1061 | followItem && followItem->getId() == "Invoke"_id); | ||
| 1062 | break; | ||
| 1063 | } | ||
| 1064 | case "String"_id: | ||
| 1065 | transformString(static_cast<String_t*>(item), temp); | ||
| 1066 | temp.back() = s("("sv) + temp.back() + s(")"sv); | ||
| 1067 | break; | ||
| 1068 | case "Exp"_id: | ||
| 1069 | transformExp(static_cast<Exp_t*>(item), temp); | ||
| 1070 | temp.back() = s("["sv) + temp.back() + s("]"sv); | ||
| 1071 | break; | ||
| 1072 | default: break; | ||
| 1073 | } | ||
| 1092 | } | 1074 | } |
| 1093 | out.push_back(join(temp)); | 1075 | out.push_back(join(temp)); |
| 1094 | } | 1076 | } |
| 1095 | 1077 | ||
| 1096 | void transformChainItem(ChainItem_t* chainItem, std::vector<std::string>& out) { | 1078 | void transformDotChainItem(DotChainItem_t* dotChainItem, std::vector<std::string>& out) { |
| 1097 | auto item = chainItem->item.get(); | 1079 | out.push_back(s("."sv) + toString(dotChainItem->name)); |
| 1098 | switch (item->getId()) { | ||
| 1099 | case "Invoke"_id: transformInvoke(static_cast<Invoke_t*>(item), out); break; | ||
| 1100 | case "DotChainItem"_id: | ||
| 1101 | out.push_back(s("."sv) + toString(item->getFirstChild())); | ||
| 1102 | break; | ||
| 1103 | case "Slice"_id: transformSlice(item, out); break; | ||
| 1104 | case "Exp"_id: | ||
| 1105 | transformExp(static_cast<Exp_t*>(item), out); | ||
| 1106 | out.back() = s("["sv) + out.back() + s("]"sv); | ||
| 1107 | break; | ||
| 1108 | default: break; | ||
| 1109 | } | ||
| 1110 | } | 1080 | } |
| 1111 | 1081 | ||
| 1112 | void transformInvoke(Invoke_t* invoke, std::vector<std::string>& out) { | 1082 | void transformColonChainItem(ColonChainItem_t* colonChainItem, std::vector<std::string>& out) { |
| 1113 | auto argument = invoke->argument.get(); | 1083 | out.push_back(s(colonChainItem->switchToDot ? "."sv : ":"sv) + toString(colonChainItem->name)); |
| 1114 | switch (argument->getId()) { | ||
| 1115 | case "FnArgs"_id: transformFnArgs(static_cast<FnArgs_t*>(argument), out); break; | ||
| 1116 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(argument), out); break; | ||
| 1117 | case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(argument), out); break; | ||
| 1118 | case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(argument), out); break; | ||
| 1119 | default: break; | ||
| 1120 | } | ||
| 1121 | out.back() = s("("sv) + out.back() + s(")"sv); | ||
| 1122 | } | 1084 | } |
| 1123 | 1085 | ||
| 1124 | void transformFnArgs(FnArgs_t* fnArgs, std::vector<std::string>& out) { | 1086 | void transformSlice(Slice_t* slice, std::vector<std::string>& out) { |
| 1125 | std::vector<std::string> temp; | 1087 | noop(slice, out); |
| 1126 | for (auto node : fnArgs->args.objects()) { | ||
| 1127 | transformExp(static_cast<Exp_t*>(node), temp); | ||
| 1128 | } | ||
| 1129 | std::string args = join(temp, ", "sv); | ||
| 1130 | out.push_back(args); | ||
| 1131 | } | 1088 | } |
| 1132 | 1089 | ||
| 1133 | void transformColonChain(ColonChain_t* colonChain, std::vector<std::string>& out) { | 1090 | void transformInvoke(Invoke_t* invoke, std::vector<std::string>& out) { |
| 1134 | std::vector<std::string> temp; | ||
| 1135 | temp.push_back( | ||
| 1136 | s(colonChain->colonChain->switchToDot ? "."sv : ":"sv) + | ||
| 1137 | toString(colonChain->colonChain->name)); | ||
| 1138 | if (colonChain->invokeChain) { | ||
| 1139 | transform_invoke_chain(colonChain->invokeChain, temp); | ||
| 1140 | } | ||
| 1141 | out.push_back(join(temp)); | ||
| 1142 | } | ||
| 1143 | |||
| 1144 | void transform_invoke_chain(invoke_chain_t* invoke_chain, std::vector<std::string>& out) { | ||
| 1145 | std::vector<std::string> temp; | 1091 | std::vector<std::string> temp; |
| 1146 | transformInvoke(invoke_chain->invoke, temp); | 1092 | for (auto arg : invoke->args.objects()) { |
| 1147 | if (invoke_chain->chain) { | 1093 | switch (arg->getId()) { |
| 1148 | transformChainItems(invoke_chain->chain, temp); | 1094 | case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp); break; |
| 1095 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(arg), temp); break; | ||
| 1096 | case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(arg), temp); break; | ||
| 1097 | case "LuaString"_id: transformLuaString(static_cast<LuaString_t*>(arg), temp); break; | ||
| 1098 | default: break; | ||
| 1099 | } | ||
| 1149 | } | 1100 | } |
| 1150 | out.push_back(join(temp)); | 1101 | out.push_back(s("("sv) + join(temp, ", "sv) + s(")"sv)); |
| 1151 | } | 1102 | } |
| 1152 | 1103 | ||
| 1153 | void transform_unary_exp(unary_exp_t* unary_exp, std::vector<std::string>& out) { | 1104 | void transform_unary_exp(unary_exp_t* unary_exp, std::vector<std::string>& out) { |
| @@ -1168,22 +1119,21 @@ private: | |||
| 1168 | void transformTableLit(TableLit_t* tableLit, std::vector<std::string>& out) { | 1119 | void transformTableLit(TableLit_t* tableLit, std::vector<std::string>& out) { |
| 1169 | std::vector<std::string> temp; | 1120 | std::vector<std::string> temp; |
| 1170 | ast_node* lastNode = nullptr; | 1121 | ast_node* lastNode = nullptr; |
| 1171 | for (auto _tableValue : tableLit->values.objects()) { | 1122 | for (auto value : tableLit->values.objects()) { |
| 1172 | auto tableValue = static_cast<TableValue_t*>(_tableValue); | ||
| 1173 | auto value = tableValue->value.get(); | ||
| 1174 | switch (value->getId()) { | 1123 | switch (value->getId()) { |
| 1175 | case "KeyValue"_id: | 1124 | case "variable_pair"_id: |
| 1125 | transform_variable_pair(static_cast<variable_pair_t*>(value), temp); | ||
| 1126 | break; | ||
| 1127 | case "normal_pair"_id: | ||
| 1128 | transform_normal_pair(static_cast<normal_pair_t*>(value), temp); | ||
| 1129 | break; | ||
| 1176 | case "Exp"_id: | 1130 | case "Exp"_id: |
| 1177 | if (value->getId() == "Exp"_id) { | 1131 | transformExp(static_cast<Exp_t*>(value), temp); |
| 1178 | transformExp(static_cast<Exp_t*>(value), temp); | ||
| 1179 | } else { | ||
| 1180 | transformKeyValue(static_cast<KeyValue_t*>(value), temp); | ||
| 1181 | } | ||
| 1182 | temp.back() = (lastNode ? s(","sv) + nll(lastNode) : Empty) + indent(1) + temp.back(); | ||
| 1183 | lastNode = value; | ||
| 1184 | break; | 1132 | break; |
| 1185 | default: break; | 1133 | default: break; |
| 1186 | } | 1134 | } |
| 1135 | temp.back() = (lastNode ? s(","sv) + nll(lastNode) : Empty) + indent(1) + temp.back(); | ||
| 1136 | lastNode = value; | ||
| 1187 | } | 1137 | } |
| 1188 | out.push_back(s("{"sv) + nll(tableLit) + join(temp) + nlr(tableLit) + indent() + s("}"sv)); | 1138 | out.push_back(s("{"sv) + nll(tableLit) + join(temp) + nlr(tableLit) + indent() + s("}"sv)); |
| 1189 | } | 1139 | } |
| @@ -1329,14 +1279,12 @@ private: | |||
| 1329 | 1279 | ||
| 1330 | void transformInvokeArgs(InvokeArgs_t* invokeArgs, std::vector<std::string>& out) { | 1280 | void transformInvokeArgs(InvokeArgs_t* invokeArgs, std::vector<std::string>& out) { |
| 1331 | std::vector<std::string> temp; | 1281 | std::vector<std::string> temp; |
| 1332 | if (invokeArgs->argsList) { | 1282 | for (auto arg : invokeArgs->args.objects()) { |
| 1333 | transformExpList(invokeArgs->argsList, temp); | 1283 | switch (arg->getId()) { |
| 1334 | } | 1284 | case "Exp"_id: transformExp(static_cast<Exp_t*>(arg), temp); break; |
| 1335 | if (invokeArgs->argsTableBlock) { | 1285 | case "TableBlock"_id: transformTableBlock(arg, temp); break; |
| 1336 | transform_invoke_args_with_table(invokeArgs->argsTableBlock, temp); | 1286 | default: break; |
| 1337 | } | 1287 | } |
| 1338 | if (invokeArgs->tableBlock) { | ||
| 1339 | transformTableBlock(invokeArgs->tableBlock, temp); | ||
| 1340 | } | 1288 | } |
| 1341 | out.push_back(join(temp, ", "sv)); | 1289 | out.push_back(join(temp, ", "sv)); |
| 1342 | } | 1290 | } |
| @@ -1529,37 +1477,35 @@ private: | |||
| 1529 | out.push_back(join(temp)); | 1477 | out.push_back(join(temp)); |
| 1530 | } | 1478 | } |
| 1531 | 1479 | ||
| 1532 | void transformKeyValue(KeyValue_t* keyValue, std::vector<std::string>& out) { | 1480 | void transform_variable_pair(variable_pair_t* pair, std::vector<std::string>& out) { |
| 1533 | auto item = keyValue->item.get(); | 1481 | out.push_back(toString(pair->name)); |
| 1534 | switch (item->getId()) { | 1482 | } |
| 1535 | case "variable_pair"_id: | 1483 | |
| 1536 | out.push_back(toString(static_cast<variable_pair_t*>(item)->name)); | 1484 | void transform_normal_pair(normal_pair_t* pair, std::vector<std::string>& out) { |
| 1485 | auto key = pair->key.get(); | ||
| 1486 | std::vector<std::string> temp; | ||
| 1487 | switch (key->getId()) { | ||
| 1488 | case "KeyName"_id: transformKeyName(static_cast<KeyName_t*>(key), temp); break; | ||
| 1489 | case "Exp"_id: | ||
| 1490 | transformExp(static_cast<Exp_t*>(key), temp); | ||
| 1491 | temp.back() = s("["sv) + temp.back() + s("]"sv); | ||
| 1537 | break; | 1492 | break; |
| 1538 | case "normal_pair"_id: { | 1493 | case "DoubleString"_id: |
| 1539 | auto pair = static_cast<normal_pair_t*>(item); | 1494 | transformDoubleString(static_cast<DoubleString_t*>(key), temp); |
| 1540 | auto key = pair->key.get(); | 1495 | temp.back() = s("["sv) + temp.back() + s("]"sv); |
| 1541 | std::vector<std::string> temp; | 1496 | break; |
| 1542 | switch (key->getId()) { | 1497 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(key), temp); |
| 1543 | case "KeyName"_id: transformKeyName(static_cast<KeyName_t*>(key), temp); break; | 1498 | temp.back() = s("["sv) + temp.back() + s("]"sv); |
| 1544 | case "Exp"_id: | ||
| 1545 | transformExp(static_cast<Exp_t*>(key), temp); | ||
| 1546 | temp.back() = s("["sv) + temp.back() + s("]"sv); | ||
| 1547 | break; | ||
| 1548 | case "DoubleString"_id: transformDoubleString(static_cast<DoubleString_t*>(key), temp); break; | ||
| 1549 | case "SingleString"_id: transformSingleString(static_cast<SingleString_t*>(key), temp); break; | ||
| 1550 | default: break; | ||
| 1551 | } | ||
| 1552 | auto value = pair->value.get(); | ||
| 1553 | switch (value->getId()) { | ||
| 1554 | case "Exp"_id: transformExp(static_cast<Exp_t*>(value), temp); break; | ||
| 1555 | case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), temp); break; | ||
| 1556 | default: break; | ||
| 1557 | } | ||
| 1558 | out.push_back(temp[0] + s(" = "sv) + temp[1]); | ||
| 1559 | break; | 1499 | break; |
| 1560 | } | ||
| 1561 | default: break; | 1500 | default: break; |
| 1562 | } | 1501 | } |
| 1502 | auto value = pair->value.get(); | ||
| 1503 | switch (value->getId()) { | ||
| 1504 | case "Exp"_id: transformExp(static_cast<Exp_t*>(value), temp); break; | ||
| 1505 | case "TableBlock"_id: transformTableBlock(static_cast<TableBlock_t*>(value), temp); break; | ||
| 1506 | default: break; | ||
| 1507 | } | ||
| 1508 | out.push_back(temp[0] + s(" = "sv) + temp[1]); | ||
| 1563 | } | 1509 | } |
| 1564 | 1510 | ||
| 1565 | void transformKeyName(KeyName_t* keyName, std::vector<std::string>& out) { | 1511 | void transformKeyName(KeyName_t* keyName, std::vector<std::string>& out) { |
| @@ -1802,16 +1748,14 @@ private: | |||
| 1802 | 1748 | ||
| 1803 | void transform_class_member_list(class_member_list_t* class_member_list, std::list<ClassMember>& out, const std::string& classVar) { | 1749 | void transform_class_member_list(class_member_list_t* class_member_list, std::list<ClassMember>& out, const std::string& classVar) { |
| 1804 | std::vector<std::string> temp; | 1750 | std::vector<std::string> temp; |
| 1805 | for (auto _keyValue : class_member_list->values.objects()) { | 1751 | for (auto keyValue : class_member_list->values.objects()) { |
| 1806 | auto keyValue = static_cast<KeyValue_t*>(_keyValue); | ||
| 1807 | bool isBuiltin = false; | 1752 | bool isBuiltin = false; |
| 1808 | do { | 1753 | do { |
| 1809 | auto keyName = static_cast<KeyName_t*>( | 1754 | auto normal_pair = ast_cast<normal_pair_t>(keyValue); |
| 1810 | keyValue->getByPath({"normal_pair"_id, "KeyName"_id}) | 1755 | if (!normal_pair) break; |
| 1811 | ); | 1756 | auto keyName = normal_pair->key.as<KeyName_t>(); |
| 1812 | if (!keyName) break; | 1757 | if (!keyName) break; |
| 1813 | auto normal_pair = static_cast<normal_pair_t*>(keyValue->getFirstChild()); | 1758 | auto nameNode = keyName->name.as<Name_t>(); |
| 1814 | auto nameNode = keyName->getByPath({"Name"_id}); | ||
| 1815 | if (!nameNode) break; | 1759 | if (!nameNode) break; |
| 1816 | auto name = toString(nameNode); | 1760 | auto name = toString(nameNode); |
| 1817 | input newSuperCall; | 1761 | input newSuperCall; |
| @@ -1827,8 +1771,8 @@ private: | |||
| 1827 | if (auto chainValue = ast_cast<ChainValue_t>(node)) { | 1771 | if (auto chainValue = ast_cast<ChainValue_t>(node)) { |
| 1828 | if (auto var = chainValue->caller->getByPath({"Variable"_id})) { | 1772 | if (auto var = chainValue->caller->getByPath({"Variable"_id})) { |
| 1829 | if (toString(var) == "super"sv) { | 1773 | if (toString(var) == "super"sv) { |
| 1830 | if (chainValue->arguments && chainValue->arguments->argsList) { | 1774 | if (chainValue->arguments) { |
| 1831 | chainValue->arguments->argsList->exprs.push_front(toAst<Exp_t>("self"sv, Exp)); | 1775 | chainValue->arguments->args.push_front(toAst<Exp_t>("self"sv, Exp)); |
| 1832 | _codeCache.push_back(newSuperCall); | 1776 | _codeCache.push_back(newSuperCall); |
| 1833 | var->m_begin.m_it = _codeCache.back().begin(); | 1777 | var->m_begin.m_it = _codeCache.back().begin(); |
| 1834 | var->m_end.m_it = _codeCache.back().end(); | 1778 | var->m_end.m_it = _codeCache.back().end(); |
| @@ -1838,44 +1782,33 @@ private: | |||
| 1838 | var->m_end.m_it = _codeCache.back().end(); | 1782 | var->m_end.m_it = _codeCache.back().end(); |
| 1839 | } | 1783 | } |
| 1840 | } | 1784 | } |
| 1841 | } else if (auto var = chainValue->caller->getByPath({"chain_call"_id, "Callable"_id, "Variable"_id})) { | 1785 | } else if (auto var = chainValue->caller->getByPath({"Callable"_id, "Variable"_id})) { |
| 1842 | if (toString(var) == "super"sv) { | 1786 | if (toString(var) == "super"sv) { |
| 1843 | auto chainList = getChainList(chainValue->caller); | ||
| 1844 | if (auto args = chainValue->getByPath({"InvokeArgs"_id, "ExpList"_id})) { | ||
| 1845 | chainList.push_back(args); | ||
| 1846 | } | ||
| 1847 | auto insertSelfToArguments = [&](ast_node* item) { | 1787 | auto insertSelfToArguments = [&](ast_node* item) { |
| 1848 | switch (item->getId()) { | 1788 | switch (item->getId()) { |
| 1849 | case "ExpList"_id: | 1789 | case "InvokeArgs"_id: { |
| 1850 | static_cast<ExpList_t*>(item)->exprs.push_front(toAst<Exp_t>("self"sv, Exp)); | 1790 | auto invoke = static_cast<InvokeArgs_t*>(item); |
| 1851 | break; | 1791 | invoke->args.push_front(toAst<Exp_t>("self"sv, Exp)); |
| 1792 | return true; | ||
| 1793 | } | ||
| 1852 | case "Invoke"_id: { | 1794 | case "Invoke"_id: { |
| 1853 | auto invoke = static_cast<Invoke_t*>(item); | 1795 | auto invoke = static_cast<Invoke_t*>(item); |
| 1854 | if (auto fnArgs = invoke->argument.as<FnArgs_t>()) { | 1796 | invoke->args.push_front(toAst<Exp_t>("self"sv, Exp)); |
| 1855 | fnArgs->args.push_front(toAst<Exp_t>("self"sv, Exp)); | 1797 | return true; |
| 1856 | } else { | ||
| 1857 | auto string = new_ptr<String_t>(); | ||
| 1858 | string->str.set(invoke->argument); | ||
| 1859 | auto value = new_ptr<Value_t>(); | ||
| 1860 | value->item.set(string); | ||
| 1861 | auto exp = new_ptr<Exp_t>(); | ||
| 1862 | exp->value.set(value); | ||
| 1863 | auto newFnArgs = new_ptr<FnArgs_t>(); | ||
| 1864 | fnArgs->args.push_back(toAst<Exp_t>("self"sv, Exp)); | ||
| 1865 | newFnArgs->args.push_back(exp); | ||
| 1866 | invoke->argument.set(newFnArgs); | ||
| 1867 | } | ||
| 1868 | break; | ||
| 1869 | } | 1798 | } |
| 1870 | default: break; | 1799 | default: |
| 1800 | return false; | ||
| 1871 | } | 1801 | } |
| 1872 | }; | 1802 | }; |
| 1803 | auto chainList = getChainList(chainValue); | ||
| 1873 | if (chainList.size() == 2) { | 1804 | if (chainList.size() == 2) { |
| 1874 | _codeCache.push_back(newSuperCall); | 1805 | if (insertSelfToArguments(chainList.back())) { |
| 1806 | _codeCache.push_back(newSuperCall); | ||
| 1807 | } else { | ||
| 1808 | _codeCache.push_back(_converter.from_bytes(classVar) + L".__parent"); | ||
| 1809 | } | ||
| 1875 | var->m_begin.m_it = _codeCache.back().begin(); | 1810 | var->m_begin.m_it = _codeCache.back().begin(); |
| 1876 | var->m_end.m_it = _codeCache.back().end(); | 1811 | var->m_end.m_it = _codeCache.back().end(); |
| 1877 | auto item = chainList.back(); | ||
| 1878 | insertSelfToArguments(item); | ||
| 1879 | } else if (chainList.size() > 2) { | 1812 | } else if (chainList.size() > 2) { |
| 1880 | _codeCache.push_back(_converter.from_bytes(classVar) + L".__parent"); | 1813 | _codeCache.push_back(_converter.from_bytes(classVar) + L".__parent"); |
| 1881 | var->m_begin.m_it = _codeCache.back().begin(); | 1814 | var->m_begin.m_it = _codeCache.back().begin(); |
| @@ -1896,7 +1829,14 @@ private: | |||
| 1896 | return traversal::Continue; | 1829 | return traversal::Continue; |
| 1897 | }); | 1830 | }); |
| 1898 | } while (false); | 1831 | } while (false); |
| 1899 | transformKeyValue(keyValue, temp); | 1832 | switch (keyValue->getId()) { |
| 1833 | case "variable_pair"_id: | ||
| 1834 | transform_variable_pair(static_cast<variable_pair_t*>(keyValue), temp); | ||
| 1835 | break; | ||
| 1836 | case "normal_pair"_id: | ||
| 1837 | transform_normal_pair(static_cast<normal_pair_t*>(keyValue), temp); | ||
| 1838 | break; | ||
| 1839 | } | ||
| 1900 | out.push_back({temp.back(), isBuiltin, keyValue}); | 1840 | out.push_back({temp.back(), isBuiltin, keyValue}); |
| 1901 | temp.clear(); | 1841 | temp.clear(); |
| 1902 | } | 1842 | } |
| @@ -1926,7 +1866,6 @@ private: | |||
| 1926 | void transform_const_value(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1866 | void transform_const_value(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1927 | void transformDo(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1867 | void transformDo(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1928 | void transformTblComprehension(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1868 | void transformTblComprehension(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1929 | void transform_chain_dot_chain(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
| 1930 | void transformSlice(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1869 | void transformSlice(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1931 | void transformCompFor(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1870 | void transformCompFor(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| 1932 | void transformCompClause(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | 1871 | void transformCompClause(ast_node* node, std::vector<std::string>& out) {noop(node, out);} |
| @@ -1938,64 +1877,18 @@ const std::string MoonCompliler::Empty; | |||
| 1938 | 1877 | ||
| 1939 | int main() | 1878 | int main() |
| 1940 | { | 1879 | { |
| 1941 | std::string s = R"TestCodesHere(class Hello | 1880 | std::string s = R"TestCodesHere(my_func 5,6,7, |
| 1942 | new: (@test, @world) => | 1881 | 6, another_func 6,7,8, |
| 1943 | print "creating object.." | 1882 | 9,1,2, |
| 1944 | hello: => | 1883 | 5,4, :name, :value)TestCodesHere"; |
| 1945 | print @test, @world | 1884 | /* |
| 1946 | __tostring: => "hello world" | 1885 | return my_func(5, 6, 7, 6, another_func(6, 7, 8, 9, 1, 2), 5, 4) |
| 1947 | 1886 | ||
| 1948 | x = Hello 1,2 | 1887 | with Hello! |
| 1949 | x\hello() | 1888 | x = \something! |
| 1950 | 1889 | print x | |
| 1951 | print x | 1890 | x! |
| 1952 | 1891 | */ | |
| 1953 | class Simple | ||
| 1954 | cool: => print "cool" | ||
| 1955 | |||
| 1956 | class Yikes extends Simple | ||
| 1957 | new: => print "created hello" | ||
| 1958 | |||
| 1959 | x = Yikes() | ||
| 1960 | x\cool() | ||
| 1961 | |||
| 1962 | |||
| 1963 | class Hi | ||
| 1964 | new: (arg) => | ||
| 1965 | print "init arg", arg | ||
| 1966 | |||
| 1967 | cool: (num) => | ||
| 1968 | print "num", num | ||
| 1969 | |||
| 1970 | |||
| 1971 | class Simple extends Hi | ||
| 1972 | new: => super "man" | ||
| 1973 | cool: => super 120302 | ||
| 1974 | |||
| 1975 | x = Simple() | ||
| 1976 | x\cool() | ||
| 1977 | |||
| 1978 | print x.__class == Simple | ||
| 1979 | |||
| 1980 | |||
| 1981 | class Okay | ||
| 1982 | -- what is going on | ||
| 1983 | something: 20323 | ||
| 1984 | -- yeaha | ||
| 1985 | |||
| 1986 | |||
| 1987 | class Biggie extends Okay | ||
| 1988 | something: => | ||
| 1989 | super 1,2,3,4 | ||
| 1990 | super.something another_self, 1,2,3,4 | ||
| 1991 | assert super == Okay | ||
| 1992 | |||
| 1993 | |||
| 1994 | class Yeah | ||
| 1995 | okay: => | ||
| 1996 | super\something 1,2,3,4 | ||
| 1997 | )TestCodesHere"; | ||
| 1998 | |||
| 1999 | MoonCompliler{}.complile(s); | 1892 | MoonCompliler{}.complile(s); |
| 2000 | 1893 | ||
| 2001 | return 0; | 1894 | return 0; |
