docgenerator.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 289 行

SCALA
289
字号
object Test {  import java.io.{File, FileReader, FileWriter}  /** Tests the generation of the HTML documentation for some Scala   *  code samples (see value 'code' below) with different scaladoc   *  options (currently -access:<value>).   *   *  @author Stephane Micheloud   */  def main(args: Array[String]) {    // overwrites value of UrlContext.generator in file DocUtil.scala    System.setProperty("doc.generator", "scaladoc")    var dirname = System.getProperty("scalatest.output")    if (dirname eq null) dirname = System.getProperty("java.io.tmpdir")    val tmpDir = new File(dirname)    tmpDir.mkdirs()    test1(tmpDir)    test2(tmpDir)  }  private def test1(tmpDir: File) {    def testOptions(inFile: File, outDirName: String, opts: String*) {      val outDir = createDir(tmpDir, outDirName)      val args = Array.concat(Array("-d", outDir.getPath, inFile.getPath), opts.toArray:Array[String])      if (MainDoc.main0(args)) {        for (name <- List("all-classes.html", "index.html")) {          val outFile = new File(outDir, name)          val n = outFile.length.toInt          val in = new FileReader(outFile)          val cbuf = new Array[Char](n)          in.read(cbuf, 0, n)          println(new String(cbuf))        }        println      }    }    val inFile = {      val f = new File(tmpDir.getPath, "docgenerator1.scala")      val writer = new FileWriter(f)      writer.write(code1, 0, code1.length)      writer.close      f    }    testOptions(inFile, "test1", "") // none (default is -access:protected)    testOptions(inFile, "test2", "-access:public")    testOptions(inFile, "test3", "-access:protected")    testOptions(inFile, "test4", "-access:private")  }  private def test2(tmpDir: File) {    val code ="""package annots@deprecatedobject Foo { val x = 0 }@deprecatedclass Bar { val x = 1 }object Foo1 {  @deprecated  object Foo11 { val x = 3 }}class Bar1 {  @deprecated  object Foo11 { val x = 2 }}class Bar2 {  def bar {    @deprecated    object Foo21 { val x = 4 }    ()  }}object Foo2 {  def foo {    @deprecated    object Foo21 { val x = 5 }    ()  }}"""    val inFile = {      val f = new File(tmpDir.getPath, "docgenerator2.scala")      val writer = new FileWriter(f)      writer.write(code, 0, code.length)      writer.close      f    }    val outDir = createDir(tmpDir, "annots1")    val args = Array.concat(Array("-d", outDir.getPath, inFile.getPath))    if (MainDoc.main0(args)) {      for (name <- List("all-classes.html", "index.html")) {        val outFile = new File(outDir, name)        val n = outFile.length.toInt        val in = new FileReader(outFile)        val cbuf = new Array[Char](n)        in.read(cbuf, 0, n)        println(new String(cbuf))      }      println    }  }  object MainDoc {    import scala.tools.nsc._    import scala.tools.nsc.doc.DefaultDocDriver    import scala.tools.nsc.reporters.ConsoleReporter    def error(msg: String) { Console.err.println(msg) }    var reporter: ConsoleReporter = _    def process(args: Array[String]) {      val docSettings = new scala.tools.nsc.doc.Settings(error)      reporter = new ConsoleReporter(docSettings)      val command = new CompilerCommand(List.fromArray(args), docSettings, error, false)      try {        object compiler extends Global(command.settings, reporter) {	  override val onlyPresentation = true	}        if (reporter.hasErrors) {          reporter.flush()          return        }        val run = new compiler.Run        run compile command.files        object generator extends DefaultDocDriver {          lazy val global: compiler.type = compiler          lazy val settings = docSettings        }        generator process run.units        reporter.printSummary()      } catch {        case ex @ FatalError(msg) =>          if (command.settings.debug.value)            ex.printStackTrace();        reporter.error(null, "fatal error: " + msg)      }    }    def main(args: Array[String]) {      process(args)      exit(if (reporter.hasErrors) 1 else 0)    }    // main returning a status (no exit code)    def main0(args: Array[String]): Boolean = {      process(args)      !reporter.hasErrors    }  }  private def createDir(parent: File, dirname: String): File = {    val outDir = new File(parent, dirname)    outDir.mkdir    outDir  }  private val code1 = """package examplesabstract class C0 {  def foo_public  protected def foo_protected  private def foo_private {}  class C1_Public {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  protected class C1_Protected {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  private class C1_Private {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }}protected abstract class C0_Protected {  def foo_public  protected def foo_protected  private def foo_private {}  class C1_Public {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  protected class C1_Protected {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  private class C1_Private {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }}private abstract class C0_Private {  def foo_public  protected def foo_protected  private def foo_private {}  class C1_Public {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  protected class C1_Protected {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  private class C1_Private {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }}object obj0 {  def bar_public {}  protected def bar_protected {}  private def bar_private {}  object obj1_Public {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  protected object obj1_Protected {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  private object obj1_Private {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }}protected object obj0_Protected {  def bar_public {}  protected def bar_protected {}  private def bar_private {}  object obj1_Public {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  protected object obj1_Protected {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  private object obj1_Private {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }}private object obj0_Private {  def bar_public {}  protected def bar_protected {}  private def bar_private {}  object obj1_Public {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  protected object obj1_Protected {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }  private object obj1_Private {    val x_public = ()    protected val x_protected = ()    private val x_private = ()  }}"""}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?