diff options
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 64 |
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); |
