Scala编译器TypeRef到ClassDef

时间:2011-07-26 22:13:38

标签: scala compiler-construction

我正在编写一个插件,它会监视@unmatchable注释,如果在模式匹配中找到它,则会发出警告。

我已经能够找到TypeRef,但我无法将其转换为ClassDef,因此我可以检查annoations。

我猜我需要获取树的根并使用TreeOpts.find来获取实际的ClassDef。但是,我无法找到根树的位置。

编辑:如果库中包含可匹配的annoation,我需要的不仅仅是根编译单元。

这是我到目前为止所拥有的。

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)
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

通常,您无法将类型/符号转换为树,因为可能存在没有与之对应的树的符号。例如,当符号对应于二进制类文件中定义的类时,就是这种情况。

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