Scala Компилятор TypeRef to ClassDef - PullRequest
2 голосов
/ 27 июля 2011

Я пишу плагин, который отслеживает аннотацию @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)
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 28 июля 2011

Как правило, вы не можете превращать типы / символы в деревья, поскольку может существовать символ, которому не соответствует дерево. Например, это тот случай, когда символ соответствует классу, определенному в двоичном файле классов.

Однако, насколько я понимаю, что вы пытаетесь сделать, вам не нужен ClassDef. Полученные символы уже содержат всю информацию об аннотациях. Проверьте методы hasAnnotation и getAnnotation, определенные в Symbols.scala (строки 1115-1118).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...