Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 28 additions & 11 deletions llvm/lib/Support/Mustache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,8 @@ SmallVector<Token> tokenize(StringRef Template) {
SmallVector<Token> Tokens;
StringLiteral Open("{{");
StringLiteral Close("}}");
StringLiteral TripleOpen("{{{");
StringLiteral TripleClose("}}}");
size_t Start = 0;
size_t DelimiterStart = Template.find(Open);
if (DelimiterStart == StringRef::npos) {
Expand All @@ -314,18 +316,33 @@ SmallVector<Token> tokenize(StringRef Template) {
while (DelimiterStart != StringRef::npos) {
if (DelimiterStart != Start)
Tokens.emplace_back(Template.substr(Start, DelimiterStart - Start).str());
size_t DelimiterEnd = Template.find(Close, DelimiterStart);
if (DelimiterEnd == StringRef::npos)
break;

// Extract the Interpolated variable without delimiters.
size_t InterpolatedStart = DelimiterStart + Open.size();
size_t InterpolatedEnd = DelimiterEnd - DelimiterStart - Close.size();
std::string Interpolated =
Template.substr(InterpolatedStart, InterpolatedEnd).str();
std::string RawBody = Open.str() + Interpolated + Close.str();
Tokens.emplace_back(RawBody, Interpolated, Interpolated[0]);
Start = DelimiterEnd + Close.size();
if (Template.substr(DelimiterStart).starts_with(TripleOpen)) {
size_t DelimiterEnd = Template.find(TripleClose, DelimiterStart);
if (DelimiterEnd == StringRef::npos)
break;
size_t BodyStart = DelimiterStart + TripleOpen.size();
std::string Body =
Template.substr(BodyStart, DelimiterEnd - BodyStart).str();
std::string RawBody =
Template.substr(DelimiterStart, DelimiterEnd - DelimiterStart + 3)
.str();
Tokens.emplace_back(RawBody, "&" + Body, '&');
Start = DelimiterEnd + TripleClose.size();
} else {
size_t DelimiterEnd = Template.find(Close, DelimiterStart);
if (DelimiterEnd == StringRef::npos)
break;

// Extract the Interpolated variable without delimiters.
size_t InterpolatedStart = DelimiterStart + Open.size();
size_t InterpolatedEnd = DelimiterEnd - DelimiterStart - Close.size();
std::string Interpolated =
Template.substr(InterpolatedStart, InterpolatedEnd).str();
std::string RawBody = Open.str() + Interpolated + Close.str();
Tokens.emplace_back(RawBody, Interpolated, Interpolated[0]);
Start = DelimiterEnd + Close.size();
}
DelimiterStart = Template.find(Open, Start);
}

Expand Down
20 changes: 10 additions & 10 deletions llvm/unittests/Support/MustacheTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1235,7 +1235,7 @@ TEST(MustacheTripleMustache, Basic) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("Hello, <b>World</b>!", Out);
EXPECT_EQ("Hello, <b>World</b>!", Out);
}

TEST(MustacheTripleMustache, IntegerInterpolation) {
Expand All @@ -1244,7 +1244,7 @@ TEST(MustacheTripleMustache, IntegerInterpolation) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("85 miles an hour!", Out);
EXPECT_EQ("85 miles an hour!", Out);
}

TEST(MustacheTripleMustache, DecimalInterpolation) {
Expand All @@ -1253,7 +1253,7 @@ TEST(MustacheTripleMustache, DecimalInterpolation) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("1.21 jiggawatts!", Out);
EXPECT_EQ("1.21 jiggawatts!", Out);
}

TEST(MustacheTripleMustache, NullInterpolation) {
Expand All @@ -1262,7 +1262,7 @@ TEST(MustacheTripleMustache, NullInterpolation) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("I () be seen!", Out);
EXPECT_EQ("I () be seen!", Out);
}

TEST(MustacheTripleMustache, ContextMissInterpolation) {
Expand All @@ -1271,7 +1271,7 @@ TEST(MustacheTripleMustache, ContextMissInterpolation) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("I () be seen!", Out);
EXPECT_EQ("I () be seen!", Out);
}

TEST(MustacheTripleMustache, DottedNames) {
Expand All @@ -1280,7 +1280,7 @@ TEST(MustacheTripleMustache, DottedNames) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("<b>Joe</b>", Out);
EXPECT_EQ("<b>Joe</b>", Out);
}

TEST(MustacheTripleMustache, ImplicitIterator) {
Expand All @@ -1289,7 +1289,7 @@ TEST(MustacheTripleMustache, ImplicitIterator) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("(<a>)(<b>)", Out);
EXPECT_EQ("(<a>)(<b>)", Out);
}

TEST(MustacheTripleMustache, SurroundingWhitespace) {
Expand All @@ -1298,7 +1298,7 @@ TEST(MustacheTripleMustache, SurroundingWhitespace) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("| --- |", Out);
EXPECT_EQ("| --- |", Out);
}

TEST(MustacheTripleMustache, Standalone) {
Expand All @@ -1307,7 +1307,7 @@ TEST(MustacheTripleMustache, Standalone) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE(" ---\n", Out);
EXPECT_EQ(" ---\n", Out);
}

TEST(MustacheTripleMustache, WithPadding) {
Expand All @@ -1316,5 +1316,5 @@ TEST(MustacheTripleMustache, WithPadding) {
std::string Out;
raw_string_ostream OS(Out);
T.render(D, OS);
EXPECT_NE("|---|", Out);
EXPECT_EQ("|---|", Out);
}
14 changes: 0 additions & 14 deletions llvm/utils/llvm-test-mustache-spec/llvm-test-mustache-spec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,21 +128,7 @@ static const StringMap<StringSet<>> XFailTestNames = {{
"Section - Multiple Calls",

}},
{"interpolation.json",
{
"Triple Mustache",
"Triple Mustache Integer Interpolation",
"Triple Mustache Decimal Interpolation",
"Triple Mustache Null Interpolation",
"Triple Mustache Context Miss Interpolation",
"Dotted Names - Triple Mustache Interpolation",
"Implicit Iterators - Triple Mustache",
"Triple Mustache - Surrounding Whitespace",
"Triple Mustache - Standalone",
"Triple Mustache With Padding",
}},
{"partials.json", {"Standalone Indentation"}},
{"sections.json", {"Implicit Iterator - Triple mustache"}},
}};

struct TestData {
Expand Down