diff options
author | Li Jin <dragon-fly@qq.com> | 2024-02-05 10:27:47 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2024-02-05 10:27:47 +0800 |
commit | ef0ff9c4c523980d71e49d65e8db57d670daf85c (patch) | |
tree | bfe36110dbb6a11b15464168bc8f872c1678eac3 /src | |
parent | 5dcfab2ee3bd686ec78de360a09987d916c02b36 (diff) | |
download | yuescript-ef0ff9c4c523980d71e49d65e8db57d670daf85c.tar.gz yuescript-ef0ff9c4c523980d71e49d65e8db57d670daf85c.tar.bz2 yuescript-ef0ff9c4c523980d71e49d65e8db57d670daf85c.zip |
fix more invalid in-expression use cases.
Diffstat (limited to 'src')
-rw-r--r-- | src/yuescript/yue_compiler.cpp | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index ba74d91..3892d72 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -75,7 +75,7 @@ static std::unordered_set<std::string> Metamethods = { | |||
75 | "close"s // Lua 5.4 | 75 | "close"s // Lua 5.4 |
76 | }; | 76 | }; |
77 | 77 | ||
78 | const std::string_view version = "0.21.6"sv; | 78 | const std::string_view version = "0.21.7"sv; |
79 | const std::string_view extension = "yue"sv; | 79 | const std::string_view extension = "yue"sv; |
80 | 80 | ||
81 | class CompileError : public std::logic_error { | 81 | class CompileError : public std::logic_error { |
@@ -5946,7 +5946,52 @@ private: | |||
5946 | varName.clear(); | 5946 | varName.clear(); |
5947 | } | 5947 | } |
5948 | } | 5948 | } |
5949 | ast_ptr<false, InDiscrete_t> discrete; | ||
5949 | if (auto inExp = unary_exp->inExp->item.as<Exp_t>()) { | 5950 | if (auto inExp = unary_exp->inExp->item.as<Exp_t>()) { |
5951 | BLOCK_START | ||
5952 | auto value = singleValueFrom(inExp); | ||
5953 | BREAK_IF(!value); | ||
5954 | auto sval = value->item.as<SimpleValue_t>(); | ||
5955 | BREAK_IF(!sval); | ||
5956 | if (auto table = sval->value.as<TableLit_t>()) { | ||
5957 | discrete = inExp->new_ptr<InDiscrete_t>(); | ||
5958 | for (ast_node* val : table->values.objects()) { | ||
5959 | if (auto def = ast_cast<NormalDef_t>(val)) { | ||
5960 | if (def->defVal) { | ||
5961 | discrete = nullptr; | ||
5962 | break; | ||
5963 | } else { | ||
5964 | discrete->values.push_back(def->item); | ||
5965 | } | ||
5966 | } else if (ast_is<Exp_t>(val)) { | ||
5967 | discrete->values.push_back(val); | ||
5968 | } else { | ||
5969 | discrete = nullptr; | ||
5970 | break; | ||
5971 | } | ||
5972 | } | ||
5973 | } else if (auto comp = sval->value.as<Comprehension_t>()) { | ||
5974 | if (comp->items.size() != 2 || !ast_is<CompInner_t>(comp->items.back())) { | ||
5975 | discrete = inExp->new_ptr<InDiscrete_t>(); | ||
5976 | for (ast_node* val : comp->items.objects()) { | ||
5977 | if (auto def = ast_cast<NormalDef_t>(val)) { | ||
5978 | if (def->defVal) { | ||
5979 | discrete = nullptr; | ||
5980 | break; | ||
5981 | } else { | ||
5982 | discrete->values.push_back(def->item); | ||
5983 | } | ||
5984 | } else { | ||
5985 | discrete = nullptr; | ||
5986 | break; | ||
5987 | } | ||
5988 | } | ||
5989 | } | ||
5990 | } | ||
5991 | BLOCK_END | ||
5992 | |||
5993 | BLOCK_START | ||
5994 | BREAK_IF(discrete); | ||
5950 | str_list temp; | 5995 | str_list temp; |
5951 | auto checkVar = singleVariableFrom(inExp, false); | 5996 | auto checkVar = singleVariableFrom(inExp, false); |
5952 | if (usage == ExpUsage::Assignment) { | 5997 | if (usage == ExpUsage::Assignment) { |
@@ -6069,8 +6114,11 @@ private: | |||
6069 | out.push_back(join(temp)); | 6114 | out.push_back(join(temp)); |
6070 | return; | 6115 | return; |
6071 | } | 6116 | } |
6117 | BLOCK_END | ||
6118 | } | ||
6119 | if (!discrete) { | ||
6120 | discrete = unary_exp->inExp->item.to<InDiscrete_t>(); | ||
6072 | } | 6121 | } |
6073 | auto discrete = unary_exp->inExp->item.to<InDiscrete_t>(); | ||
6074 | if (usage == ExpUsage::Closure && discrete->values.size() == 1) { | 6122 | if (usage == ExpUsage::Closure && discrete->values.size() == 1) { |
6075 | str_list tmp; | 6123 | str_list tmp; |
6076 | transformExp(static_cast<Exp_t*>(discrete->values.front()), tmp, ExpUsage::Closure); | 6124 | transformExp(static_cast<Exp_t*>(discrete->values.front()), tmp, ExpUsage::Closure); |
@@ -6151,6 +6199,13 @@ private: | |||
6151 | for (auto exp : discrete->values.objects()) { | 6199 | for (auto exp : discrete->values.objects()) { |
6152 | transformExp(static_cast<Exp_t*>(exp), tmp, ExpUsage::Closure); | 6200 | transformExp(static_cast<Exp_t*>(exp), tmp, ExpUsage::Closure); |
6153 | } | 6201 | } |
6202 | if (usage == ExpUsage::Assignment) { | ||
6203 | str_list tmpList; | ||
6204 | transformExp(static_cast<Exp_t*>(assignList->exprs.front()), tmpList, ExpUsage::Closure); | ||
6205 | _buf << indent() << tmpList.back() << " = "sv; | ||
6206 | } else if (usage == ExpUsage::Return) { | ||
6207 | _buf << indent() << "return "sv; | ||
6208 | } | ||
6154 | if (unary_exp->inExp->not_) { | 6209 | if (unary_exp->inExp->not_) { |
6155 | _buf << "not "sv; | 6210 | _buf << "not "sv; |
6156 | } | 6211 | } |
@@ -6162,6 +6217,9 @@ private: | |||
6162 | } | 6217 | } |
6163 | } | 6218 | } |
6164 | _buf << ')'; | 6219 | _buf << ')'; |
6220 | if (usage == ExpUsage::Assignment || usage == ExpUsage::Return) { | ||
6221 | _buf << nll(discrete); | ||
6222 | } | ||
6165 | out.push_back(clearBuf()); | 6223 | out.push_back(clearBuf()); |
6166 | } | 6224 | } |
6167 | return; | 6225 | return; |