From 120d89e3cf5a7227e85a717cdafa04b65a65bc0e Mon Sep 17 00:00:00 2001 From: Yousuke Date: Wed, 15 Nov 2023 05:46:59 +0900 Subject: [PATCH 1/5] Add a test for whitespaces after ifExpression (#711) (cherry picked from commit 2e0bc84711182d7b5f04300132f92ad5254fb121) --- .../play/twirl/parser/test/ParserSpec.scala | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala b/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala index 7cac16d1..807755b8 100644 --- a/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala +++ b/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala @@ -178,6 +178,25 @@ class ParserSpec extends AnyWordSpec with Matchers with Inside { val secondCaseBlockBody = secondCaseBlock(1).asInstanceOf[Block] secondCaseBlockBody.content(1).asInstanceOf[Plain].text mustBe "Not a nice string " } + + "whitespaces after 'else {...}' as plain" in { + val template = parseTemplateString( + """@if(condition) {ifblock body} else {elseblock body} Some plain text with whitespaces""" + ) + val ifExpressions = template.content(0).asInstanceOf[Display].exp.parts + ifExpressions.head must be(Simple("if(condition)")) + val ifBlockBody = ifExpressions(1).asInstanceOf[Block].content(0) + ifBlockBody mustBe Plain("ifblock body") + val elsePart = ifExpressions(2) + elsePart mustBe Simple("else") + val elseBlockBody = ifExpressions(3).asInstanceOf[Block].content(0) + elseBlockBody mustBe Plain("elseblock body") + val afterIfExpressionOfWhitespaces = template.content(1) + afterIfExpressionOfWhitespaces mustBe Plain(" ") + val afterWhitespaces = template.content(2) + afterWhitespaces mustBe Plain("Some plain text with whitespaces") + } + } "handle local definitions" when { From 1a257706c192d3962d3ee8b8d94053f8ed8bf8ba Mon Sep 17 00:00:00 2001 From: Yousuke Date: Wed, 15 Nov 2023 05:49:01 +0900 Subject: [PATCH 2/5] Whitespaces after 'else {...}' is text (cherry picked from commit 89a30bef11221d169877f0f47a9dadf9b0b5e307) --- parser/src/main/scala/play/twirl/parser/TwirlParser.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/parser/src/main/scala/play/twirl/parser/TwirlParser.scala b/parser/src/main/scala/play/twirl/parser/TwirlParser.scala index e873e0de..b6057425 100644 --- a/parser/src/main/scala/play/twirl/parser/TwirlParser.scala +++ b/parser/src/main/scala/play/twirl/parser/TwirlParser.scala @@ -874,7 +874,6 @@ class TwirlParser(val shouldParseInclusiveDot: Boolean) { whitespaceNoBreak() val blk = expressionPart(blockArgsAllowed = true) if (blk != null) { - whitespaceNoBreak() Seq(Simple("else"), blk) } else { null From 1475f1a60ab4f641acb9d9faa2a86d517e963242 Mon Sep 17 00:00:00 2001 From: Yousuke Date: Thu, 16 Nov 2023 05:27:09 +0900 Subject: [PATCH 3/5] Modify 'elseCall' document to match 89a30bef11221d169877f0f47a9dadf9b0b5e307 (cherry picked from commit dab0a0396c93510dea45cec30a83442061a9362e) --- parser/src/main/scala/play/twirl/parser/TwirlParser.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parser/src/main/scala/play/twirl/parser/TwirlParser.scala b/parser/src/main/scala/play/twirl/parser/TwirlParser.scala index b6057425..d6a34c9c 100644 --- a/parser/src/main/scala/play/twirl/parser/TwirlParser.scala +++ b/parser/src/main/scala/play/twirl/parser/TwirlParser.scala @@ -72,7 +72,7 @@ import scala.util.parsing.input.OffsetPosition * complexExpr : parentheses * safeExpression : '@' parentheses * ifExpression : '@' "if" parentheses expressionPart (elseIfCall)* elseCall? - * elseCall : whitespaceNoBreak? "else" expressionPart whitespaceNoBreak? + * elseCall : whitespaceNoBreak? "else" whitespaceNoBreak? expressionPart * elseIfCall : whitespaceNoBreak? "else if" parentheses expressionPart whitespaceNoBreak? * chainedMethods : ('.' methodCall)+ * expressionPart : chainedMethods | block | (whitespaceNoBreak scalaBlockChained) | parentheses From 5085e9ae70dc851ab00f9e1c6a10681af19d22df Mon Sep 17 00:00:00 2001 From: Yousuke Date: Thu, 16 Nov 2023 05:44:08 +0900 Subject: [PATCH 4/5] Add a test for whitespaces after `else if(codition) {...}` (cherry picked from commit 1458e679359a5db9d18a2ecaa1d28642d82f4eda) --- .../play/twirl/parser/test/ParserSpec.scala | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala b/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala index 807755b8..e6523dde 100644 --- a/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala +++ b/parser/src/test/scala/play/twirl/parser/test/ParserSpec.scala @@ -197,6 +197,23 @@ class ParserSpec extends AnyWordSpec with Matchers with Inside { afterWhitespaces mustBe Plain("Some plain text with whitespaces") } + "whitespaces after 'else if(condition) {...}' as plain" in { + val template = parseTemplateString( + """@if(condition) {ifblock body} else if(condition2) {elseifblock body} Some plain text with whitespaces""" + ) + val ifExpressions = template.content(0).asInstanceOf[Display].exp.parts + ifExpressions.head must be(Simple("if(condition)")) + val ifBlockBody = ifExpressions(1).asInstanceOf[Block].content(0) + ifBlockBody mustBe Plain("ifblock body") + val elseIfPart = ifExpressions(2) + elseIfPart mustBe Simple("else if(condition2)") + val elseBlockBody = ifExpressions(3).asInstanceOf[Block].content(0) + elseBlockBody mustBe Plain("elseifblock body") + val afterIfExpressionOfWhitespaces = template.content(1) + afterIfExpressionOfWhitespaces mustBe Plain(" ") + val afterWhitespaces = template.content(2) + afterWhitespaces mustBe Plain("Some plain text with whitespaces") + } } "handle local definitions" when { From 75db93e1829f79f076f2ecc6e7a826278f6fe5d2 Mon Sep 17 00:00:00 2001 From: Yousuke Date: Thu, 16 Nov 2023 05:52:19 +0900 Subject: [PATCH 5/5] Whitespaces after `else if(codition) {...}` are text (cherry picked from commit 81ef6acde77cd5e011a9266421f6658d8a0d6669) --- parser/src/main/scala/play/twirl/parser/TwirlParser.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/parser/src/main/scala/play/twirl/parser/TwirlParser.scala b/parser/src/main/scala/play/twirl/parser/TwirlParser.scala index d6a34c9c..1139f6ab 100644 --- a/parser/src/main/scala/play/twirl/parser/TwirlParser.scala +++ b/parser/src/main/scala/play/twirl/parser/TwirlParser.scala @@ -73,7 +73,7 @@ import scala.util.parsing.input.OffsetPosition * safeExpression : '@' parentheses * ifExpression : '@' "if" parentheses expressionPart (elseIfCall)* elseCall? * elseCall : whitespaceNoBreak? "else" whitespaceNoBreak? expressionPart - * elseIfCall : whitespaceNoBreak? "else if" parentheses expressionPart whitespaceNoBreak? + * elseIfCall : whitespaceNoBreak? "else if" parentheses whitespaceNoBreak? expressionPart * chainedMethods : ('.' methodCall)+ * expressionPart : chainedMethods | block | (whitespaceNoBreak scalaBlockChained) | parentheses * expression : '@' methodCall expressionPart* @@ -853,7 +853,6 @@ class TwirlParser(val shouldParseInclusiveDot: Boolean) { if (args != null) { val blk = expressionPart(blockArgsAllowed = true) if (blk != null) { - whitespaceNoBreak() Seq(Simple("else if" + args), blk) } else { null