aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2022-05-16 09:45:04 +0800
committerLi Jin <dragon-fly@qq.com>2022-05-16 09:45:27 +0800
commita9fe6a5c4c17cf7e8305c1d614939ce510fb1103 (patch)
tree404509931668656356cce49493f10e27d1cc32e6 /src
parentc4935826eea8df7a161b2b4ba9262dce66d9d366 (diff)
downloadyuescript-a9fe6a5c4c17cf7e8305c1d614939ce510fb1103.tar.gz
yuescript-a9fe6a5c4c17cf7e8305c1d614939ce510fb1103.tar.bz2
yuescript-a9fe6a5c4c17cf7e8305c1d614939ce510fb1103.zip
fix issue #97 by line decorator.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/yuescript/yue_compiler.cpp64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 6f641d9..6d90d24 100755
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -60,7 +60,7 @@ using namespace parserlib;
60 60
61typedef std::list<std::string> str_list; 61typedef std::list<std::string> str_list;
62 62
63const std::string_view version = "0.10.20"sv; 63const std::string_view version = "0.10.21"sv;
64const std::string_view extension = "yue"sv; 64const std::string_view extension = "yue"sv;
65 65
66class YueCompilerImpl { 66class YueCompilerImpl {
@@ -925,6 +925,66 @@ private:
925 local->defined = true; 925 local->defined = true;
926 transformLocalDef(local, out); 926 transformLocalDef(local, out);
927 } 927 }
928 } else if (auto attrib = statement->content.as<LocalAttrib_t>()) {
929 auto appendix = statement->appendix.get();
930 switch (appendix->item->getId()) {
931 case id<if_line_t>(): {
932 auto if_line = static_cast<if_line_t*>(appendix->item.get());
933 auto ifNode = x->new_ptr<If_t>();
934 ifNode->type.set(if_line->type);
935 ifNode->nodes.push_back(if_line->condition);
936
937 auto expList = x->new_ptr<ExpList_t>();
938 for (auto val : attrib->assign->values.objects()) {
939 switch (val->getId()) {
940 case id<If_t>():
941 case id<Switch_t>():
942 case id<With_t>(): {
943 auto simpleValue = x->new_ptr<SimpleValue_t>();
944 simpleValue->value.set(val);
945 auto value = x->new_ptr<Value_t>();
946 value->item.set(simpleValue);
947 auto exp = newExp(value, x);
948 expList->exprs.push_back(exp);
949 break;
950 }
951 case id<TableBlock_t>(): {
952 auto tableBlock = static_cast<TableBlock_t*>(val);
953 auto tabLit = x->new_ptr<TableLit_t>();
954 tabLit->values.dup(tableBlock->values);
955 auto simpleValue = x->new_ptr<SimpleValue_t>();
956 simpleValue->value.set(tabLit);
957 auto value = x->new_ptr<Value_t>();
958 value->item.set(simpleValue);
959 auto exp = newExp(value, x);
960 expList->exprs.push_back(exp);
961 break;
962 }
963 case id<Exp_t>(): {
964 expList->exprs.push_back(val);
965 break;
966 }
967 default: YUEE("AST node mismatch", val); break;
968 }
969 }
970 auto expListAssign = x->new_ptr<ExpListAssign_t>();
971 expListAssign->expList.set(expList);
972 auto stmt = x->new_ptr<Statement_t>();
973 stmt->content.set(expListAssign);
974 ifNode->nodes.push_back(stmt);
975
976 statement->appendix.set(nullptr);
977 attrib->assign->values.clear();
978 attrib->assign->values.push_back(ifNode);
979 transformStatement(statement, out);
980 return;
981 }
982 case id<CompInner_t>(): {
983 throw std::logic_error(_info.errorMessage("for-loop line decorator is not supported here"sv, appendix->item.get()));
984 break;
985 }
986 default: YUEE("AST node mismatch", appendix->item.get()); break;
987 }
928 } 988 }
929 auto appendix = statement->appendix.get(); 989 auto appendix = statement->appendix.get();
930 switch (appendix->item->getId()) { 990 switch (appendix->item->getId()) {
@@ -5345,7 +5405,7 @@ private:
5345 auto continueVar = getUnusedName("_continue_"sv); 5405 auto continueVar = getUnusedName("_continue_"sv);
5346 forceAddToScope(continueVar); 5406 forceAddToScope(continueVar);
5347 _continueVars.push(continueVar); 5407 _continueVars.push(continueVar);
5348 _buf << indent() << "local "sv << conditionVar << nll(body); 5408 _buf << indent() << "local "sv << conditionVar << " = false"sv << nll(body);
5349 _buf << indent() << "local "sv << continueVar << " = false"sv << nll(body); 5409 _buf << indent() << "local "sv << continueVar << " = false"sv << nll(body);
5350 _buf << indent() << "repeat"sv << nll(body); 5410 _buf << indent() << "repeat"sv << nll(body);
5351 pushScope(); 5411 pushScope();