diff options
| author | Li Jin <dragon-fly@qq.com> | 2025-05-07 12:46:39 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2025-05-07 12:46:39 +0800 |
| commit | c925dbea9c9108a18b9abf4a57d9d59b0ed04652 (patch) | |
| tree | d26083e7358739961fea4fd1bee094e35be45490 /src | |
| parent | 4dba7838d2d805f71faa065a3024232b505d9d21 (diff) | |
| download | yuescript-c925dbea9c9108a18b9abf4a57d9d59b0ed04652.tar.gz yuescript-c925dbea9c9108a18b9abf4a57d9d59b0ed04652.tar.bz2 yuescript-c925dbea9c9108a18b9abf4a57d9d59b0ed04652.zip | |
Tried adding more table matching functions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/3rdParty/efsw/FileWatcherGeneric.cpp | 2 | ||||
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 78 |
2 files changed, 68 insertions, 12 deletions
diff --git a/src/3rdParty/efsw/FileWatcherGeneric.cpp b/src/3rdParty/efsw/FileWatcherGeneric.cpp index 3f3c52e..468d27c 100644 --- a/src/3rdParty/efsw/FileWatcherGeneric.cpp +++ b/src/3rdParty/efsw/FileWatcherGeneric.cpp | |||
| @@ -25,7 +25,7 @@ FileWatcherGeneric::~FileWatcherGeneric() { | |||
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | WatchID FileWatcherGeneric::addWatch( const std::string& directory, FileWatchListener* watcher, | 27 | WatchID FileWatcherGeneric::addWatch( const std::string& directory, FileWatchListener* watcher, |
| 28 | bool recursive, const std::vector<WatcherOption>& options ) { | 28 | bool recursive, const std::vector<WatcherOption>& /*options*/ ) { |
| 29 | std::string dir( directory ); | 29 | std::string dir( directory ); |
| 30 | 30 | ||
| 31 | FileSystem::dirAddSlashAtEnd( dir ); | 31 | FileSystem::dirAddSlashAtEnd( dir ); |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 590c502..06f0d6d 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 | ||
| 81 | const std::string_view version = "0.27.5"sv; | 81 | const std::string_view version = "0.27.6"sv; |
| 82 | const std::string_view extension = "yue"sv; | 82 | const std::string_view extension = "yue"sv; |
| 83 | 83 | ||
| 84 | class CompileError : public std::logic_error { | 84 | class CompileError : public std::logic_error { |
| @@ -2807,8 +2807,26 @@ private: | |||
| 2807 | defVal = nd->defVal.get(); | 2807 | defVal = nd->defVal.get(); |
| 2808 | } | 2808 | } |
| 2809 | ++index; | 2809 | ++index; |
| 2810 | if (!varDefOnly && !isAssignable(static_cast<Exp_t*>(pair))) { | 2810 | bool assignable = false; |
| 2811 | throw CompileError("can't destructure value"sv, pair); | 2811 | try { |
| 2812 | assignable = isAssignable(static_cast<Exp_t*>(pair)); | ||
| 2813 | } catch (const CompileError& e) { | ||
| 2814 | if (!varDefOnly) throw e; | ||
| 2815 | } | ||
| 2816 | if (!assignable && !varDefOnly) { | ||
| 2817 | if (optional) { | ||
| 2818 | if (defVal) { | ||
| 2819 | throw CompileError("default value is not supported here"sv, defVal); | ||
| 2820 | } | ||
| 2821 | auto exp = static_cast<Exp_t*>(pair); | ||
| 2822 | auto chain = exp->new_ptr<ChainValue_t>(); | ||
| 2823 | auto indexItem = toAst<Exp_t>(std::to_string(index), exp); | ||
| 2824 | chain->items.push_back(indexItem); | ||
| 2825 | pairs.push_back({exp, Empty, chain, nullptr}); | ||
| 2826 | break; | ||
| 2827 | } else { | ||
| 2828 | throw CompileError("can't destructure value"sv, pair); | ||
| 2829 | } | ||
| 2812 | } | 2830 | } |
| 2813 | auto value = singleValueFrom(pair); | 2831 | auto value = singleValueFrom(pair); |
| 2814 | auto item = value->item.get(); | 2832 | auto item = value->item.get(); |
| @@ -2889,7 +2907,25 @@ private: | |||
| 2889 | } | 2907 | } |
| 2890 | } | 2908 | } |
| 2891 | if (auto exp = np->value.as<Exp_t>()) { | 2909 | if (auto exp = np->value.as<Exp_t>()) { |
| 2892 | if (!varDefOnly && !isAssignable(exp)) throw CompileError("can't do destructure value"sv, exp); | 2910 | bool assignable = false; |
| 2911 | try { | ||
| 2912 | assignable = isAssignable(exp); | ||
| 2913 | } catch (const CompileError& e) { | ||
| 2914 | if (!varDefOnly) throw e; | ||
| 2915 | } | ||
| 2916 | if (!assignable && !varDefOnly) { | ||
| 2917 | if (optional) { | ||
| 2918 | if (defVal) { | ||
| 2919 | throw CompileError("default value is not supported here"sv, defVal); | ||
| 2920 | } | ||
| 2921 | auto chain = exp->new_ptr<ChainValue_t>(); | ||
| 2922 | if (keyIndex) chain->items.push_back(keyIndex); | ||
| 2923 | pairs.push_back({exp, Empty, chain, nullptr}); | ||
| 2924 | break; | ||
| 2925 | } else { | ||
| 2926 | throw CompileError("can't destructure value"sv, exp); | ||
| 2927 | } | ||
| 2928 | } | ||
| 2893 | auto item = singleValueFrom(exp)->item.get(); | 2929 | auto item = singleValueFrom(exp)->item.get(); |
| 2894 | ast_node* subExp = ast_cast<SimpleTable_t>(item); | 2930 | ast_node* subExp = ast_cast<SimpleTable_t>(item); |
| 2895 | if (subExp || (subExp = item->get_by_path<TableLit_t>()) || (subExp = item->get_by_path<Comprehension_t>())) { | 2931 | if (subExp || (subExp = item->get_by_path<TableLit_t>()) || (subExp = item->get_by_path<Comprehension_t>())) { |
| @@ -3111,7 +3147,11 @@ private: | |||
| 3111 | break; | 3147 | break; |
| 3112 | default: YUEE("AST node mismatch", destructNode); break; | 3148 | default: YUEE("AST node mismatch", destructNode); break; |
| 3113 | } | 3149 | } |
| 3114 | if (dlist->empty()) throw CompileError("expect items to be destructured"sv, destructNode); | 3150 | if (dlist->empty()) { |
| 3151 | if (!optional) { | ||
| 3152 | throw CompileError("expect items to be destructured"sv, destructNode); | ||
| 3153 | } | ||
| 3154 | } | ||
| 3115 | for (auto item : *dlist) { | 3155 | for (auto item : *dlist) { |
| 3116 | switch (item->get_id()) { | 3156 | switch (item->get_id()) { |
| 3117 | case id<MetaVariablePairDef_t>(): { | 3157 | case id<MetaVariablePairDef_t>(): { |
| @@ -3247,7 +3287,9 @@ private: | |||
| 3247 | simpleValue->value.set(tab); | 3287 | simpleValue->value.set(tab); |
| 3248 | auto pairs = destructFromExp(newExp(simpleValue, expr), varDefOnly, optional); | 3288 | auto pairs = destructFromExp(newExp(simpleValue, expr), varDefOnly, optional); |
| 3249 | if (pairs.empty()) { | 3289 | if (pairs.empty()) { |
| 3250 | throw CompileError("expect items to be destructured"sv, tab); | 3290 | if (!optional) { |
| 3291 | throw CompileError("expect items to be destructured"sv, tab); | ||
| 3292 | } | ||
| 3251 | } | 3293 | } |
| 3252 | destruct.items = std::move(pairs); | 3294 | destruct.items = std::move(pairs); |
| 3253 | if (!varDefOnly) { | 3295 | if (!varDefOnly) { |
| @@ -3286,7 +3328,7 @@ private: | |||
| 3286 | destruct.valueVar.clear(); | 3328 | destruct.valueVar.clear(); |
| 3287 | } | 3329 | } |
| 3288 | } | 3330 | } |
| 3289 | destructs.push_back(destruct); | 3331 | destructs.push_back(std::move(destruct)); |
| 3290 | } | 3332 | } |
| 3291 | } | 3333 | } |
| 3292 | } else { | 3334 | } else { |
| @@ -10597,8 +10639,9 @@ private: | |||
| 10597 | } | 10639 | } |
| 10598 | temp.back().append(indent() + "if "s + tabCheckVar + " then"s + nll(branch)); | 10640 | temp.back().append(indent() + "if "s + tabCheckVar + " then"s + nll(branch)); |
| 10599 | pushScope(); | 10641 | pushScope(); |
| 10600 | auto assignment = assignmentFrom(static_cast<Exp_t*>(valueList->exprs.front()), toAst<Exp_t>(objVar, branch), branch); | 10642 | auto chainValue = toAst<ChainValue_t>(objVar, branch); |
| 10601 | auto info = extractDestructureInfo(assignment, true, false); | 10643 | auto assignment = assignmentFrom(static_cast<Exp_t*>(valueList->exprs.front()), newExp(chainValue, branch), branch); |
| 10644 | auto info = extractDestructureInfo(assignment, true, true); | ||
| 10602 | transformAssignment(assignment, temp, true); | 10645 | transformAssignment(assignment, temp, true); |
| 10603 | str_list conds; | 10646 | str_list conds; |
| 10604 | for (const auto& des : info.destructures) { | 10647 | for (const auto& des : info.destructures) { |
| @@ -10608,8 +10651,21 @@ private: | |||
| 10608 | const auto& destruct = std::get<Destructure>(des); | 10651 | const auto& destruct = std::get<Destructure>(des); |
| 10609 | for (const auto& item : destruct.items) { | 10652 | for (const auto& item : destruct.items) { |
| 10610 | if (!item.defVal) { | 10653 | if (!item.defVal) { |
| 10611 | transformExp(item.target, conds, ExpUsage::Closure); | 10654 | if (!isAssignable(item.target)) { |
| 10612 | conds.back().append(" ~= nil"s); | 10655 | transformExp(item.target, conds, ExpUsage::Closure); |
| 10656 | auto callable = chainValue->items.front(); | ||
| 10657 | auto chain = callable->new_ptr<ChainValue_t>(); | ||
| 10658 | chain->items.push_back(callable); | ||
| 10659 | chain->items.dup(item.structure->items); | ||
| 10660 | transformChainValue(chain, conds, ExpUsage::Closure); | ||
| 10661 | auto vStr = conds.back(); | ||
| 10662 | conds.pop_back(); | ||
| 10663 | conds.back().append(" == "s); | ||
| 10664 | conds.back().append(vStr); | ||
| 10665 | } else { | ||
| 10666 | transformExp(item.target, conds, ExpUsage::Closure); | ||
| 10667 | conds.back().append(" ~= nil"s); | ||
| 10668 | } | ||
| 10613 | } | 10669 | } |
| 10614 | } | 10670 | } |
| 10615 | } | 10671 | } |
