From 7ee395d918b97795f151c24ed877bfcc2edf602a Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 25 Dec 2025 00:00:08 +0800 Subject: Added named vararg support. --- src/yuescript/yue_ast.cpp | 3 +++ src/yuescript/yue_ast.h | 7 ++++++- src/yuescript/yue_compiler.cpp | 29 ++++++++++++++++++++++------- src/yuescript/yue_parser.cpp | 5 +++-- src/yuescript/yue_parser.h | 1 + 5 files changed, 35 insertions(+), 10 deletions(-) (limited to 'src') 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 { std::string VarArg_t::to_string(void*) const { return "..."s; } +std::string VarArgDef_t::to_string(void* ud) const { + return "..."s + name->to_string(ud); +} std::string Seperator_t::to_string(void*) const { return {}; } 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) AST_MEMBER(KeyName, &name) AST_END(KeyName) +AST_NODE(VarArgDef) + ast_ptr name; + AST_MEMBER(VarArgDef, &name) +AST_END(VarArgDef) + AST_LEAF(VarArg) AST_END(VarArg) @@ -790,7 +795,7 @@ AST_END(FnArgDef) AST_NODE(FnArgDefList) ast_ptr sep; ast_list definitions; - ast_ptr varArg; + ast_ptr varArg; ast_ptr label; AST_MEMBER(FnArgDefList, &sep, &definitions, &varArg, &label) AST_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 Metamethods = { "close"s // Lua 5.4 }; -const std::string_view version = "0.30.3"sv; +const std::string_view version = "0.30.4"sv; const std::string_view extension = "yue"sv; class CompileError : public std::logic_error { @@ -5872,18 +5872,33 @@ private: temp.emplace_back(indent() + "local "s + join(names, ", "sv) + nl(def)); transformAssignment(arg.assignment, temp); } - if (varNames.empty()) + if (varNames.empty()) { varNames = arg.name; - else + } else { varNames.append(", "s + arg.name); + } } if (argDefList->varArg) { + std::string varStr; + if (auto varName = argDefList->varArg->name.get()) { + varStr = variableToString(varName); + int target = getLuaTarget(varName); + forceAddToScope(varStr); + if (target < 505) { + temp.push_back(indent() + "local "s + varStr + " = {"s + nl(varName)); + temp.push_back(indent(1) + "n = "s + globalVar("select", varName, AccessType::Read) + "(\"#\", ...),"s + nl(varName)); + temp.push_back(indent(1) + "..."s + nl(varName)); + temp.push_back(indent() + '}' + nl(varName)); + varStr.clear(); + } + } auto& arg = argItems.emplace_back(); arg.name = "..."sv; - if (varNames.empty()) - varNames = arg.name; - else - varNames.append(", "s + arg.name); + if (varNames.empty()) { + varNames = arg.name + varStr; + } else { + varNames.append(", "s + arg.name + varStr); + } _varArgs.top().hasVar = true; } 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() { SelfItem = SelfClassName | SelfClass | SelfName | Self; KeyName = SelfItem | Name | UnicodeName; + VarArgDef = "..." >> -(space >> Variable); VarArg = "..."; auto getIndent = [](const item_t& item) -> int { @@ -1032,8 +1033,8 @@ YueParser::YueParser() { check_vararg_position = and_(white >> (')' | key("using"))) | white >> -(',' >> white) >> vararg_position_error; var_arg_def = ( - VarArg | - +space_break >> push_indent_match >> ensure(space >> VarArg >> -(space >> '`' >> space >> Name), pop_indent) + VarArgDef | + +space_break >> push_indent_match >> ensure(space >> VarArgDef >> -(space >> '`' >> space >> Name), pop_indent) ) >> check_vararg_position; 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: AST_RULE(SelfItem); AST_RULE(KeyName); AST_RULE(VarArg); + AST_RULE(VarArgDef); AST_RULE(Seperator); AST_RULE(NameList); AST_RULE(LocalFlag); -- cgit v1.2.3-55-g6feb