From 5440c952f2c73da6fa6a752d8628eaf25015c070 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 17 Sep 2020 08:47:29 +0800 Subject: make simple table and table block appear in the end of function arguments merged. --- src/MoonP/moon_compiler.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index 406b412..112cae7 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp @@ -49,7 +49,7 @@ inline std::string s(std::string_view sv) { } const std::string_view version() { - return "0.4.12"sv; + return "0.4.14"sv; } // name of table stored in lua registry @@ -3603,6 +3603,37 @@ private: } void transformInvokeArgs(InvokeArgs_t* invokeArgs, str_list& out) { + if (invokeArgs->args.size() > 1) { + /* merge all the key-value pairs into one table + from arguments in the end */ + auto lastArg = invokeArgs->args.back(); + _ast_list* lastTable = nullptr; + if (auto tableBlock = ast_cast(lastArg)) { + lastTable = &tableBlock->values; + } else if (auto value = singleValueFrom(lastArg)) { + if (auto simpleTable = ast_cast(value->item)) { + lastTable = &simpleTable->pairs; + } + } + if (lastTable) { + ast_ptr ref(lastArg); + invokeArgs->args.pop_back(); + while (!invokeArgs->args.empty()) { + if (Value_t* value = singleValueFrom(invokeArgs->args.back())) { + if (auto tb = value->item.as()) { + const auto& ps = tb->pairs.objects(); + for (auto it = ps.rbegin(); it != ps.rend(); ++it) { + lastTable->push_front(*it); + } + invokeArgs->args.pop_back(); + continue; + } + } + break; + } + invokeArgs->args.push_back(lastArg); + } + } str_list temp; for (auto arg : invokeArgs->args.objects()) { switch (arg->getId()) { -- cgit v1.2.3-55-g6feb