aboutsummaryrefslogtreecommitdiff
path: root/src/MoonP/moon_compiler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/MoonP/moon_compiler.cpp')
-rw-r--r--src/MoonP/moon_compiler.cpp56
1 files changed, 38 insertions, 18 deletions
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp
index 6e7db2c..f5835db 100644
--- a/src/MoonP/moon_compiler.cpp
+++ b/src/MoonP/moon_compiler.cpp
@@ -53,7 +53,7 @@ inline std::string s(std::string_view sv) {
53 return std::string(sv); 53 return std::string(sv);
54} 54}
55 55
56const std::string_view version = "0.4.16"sv; 56const std::string_view version = "0.4.17"sv;
57const std::string_view extension = "mp"sv; 57const std::string_view extension = "mp"sv;
58 58
59class MoonCompilerImpl { 59class MoonCompilerImpl {
@@ -4911,11 +4911,12 @@ private:
4911 auto name = moduleNameFrom(import->literal); 4911 auto name = moduleNameFrom(import->literal);
4912 import->target.set(toAst<Variable_t>(name, x)); 4912 import->target.set(toAst<Variable_t>(name, x));
4913 } 4913 }
4914 if (auto tableLit = import->target.as<TableLit_t>()) { 4914 if (auto tabLit = import->target.as<ImportTabLit_t>()) {
4915 auto newTab = x->new_ptr<TableLit_t>(); 4915 auto newTab = x->new_ptr<ImportTabLit_t>();
4916#ifndef MOONP_NO_MACRO 4916#ifndef MOONP_NO_MACRO
4917 bool importAllMacro = false;
4917 std::list<std::pair<std::string,std::string>> macroPairs; 4918 std::list<std::pair<std::string,std::string>> macroPairs;
4918 for (auto item : tableLit->values.objects()) { 4919 for (auto item : tabLit->items.objects()) {
4919 switch (item->getId()) { 4920 switch (item->getId()) {
4920 case id<MacroName_t>(): { 4921 case id<MacroName_t>(): {
4921 auto macroName = static_cast<MacroName_t*>(item); 4922 auto macroName = static_cast<MacroName_t*>(item);
@@ -4925,21 +4926,27 @@ private:
4925 } 4926 }
4926 case id<macro_name_pair_t>(): { 4927 case id<macro_name_pair_t>(): {
4927 auto pair = static_cast<macro_name_pair_t*>(item); 4928 auto pair = static_cast<macro_name_pair_t*>(item);
4928 macroPairs.emplace_back(_parser.toString(pair->value->name), _parser.toString(pair->key->name)); 4929 macroPairs.emplace_back(_parser.toString(pair->key->name), _parser.toString(pair->value->name));
4929 break; 4930 break;
4930 } 4931 }
4931 default: 4932 case id<import_all_macro_t>():
4932 newTab->values.push_back(item); 4933 if (importAllMacro) throw std::logic_error(_info.errorMessage(s("import all macro symbol duplicated"sv), item));
4934 importAllMacro = true;
4935 break;
4936 case id<variable_pair_t>():
4937 case id<normal_pair_t>():
4938 newTab->items.push_back(item);
4933 break; 4939 break;
4940 default: assert(false); break;
4934 } 4941 }
4935 } 4942 }
4936 if (!macroPairs.empty()) { 4943 if (importAllMacro || !macroPairs.empty()) {
4937 auto moduleName = _parser.toString(import->literal); 4944 auto moduleName = _parser.toString(import->literal);
4938 Utils::replace(moduleName, "'"sv, ""sv); 4945 Utils::replace(moduleName, "'"sv, ""sv);
4939 Utils::replace(moduleName, "\""sv, ""sv); 4946 Utils::replace(moduleName, "\""sv, ""sv);
4940 Utils::trim(moduleName); 4947 Utils::trim(moduleName);
4941 pushCurrentModule(); // cur 4948 pushCurrentModule(); // cur
4942 int top = lua_gettop(L) - 1; 4949 int top = lua_gettop(L) - 1; // Lua state may be setup by pushCurrentModule()
4943 DEFER(lua_settop(L, top)); 4950 DEFER(lua_settop(L, top));
4944 pushMoonp("find_modulepath"sv); // cur find_modulepath 4951 pushMoonp("find_modulepath"sv); // cur find_modulepath
4945 lua_pushlstring(L, moduleName.c_str(), moduleName.size()); // cur find_modulepath moduleName 4952 lua_pushlstring(L, moduleName.c_str(), moduleName.size()); // cur find_modulepath moduleName
@@ -4977,27 +4984,38 @@ private:
4977 } 4984 }
4978 lua_pop(L, 1); // cur 4985 lua_pop(L, 1); // cur
4979 } 4986 }
4980 pushModuleTable(moduleFullName); // cur module 4987 pushModuleTable(moduleFullName); // cur mod
4988 if (importAllMacro) {
4989 lua_pushnil(L); // cur mod startKey
4990 while (lua_next(L, -2) != 0) { // cur mod key value
4991 lua_pushvalue(L, -2); // cur mod key value key
4992 lua_insert(L, -2); // cur mod key key value
4993 lua_rawset(L, -5); // cur[key] = value, cur mod key
4994 }
4995 }
4981 for (const auto& pair : macroPairs) { 4996 for (const auto& pair : macroPairs) {
4982 lua_getfield(L, -1, pair.first.c_str()); 4997 lua_getfield(L, -1, pair.first.c_str()); // mod[first], cur mod val
4983 lua_setfield(L, -3, pair.second.c_str()); 4998 lua_setfield(L, -3, pair.second.c_str()); // cur[second] = val, cur mod
4984 } 4999 }
4985 } 5000 }
4986#else // MOONP_NO_MACRO 5001#else // MOONP_NO_MACRO
4987 for (auto item : tableLit->values.objects()) { 5002 for (auto item : tabLit->items.objects()) {
4988 switch (item->getId()) { 5003 switch (item->getId()) {
4989 case id<MacroName_t>(): 5004 case id<MacroName_t>():
4990 case id<macro_name_pair_t>(): { 5005 case id<macro_name_pair_t>():
5006 case id<import_all_macro_t>(): {
4991 throw std::logic_error(_info.errorMessage("macro feature not supported"sv, item)); 5007 throw std::logic_error(_info.errorMessage("macro feature not supported"sv, item));
4992 break; 5008 break;
4993 } 5009 }
4994 default: 5010 case id<variable_pair_t>():
4995 newTab->values.push_back(item); 5011 case id<normal_pair_t>():
5012 newTab->items.push_back(item);
4996 break; 5013 break;
5014 default: assert(false); break;
4997 } 5015 }
4998 } 5016 }
4999#endif // MOONP_NO_MACRO 5017#endif // MOONP_NO_MACRO
5000 if (newTab->values.empty()) { 5018 if (newTab->items.empty()) {
5001 out.push_back(Empty); 5019 out.push_back(Empty);
5002 return; 5020 return;
5003 } else { 5021 } else {
@@ -5013,8 +5031,10 @@ private:
5013 chainValue->items.push_back(callable); 5031 chainValue->items.push_back(callable);
5014 value->item.set(chainValue); 5032 value->item.set(chainValue);
5015 } else { 5033 } else {
5016 auto tableLit = ast_to<TableLit_t>(target); 5034 auto tabLit = ast_to<ImportTabLit_t>(target);
5017 auto simpleValue = x->new_ptr<SimpleValue_t>(); 5035 auto simpleValue = x->new_ptr<SimpleValue_t>();
5036 auto tableLit = x->new_ptr<TableLit_t>();
5037 tableLit->values.dup(tabLit->items);
5018 simpleValue->value.set(tableLit); 5038 simpleValue->value.set(tableLit);
5019 value->item.set(simpleValue); 5039 value->item.set(simpleValue);
5020 } 5040 }