Scala编译器TypeRef到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

我正在写一个插件,它监视@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)
        }
      }
    }
  }
}

通常,无法将类型/符号转换为树,因为可能有一个符号没有对应的树。例如,符号对应于二进制类文件中定义的类


但是,据我所知,您不需要ClassDef。您获得的符号已包含有关批注的所有信息。检查Symbols.scala第1115-1118行中定义的hasAnnotation和getAnnotation方法。

通常,您不能将类型/符号转换为树,因为可能有一个符号没有对应的树。例如,符号对应于二进制类文件中定义的类

但是,据我所知,您不需要ClassDef。您获得的符号已包含有关批注的所有信息。检查Symbols.scala第1115-1118行中定义的hasAnnotation和getAnnotation方法