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
48
49
50
|
import scala.tools.partest._
import scala.tools.nsc._
object Test extends DirectTest {
override def extraSettings: String = "-usejavacp -Xprint:typer"
def code = """
class C {
def x = 2
def y = 3
}
""".trim
def show() {
val global = newCompiler()
import global._
import analyzer._
val output = collection.mutable.ListBuffer[String]()
def log(what: String) = output += what.replace(String.format("%n"), " ")
def logEnterStat(pluginName: String, stat: Tree): Unit = log(s"$pluginName:enterStat($stat)")
def deriveStat(pluginName: String, typer: Typer, stat: Tree): List[Tree] = stat match {
case DefDef(mods, name, Nil, Nil, TypeTree(), body) =>
val derived = DefDef(NoMods, TermName(name + pluginName), Nil, Nil, TypeTree(), Ident(TermName("$qmark$qmark$qmark")))
newNamer(typer.context).enterSym(derived)
List(derived)
case _ =>
Nil
}
object macroPlugin1 extends MacroPlugin {
override def pluginsEnterStats(typer: Typer, stats: List[Tree]): List[Tree] = {
stats.foreach(stat => logEnterStat("macroPlugin1", stat))
stats.flatMap(stat => stat +: deriveStat("macroPlugin1", typer, stat))
}
}
object macroPlugin2 extends MacroPlugin {
override def pluginsEnterStats(typer: Typer, stats: List[Tree]): List[Tree] = {
stats.foreach(stat => logEnterStat("macroPlugin2", stat))
stats.flatMap(stat => stat +: deriveStat("macroPlugin2", typer, stat))
}
}
addMacroPlugin(macroPlugin1)
addMacroPlugin(macroPlugin2)
compileString(global)(code)
println(output.mkString("\n"))
}
}
|