diff options
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; |
