Доступ к комментариям к документации в плагине компилятора Scala

Я хочу получить доступ к комментариям к документации из плагина компилятора Scala, запущенного после typer этап.

scala.tools.nsc.Global продолжается DocComments, поэтому я предположил, что это будет так же просто, как вызов global.cookedDocComment(symbol) но он возвращает пустую строку даже для символов, которые имеют комментарии.

Затем я посмотрел, где docComments карта обновляется: основное местоположение находится в интерактивном компиляторе

private def forceDocComment(sym: Symbol, unit: RichCompilationUnit) {
  unit.body foreachPartial {
    case DocDef(comment, defn) if defn.symbol == sym =>
      fillDocComment(defn.symbol, comment) // <- updates the map
      EmptyTree
    case _: ValOrDefDef =>
      EmptyTree
  }
}

Поэтому я попытался добавить следующий traverser:

object FindCommentsTraverser extends Traverser {
  override def traverse(tree: Tree): Unit = tree match {
    case DocDef(comment, definition) =>
      fillDocComment(definition.symbol, comment)
    case _ => super.traverse(tree)
  }
}

val unit: global.CompilationUnit = ...
FindCommentsTraverser.traverse(unit.body)

Я могу проверить, вызван ли traverser, но он никогда не встречает DocDef,

РЕДАКТИРОВАТЬ: У меня есть частичный обходной путь (комментарии объясняют, почему он только частичный, и я все еще очень хочу лучшую альтернативу):

object FindCommentsTraverser extends Traverser {
  override def traverse(tree: Tree): Unit = tree match {
    case DocDef(comment, definition) =>
      super.traverse(tree)
      // FIXME definition.symbol is NoSymbol
//        fillDocComment(definition.symbol, comment)

      // For now work around by searching for name
      val name = definition match {
        case named: NameTree => named.name.toString
      }
      symbolMap.valuesIterator.find {
        sym => sym.nameString == name
      }.foreach {
        sym => fillDocComment(sym, comment)
      }
    case _ => super.traverse(tree)
  }
}

val analyzer = new ScaladocSyntaxAnalyzer[global.type](global) {
  override val runsAfter: List[String] = Nil
  override val runsRightAfter: Option[String] = None
}
val parser = new analyzer.ScaladocUnitParser(context.unit, Nil)
val treeWithDocs = parser.parse()
FindCommentsTraverser.traverse(treeWithDocs)

где symbolMap является частью моего плагина.

0 ответов

Другие вопросы по тегам