From 8d6d1c9f23a2d800102a17de43898e615ba5f386 Mon Sep 17 00:00:00 2001 From: Matt Russell Date: Mon, 31 May 2010 14:03:48 +0100 Subject: [PATCH] Parser: support multiple guards in a generator to match http://lampsvn.epfl.ch/trac/scala/changeset/22030 --- .../scala/scalariform/formatter/ExprFormatter.scala | 12 +++++++----- .../src/main/scala/scalariform/parser/AstNodes.scala | 4 ++-- .../scalariform/parser/ScalaCombinatorParser.scala | 8 +++++--- .../scalariform/formatter/ForExprFormatterTest.scala | 4 ++++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/src/main/scala/scalariform/formatter/ExprFormatter.scala b/core/src/main/scala/scalariform/formatter/ExprFormatter.scala index a4119f6b..fbdd5129 100644 --- a/core/src/main/scala/scalariform/formatter/ExprFormatter.scala +++ b/core/src/main/scala/scalariform/formatter/ExprFormatter.scala @@ -299,11 +299,13 @@ trait ExprFormatter { self: HasFormattingPreferences with AnnotationFormatter wi } private def format(generator: Generator)(implicit formatterState: FormatterState): FormatResult = { - val Generator(valOption: Option[Token], pattern: Expr, equalsOrArrowToken: Token, expr: Expr, guardOption: Option[Guard]) = generator - format(expr) ++ format(pattern) ++ (guardOption match { - case None ⇒ NoFormatResult - case Some(guard) ⇒ format(guard) - }) + val Generator(valOption: Option[Token], pattern: Expr, equalsOrArrowToken: Token, expr: Expr, guards: List[Guard]) = generator + var formatResult: FormatResult = NoFormatResult + formatResult ++= format(expr) + formatResult ++= format(pattern) + for (guard <- guards) + formatResult ++= format(guard) + formatResult } private def format(guard: Guard)(implicit formatterState: FormatterState): FormatResult = { diff --git a/core/src/main/scala/scalariform/parser/AstNodes.scala b/core/src/main/scala/scalariform/parser/AstNodes.scala index cd46f206..eeb802ef 100644 --- a/core/src/main/scala/scalariform/parser/AstNodes.scala +++ b/core/src/main/scala/scalariform/parser/AstNodes.scala @@ -155,9 +155,9 @@ case class Generator( pattern: Expr, equalsOrArrowToken: Token, expr: Expr, - guardOption: Option[Guard]) extends AstNode with Enumerator { + guards: List[Guard]) extends AstNode with Enumerator { - lazy val tokens = flatten(valOption, pattern, equalsOrArrowToken, expr, guardOption) + lazy val tokens = flatten(valOption, pattern, equalsOrArrowToken, expr, guards) } diff --git a/core/src/main/scala/scalariform/parser/ScalaCombinatorParser.scala b/core/src/main/scala/scalariform/parser/ScalaCombinatorParser.scala index 1627451d..6b2a7015 100644 --- a/core/src/main/scala/scalariform/parser/ScalaCombinatorParser.scala +++ b/core/src/main/scala/scalariform/parser/ScalaCombinatorParser.scala @@ -329,16 +329,18 @@ class ScalaCombinatorParser extends Parsers { opt(actualGuard) } + val definiteGuard: Parser[Guard] = guard(IF) ~> guard ^^ { _.get } + lazy val enumerators: Parser[Enumerators] = { - val enumerator: Parser[Enumerator] = (guard(IF) ~> guard ^^ { _.get }) | generator(eqOK = true) | expr + val enumerator: Parser[Enumerator] = definiteGuard | generator(eqOK = true) | expr generator(eqOK = false) ~ pairRep(statSep, enumerator) ^^ { case initialGenerator ~ rest ⇒ Enumerators(initialGenerator, rest) } } def generator(eqOK: Boolean): Parser[Generator] = { - opt(VAL) ~ pattern1(seqOK = false) ~ (when(eqOK, EQUALS) | LARROW) ~ expr ~ guard ^^ { - case valOption ~ pattern ~ equalsOrArrowToken ~ expr ~ guard ⇒ Generator(valOption, pattern, equalsOrArrowToken, expr, guard) + opt(VAL) ~ pattern1(seqOK = false) ~ (when(eqOK, EQUALS) | LARROW) ~ expr ~ rep(definiteGuard) ^^ { + case valOption ~ pattern ~ equalsOrArrowToken ~ expr ~ guards ⇒ Generator(valOption, pattern, equalsOrArrowToken, expr, guards) } } diff --git a/core/src/test/scala/scalariform/formatter/ForExprFormatterTest.scala b/core/src/test/scala/scalariform/formatter/ForExprFormatterTest.scala index c4428efc..6cd24ffd 100644 --- a/core/src/test/scala/scalariform/formatter/ForExprFormatterTest.scala +++ b/core/src/test/scala/scalariform/formatter/ForExprFormatterTest.scala @@ -131,6 +131,10 @@ class ForExprFormatterTest extends AbstractExpressionFormatterTest { |} println(x + y)""" + "for (n <- 1 to 10 if n > 4 if n < 10) yield n" ==> "for (n <- 1 to 10 if n > 4 if n < 10) yield n" + + "for {n <- 1 to 10 if n > (4)if n < 10} yield n" ==> "for { n <- 1 to 10 if n > (4) if n < 10 } yield n" + }