diff options
Diffstat (limited to 'scalatexApi/src/main/scala/scalatex/stages')
-rw-r--r-- | scalatexApi/src/main/scala/scalatex/stages/Compiler.scala | 13 | ||||
-rw-r--r-- | scalatexApi/src/main/scala/scalatex/stages/Parser.scala | 14 |
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(_))) ~ |