aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/yuescript/yue_compiler.cpp64
1 files changed, 38 insertions, 26 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index e42c75d..f80aac2 100644
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -9937,8 +9937,6 @@ private:
9937 std::tie(clsName, newDefined, clsTextName) = defineClassVariable(clsDecl->name); 9937 std::tie(clsName, newDefined, clsTextName) = defineClassVariable(clsDecl->name);
9938 if (newDefined) varDefs.push_back(clsName); 9938 if (newDefined) varDefs.push_back(clsName);
9939 } 9939 }
9940 } else if (ast_is<YueComment_t, EmptyLine_t>(item)) {
9941 block->statementOrComments.push_back(item);
9942 } 9940 }
9943 } 9941 }
9944 if (!varDefs.empty()) { 9942 if (!varDefs.empty()) {
@@ -9958,7 +9956,7 @@ private:
9958 addToScope(baseVar); 9956 addToScope(baseVar);
9959 temp.push_back(indent() + "local "s + baseVar + " = "s); 9957 temp.push_back(indent() + "local "s + baseVar + " = "s);
9960 str_list builtins; 9958 str_list builtins;
9961 str_list commons; 9959 std::vector<std::pair<std::string, bool>> baseEntries;
9962 str_list statements; 9960 str_list statements;
9963 if (body) { 9961 if (body) {
9964 std::list<ClassMember> members; 9962 std::list<ClassMember> members;
@@ -9972,15 +9970,28 @@ private:
9972 auto& member = *it; 9970 auto& member = *it;
9973 if (member.type == MemType::Property) { 9971 if (member.type == MemType::Property) {
9974 statements.push_back(indent() + member.item + nl(content)); 9972 statements.push_back(indent() + member.item + nl(content));
9973 } else if (member.type == MemType::Builtin) {
9974 builtins.push_back((builtins.empty() ? Empty : ',' + nl(member.node)) + indent(1) + member.item);
9975 } else { 9975 } else {
9976 member.item = indent(1) + member.item; 9976 baseEntries.emplace_back(indent(1) + member.item + nl(member.node), true);
9977 } 9977 }
9978 } 9978 }
9979 break; 9979 break;
9980 } 9980 }
9981 case id<YueComment_t>(): {
9982 if (_config.reserveComment) {
9983 auto comment = static_cast<YueComment_t*>(content);
9984 baseEntries.emplace_back(indent(1) + comment->to_string(&_config) + nl(content), false);
9985 }
9986 break;
9987 }
9988 case id<EmptyLine_t>(): {
9989 if (_config.reserveComment) {
9990 baseEntries.emplace_back(nl(content), false);
9991 }
9992 break;
9993 }
9981 case id<Statement_t>(): 9994 case id<Statement_t>():
9982 case id<YueComment_t>():
9983 case id<EmptyLine_t>():
9984 break; 9995 break;
9985 default: YUEE("AST node mismatch", content); break; 9996 default: YUEE("AST node mismatch", content); break;
9986 } 9997 }
@@ -9992,30 +10003,31 @@ private:
9992 for (auto stmt_ : block->statementOrComments.objects()) { 10003 for (auto stmt_ : block->statementOrComments.objects()) {
9993 if (auto stmt = ast_cast<Statement_t>(stmt_)) { 10004 if (auto stmt = ast_cast<Statement_t>(stmt_)) {
9994 transformStatement(stmt, statements); 10005 transformStatement(stmt, statements);
9995 } else if (auto comment = ast_cast<YueComment_t>(stmt_)) {
9996 if (_config.reserveComment) {
9997 statements.push_back(indent() + comment->to_string(&_config) + nl(comment));
9998 }
9999 } else if (auto emptyLine = ast_cast<EmptyLine_t>(stmt_)) {
10000 if (_config.reserveComment) {
10001 statements.push_back(nl(emptyLine));
10002 }
10003 } 10006 }
10004 } 10007 }
10005 for (auto& member : members) { 10008 if (!baseEntries.empty()) {
10006 switch (member.type) { 10009 temp.back() += '{' + nl(body);
10007 case MemType::Common: 10010 int lastValue = -1;
10008 commons.push_back((commons.empty() ? Empty : ',' + nl(member.node)) + member.item); 10011 for (int i = static_cast<int>(baseEntries.size()) - 1; i >= 0; --i) {
10009 break; 10012 if (baseEntries[i].second) {
10010 case MemType::Builtin: 10013 lastValue = i;
10011 builtins.push_back((builtins.empty() ? Empty : ',' + nl(member.node)) + member.item);
10012 break; 10014 break;
10013 default: break; 10015 }
10014 } 10016 }
10015 } 10017 str_list baseItems;
10016 if (!commons.empty()) { 10018 for (int i = 0; i < static_cast<int>(baseEntries.size()); ++i) {
10017 temp.back() += '{' + nl(body); 10019 auto item = baseEntries[i].first;
10018 temp.push_back(join(commons) + nl(body)); 10020 if (baseEntries[i].second && i != lastValue) {
10021 auto pos = item.rfind('\n');
10022 if (pos != std::string::npos) {
10023 item.insert(pos, ",");
10024 } else {
10025 item.push_back(',');
10026 }
10027 }
10028 baseItems.push_back(std::move(item));
10029 }
10030 temp.push_back(join(baseItems));
10019 temp.push_back(indent() + '}' + nl(body)); 10031 temp.push_back(indent() + '}' + nl(body));
10020 } else { 10032 } else {
10021 temp.back() += "{ }"s + nl(body); 10033 temp.back() += "{ }"s + nl(body);