summaryrefslogtreecommitdiff
path: root/scalatexApi/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'scalatexApi/src/main')
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Compiler.scala13
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Parser.scala14
2 files changed, 20 insertions, 7 deletions
diff --git a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
index 8bb203a..7d1492c 100644
--- a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
+++ b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
@@ -38,6 +38,17 @@ object Compiler{
case Ast.Block.Text(str, _) => q"$str"
case Ast.Chain(code, parts, offset) => compileChain(code, parts, offset)
case Ast.Header(header, block, offset) => compileHeader(header, block, offset)
+ case b @ Ast.Block.IfElse(condString, Ast.Block(parts2, offset2), elseBlock, offset) =>
+ println("AST " + b)
+ val If(cond, _, _) = c.parse(condString + "{}")
+ val elseCompiled = elseBlock match{
+ case Some(Ast.Block(parts3, offset3)) => wrapBlock(compileBlock(parts3, offset3))
+ case None => EmptyTree
+ }
+
+ val res = If(cond, wrapBlock(compileBlock(parts2, offset2)), elseCompiled)
+ println("Tree " + res)
+ res
case Ast.Block.For(generators, Ast.Block(parts2, offset2), offset) =>
val fresh = c.fresh()
@@ -48,7 +59,7 @@ object Compiler{
val a2 = Apply(fun, List(f2))
a2
case Ident(x: TermName) if x.decoded == fresh =>
- q"Seq[$fragType](..${compileBlock(parts2, offset2)})"
+ wrapBlock(compileBlock(parts2, offset2))
}
val out = rec(tree)
diff --git a/scalatexApi/src/main/scala/scalatex/stages/Parser.scala b/scalatexApi/src/main/scala/scalatex/stages/Parser.scala
index 48138af..7b694da 100644
--- a/scalatexApi/src/main/scala/scalatex/stages/Parser.scala
+++ b/scalatexApi/src/main/scala/scalatex/stages/Parser.scala
@@ -51,7 +51,8 @@ class Parser(input: ParserInput, indent: Int = 0) extends ScalaSyntax(input) {
}
def BlankLine = rule{ '\n' ~ zeroOrMore(' ') ~ &('\n') }
- def Indent = rule{ '\n' ~ indent.times(' ') ~ zeroOrMore(' ') }
+ def IndentSpaces = rule{ indent.times(' ') ~ zeroOrMore(' ') }
+ def Indent = rule{ '\n' ~ IndentSpaces }
def LoneScalaChain: Rule2[Ast.Block.Text, Ast.Chain] = rule {
(capture(Indent) ~> (Ast.Block.Text(_))) ~
ScalaChain ~
@@ -60,26 +61,27 @@ class Parser(input: ParserInput, indent: Int = 0) extends ScalaSyntax(input) {
}
}
def IndentBlock = rule{
+ &("\n") ~
test(cursorNextIndent() > indent) ~
runSubParser(new Parser(_, cursorNextIndent()).Body)
}
def IfHead = rule{ "@" ~ capture("if" ~ "(" ~ Expr ~ ")") }
def IfElse1 = rule{
- IfHead ~ BraceBlock ~ optional("else" ~ (BraceBlock | IndentBlock))
+ IfHead ~ BraceBlock ~ optional("else" ~ (BraceBlock | IndentBlock))
}
def IfElse2 = rule{
- IfHead ~ IndentBlock ~ optional(Indent ~ "@else" ~ (BraceBlock | IndentBlock))
+ Indent ~ IfHead ~ IndentBlock ~ optional(Indent ~ "@else" ~ (BraceBlock | IndentBlock))
}
def IfElse = rule{
(IfElse1 | IfElse2) ~> (Ast.Block.IfElse(_, _, _))
}
def ForHead = rule{
- "@" ~ capture("for" ~ '(' ~ Enumerators ~ ')'~ run(println("f")))
+ "@" ~ capture("for" ~ '(' ~ Enumerators ~ ')')
}
def ForLoop = rule{
- run(println("A")) ~ ForHead ~ run(println("B")) ~
- BraceBlock ~ run(println("C")) ~> (Ast.Block.For(_, _))
+ ForHead ~
+ BraceBlock ~> (Ast.Block.For(_, _))
}
def LoneForLoop = rule{
(capture(Indent) ~> (Ast.Block.Text(_))) ~