summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/macros/Universe.scala
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-02-14 16:34:22 +0100
committerEugene Burmako <xeno.by@gmail.com>2014-02-15 09:32:26 +0100
commit88fd9b91c9b468d983bff795869753e6b9c53365 (patch)
tree5634ff79f160431db9f2fb33b28a43becb6c5dfd /src/reflect/scala/reflect/macros/Universe.scala
parent1c4863439c763bdcce9cb276a1eb1bcc2763d9b8 (diff)
downloadscala-88fd9b91c9b468d983bff795869753e6b9c53365.tar.gz
scala-88fd9b91c9b468d983bff795869753e6b9c53365.tar.bz2
scala-88fd9b91c9b468d983bff795869753e6b9c53365.zip
provides extension methods for internal
Based on my scala/async migration experiences, I can say that having to write `setType(tree, tpe)` instead of `tree.setType(tpe)` is a major pain. That's why I think it makes sense to expose some functions in internal as extension methods.
Diffstat (limited to 'src/reflect/scala/reflect/macros/Universe.scala')
-rw-r--r--src/reflect/scala/reflect/macros/Universe.scala65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/reflect/scala/reflect/macros/Universe.scala b/src/reflect/scala/reflect/macros/Universe.scala
index 8521b782e3..3319965844 100644
--- a/src/reflect/scala/reflect/macros/Universe.scala
+++ b/src/reflect/scala/reflect/macros/Universe.scala
@@ -23,7 +23,7 @@ abstract class Universe extends scala.reflect.api.Universe {
override type Internal <: MacroInternalApi
/** @inheritdoc */
- trait MacroInternalApi extends InternalApi {
+ trait MacroInternalApi extends InternalApi { internal =>
/** Collects all the symbols defined by subtrees of `tree` that are owned by `prev`,
* and then changes their owner to point to `next`.
@@ -136,6 +136,69 @@ abstract class Universe extends scala.reflect.api.Universe {
* Useful in writing quasiquoting macros that do pattern matching.
*/
def subpatterns(tree: Tree): Option[List[Tree]]
+
+ /** @inheritdoc */
+ override type Decorators <: MacroDecoratorApi
+
+ /** @inheritdoc */
+ trait MacroDecoratorApi extends DecoratorApi {
+ /** @inheritdoc */
+ type TreeDecorator <: MacroTreeDecoratorApi
+
+ /** @see [[TreeDecorator]] */
+ class MacroTreeDecoratorApi(override val tree: Tree) extends TreeDecoratorApi(tree) {
+ /** @see [[internal.changeOwner]] */
+ def changeOwner(prev: Symbol, next: Symbol): tree.type = internal.changeOwner(tree, prev, next)
+
+ /** @see [[internal.attachments]] */
+ def attachments: Attachments { type Pos = Position } = internal.attachments(tree)
+
+ /** @see [[internal.updateAttachment]] */
+ def updateAttachment[T: ClassTag](attachment: T): tree.type = internal.updateAttachment(tree, attachment)
+
+ /** @see [[internal.removeAttachment]] */
+ def removeAttachment[T: ClassTag]: tree.type = internal.removeAttachment[T](tree)
+
+ /** @see [[internal.setPos]] */
+ def setPos(newpos: Position): tree.type = internal.setPos(tree, newpos)
+
+ /** @see [[internal.setType]] */
+ def setType(tp: Type): tree.type = internal.setType(tree, tp)
+
+ /** @see [[internal.defineType]] */
+ def defineType(tp: Type): tree.type = internal.defineType(tree, tp)
+
+ /** @see [[internal.setSymbol]] */
+ def setSymbol(sym: Symbol): tree.type = internal.setSymbol(tree, sym)
+ }
+
+ /** @inheritdoc */
+ type SymbolDecorator <: MacroSymbolDecoratorApi
+
+ /** @see [[TreeDecorator]] */
+ class MacroSymbolDecoratorApi(override val symbol: Symbol) extends SymbolDecoratorApi(symbol) {
+ /** @see [[internal.attachments]] */
+ def attachments: Attachments { type Pos = Position } = internal.attachments(symbol)
+
+ /** @see [[internal.updateAttachment]] */
+ def updateAttachment[T: ClassTag](attachment: T): symbol.type = internal.updateAttachment(symbol, attachment)
+
+ /** @see [[internal.removeAttachment]] */
+ def removeAttachment[T: ClassTag]: symbol.type = internal.removeAttachment[T](symbol)
+
+ /** @see [[internal.setInfo]] */
+ def setInfo(tpe: Type): symbol.type = internal.setInfo(symbol, tpe)
+
+ /** @see [[internal.setAnnotations]] */
+ def setAnnotations(annots: Annotation*): symbol.type = internal.setAnnotations(symbol, annots: _*)
+
+ /** @see [[internal.setName]] */
+ def setName(name: Name): symbol.type = internal.setName(symbol, name)
+
+ /** @see [[internal.setPrivateWithin]] */
+ def setPrivateWithin(sym: Symbol): symbol.type = internal.setPrivateWithin(symbol, sym)
+ }
+ }
}
/** @group Internal */