blob: 8c784d7e54eb4e5e205fc772de97244d39f016b7 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
package scala.reflect.macros
package contexts
trait Internals extends scala.tools.nsc.transform.TypingTransformers {
self: Context =>
import global._
lazy val internal: ContextInternalApi = new global.SymbolTableInternal with ContextInternalApi {
val enclosingOwner = callsiteTyper.context.owner
class HofTransformer(hof: (Tree, TransformApi) => Tree) extends Transformer {
val api = new TransformApi {
def recur(tree: Tree): Tree = hof(tree, this)
def default(tree: Tree): Tree = superTransform(tree)
}
def superTransform(tree: Tree) = super.transform(tree)
override def transform(tree: Tree): Tree = hof(tree, api)
}
def transform(tree: Tree)(transformer: (Tree, TransformApi) => Tree): Tree = new HofTransformer(transformer).transform(tree)
class HofTypingTransformer(hof: (Tree, TypingTransformApi) => Tree) extends TypingTransformer(callsiteTyper.context.unit) { self =>
currentOwner = callsiteTyper.context.owner
curTree = EmptyTree
localTyper = global.analyzer.newTyper(callsiteTyper.context.make(unit = callsiteTyper.context.unit))
val api = new TypingTransformApi {
def recur(tree: Tree): Tree = hof(tree, this)
def default(tree: Tree): Tree = superTransform(tree)
def atOwner[T](owner: Symbol)(op: => T): T = self.atOwner(owner)(op)
def atOwner[T](tree: Tree, owner: Symbol)(op: => T): T = self.atOwner(tree, owner)(op)
def currentOwner: Symbol = self.currentOwner
def typecheck(tree: Tree): Tree = localTyper.typed(tree)
}
def superTransform(tree: Tree) = super.transform(tree)
override def transform(tree: Tree): Tree = hof(tree, api)
}
def typingTransform(tree: Tree)(transformer: (Tree, TypingTransformApi) => Tree): Tree = new HofTypingTransformer(transformer).transform(tree)
def typingTransform(tree: Tree, owner: Symbol)(transformer: (Tree, TypingTransformApi) => Tree): Tree = {
val trans = new HofTypingTransformer(transformer)
trans.atOwner(owner)(trans.transform(tree))
}
}
}
|