From c9b10d08ea362da1dc9790819a5d8cc3ef9905e5 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Wed, 29 Nov 2023 15:25:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20TaskData=20?= =?UTF-8?q?=E9=83=A8=E5=88=86=20next=20=E7=94=9F=E6=88=90=E4=B8=8D?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 有新问题: `A@B@LoadingText` 没有 B 任务的时候无法生成,会在解析 B@LoadingText->next 的 #next 时出问题 --- src/MaaCore/Config/TaskData.cpp | 41 ++++++++++++++------------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/src/MaaCore/Config/TaskData.cpp b/src/MaaCore/Config/TaskData.cpp index 304bb14eba..f93f7f85c5 100644 --- a/src/MaaCore/Config/TaskData.cpp +++ b/src/MaaCore/Config/TaskData.cpp @@ -51,21 +51,6 @@ asst::TaskPtr asst::TaskData::get(std::string_view name) if (!task) [[unlikely]] { return nullptr; } -#define ASST_TASKDATA_GET_IF_BRANCH(list, m) \ - if (auto opt = compile_tasklist(task->list, name, m); !opt) [[unlikely]] { \ - Log.error("Generate task_list", std::string(name) + "->" #list, "failed.", opt.error()); \ - return nullptr; \ - } \ - else { \ - task->list = std::move(opt.value().tasks); \ - } - // 展开五个任务列表中的虚任务 - ASST_TASKDATA_GET_IF_BRANCH(next, false); - ASST_TASKDATA_GET_IF_BRANCH(sub, true); - ASST_TASKDATA_GET_IF_BRANCH(exceeded_next, false); - ASST_TASKDATA_GET_IF_BRANCH(on_error_next, false); - ASST_TASKDATA_GET_IF_BRANCH(reduce_other_times, true); -#undef ASST_TASKDATA_GET_IF_BRANCH constexpr size_t MAX_TASKS_SIZE = 65535; if (m_all_tasks_info.size() < MAX_TASKS_SIZE) [[likely]] { @@ -117,6 +102,7 @@ bool asst::TaskData::lazy_parse(const json::value& json) #ifdef ASST_DEBUG { + LogTraceScope("syntax_check"); bool validity = true; std::queue task_queue; std::unordered_set checking_task_set; @@ -392,11 +378,16 @@ asst::TaskPtr asst::TaskData::generate_task_info(std::string_view name) return nullptr; } - const auto& prefix = raw->prefix; - #define ASST_TASKDATA_GET_VALUE_OR(key, value) utils::get_value_or(name, json, key, task->value, base->value) -#define ASST_TASKDATA_GET_VALUE_OR_LAZY(key, value) \ - utils::get_value_or(name, json, key, task->value, [&]() { return append_prefix(base->value, prefix); }) +#define ASST_TASKDATA_GET_VALUE_OR_LAZY(key, value, m) \ + utils::get_value_or(name, json, key, task->value, raw->value); \ + if (auto opt = compile_tasklist(task->value, name, m); !opt) [[unlikely]] { \ + Log.error("Generate task_list", std::string(name) + "->"##key, "failed.", opt.error()); \ + return nullptr; \ + } \ + else { \ + task->value = std::move((*opt).tasks); \ + } ASST_TASKDATA_GET_VALUE_OR("action", action); ASST_TASKDATA_GET_VALUE_OR("cache", cache); @@ -408,11 +399,13 @@ asst::TaskPtr asst::TaskData::generate_task_info(std::string_view name) ASST_TASKDATA_GET_VALUE_OR("rectMove", rect_move); ASST_TASKDATA_GET_VALUE_OR("specificRect", specific_rect); ASST_TASKDATA_GET_VALUE_OR("specialParams", special_params); - ASST_TASKDATA_GET_VALUE_OR_LAZY("next", next); - ASST_TASKDATA_GET_VALUE_OR_LAZY("sub", sub); - ASST_TASKDATA_GET_VALUE_OR_LAZY("exceededNext", exceeded_next); - ASST_TASKDATA_GET_VALUE_OR_LAZY("onErrorNext", on_error_next); - ASST_TASKDATA_GET_VALUE_OR_LAZY("reduceOtherTimes", reduce_other_times); + + // 展开五个任务列表中的虚任务 + ASST_TASKDATA_GET_VALUE_OR_LAZY("next", next, false); + ASST_TASKDATA_GET_VALUE_OR_LAZY("sub", sub, true); + ASST_TASKDATA_GET_VALUE_OR_LAZY("exceededNext", exceeded_next, false); + ASST_TASKDATA_GET_VALUE_OR_LAZY("onErrorNext", on_error_next, false); + ASST_TASKDATA_GET_VALUE_OR_LAZY("reduceOtherTimes", reduce_other_times, true); #undef ASST_TASKDATA_GET_VALUE_OR #undef ASST_TASKDATA_GET_VALUE_OR_LAZY