Я пишу плагин, который отслеживает аннотацию @unmatchable и выдает предупреждение, если он обнаружен при сопоставлении с образцом.
Мне удалось найти TypeRef, но я не могу преобразовать его вClassDef, чтобы я мог просматривать аннотации.
Я предполагаю, что мне нужно получить корень дерева и использовать TreeOpts.find, чтобы получить реальный ClassDef.Тем не менее, я не могу найти, где находится корневое дерево.
РЕДАКТИРОВАТЬ: мне нужно больше, чем корневые единицы компиляции в случае, если в библиотеку включена соответствующая аннотация.
Вот что у меня естьпока что.
class UnmatchablePlugin(val global: Global) extends Plugin {
val name = "unmatchable-check-gen"
val description = "marks a class unmatchable"
val components = List[PluginComponent](UnmatchableComponent)
private object UnmatchableComponent extends PluginComponent with Transform {
val global: UnmatchablePlugin.this.global.type = UnmatchablePlugin.this.global
val runsAfter = List("parser")
// Using the Scala Compiler 2.8.x the runsAfter should be written as below
// val runsAfter = List[String]("parser");
val phaseName = UnmatchablePlugin.this.name
def newTransformer(unit: global.CompilationUnit) = UnmatchableTransformer
object UnmatchableTransformer extends global.Transformer {
override def transform(tree: global.Tree) = {
import global._
tree match {
case cd @ global.CaseDef(global.Bind(_, global.Typed(exp,tpt)) , _, _) => {
//Need to turn tpt.tpe.sym into a ClassDef
println("sym: " + tpt.tpe.sym)
tree
}
case t => super.transform(t)
}
}
}
}
}