Skip to content

Commit

Permalink
Support macro syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
mdr committed Apr 26, 2012
1 parent 8e3221c commit 0b913ab
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 17 deletions.
1 change: 1 addition & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* FIX: Parse 5.f, 5.d as floating points, unless in Scala 2.11+ mode
* FIX: Bug with line-per-annotation style
* Add support for String interpolation (2.10)
* Add support for macros

0.1.1 (18/October/11)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -809,7 +809,7 @@ trait ExprFormatter { self: HasFormattingPreferences with AnnotationFormatter wi
formatResult ++= format(type_)
for (funBody funBodyOpt) {
funBody match {
case ExprFunBody(equals: Token, body: Expr) {
case ExprFunBody(equals: Token, macroOpt: Option[Token], body: Expr) {
// TODO: see format(PatDefOrDcl)
val bodyToken = body.firstToken
val (formatInstruction, exprFormatterState) =
Expand Down
6 changes: 4 additions & 2 deletions scalariform/src/main/scala/scalariform/parser/AstNodes.scala
Original file line number Diff line number Diff line change
Expand Up @@ -275,11 +275,13 @@ case class PatDefOrDcl(valOrVarToken: Token,
}

sealed trait FunBody extends AstNode

case class ProcFunBody(newlineOpt: Option[Token], bodyBlock: BlockExpr) extends FunBody {
lazy val tokens = flatten(newlineOpt, bodyBlock)
}
case class ExprFunBody(equals: Token, body: Expr) extends FunBody {
lazy val tokens = flatten(equals, body)

case class ExprFunBody(equals: Token, macroOpt: Option[Token], body: Expr) extends FunBody {
lazy val tokens = flatten(equals, macroOpt, body)
}

case class ParamClauses(newlineOpt: Option[Token], paramClausesAndNewlines: List[(ParamClause, Option[Token])]) extends AstNode {
Expand Down
42 changes: 28 additions & 14 deletions scalariform/src/main/scala/scalariform/parser/ScalaParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1353,26 +1353,40 @@ class ScalaParser(tokens: Array[Token]) {
case _
val equalsToken = accept(EQUALS)
val constrExpr_ = constrExpr()
ExprFunBody(equalsToken, constrExpr_)
ExprFunBody(equalsToken, None, constrExpr_)
}
FunDefOrDcl(defToken, thisToken, None, paramClauses_, None, Some(funBody), localDef)
} else {
val nameToken = ident()
val typeParamClauseOpt_ = typeParamClauseOpt(allowVariance = false)
val paramClauses_ = paramClauses()
val newLineOpt_ = newLineOptWhenFollowedBy(LBRACE)
val returnTypeOpt = typedOpt()
val funBodyOpt = if (isStatSep || RBRACE || EOF /* for our tests */ )
None
else if (LBRACE) { // TODO: check cond
val blockExpr_ = blockExpr()
Some(ProcFunBody(newLineOpt_, blockExpr_))
} else {
val (equalsToken, expr_) = equalsExpr()
Some(ExprFunBody(equalsToken, expr_))
funDefRest(localDef, defToken, nameToken)
}
}

private def funDefRest(localDef: Boolean, defToken: Token, nameToken: Token): FunDefOrDcl = {
val typeParamClauseOpt_ = typeParamClauseOpt(allowVariance = false)
val paramClauses_ = paramClauses()
val newLineOpt_ = newLineOptWhenFollowedBy(LBRACE)
val returnTypeOpt = typedOpt()
val funBodyOpt = if (isStatSep || RBRACE || EOF /* for our tests */ )
None
else if (LBRACE) { // TODO: check cond
val blockExpr_ = blockExpr()
Some(ProcFunBody(newLineOpt_, blockExpr_))
} else {
if (!EQUALS) {
accept(EQUALS)
throw new AssertionError("Will not reach here")
}
FunDefOrDcl(defToken, nameToken, typeParamClauseOpt_, paramClauses_, returnTypeOpt, funBodyOpt, localDef)
val equalsToken = nextToken()
val macroTokenOpt =
if (VARID && currentToken.text == "macro")
Some(nextToken())
else
None
val expr_ = expr()
Some(ExprFunBody(equalsToken, macroTokenOpt, expr_))
}
FunDefOrDcl(defToken, nameToken, typeParamClauseOpt_, paramClauses_, returnTypeOpt, funBodyOpt, localDef)
}

private def constrExpr(): Expr = {
Expand Down

0 comments on commit 0b913ab

Please sign in to comment.