summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-05 06:37:03 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-05 06:37:03 -0800
commit8e8f9bb1d2e05d946ba55e273027d05345057d4d (patch)
treecfdb80268a283aac1bc91ee54c55cf302ce55a4f
parenta99ca0a1c4df83638d888d316a453b6516477a08 (diff)
downloadhands-on-scala-js-8e8f9bb1d2e05d946ba55e273027d05345057d4d.tar.gz
hands-on-scala-js-8e8f9bb1d2e05d946ba55e273027d05345057d4d.tar.bz2
hands-on-scala-js-8e8f9bb1d2e05d946ba55e273027d05345057d4d.zip
If-elses-fors work and are tested
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Compiler.scala13
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Parser.scala14
-rw-r--r--scalatexApi/src/test/scala/scalatex/BasicTests.scala272
-rw-r--r--scalatexApi/src/test/scala/scalatex/ParserTests.scala46
4 files changed, 199 insertions, 146 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(_))) ~
diff --git a/scalatexApi/src/test/scala/scalatex/BasicTests.scala b/scalatexApi/src/test/scala/scalatex/BasicTests.scala
index 2412456..4bc362c 100644
--- a/scalatexApi/src/test/scala/scalatex/BasicTests.scala
+++ b/scalatexApi/src/test/scala/scalatex/BasicTests.scala
@@ -193,22 +193,22 @@ object BasicTests extends TestSuite{
"""
)
}
-// 'linearNested{
-// check(
-// tw("""
-// @h1 @span @a Hello World
-// @h2 @span @a hello
-// @b world
-// @h3 @i
-// @div Cow
-// """),
-// """
-// <h1></h1><span></span><a></a>HelloWorld
-// <h2></h2><span></span><a></a>hello<b></b>world
-// <h3></h3><i></i><div></div>Cow
-// """
-// )
-// }
+ 'linearNested{
+ check(
+ tw("""
+ @h1 @span @a Hello World
+ @h2 @span @a hello
+ @b world
+ @h3 @i
+ @div Cow
+ """),
+ """
+ <h1></h1><span></span><a></a>HelloWorld
+ <h2></h2><span></span><a></a>hello<b></b>world
+ <h3></h3><i></i><div></div>Cow
+ """
+ )
+ }
'crasher{
tw("""
@html
@@ -294,9 +294,9 @@ object BasicTests extends TestSuite{
// """
// )
// }
-// }
+ }
//
-// 'loops {
+ 'loops {
//
* - check(
tw("""
@@ -310,124 +310,124 @@ object BasicTests extends TestSuite{
"""),
"lollollol"
)
-//
-//
-// * - check(
-// tw("""
-// @p
-// @for(x <- 0 until 2)
-// @for(y <- 0 until 2)
-// lol@x@y
-// """),
-// tw( """
-// @p
-// @for(x <- 0 until 2) {
-// @for(y <- 0 until 2)
-// lol@x@y
-// }
-// """),
-// tw("""
-// @p
-// @for(x <- 0 until 2)
-// @for(y <- 0 until 2){
-// lol@x@y
-// }
-// """),
-// "<p>lol00lol01lol10lol11</p>"
-// )
-// check(
-// tw("""
-// @p
-// @for(x <- 0 until 2)
-// @for(y <- 0 until 2)
-// lol@x@y
-// """),
-// "<p>lol00lol01lol10lol11</p>"
-// )
-//
-// * - check(
-// tw(
-// """
-// @for(x <- 0 until 2; y <- 0 until 2)
-// @div{@x@y}
-//
-// """),
-// """<div>00</div><div>01</div><div>10</div><div>11</div>"""
-// )
-// }
-//
-// 'ifElse{
-// 'basicExamples{
-// * - check(
-// tw("""
-// @if(false)
-// Hello
-// @else
-// lols
-// @p
-// """),
-// "lols<p></p>"
-// )
-//
-// * - check(
-// tw("""
-// @div
-// @if(true)
-// Hello
-// @else
-// lols
-// """),
-// "<div>Hello</div>"
-// )
-//
-// * - check(
-// tw("""
-// @div
-// @if(true)
-// Hello
-// @else
-// lols
-// """),
-// "<div>Hello</div>"
-// )
-// * - check(
-// tw("""
-// @if(false)
-// Hello
-// @else
-// lols
-// """),
-// "lols"
-// )
-// * - check(
-// tw("""
-// @if(false)
-// Hello
-// @else
-// lols
-// @img
-// """),
-// "lols<img/>"
-// )
-// * - check(
-// tw("""
-// @p
-// @if(true)
-// Hello
-// @else
-// lols
-// """),
-// tw("""
-// @p
-// @if(true) {
-// Hello
-// } else {
-// lols
-// }
-// """),
-// "<p>Hello</p>"
-// )
-// }
+
+
+ * - check(
+ tw("""
+ @p
+ @for(x <- 0 until 2)
+ @for(y <- 0 until 2)
+ lol@x@y
+ """),
+ tw( """
+ @p
+ @for(x <- 0 until 2){
+ @for(y <- 0 until 2)
+ lol@x@y
+ }
+ """),
+ tw("""
+ @p
+ @for(x <- 0 until 2)
+ @for(y <- 0 until 2){
+ lol@x@y
+ }
+ """),
+ "<p>lol00lol01lol10lol11</p>"
+ )
+ check(
+ tw("""
+ @p
+ @for(x <- 0 until 2)
+ @for(y <- 0 until 2)
+ lol@x@y
+ """),
+ "<p>lol00lol01lol10lol11</p>"
+ )
+
+ * - check(
+ tw(
+ """
+ @for(x <- 0 until 2; y <- 0 until 2)
+ @div{@x@y}
+
+ """),
+ """<div>00</div><div>01</div><div>10</div><div>11</div>"""
+ )
+ }
+
+ 'ifElse{
+ 'basicExamples{
+ * - check(
+ tw("""
+ @if(false)
+ Hello
+ @else
+ lols
+ @p
+ """),
+ "lols<p></p>"
+ )
+
+ * - check(
+ tw("""
+ @div
+ @if(true)
+ Hello
+ @else
+ lols
+ """),
+ "<div>Hello</div>"
+ )
+
+ * - check(
+ tw("""
+ @div
+ @if(true)
+ Hello
+ @else
+ lols
+ """),
+ "<div>Hello</div>"
+ )
+ * - check(
+ tw("""
+ @if(false)
+ Hello
+ @else
+ lols
+ """),
+ "lols"
+ )
+ * - check(
+ tw("""
+ @if(false)
+ Hello
+ @else
+ lols
+ @img
+ """),
+ "lols<img/>"
+ )
+ * - check(
+ tw("""
+ @p
+ @if(true)
+ Hello
+ @else
+ lols
+ """),
+ tw("""
+ @p
+ @if(true){
+ Hello
+ }else{
+ lols
+ }
+ """),
+ "<p>Hello</p>"
+ )
+ }
// 'funkyExpressions{
// * - check(
// tw("""
diff --git a/scalatexApi/src/test/scala/scalatex/ParserTests.scala b/scalatexApi/src/test/scala/scalatex/ParserTests.scala
index 5cefa67..150f766 100644
--- a/scalatexApi/src/test/scala/scalatex/ParserTests.scala
+++ b/scalatexApi/src/test/scala/scalatex/ParserTests.scala
@@ -173,7 +173,7 @@ object ParserTests extends utest.TestSuite{
_.Body.run(),
Block(Seq(
Text("\n"),
- For("for(x <- 0 until 3)", Block(Seq(Text("\n "), Text("lol"))))
+ For("for(x <- 0 until 3)", Block(Seq(Text("\n "), Text("lol"), Text("\n"))))
))
)
}
@@ -189,13 +189,15 @@ object ParserTests extends utest.TestSuite{
IfElse("if(true)", Block(Seq(Text("lol"))), Some(Block(Seq(Text(" omg ")))))
)
'ifBlock - check(
- """@if(true)
+ """
+ |@if(true)
| omg""".stripMargin,
_.IfElse.run(),
IfElse("if(true)", Block(Seq(Text("\n "), Text("omg"))), None)
)
'ifBlockElseBlock - check(
- """@if(true)
+ """
+ |@if(true)
| omg
|@else
| wtf""".stripMargin,
@@ -206,6 +208,43 @@ object ParserTests extends utest.TestSuite{
Some(Block(Seq(Text("\n "), Text("wtf"))))
)
)
+ 'ifBlockElseBraceBlock - check(
+ """@if(true){
+ | omg
+ |}else{
+ | wtf
+ |}""".stripMargin,
+ _.IfElse.run(),
+ IfElse(
+ "if(true)",
+ Block(Seq(Text("\n "), Text("omg"), Text("\n"))),
+ Some(Block(Seq(Text("\n "), Text("wtf"), Text("\n"))))
+ )
+ )
+ 'ifBlockElseBraceBlockNested - {
+ val res = Parser(Trim(
+ """
+ @p
+ @if(true){
+ Hello
+ }else{
+ lols
+ }
+ """))
+ val expected =
+ Block(Vector(
+ Text("\n"),
+ Chain("p",Vector(Block(Vector(
+ Text("\n "),
+ IfElse("if(true)", Block(Vector(
+ Text("\n "), Text("Hello"), Text("\n "))),
+ Some(Block(Vector(
+ Text("\n "), Text("lols"), Text("\n "))))
+ ))))),
+ Text("\n")
+ ))
+ assert(res == expected)
+ }
'ifElseBlock - check(
"""@if(true){
| omg
@@ -219,6 +258,7 @@ object ParserTests extends utest.TestSuite{
)
)
}
+
}
'Body{
'indents - check(