libexpr: Optimize complex indented strings

The old behavior results in lots of concatenations happening for no good
reason and is an artifact of the technical limitations of the old parser
(combined with some lack of care for such details).

Change-Id: I0d78d6220ca6aeaa10bc437e48e08bf7922e0bb3
This commit is contained in:
piegames
2024-10-18 19:37:23 +02:00
parent 878e181882
commit e5de1d13c4
4 changed files with 22 additions and 59 deletions
+7 -7
View File
@@ -542,10 +542,10 @@ template<> struct BuildAST<grammar::v1::ind_string::line_start> {
}
};
template<bool CanMerge, typename... Content>
struct BuildAST<grammar::v1::ind_string::literal<CanMerge, Content...>> {
template<typename... Content>
struct BuildAST<grammar::v1::ind_string::literal<Content...>> {
static void apply(const auto & in, IndStringState & s, State & ps) {
s.lines.back().parts.emplace_back(ps.at(in), StringToken{ in.string_view(), CanMerge });
s.lines.back().parts.emplace_back(ps.at(in), in.string_view());
}
};
@@ -558,10 +558,10 @@ template<> struct BuildAST<grammar::v1::ind_string::interpolation> {
template<> struct BuildAST<grammar::v1::ind_string::escape> {
static void apply(const auto & in, IndStringState & s, State & ps) {
switch (*in.begin()) {
case 'n': s.lines.back().parts.emplace_back(ps.at(in), StringToken{"\n"}); break;
case 'r': s.lines.back().parts.emplace_back(ps.at(in), StringToken{"\r"}); break;
case 't': s.lines.back().parts.emplace_back(ps.at(in), StringToken{"\t"}); break;
default: s.lines.back().parts.emplace_back(ps.at(in), StringToken{in.string_view()}); break;
case 'n': s.lines.back().parts.emplace_back(ps.at(in), "\n"); break;
case 'r': s.lines.back().parts.emplace_back(ps.at(in), "\r"); break;
case 't': s.lines.back().parts.emplace_back(ps.at(in), "\t"); break;
default: s.lines.back().parts.emplace_back(ps.at(in), in.string_view()); break;
}
}
};