Доступ к комментариям к документации в плагине компилятора 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
является частью моего плагина.