summaryrefslogblamecommitdiff
path: root/test/files/presentation/doc/doc.scala
blob: 475d92b861bc07a19b23e69c615e35f75310daa6 (plain) (tree)
1
2
                          
                                 



























                                                                                                       







                                                                                             
                                                              













                                                                                    
     


                                  

















                                                                                            








                                                                                                                                                  
               
                                                             




           
import scala.tools.nsc.doc
import scala.tools.nsc.doc.base._
import scala.tools.nsc.doc.base.comment._
import scala.tools.nsc.interactive._
import scala.tools.nsc.interactive.tests._
import scala.tools.nsc.util._
import scala.tools.nsc.io._

object Test extends InteractiveTest {
  override val settings: doc.Settings = docSettings

  val tags = Seq(
    "@example  `\"abb\".permutations = Iterator(abb, bab, bba)`",
    "@version 1.0, 09/07/2012",
    "@since 2.10",
    "@todo this method is unsafe",
    "@note Don't inherit!",
    "@see some other method"
  )

  val comment = "This is a test comment."
  val caret = "<caret>"

  def text(nTags: Int) = 
    """|/** %s
       |
       | *  %s */
       |trait Commented {}
       |class User(c: %sCommented)""".stripMargin.format(comment, tags take nTags mkString "\n", caret)

  override lazy val compiler = {
    new {
      override val settings = {
        prepareSettings(Test.this.settings)
        Test.this.settings
      }
    } with Global(settings, compilerReporter) with MemberLookupBase with CommentFactoryBase {
      val global: this.type = this
      def chooseLink(links: List[LinkTo]): LinkTo = links.head
      def internalLink(sym: Symbol, site: Symbol) = None
      def toString(link: LinkTo) = link.toString

      def getComment(sym: Symbol, source: SourceFile) = {
        val docResponse = new Response[(String, String, Position)]
        askDocComment(sym, sym.owner, source, docResponse)
        docResponse.get.left.toOption flatMap {
          case (expanded, raw, pos) =>
            if (expanded.isEmpty)
              None
            else
              Some(ask { () => parseAtSymbol(expanded, raw, pos, Some(sym.owner)) })
        }
      }
    }
  }

  override def runDefaultTests() {
    for (i <- 1 to tags.length) {
      val markedText = text(i)
      val idx = markedText.indexOf(caret)
      val fileText = markedText.substring(0, idx) + markedText.substring(idx + caret.length)
      val source = sourceFiles(0) 
      val batch = new BatchSourceFile(source.file, fileText.toCharArray)
      val reloadResponse = new Response[Unit]
      compiler.askReload(List(batch), reloadResponse)
      reloadResponse.get.left.toOption match {
        case None =>
          reporter.println("Couldn't reload")
        case Some(_) =>
          val treeResponse = new compiler.Response[compiler.Tree]
          val pos = compiler.rangePos(batch, idx, idx, idx)
          compiler.askTypeAt(pos, treeResponse)
          treeResponse.get.left.toOption match {
            case Some(tree) =>
              val sym = tree.tpe.typeSymbol
              compiler.getComment(sym, batch) match {
                case None => println("Got no doc comment")
                case Some(comment) =>
                  import comment._
                  val tags: List[(String, Iterable[Body])] =
                    List(("@example", example), ("@version", version), ("@since", since.toList), ("@todo", todo), ("@note",  note), ("@see", see))
                  val str = ("body:" + body + "\n") + 
                    tags.map{ case (name, bodies) => name + ":" + bodies.mkString("\n") }.mkString("\n")
                  println(str)
              }
            case None => println("Couldn't find a typedTree")
          }
      }
    }
  }
}