Scala编译器TypeRef到ClassDef
我正在写一个插件,它监视@unmatchable注释,如果在模式匹配中发现,就会抛出警告 我已经能够找到TypeRef,但是我无法将其转换为ClassDef,以便检查注释 我猜我需要得到树的根并使用TreeOpts.find来获得实际的ClassDef。但是,我找不到根树在哪里 编辑:我需要不止根编译单元,以防库中包含匹配的注释 这是我到目前为止所拥有的Scala编译器TypeRef到ClassDef,scala,compiler-construction,Scala,Compiler Construction,我正在写一个插件,它监视@unmatchable注释,如果在模式匹配中发现,就会抛出警告 我已经能够找到TypeRef,但是我无法将其转换为ClassDef,以便检查注释 我猜我需要得到树的根并使用TreeOpts.find来获得实际的ClassDef。但是,我找不到根树在哪里 编辑:我需要不止根编译单元,以防库中包含匹配的注释 这是我到目前为止所拥有的 class UnmatchablePlugin(val global: Global) extends Plugin { val name
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)
}
}
}
}
}
通常,无法将类型/符号转换为树,因为可能有一个符号没有对应的树。例如,符号对应于二进制类文件中定义的类
但是,据我所知,您不需要ClassDef。您获得的符号已包含有关批注的所有信息。检查Symbols.scala第1115-1118行中定义的hasAnnotation和getAnnotation方法。通常,您不能将类型/符号转换为树,因为可能有一个符号没有对应的树。例如,符号对应于二进制类文件中定义的类 但是,据我所知,您不需要ClassDef。您获得的符号已包含有关批注的所有信息。检查Symbols.scala第1115-1118行中定义的hasAnnotation和getAnnotation方法