From fe6d146bc4454d8096ddd0543d7142db3da5da5b Mon Sep 17 00:00:00 2001 From: Li Jin Date: Sun, 24 Apr 2022 11:26:46 +0800 Subject: fix spreading syntax behavior. --- src/yuescript/yue_compiler.cpp | 45 +++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 4fb14b6..4dacf42 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -4537,15 +4537,20 @@ private: switch (item->getId()) { case id(): { auto spread = static_cast(item); - std::string keyVar = getUnusedName("_key_"sv); std::string valueVar = getUnusedName("_value_"sv); - auto targetStr = _parser.toString(spread->exp); - _buf << "for "sv << keyVar << ',' << valueVar - << " in pairs! do "sv - << tableVar << '[' << keyVar << "]="sv << valueVar; + auto objVar = singleVariableFrom(spread->exp); + if (objVar.empty()) { + objVar = getUnusedName("_obj_"); + auto assignment = toAst(objVar + "=nil"s, spread); + auto assign = assignment->action.to(); + assign->values.clear(); + assign->values.push_back(spread->exp); + transformAssignment(assignment, temp); + } + _buf << "for "sv << valueVar + << " in *"sv << objVar << " do "sv + << tableVar << "[]="sv << valueVar; auto forEach = toAst(clearBuf(), spread); - auto chainValue = singleValueFrom(forEach->loopValue.to())->item.to(); - ast_to(*(++chainValue->items.objects().begin()))->args.push_back(spread->exp); transformForEach(forEach, temp); break; } @@ -4603,11 +4608,27 @@ private: break; } case id(): { - auto assignment = toAst(tableVar + "[]=nil"s, item); - auto assign = assignment->action.to(); - assign->values.clear(); - assign->values.push_back(item); - transformAssignment(assignment, temp); + bool lastVarArg = false; + BLOCK_START + BREAK_IF(item != table->values.back()); + auto value = singleValueFrom(item); + BREAK_IF(!value); + auto chainValue = value->item.as(); + BREAK_IF(!chainValue); + BREAK_IF(chainValue->items.size() != 1); + BREAK_IF((!chainValue->getByPath())); + auto indexVar = getUnusedName("_index_"); + _buf << "for "sv << indexVar << "=1,select '#',...\n\t"sv << tableVar << "[]= select "sv << indexVar << ",..."sv; + transformFor(toAst(clearBuf(), item), temp); + lastVarArg = true; + BLOCK_END + if (!lastVarArg) { + auto assignment = toAst(tableVar + "[]=nil"s, item); + auto assign = assignment->action.to(); + assign->values.clear(); + assign->values.push_back(item); + transformAssignment(assignment, temp); + } break; } default: YUEE("AST node mismatch", item); break; -- cgit v1.2.3-55-g6feb