summaryrefslogtreecommitdiff
path: root/scalatexApi/src/main
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-04 00:03:13 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-04 00:03:13 -0800
commit84d025280986302c0435a5910a6a3c9c34d8fc8c (patch)
treef194b1c44f7b48ecfc3a7252edf256a7da041f26 /scalatexApi/src/main
parent9d9cd46a6ccc5bbe8b22dc38f615b532e526774c (diff)
downloadhands-on-scala-js-84d025280986302c0435a5910a6a3c9c34d8fc8c.tar.gz
hands-on-scala-js-84d025280986302c0435a5910a6a3c9c34d8fc8c.tar.bz2
hands-on-scala-js-84d025280986302c0435a5910a6a3c9c34d8fc8c.zip
Inline definition-statements now work and are tested.
Diffstat (limited to 'scalatexApi/src/main')
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Compiler.scala23
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Parser.scala19
-rw-r--r--scalatexApi/src/main/scala/torimatomeru/ScalaSyntax.scala2
3 files changed, 26 insertions, 18 deletions
diff --git a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
index 5704b2c..0ac9844 100644
--- a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
+++ b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
@@ -25,18 +25,29 @@ object Compiler{
case (curr, Ast.Chain.TypeArgs(str, offset2)) =>
val TypeApply(fun, args) = c.parse(s"omg$str")
TypeApply(curr, args)
- case (curr, Ast.Block(front, parts, offset)) =>
- q"$curr(..${compileBlock(front, parts, offset)})"
+ case (curr, Ast.Block(parts, offset)) =>
+ q"$curr(..${compileBlock(parts, offset)})"
+ case (curr, Ast.Header(header, block, offset)) =>
+ q"$curr(${compileHeader(header, block, offset)})"
+
}
}
- def compileBlock(front: Option[String], parts: Seq[Ast.Block.Sub], offset: Int): Seq[c.Tree] = {
+ def compileBlock(parts: Seq[Ast.Block.Sub], offset: Int): Seq[c.Tree] = {
parts.map{
- case Ast.Block.Text(str, offset2) => q"$str"
+ 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)
}
}
- val res = q"Seq[$fragType](..${compileBlock(None, template.parts, template.offset)})"
+ def compileHeader(header: String, block: Ast.Block, offset: Int): c.Tree = {
+ val Block(stmts, expr) = c.parse(s"{$header\n ()}")
+ Block(stmts, wrapBlock(compileBlock(block.parts, block.offset)))
+ }
+
+ def wrapBlock(items: Seq[c.Tree]) = {
+ q"Seq[$fragType](..$items)"
+ }
+ val res = wrapBlock(compileBlock(template.parts, template.offset))
println("::::::::::::::::::::::::::::::::::::::::::::::::")
println(res)
println("::::::::::::::::::::::::::::::::::::::::::::::::")
diff --git a/scalatexApi/src/main/scala/scalatex/stages/Parser.scala b/scalatexApi/src/main/scala/scalatex/stages/Parser.scala
index 91738a7..e54cb6b 100644
--- a/scalatexApi/src/main/scala/scalatex/stages/Parser.scala
+++ b/scalatexApi/src/main/scala/scalatex/stages/Parser.scala
@@ -44,9 +44,9 @@ class Parser(input: ParserInput, indent: Int = 0) extends ScalaSyntax(input) {
"@" ~ capture(Def | Import)
}
- def HeaderBlock: Rule1[Ast.Block] = rule{
- oneOrMore(Header ~ NewlineS) ~ runSubParser{new Parser(_, indent).Body0} ~> {
- (head: Seq[String], body: Ast.Block) => body.copy(front = Some(head.mkString("\n")))
+ def HeaderBlock: Rule1[Ast.Header] = rule{
+ Header ~ zeroOrMore(capture(NewlineS) ~ Header ~> (_ + _)) ~ runSubParser{new Parser(_, indent).Body0} ~> {
+ (start: String, heads: Seq[String], body: Ast.Block) => Ast.Header(start + heads.mkString, body)
}
}
@@ -92,12 +92,12 @@ class Parser(input: ParserInput, indent: Int = 0) extends ScalaSyntax(input) {
}
def Body = rule{
oneOrMore(BodyItem) ~> {x =>
- Ast.Block(None, x.flatten)
+ Ast.Block(x.flatten)
}
}
def Body0 = rule{
zeroOrMore(BodyItem) ~> {x =>
- Ast.Block(None, x.flatten)
+ Ast.Block(x.flatten)
}
}
}
@@ -108,21 +108,18 @@ trait Ast{
object Ast{
/**
- * @param front Any parameter lists (if it's a lambda), imports, val/def/lazy-val,
- * class/object/trait declarations that occur before the parts of this
- * block, and must be in scope within those parts
* @param parts The various bits of text and other things which make up this block
* @param offset
*/
- case class Block(front: Option[String],
- parts: Seq[Block.Sub],
+ case class Block(parts: Seq[Block.Sub],
offset: Int = 0)
extends Chain.Sub with Block.Sub
object Block{
trait Sub extends Ast
case class Text(txt: String, offset: Int = 0) extends Block.Sub
- }
+ }
+ case class Header(front: String, block: Block, offset: Int = 0) extends Block.Sub with Chain.Sub
/**
* @param lhs The first expression in this method-chain
* @param parts A list of follow-on items chained to the first
diff --git a/scalatexApi/src/main/scala/torimatomeru/ScalaSyntax.scala b/scalatexApi/src/main/scala/torimatomeru/ScalaSyntax.scala
index 5bbd0af..bf0e0e2 100644
--- a/scalatexApi/src/main/scala/torimatomeru/ScalaSyntax.scala
+++ b/scalatexApi/src/main/scala/torimatomeru/ScalaSyntax.scala
@@ -166,7 +166,7 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
def Params: Rule0 = rule { zeroOrMore(Param).separatedBy(',') }
def Param: Rule0 = rule { zeroOrMore(Annotation) ~ IdS ~ optional(':' ~ ParamType) ~ optional('=' ~ Expr) }
def ClassParamClauses: Rule0 = rule { zeroOrMore(ClassParamClause) ~ optional(optional(NewlineS) ~ '(' ~ "implicit" ~ ClassParam ~ ')') }
- def ClassParamClause: Rule0 = rule { optional(NewlineS) ~ '(' ~ optional(ClassParam) ~ ')' }
+ def ClassParamClause: Rule0 = rule { optional(NewlineS) ~ '(' ~ optional(ClassParams) ~ ')' }
def ClassParams: Rule0 = rule { oneOrMore(ClassParam).separatedBy(',') }
def ClassParam: Rule0 = rule { zeroOrMore(Annotation) ~ optional(zeroOrMore(Modifier) ~ ("val" | "var")) ~ IdS ~ ":" ~ ParamType ~ optional("=" ~ Expr) }