aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2024-02-05 10:27:47 +0800
committerLi Jin <dragon-fly@qq.com>2024-02-05 10:27:47 +0800
commitef0ff9c4c523980d71e49d65e8db57d670daf85c (patch)
treebfe36110dbb6a11b15464168bc8f872c1678eac3 /src
parent5dcfab2ee3bd686ec78de360a09987d916c02b36 (diff)
downloadyuescript-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.cpp62
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
78const std::string_view version = "0.21.6"sv; 78const std::string_view version = "0.21.7"sv;
79const std::string_view extension = "yue"sv; 79const std::string_view extension = "yue"sv;
80 80
81class CompileError : public std::logic_error { 81class 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;