scaladoc.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 607 行 · 第 1/2 页

SCALA
607
字号
  /** Sets the <code>top</code> attribute.   *   *  @param input The value of <code>top</code>.   */  def setTop(input: String): Unit =    pagetop = Some(input)  /** Sets the <code>bottom</code> attribute.   *   *  @param input The value of <code>bottom</code>.   */  def setBottom(input: String): Unit =    pagebottom = Some(input)  /** Set the <code>addparams</code> info attribute.   *   *  @param input The value for <code>addparams</code>.   */  def setAddparams(input: String): Unit =    addParams = input  /** Set the <code>deprecation</code> info attribute.   *   *  @param input One of the flags <code>yes/no</code> or <code>on/off</code>.   */  def setDeprecation(input: String): Unit =    if (Flag.isPermissible(input))      deprecation = "yes".equals(input) || "on".equals(input)    else      error("Unknown deprecation flag '" + input + "'")  /** Set the <code>unchecked</code> info attribute.   *   *  @param input One of the flags <code>yes/no</code> or <code>on/off</code>.   */  def setUnchecked(input: String): Unit =    if (Flag.isPermissible(input))      unchecked = "yes".equals(input) || "on".equals(input)    else      error("Unknown unchecked flag '" + input + "'")/*============================================================================*\**                             Properties getters                             **\*============================================================================*/  /** Gets the value of the <code>classpath</code> attribute in a   *  Scala-friendly form.   *   *  @return The class path as a list of files.   */  private def getClasspath: List[File] =    if (classpath.isEmpty) error("Member 'classpath' is empty.")    else List.fromArray(classpath.get.list()).map(nameToFile)  /** Gets the value of the <code>origin</code> attribute in a Scala-friendly   *  form.   *   *  @return The origin path as a list of files.   */  private def getOrigin: List[File] =    if (origin.isEmpty) error("Member 'origin' is empty.")    else List.fromArray(origin.get.list()).map(nameToFile)  /** Gets the value of the <code>destination</code> attribute in a   *  Scala-friendly form.   *   *  @return The destination as a file.   */  private def getDestination: File =    if (destination.isEmpty) error("Member 'destination' is empty.")    else existing(getProject().resolveFile(destination.get.toString))  /** Gets the value of the <code>sourcepath</code> attribute in a   *  Scala-friendly form.   *   *  @return The source path as a list of files.   */  private def getSourcepath: List[File] =    if (sourcepath.isEmpty) error("Member 'sourcepath' is empty.")    else List.fromArray(sourcepath.get.list()).map(nameToFile)  /** Gets the value of the <code>bootclasspath</code> attribute in a   *  Scala-friendly form.   *   *  @return The boot class path as a list of files.   */  private def getBootclasspath: List[File] =    if (bootclasspath.isEmpty) error("Member 'bootclasspath' is empty.")    else List.fromArray(bootclasspath.get.list()).map(nameToFile)  /** Gets the value of the <code>extdirs</code> attribute in a   *  Scala-friendly form.   *   *  @return The extensions path as a list of files.   */  private def getExtdirs: List[File] =    if (extdirs.isEmpty) error("Member 'extdirs' is empty.")    else List.fromArray(extdirs.get.list()).map(nameToFile)/*============================================================================*\**                       Compilation and support methods                      **\*============================================================================*/  /** This is forwarding method to circumvent bug #281 in Scala 2. Remove when   *  bug has been corrected.   */  override protected def getDirectoryScanner(baseDir: java.io.File) =    super.getDirectoryScanner(baseDir)  /** Transforms a string name into a file relative to the provided base   *  directory.   *   *  @param base A file pointing to the location relative to which the name   *              will be resolved.   *  @param name A relative or absolute path to the file as a string.   *  @return     A file created from the name and the base file.   */  private def nameToFile(base: File)(name: String): File =    existing(fileUtils.resolveFile(base, name))  /** Transforms a string name into a file relative to the build root   *  directory.   *   *  @param name A relative or absolute path to the file as a string.   *  @return     A file created from the name.   */  private def nameToFile(name: String): File =    existing(getProject().resolveFile(name))  /** Tests if a file exists and prints a warning in case it doesn't. Always   *  returns the file, even if it doesn't exist.   *   *  @param file A file to test for existance.   *  @return     The same file.   */  private def existing(file: File): File = {    if (!file.exists())      log("Element '" + file.toString + "' does not exist.",          Project.MSG_WARN)    file  }  /** Transforms a path into a Scalac-readable string.   *   *  @param path A path to convert.   *  @return     A string-representation of the path like <code>a.jar:b.jar</code>.   */  private def asString(path: List[File]): String =    path.map(asString).mkString("", File.pathSeparator, "")  /** Transforms a file into a Scalac-readable string.   *   *  @param path A file to convert.   *  @return     A string-representation of the file like <code>/x/k/a.scala</code>.   */  private def asString(file: File): String =    file.getAbsolutePath()  /** Generates a build error. Error location will be the current task in the     *  ant file.   *   *  @param message         A message describing the error.   *  @throws BuildException A build error exception thrown in every case.   */  private def error(message: String): Nothing =    throw new BuildException(message, getLocation())/*============================================================================*\**                           The big execute method                           **\*============================================================================*/  /** Initializes settings and source files */  protected def initialize: Pair[scala.tools.nsc.doc.Settings, List[File]] = {    // Tests if all mandatory attributes are set and valid.    if (origin.isEmpty) error("Attribute 'srcdir' is not set.")    if (getOrigin.isEmpty) error("Attribute 'srcdir' is not set.")    if (!destination.isEmpty && !destination.get.isDirectory())      error("Attribute 'destdir' does not refer to an existing directory.")    if (destination.isEmpty) destination = Some(getOrigin.head)    val mapper = new GlobPatternMapper()    mapper.setTo("*.html")    mapper.setFrom("*.scala")    // Scans source directories to build up a compile lists.    // If force is false, only files were the .class file in destination is    // older than the .scala file will be used.    val sourceFiles: List[File] =      for {        originDir <- getOrigin        originFile <- {          val includedFiles =            getDirectoryScanner(originDir).getIncludedFiles()          val list = List.fromArray(includedFiles)          if (list.length > 0)            log(              "Documenting " + list.length + " source file" +              (if (list.length > 1) "s" else "") +              (" to " + getDestination.toString)            )          else            log("No files selected for documentation", Project.MSG_VERBOSE)          list        }      } yield {        log(originFile, Project.MSG_DEBUG)        nameToFile(originDir)(originFile)      }    def decodeEscapes(s: String): String = {      // In Ant script characters '<' and '>' must be encoded when      // used in attribute values, e.g. for attributes "doctitle", "header", ..      // in task Scaladoc you may write:      //   doctitle="&lt;div&gt;Scala&lt;/div&gt;"      // so we have to decode them here.      s.replaceAll("&lt;", "<").replaceAll("&gt;",">")       .replaceAll("&amp;", "&").replaceAll("&quot;", "\"")    }    // Builds-up the compilation settings for Scalac with the existing Ant    // parameters.    val docSettings = new scala.tools.nsc.doc.Settings(error)    docSettings.outdir.value = asString(destination.get)    if (!classpath.isEmpty)      docSettings.classpath.value = asString(getClasspath)    if (!sourcepath.isEmpty)      docSettings.sourcepath.value = asString(getSourcepath)    /*else if (origin.get.size() > 0)      settings.sourcepath.value = origin.get.list()(0)*/    if (!bootclasspath.isEmpty)      docSettings.bootclasspath.value = asString(getBootclasspath)    if (!extdirs.isEmpty) docSettings.extdirs.value = asString(getExtdirs)    if (!encoding.isEmpty) docSettings.encoding.value = encoding.get    if (!windowtitle.isEmpty) docSettings.windowtitle.value = windowtitle.get    if (!doctitle.isEmpty) docSettings.doctitle.value = decodeEscapes(doctitle.get)    if (!stylesheetfile.isEmpty) docSettings.stylesheetfile.value = stylesheetfile.get    if (!pageheader.isEmpty) docSettings.pageheader.value = decodeEscapes(pageheader.get)    if (!pagefooter.isEmpty) docSettings.pagefooter.value = decodeEscapes(pagefooter.get)    if (!pagetop.isEmpty) docSettings.pagetop.value = decodeEscapes(pagetop.get)    if (!pagebottom.isEmpty) docSettings.pagebottom.value = decodeEscapes(pagebottom.get)    docSettings.deprecation.value = deprecation    docSettings.unchecked.value = unchecked    log("Scaladoc params = '" + addParams + "'", Project.MSG_DEBUG)    var args =      if (addParams.trim() == "") Nil      else List.fromArray(addParams.trim().split(" ")).map(_.trim())    while (!args.isEmpty) {      val argsBuf = args      if (args.head startsWith "-") {        for (docSetting <- docSettings.allSettings)          args = docSetting.tryToSet(args);      } else error("Parameter '" + args.head + "' does not start with '-'.")      if (argsBuf eq args)        error("Parameter '" + args.head + "' is not recognised by Scaladoc.")    }    Pair(docSettings, sourceFiles)  }  /** Performs the compilation. */  override def execute() = {    val Pair(commandSettings, sourceFiles) = initialize    val reporter = new ConsoleReporter(commandSettings)    // Compiles the actual code    val compiler = new Global(commandSettings, reporter) {      override val onlyPresentation = true    }    try {      val run = new compiler.Run      run.compile(sourceFiles.map (_.toString))      object generator extends DefaultDocDriver {        lazy val global: compiler.type = compiler        lazy val settings = commandSettings      }      generator.process(run.units)      if (reporter.ERROR.count > 0)        error(          "Document failed with " +          reporter.ERROR.count + " error" +          (if (reporter.ERROR.count > 1) "s" else "") +          "; see the documenter error output for details.")      else if (reporter.WARNING.count > 0)        log(          "Document succeeded with " +          reporter.WARNING.count + " warning" +          (if (reporter.WARNING.count > 1) "s" else "") +          "; see the documenter output for details.")      reporter.printSummary()    } catch {      case exception: Throwable if (exception.getMessage ne null) =>        exception.printStackTrace()        error("Document failed because of an internal documenter error (" +          exception.getMessage + "); see the error output for details.")      case exception =>        exception.printStackTrace()        error("Document failed because of an internal documenter error " +          "(no error message provided); see the error output for details.")    }  }}

⌨️ 快捷键说明

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