summaryrefslogtreecommitdiff
path: root/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-03 22:13:10 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-03 22:13:10 -0800
commited923d3445e1f304949eee2ee414987d98756a86 (patch)
tree42f81cf36afc3ce34b31ca5a4d15432ac56f4445 /scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
parent2ca177afb55232ae762051d9a2cc205629000e70 (diff)
downloadhands-on-scala-js-ed923d3445e1f304949eee2ee414987d98756a86.tar.gz
hands-on-scala-js-ed923d3445e1f304949eee2ee414987d98756a86.tar.bz2
hands-on-scala-js-ed923d3445e1f304949eee2ee414987d98756a86.zip
Tests pass!
Diffstat (limited to 'scalatexApi/src/main/scala/scalatex/stages/Compiler.scala')
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Compiler.scala150
1 files changed, 10 insertions, 140 deletions
diff --git a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
index 5127945..a305199 100644
--- a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
+++ b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
@@ -2,7 +2,7 @@ package scalatex
package stages
import acyclic.file
-import scala.reflect.macros.Context
+import scala.reflect.macros.whitebox.Context
import scala.reflect.internal.util.{Position, OffsetPosition}
/**
@@ -27,150 +27,20 @@ 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(parts, offset)) =>
+ q"$curr(..${compileBlock(parts, offset)})"
}
-
}
- def compileBlock(parts: Seq[Ast.Block.Sub], offset: Int): c.Tree = {
- val compiledParts = parts.map{
+ def compileBlock(parts: Seq[Ast.Block.Sub], offset: Int): Seq[c.Tree] = {
+ parts.map{
case Ast.Block.Text(str, offset2) => q"$str"
case Ast.Chain(code, parts, offset) => compileChain(code, parts, offset)
}
- q"Seq[$fragType](..$compiledParts)"
}
- ???
-// def compileTree(frag: Ast): Tree = frag match{
-// case Ast.Block(parts, offset)
-//
-//// println(s"${frag.offset}\n${literalPos.point}\n${pos.point}\n$frag\n")
-//
-// val f: Tree = frag match {
-// case Ast.Block.Text(text, offset) => fragPos.at(q"$text", 0)
-// case WN.Display(exp, offset) => compileTree(exp)
-// case WN.Comment(msg, offset) => q""
-// case WN.ScalaExp(Seq(WN.Simple(first, _), WN.Block(ws, args, content, _)), offset)
-// if first.startsWith("for(") =>
-// val fresh = c.fresh()
-// val skeleton: Tree = c.parse(first + s"{$fresh}").asInstanceOf[Apply]
-//// println("FIRST " + first)
-// skeleton.foreach{x =>
-// x
-// if (x.pos != NoPosition) fragPos.set(x, x.pos.point + 1)
-// }
-// val b = content.map(compileTree(_))
-// def rec(t: Tree): Tree = t match {
-// case a @ Apply(fun, List(f @ Function(vparams, body))) =>
-// val f2 = Function(vparams, rec(body))
-// val a2 = Apply(fun, List(f2))
-// atPos(a.pos)(a2)
-// atPos(f.pos)(f2)
-// a2
-// case Ident(x: TermName) if x.decoded == fresh =>
-// q"Seq[$fragType](..$b)"
-// }
-// rec(skeleton)
-//
-// case WN.ScalaExp(WN.Simple(first, _) +: WN.Block(_, None, content1, _) +: rest, offset)
-// if first.startsWith("if(") =>
-//
-// val b1 = content1.map(compileTree(_))
-// val tree = c.parse(first + "{}").asInstanceOf[If]
-// tree.foreach{x =>
-// fragPos.set(x, x.pos.point + 1)
-// }
-// val If(cond, _, _) = tree
-// val b2 = rest match{
-// case Seq(WN.Simple(next, _), WN.Block(_, None, content2, _)) =>
-// content2.map(compileTree(_))
-// case Seq() => Nil
-// }
-// q"if($cond){ Seq[$fragType](..$b1): $fragType } else { Seq[$fragType](..$b2): $fragType }"
-//
-// case xx @ WN.ScalaExp(WN.Simple(first, _) +: rest, offset) =>
-//
-// val firstTree = c.parse(first)
-//
-// firstTree.foreach{x =>
-// fragPos.set(x, x.pos.point)
-// }
-//
-// val s = rest.foldLeft[Tree](firstTree) {
-// case (l, WN.Simple(code, _)) =>
-//
-// val fresh = c.fresh()
-//
-// val snippet = s"$fresh$code"
-// val skeleton = c.parse(snippet)
-//
-// def rec(t: Tree): Tree = {
-//
-// val res = t match {
-// case Apply(fun, args) =>
-// for(arg <- args; tree <- arg if tree.pos != NoPosition){
-// fragPos.set(tree, tree.pos.point + first.length - fresh.length)
-// }
-//
-// Apply(rec(fun), args)
-// case Select(qualifier, name) => Select(rec(qualifier), name)
-// case Ident(x: TermName) if x.decoded == fresh => l
-// }
-// fragPos.at(res, t.pos.point + first.length - fresh.length)
-//// println(Position.formatMessage(newPos.asInstanceOf[scala.reflect.internal.util.Position], "", true))
-// res
-// }
-// rec(skeleton)
-//
-// case (l, WN.Block(ws, None, content, offset)) =>
-// val contentTrees = content.map(compileTree(_))
-// fragPos.at(q"$l(..$contentTrees)", offset)
-//
-// case (l, WN.Block(ws, Some(args), content, offset)) =>
-//
-// val snippet = s"{$args ()}"
-// val skeleton = c.parse(snippet)
-//
-// val Function(vparams, body) = skeleton
-//
-// vparams.map(_.foreach { t =>
-// if (t.pos != NoPosition)
-// fragPos.set(t, t.pos.point)
-// })
-// val contentTrees = content.map{compileTree(_)}
-//
-// val func = Function(vparams, q"Seq[$fragType](..$contentTrees)")
-// fragPos.at(func, skeleton.pos.point)
-// val res = q"$l($func)"
-// fragPos.at(res, offset)
-// res
-// }
-//
-// s
-// }
-// f
-// }
-//
-// def compileTemplate(tmpl: WN.Template): Tree = {
-// val WN.Template(name, comment, params, topImports, imports, subs, content, offset) = tmpl
-// val fullName = if (name.toString == "") c.fresh("outer") else name
-//
-// val DefDef(mods, realName, tparams, vparamss, tpt, rhs) = {
-// val snippet = s"def $fullName$params = {}"
-// val z = c.parse(snippet).asInstanceOf[DefDef]
-// z
-// }
-//
-// val innerDefs = subs.map(compileTemplate(_))
-//
-// val body = atPos(literalPos)(q"""{
-// ..${topImports.map(i => c.parse(i.code))}
-// ..$innerDefs
-//
-// Seq[scalatags.Text.all.Frag](..${content.map(compileTree(_))})
-// }""")
-//
-// if (name.toString == "") body
-// else DefDef(mods, realName, tparams, vparamss, tpt, body)
-// }
-//
-// atPos(literalPos)(q"${compileTemplate(template)}")
+ val res = q"Seq[$fragType](..${compileBlock(template.parts, template.offset)})"
+ println("::::::::::::::::::::::::::::::::::::::::::::::::")
+ println(res)
+ println("::::::::::::::::::::::::::::::::::::::::::::::::")
+ res
}
} \ No newline at end of file