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="<div>Scala</div>" // so we have to decode them here. s.replaceAll("<", "<").replaceAll(">",">") .replaceAll("&", "&").replaceAll(""", "\"") } // 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 + -
显示快捷键?