aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/yuescript/yue_ast.cpp3
-rw-r--r--src/yuescript/yue_ast.h7
-rw-r--r--src/yuescript/yue_compiler.cpp29
-rw-r--r--src/yuescript/yue_parser.cpp5
-rw-r--r--src/yuescript/yue_parser.h1
5 files changed, 35 insertions, 10 deletions
diff --git a/src/yuescript/yue_ast.cpp b/src/yuescript/yue_ast.cpp
index be0ec45..55b5d03 100644
--- a/src/yuescript/yue_ast.cpp
+++ b/src/yuescript/yue_ast.cpp
@@ -82,6 +82,9 @@ std::string SelfClass_t::to_string(void*) const {
82std::string VarArg_t::to_string(void*) const { 82std::string VarArg_t::to_string(void*) const {
83 return "..."s; 83 return "..."s;
84} 84}
85std::string VarArgDef_t::to_string(void* ud) const {
86 return "..."s + name->to_string(ud);
87}
85std::string Seperator_t::to_string(void*) const { 88std::string Seperator_t::to_string(void*) const {
86 return {}; 89 return {};
87} 90}
diff --git a/src/yuescript/yue_ast.h b/src/yuescript/yue_ast.h
index b7cd73e..885a038 100644
--- a/src/yuescript/yue_ast.h
+++ b/src/yuescript/yue_ast.h
@@ -134,6 +134,11 @@ AST_NODE(KeyName)
134 AST_MEMBER(KeyName, &name) 134 AST_MEMBER(KeyName, &name)
135AST_END(KeyName) 135AST_END(KeyName)
136 136
137AST_NODE(VarArgDef)
138 ast_ptr<false, Variable_t> name;
139 AST_MEMBER(VarArgDef, &name)
140AST_END(VarArgDef)
141
137AST_LEAF(VarArg) 142AST_LEAF(VarArg)
138AST_END(VarArg) 143AST_END(VarArg)
139 144
@@ -790,7 +795,7 @@ AST_END(FnArgDef)
790AST_NODE(FnArgDefList) 795AST_NODE(FnArgDefList)
791 ast_ptr<true, Seperator_t> sep; 796 ast_ptr<true, Seperator_t> sep;
792 ast_list<false, FnArgDef_t> definitions; 797 ast_list<false, FnArgDef_t> definitions;
793 ast_ptr<false, VarArg_t> varArg; 798 ast_ptr<false, VarArgDef_t> varArg;
794 ast_ptr<false, Name_t> label; 799 ast_ptr<false, Name_t> label;
795 AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg, &label) 800 AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg, &label)
796AST_END(FnArgDefList) 801AST_END(FnArgDefList)
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 77643d3..cae01dd 100644
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -78,7 +78,7 @@ static std::unordered_set<std::string> Metamethods = {
78 "close"s // Lua 5.4 78 "close"s // Lua 5.4
79}; 79};
80 80
81const std::string_view version = "0.30.3"sv; 81const std::string_view version = "0.30.4"sv;
82const std::string_view extension = "yue"sv; 82const std::string_view extension = "yue"sv;
83 83
84class CompileError : public std::logic_error { 84class CompileError : public std::logic_error {
@@ -5872,18 +5872,33 @@ private:
5872 temp.emplace_back(indent() + "local "s + join(names, ", "sv) + nl(def)); 5872 temp.emplace_back(indent() + "local "s + join(names, ", "sv) + nl(def));
5873 transformAssignment(arg.assignment, temp); 5873 transformAssignment(arg.assignment, temp);
5874 } 5874 }
5875 if (varNames.empty()) 5875 if (varNames.empty()) {
5876 varNames = arg.name; 5876 varNames = arg.name;
5877 else 5877 } else {
5878 varNames.append(", "s + arg.name); 5878 varNames.append(", "s + arg.name);
5879 }
5879 } 5880 }
5880 if (argDefList->varArg) { 5881 if (argDefList->varArg) {
5882 std::string varStr;
5883 if (auto varName = argDefList->varArg->name.get()) {
5884 varStr = variableToString(varName);
5885 int target = getLuaTarget(varName);
5886 forceAddToScope(varStr);
5887 if (target < 505) {
5888 temp.push_back(indent() + "local "s + varStr + " = {"s + nl(varName));
5889 temp.push_back(indent(1) + "n = "s + globalVar("select", varName, AccessType::Read) + "(\"#\", ...),"s + nl(varName));
5890 temp.push_back(indent(1) + "..."s + nl(varName));
5891 temp.push_back(indent() + '}' + nl(varName));
5892 varStr.clear();
5893 }
5894 }
5881 auto& arg = argItems.emplace_back(); 5895 auto& arg = argItems.emplace_back();
5882 arg.name = "..."sv; 5896 arg.name = "..."sv;
5883 if (varNames.empty()) 5897 if (varNames.empty()) {
5884 varNames = arg.name; 5898 varNames = arg.name + varStr;
5885 else 5899 } else {
5886 varNames.append(", "s + arg.name); 5900 varNames.append(", "s + arg.name + varStr);
5901 }
5887 _varArgs.top().hasVar = true; 5902 _varArgs.top().hasVar = true;
5888 } 5903 }
5889 if (assignSelf) { 5904 if (assignSelf) {
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp
index 1999721..17b10c6 100644
--- a/src/yuescript/yue_parser.cpp
+++ b/src/yuescript/yue_parser.cpp
@@ -308,6 +308,7 @@ YueParser::YueParser() {
308 308
309 SelfItem = SelfClassName | SelfClass | SelfName | Self; 309 SelfItem = SelfClassName | SelfClass | SelfName | Self;
310 KeyName = SelfItem | Name | UnicodeName; 310 KeyName = SelfItem | Name | UnicodeName;
311 VarArgDef = "..." >> -(space >> Variable);
311 VarArg = "..."; 312 VarArg = "...";
312 313
313 auto getIndent = [](const item_t& item) -> int { 314 auto getIndent = [](const item_t& item) -> int {
@@ -1032,8 +1033,8 @@ YueParser::YueParser() {
1032 check_vararg_position = and_(white >> (')' | key("using"))) | white >> -(',' >> white) >> vararg_position_error; 1033 check_vararg_position = and_(white >> (')' | key("using"))) | white >> -(',' >> white) >> vararg_position_error;
1033 1034
1034 var_arg_def = ( 1035 var_arg_def = (
1035 VarArg | 1036 VarArgDef |
1036 +space_break >> push_indent_match >> ensure(space >> VarArg >> -(space >> '`' >> space >> Name), pop_indent) 1037 +space_break >> push_indent_match >> ensure(space >> VarArgDef >> -(space >> '`' >> space >> Name), pop_indent)
1037 ) >> check_vararg_position; 1038 ) >> check_vararg_position;
1038 1039
1039 FnArgDefList = Seperator >> 1040 FnArgDefList = Seperator >>
diff --git a/src/yuescript/yue_parser.h b/src/yuescript/yue_parser.h
index b68742f..7deaa18 100644
--- a/src/yuescript/yue_parser.h
+++ b/src/yuescript/yue_parser.h
@@ -333,6 +333,7 @@ private:
333 AST_RULE(SelfItem); 333 AST_RULE(SelfItem);
334 AST_RULE(KeyName); 334 AST_RULE(KeyName);
335 AST_RULE(VarArg); 335 AST_RULE(VarArg);
336 AST_RULE(VarArgDef);
336 AST_RULE(Seperator); 337 AST_RULE(Seperator);
337 AST_RULE(NameList); 338 AST_RULE(NameList);
338 AST_RULE(LocalFlag); 339 AST_RULE(LocalFlag);