summaryrefslogtreecommitdiff
path: root/src/reflect/scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-09-23 04:54:11 -0700
committerJason Zaugg <jzaugg@gmail.com>2013-09-23 04:54:11 -0700
commita456f4648a82e22b9fa66f05835c01173c16c7c8 (patch)
treef418e9b8d4985ae26f9d663f2d7b05c3147dea17 /src/reflect/scala
parentc96f135f32ffc79bc4bd7ece92aa2f18f2efe99e (diff)
parentc8a9329ff9b2a6ea99eef7234c9f84c0bfe0166b (diff)
downloadscala-a456f4648a82e22b9fa66f05835c01173c16c7c8.tar.gz
scala-a456f4648a82e22b9fa66f05835c01173c16c7c8.tar.bz2
scala-a456f4648a82e22b9fa66f05835c01173c16c7c8.zip
Merge pull request #2962 from densh/topic/syntactic-assign
Quasiquotes: add syntactic extractor for assignment-like trees
Diffstat (limited to 'src/reflect/scala')
-rw-r--r--src/reflect/scala/reflect/api/BuildUtils.scala7
-rw-r--r--src/reflect/scala/reflect/internal/BuildUtils.scala12
-rw-r--r--src/reflect/scala/reflect/internal/StdNames.scala1
-rw-r--r--src/reflect/scala/reflect/internal/TreeGen.scala8
4 files changed, 27 insertions, 1 deletions
diff --git a/src/reflect/scala/reflect/api/BuildUtils.scala b/src/reflect/scala/reflect/api/BuildUtils.scala
index 60c2a81947..551c27bf9c 100644
--- a/src/reflect/scala/reflect/api/BuildUtils.scala
+++ b/src/reflect/scala/reflect/api/BuildUtils.scala
@@ -193,5 +193,12 @@ private[reflect] trait BuildUtils { self: Universe =>
def apply(mods: Modifiers, name: TermName, tpt: Tree, rhs: Tree): ValDef
def unapply(tree: Tree): Option[(Modifiers, TermName, Tree, Tree)]
}
+
+ val SyntacticAssign: SyntacticAssignExtractor
+
+ trait SyntacticAssignExtractor {
+ def apply(lhs: Tree, rhs: Tree): Tree
+ def unapply(tree: Tree): Option[(Tree, Tree)]
+ }
}
}
diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala
index de24b88397..e5c7dc44af 100644
--- a/src/reflect/scala/reflect/internal/BuildUtils.scala
+++ b/src/reflect/scala/reflect/internal/BuildUtils.scala
@@ -140,7 +140,7 @@ trait BuildUtils { self: SymbolTable =>
object SyntacticApplied extends SyntacticAppliedExtractor {
def apply(tree: Tree, argss: List[List[Tree]]): Tree =
- argss.foldLeft(tree) { Apply(_, _) }
+ argss.foldLeft(tree) { (f, args) => Apply(f, args.map(treeInfo.assignmentToMaybeNamedArg)) }
def unapply(tree: Tree): Some[(Tree, List[List[Tree]])] = {
val treeInfo.Applied(fun, targs, argss) = tree
@@ -401,6 +401,16 @@ trait BuildUtils { self: SymbolTable =>
object SyntacticValDef extends SyntacticValDefBase { val isMutable = false }
object SyntacticVarDef extends SyntacticValDefBase { val isMutable = true }
+
+ object SyntacticAssign extends SyntacticAssignExtractor {
+ def apply(lhs: Tree, rhs: Tree): Tree = gen.mkAssign(lhs, rhs)
+ def unapply(tree: Tree): Option[(Tree, Tree)] = tree match {
+ case Assign(lhs, rhs) => Some((lhs, rhs))
+ case AssignOrNamedArg(lhs, rhs) => Some((lhs, rhs))
+ case Apply(Select(fn, nme.update), args :+ rhs) => Some((atPos(fn.pos)(Apply(fn, args)), rhs))
+ case _ => None
+ }
+ }
}
val build: BuildApi = new BuildImpl
diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala
index 6407a3979c..f4eae5590a 100644
--- a/src/reflect/scala/reflect/internal/StdNames.scala
+++ b/src/reflect/scala/reflect/internal/StdNames.scala
@@ -602,6 +602,7 @@ trait StdNames {
val SelectFromTypeTree: NameType = "SelectFromTypeTree"
val StringContext: NameType = "StringContext"
val SyntacticApplied: NameType = "SyntacticApplied"
+ val SyntacticAssign: NameType = "SyntacticAssign"
val SyntacticBlock: NameType = "SyntacticBlock"
val SyntacticClassDef: NameType = "SyntacticClassDef"
val SyntacticDefDef: NameType = "SyntacticDefDef"
diff --git a/src/reflect/scala/reflect/internal/TreeGen.scala b/src/reflect/scala/reflect/internal/TreeGen.scala
index a8af3e0f0e..a9f2807e9f 100644
--- a/src/reflect/scala/reflect/internal/TreeGen.scala
+++ b/src/reflect/scala/reflect/internal/TreeGen.scala
@@ -434,4 +434,12 @@ abstract class TreeGen extends macros.TreeBuilder {
case head :: Nil => head
case _ => gen.mkBlock(stats)
}
+
+ /** Create a tree representing an assignment <lhs = rhs> */
+ def mkAssign(lhs: Tree, rhs: Tree): Tree = lhs match {
+ case Apply(fn, args) =>
+ Apply(atPos(fn.pos)(Select(fn, nme.update)), args :+ rhs)
+ case _ =>
+ Assign(lhs, rhs)
+ }
}