Skip to content

Commit

Permalink
Parser: support multiple guards in a generator to match http://lampsv…
Browse files Browse the repository at this point in the history
  • Loading branch information
mdr committed May 31, 2010
1 parent 49f73f5 commit 8d6d1c9
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 10 deletions.
12 changes: 7 additions & 5 deletions core/src/main/scala/scalariform/formatter/ExprFormatter.scala
Expand Up @@ -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 = {
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/scala/scalariform/parser/AstNodes.scala
Expand Up @@ -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)

}

Expand Down
Expand Up @@ -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)
}
}

Expand Down
Expand Up @@ -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"

}


0 comments on commit 8d6d1c9

Please sign in to comment.