summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McDirmid <sean.mcdirmid@gmail.com>2007-04-27 02:09:40 +0000
committerSean McDirmid <sean.mcdirmid@gmail.com>2007-04-27 02:09:40 +0000
commitb1d88408776eb4e93546ca5c78b17d2bed7b88f4 (patch)
tree93a1007faa2f032274dfee6273d90d59bc512b35
parent8d2349581f5694704fb1bebc713339d46823ec67 (diff)
downloadscala-b1d88408776eb4e93546ca5c78b17d2bed7b88f4.tar.gz
scala-b1d88408776eb4e93546ca5c78b17d2bed7b88f4.tar.bz2
scala-b1d88408776eb4e93546ca5c78b17d2bed7b88f4.zip
Adding eclipse meta data.
-rw-r--r--.classpath12
-rw-r--r--.project29
-rw-r--r--META-INF/MANIFEST.MF25
-rw-r--r--src/compiler/scala/tools/nsc/CompilationUnits.scala2
-rw-r--r--src/compiler/scala/tools/nsc/CompileServer.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Scanners.scala31
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Tokens.scala4
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocGenerator.scala1358
-rw-r--r--src/compiler/scala/tools/nsc/doc/ModelExtractor.scala2
-rw-r--r--src/compiler/scala/tools/nsc/doc/ModelFrames.scala13
-rw-r--r--src/compiler/scala/tools/nsc/util/Position.scala41
-rw-r--r--src/compiler/scala/tools/nsc/util/SourceFile.scala7
12 files changed, 112 insertions, 1414 deletions
diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000000..6494ce68fc
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/compiler"/>
+ <classpathentry exported="true" kind="lib" path="build/quick/lib/compiler/"/>
+ <classpathentry exported="true" kind="lib" path="lib/fjbg.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/msil.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ant-contrib.jar"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry exported="true" kind="lib" path="build/quick/lib/library" sourcepath="src/library"/>
+ <classpathentry kind="output" path="build/quick/lib/compiler"/>
+</classpath>
diff --git a/.project b/.project
new file mode 100644
index 0000000000..71b4782bbe
--- /dev/null
+++ b/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>scala</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>ch.epfl.lamp.sdt.core.scalabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>ch.epfl.lamp.sdt.core.scalanature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..65d696ebde
--- /dev/null
+++ b/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Scala Compiler
+Bundle-SymbolicName: nsc;singleton:=true
+Bundle-Version: 1.0.0
+Eclipse-LazyStart: true
+Bundle-ClassPath: lib/fjbg.jar,
+ build/quick/lib/library/,
+ build/quick/lib/compiler/
+Export-Package: ch.epfl.lamp.fjbg,
+ scala,
+ scala.collection,
+ scala.runtime,
+ scala.collection.immutable,
+ scala.collection.mutable,
+ scala.collection.jcl,
+ scala.util,
+ scala.tools.nsc,
+ scala.tools.nsc.util,
+ scala.tools.nsc.typechecker,
+ scala.tools.nsc.symtab,
+ scala.tools.nsc.ast,
+ scala.tools.nsc.ast.parser,
+ scala.tools.nsc.reporters
+Require-Bundle: org.apache.ant
diff --git a/src/compiler/scala/tools/nsc/CompilationUnits.scala b/src/compiler/scala/tools/nsc/CompilationUnits.scala
index 6ee28f477b..b45ce29a27 100644
--- a/src/compiler/scala/tools/nsc/CompilationUnits.scala
+++ b/src/compiler/scala/tools/nsc/CompilationUnits.scala
@@ -28,7 +28,7 @@ trait CompilationUnits requires Global {
*/
val depends = new HashSet[Symbol]
- def position(pos: Int) = new OffsetPosition(source, pos)
+ def position(pos: Int) = source.position(pos)
/** The icode representation of classes in this compilation unit.
* It is empty up to phase 'icode'.
diff --git a/src/compiler/scala/tools/nsc/CompileServer.scala b/src/compiler/scala/tools/nsc/CompileServer.scala
index cefb1ffa60..89620b5687 100644
--- a/src/compiler/scala/tools/nsc/CompileServer.scala
+++ b/src/compiler/scala/tools/nsc/CompileServer.scala
@@ -10,7 +10,7 @@ import java.io.{BufferedOutputStream, File, FileOutputStream, PrintStream}
import java.lang.{Runtime, System, Thread}
import scala.concurrent.ops.spawn
-import scala.tools.nsc.doc.DocGenerator
+import scala.tools.nsc.doc.{DocDriver => DocGenerator}
import scala.tools.nsc.reporters.{Reporter, ConsoleReporter}
import scala.tools.nsc.util.FakePos //Position
import scala.tools.util.SocketServer
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
index 42a89f142f..36188676c8 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
@@ -426,23 +426,23 @@ trait Scanners {
val last = in.last
in.next
last match {
- case ' '|'\t'|'\n'|'{'|'('|'>' if xml.Parsing.isNameStart(in.ch) || in.ch == '!' || in.ch == '?' =>
- token = XMLSTART
- case _ =>
- // Console.println("found '<', but last is '"+in.last+"'"); // DEBUG
- putChar('<')
- getOperatorRest
+ case ' '|'\t'|'\n'|'{'|'('|'>' if xml.Parsing.isNameStart(in.ch) || in.ch == '!' || in.ch == '?' =>
+ token = XMLSTART
+ case _ =>
+ // Console.println("found '<', but last is '"+in.last+"'"); // DEBUG
+ putChar('<')
+ getOperatorRest
}
return
- case '~' | '!' | '@' | '#' | '%' |
- '^' | '*' | '+' | '-' | /*'<' | */
- '>' | '?' | ':' | '=' | '&' |
- '|' | '\\' =>
- putChar(in.ch)
- in.next
- getOperatorRest; // XXX
- return
+ case '~' | '!' | '@' | '#' | '%' |
+ '^' | '*' | '+' | '-' | /*'<' | */
+ '>' | '?' | ':' | '=' | '&' |
+ '|' | '\\' =>
+ putChar(in.ch)
+ in.next
+ getOperatorRest; // XXX
+ return
case '/' if !matchInScanner =>
in.next
@@ -878,8 +878,7 @@ trait Scanners {
case '\'' => putChar('\'')
case '\\' => putChar('\\')
case _ =>
- syntaxError(in.cpos - 1, // Position.encode(in.cline, in.ccol - 1),
- "invalid escape character")
+ syntaxError(in.cpos - 1, "invalid escape character")
putChar(in.ch)
}
in.next
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Tokens.scala b/src/compiler/scala/tools/nsc/ast/parser/Tokens.scala
index 914f92ee8b..2d157e350a 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Tokens.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Tokens.scala
@@ -107,4 +107,8 @@ object Tokens {
final val BACK_QUOTE = 102
final val MULTI_QUOTE = 103
final val EMPTY_STRING = 104
+ final val WHITESPACE = 105
+ final val IGNORE = 106
+ final val XML_SINGLEEND = 107
+ final val XML_STARTEND = 108
}
diff --git a/src/compiler/scala/tools/nsc/doc/DocGenerator.scala b/src/compiler/scala/tools/nsc/doc/DocGenerator.scala
deleted file mode 100644
index 5972a59d33..0000000000
--- a/src/compiler/scala/tools/nsc/doc/DocGenerator.scala
+++ /dev/null
@@ -1,1358 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2007 LAMP/EPFL
- * @author Sean McDirmid
- */
-// $Id$
-
-package scala.tools.nsc.doc
-
-import java.io.{File, FileOutputStream, FileWriter}
-import java.net.URLEncoder
-import java.util.StringTokenizer
-import java.util.regex.Pattern
-
-import compat.Platform.{EOL => LINE_SEPARATOR}
-import scala.collection.immutable.{ListMap, TreeMap, TreeSet}
-import scala.collection.mutable.{HashMap, HashSet, ListBuffer, Map}
-import scala.tools.nsc.models.Models
-import scala.tools.nsc.symtab.Flags
-import scala.xml._
-
-/**
- * @author Sean McDirmid, Stephane Micheloud
- * @version 1.0
- */
-abstract class DocGenerator extends Models {
- import global._
- import DocUtil._
- import Kinds._
-
-
- def outdir: String
- def windowTitle: String
- def documentTitle: String
- def contentFrame = "contentFrame"
- def classesFrame = "classesFrame"
- def modulesFrame = "modulesFrame"
- def emptyMap = ListMap.empty[Kind, TreeSet[HasTree]]
-
- override def acceptPrivate = false
-
- abstract class Frame extends UrlContext {
- def path: String // relative to outdir
- def relative: String = {
- assert(path ne null)
- var idx = 0
- var ct = new StringBuilder
- while (idx != -1) {
- idx = path.indexOf('/', idx)
- //System.err.println(path + " idx=" + idx)
- ct.append(if (idx != -1) "../" else "")
- idx = idx + (if (idx == -1) 0 else 1)
- }
- ct.toString
- }
-
- def body: NodeSeq
- def title: String
-
- def save(nodes: NodeSeq) = {
- val path0 = outdir + File.separator + path + FILE_EXTENSION_HTML
- if (settings.debug.value) inform("Writing XML nodes to " + path0)
- val file = new File(path0)
- val parent = file.getParentFile()
- if (!parent.exists()) parent.mkdirs()
- val writer = new FileWriter(file)
- val str = dtype + LINE_SEPARATOR + nodes.toString()
- writer.write(str, 0, str.length())
- writer.close()
- }
-
- /**
- * @param sym ...
- * @param target ...
- * @return ...
- */
- def urlFor(tree: Tree, target: String): NodeSeq = try {
- val sym = tree.symbol
- if (sym == NoSymbol)
- Text(tree.asInstanceOf[ValOrDefDef].name.toString())
- else if (sym.sourceFile eq null)
- Text(sym.fullNameString('.'))
- else
- aref(urlFor(sym), target, sym.nameString)
- } catch {
- case e: Error =>
- //System.err.println("SYM=" + sym)
- Text(tree.symbol.toString())
- }
-
- /**
- * @param tpe ...
- * @param target ...
- * @return ...
- */
- def urlFor(tpe: Type, target: String): NodeSeq = try {
- if (tpe.symbol.hasFlag(Flags.JAVA) || (tpe.symbol.sourceFile eq null))
- <a class={tpe.toString().replace('.', '/')} href=""
- target={target}>{tpe.toString()}</a>
- /*
- else if (tpe.symbol.sourceFile eq null)
- Text(tpe.toString())
- */
- else {
- val n = tpe.typeArgs.length
- if (n > 0) {
- if (definitions.isFunctionType(tpe)) {
- val (ts, List(r)) = tpe.typeArgs.splitAt(n-1)
- Text("(") ++ (
- if (ts.isEmpty) NodeSeq.Empty
- else
- urlFor(ts.head, target) ++ {
- val sep = Text(", ")
- for (t <- ts.tail)
- yield Group(sep ++ urlFor(t, target))
- }
- )
- .++ (Text(") => ")) ++ (urlFor(r, target))
- } else
- aref(urlFor(tpe.symbol), target, tpe.symbol.fullNameString)
- .++ (Text("[") ++ urlFor(tpe.typeArgs.head, target)
- .++ {
- val sep = Text(", ")
- for (t <- tpe.typeArgs.tail)
- yield Group(sep ++ urlFor(t, target))
- }
- .++ (Text("]")))
- } else tpe match {
- case RefinedType(parents, _) =>
- //Console.println("***** parents= " + parents)//debug
- val parents1 =
- if ((parents.length > 1) &&
- (parents.head.symbol eq definitions.ObjectClass)) parents.tail
- else parents
- aref(urlFor(parents1.head.symbol), target, parents1.head.toString())
- .++ {
- val sep = Text(" with ")
- for (t <- parents1.tail)
- yield Group(sep ++ urlFor(t, target))
- }
- case _ =>
- aref(urlFor(tpe.symbol), target, tpe.toString())
- }
- }
- } catch {
- case e: Error =>
- //System.err.println("SYM=" + sym)
- Text(tpe.symbol.toString())
- }
-
- def urlFor0(sym: Symbol, orig: Symbol): String = {
- (if (sym == NoSymbol) "XXX"
- else if (sym.owner.isPackageClass) sym.fullNameString('/')
- else urlFor0(sym.owner, orig) + "." + Utility.escape(sym.nameString)) +
- (sym match {
- case msym: ModuleSymbol =>
- if (msym hasFlag Flags.PACKAGE) NAME_SUFFIX_PACKAGE
- else NAME_SUFFIX_OBJECT
- case csym: ClassSymbol =>
- if (csym.isModuleClass) {
- if (csym hasFlag Flags.PACKAGE) NAME_SUFFIX_PACKAGE
- else NAME_SUFFIX_OBJECT
- }
- else ""
- case _ =>
- //System.err.println("XXX: class or object " + orig + " not found in " + sym)
- "" //"XXXXX"
- })
- }
-
- private val patVal = Pattern.compile(
- "scala\\.(Byte|Boolean|Char|Double|Float|Int|Long|Short)")
-
- def docName(sym: Symbol): String = {
- def javaParams(paramTypes: List[Type]): String = {
- def javaName(pt: Type): String = {
- val s = pt.toString
- val matVal = patVal.matcher(s)
- if (matVal.matches) matVal.group(1).toLowerCase
- else s.replaceAll("\\$", ".")
- }
- paramTypes.map(pt => javaName(pt)).mkString("(", ",", ")")
- }
- def scalaParams(paramTypes: List[Type]): String = {
- def scalaName(pt: Type): String = pt.toString.replaceAll(" ", "")
- paramTypes.map(pt => scalaName(pt)).mkString("(", ",", ")")
- }
- URLEncoder.encode(sym.nameString +
- (sym.tpe match {
- case MethodType(paramTypes, _) =>
- if (sym hasFlag Flags.JAVA) javaParams(paramTypes)
- else scalaParams(paramTypes)
- case PolyType(_, MethodType(paramTypes, _)) =>
- if (sym hasFlag Flags.JAVA) javaParams(paramTypes)
- else scalaParams(paramTypes)
- case _ => ""
- }), encoding)
- }
-
- def urlFor(sym: Symbol): String = sym match {
- case msym: ModuleSymbol => urlFor0(sym, sym) + FILE_EXTENSION_HTML
- case csym: ClassSymbol => urlFor0(sym, sym) + FILE_EXTENSION_HTML
- case _ => urlFor(sym.owner) + "#" + docName(sym)
- }
-
- def hasBody = true
-
- save(page(title, body, hasBody))
- }
-
- private val doctitle: NodeSeq =
- <div class="doctitle-larger">
- {load(documentTitle)}
- </div>;
-
- abstract class ListModuleFrame extends Frame {
- override val path = "modules"
- override val title = "List of all packages"
- def modules: TreeMap[String, ModuleClassSymbol]
- def body: NodeSeq =
- <div>
- {doctitle}
- <a href="all-classes.html" target={classesFrame} onclick="resetKind();">{"All objects and classes"}</a>
- </div>
- <div class="kinds">
- Packages
- </div>
- <ul class="list">
- { {
- for (top <- modules.elements.toList) yield
- <li><a href={urlFor(top._2)} target={classesFrame} onclick="resetKind();">{top._2.fullNameString('.')}</a></li>
- } }
- </ul>;
- }
-
- abstract class ListModuleContentFrame extends Frame {
- val path = "root-content"
- val title = "All Packages"
- def modules: TreeMap[String, ModuleClassSymbol]
- def body: NodeSeq =
- <div class="page-title">
- Scala 2
- <br/>API Specification
- </div>
- <p>
- This document is the API specification for Scala 2.
- </p><hr/>
- <table cellpadding="3" class="member" summary="">
- <tr><td colspan="2" class="title">
- Package Summary
- </td></tr>
- { {
- for (top <- modules.elements.toList) yield
- <tr><td class="signature">
- <code>{Text("package")}
- {(aref(top._2.fullNameString('/') + "$content.html", "_self", top._2.fullNameString('.')))}</code>
- </td></tr>;
- } }
- </table>;
- }
-
- abstract class ListClassFrame extends Frame {
- def classes: ListMap[Kind, TreeSet[HasTree]]
-
- def navLabel: String
-
- private def path0 = {
- val p = path
- if (p endsWith NAME_SUFFIX_PACKAGE)
- p.substring(0, p.length() - NAME_SUFFIX_PACKAGE.length())
- else p
- }
-
- def body: NodeSeq = {
- val nav =
- <table class="navigation" summary="">
- <tr><td valign="top" class="navigation-links">
- {aref(path0 + "$content.html", contentFrame, navLabel)}
- </td></tr>
- </table>;
-
- val ids = new HashSet[String]
- def idFor(kind: Kind, t: Tree): String = {
- val ch = t.symbol.nameString.charAt(0)
- val id = pluralFor(kind) + "_" + ch
- if (ids contains id) null
- else { ids += id; id }
- }
- val body = <div>{ { for (kind <- KINDS if classes contains kind) yield {
- <div id={pluralFor(kind)} class="kinds">
- {Text(pluralFor(kind))}
- </div>
- <ul class="list">
- { {
- for (mmbr <- classes(kind).toList) yield
- <li id={idFor(kind, mmbr.tree)}>{urlFor(mmbr.tree, contentFrame)}</li>
- } }
- </ul>
- } } }</div>;
-
- nav ++ body
- }
- }
-
- abstract class ContentFrame0 extends Frame {
- private def extendsFor(mmbr: HasTree): NodeSeq = mmbr match {
- case mmbr: ImplMod =>
- val parents = mmbr.treey.impl.parents
- if (parents.isEmpty) NodeSeq.Empty
- else
- <dd>
- <code>{Text(" extends ")}</code>{forType(parents.head.tpe)}
- </dd> ++ (
- { {
- for (parent <- parents.tail) yield
- <dd>
- <code>{Text(" with ")}</code>{forType(parent.tpe)}
- </dd>
- } })
- case _ =>
- NodeSeq.Empty
- }
-
- private def nameFor(tree: Tree) =
- if (tree.symbol == NoSymbol) tree.asInstanceOf[ValOrDefDef].name.toString()
- else tree.symbol.nameString
-
- private def attrsFor(tree: Tree): NodeSeq =
- if (tree.symbol.attributes.isEmpty || tree.symbol.hasFlag(Flags.CASE))
- NodeSeq.Empty
- else {
- def attrFor(attr: AnnotationInfo[Constant]): Node = {
- val buf = new StringBuilder
- val AnnotationInfo(tpe, args, nvPairs) = attr
- val name = aref(urlFor(tpe.symbol), contentFrame, tpe.toString)
- if (!args.isEmpty)
- buf.append(args.map(.escapedStringValue).mkString("(", ",", ")"))
- if (!nvPairs.isEmpty)
- for (((name, value), index) <- nvPairs.zipWithIndex) {
- if (index > 0)
- buf.append(", ")
- buf.append(name).append(" = ").append(value)
- }
- Group(name ++ Text(buf.toString))
- }
- val sep = Text("@")
- for (attr <- tree.symbol.attributes)
- yield Group(br(sep ++ attrFor(attr)))
- }
-
- /**
- * @param mmbr ...
- * @return ...
- */
- def fullHeader(mmbr: HasTree): NodeSeq = Group(
- { {
- if (mmbr.isInstanceOf[ImplMod]) NodeSeq.Empty
- //else <a name={Utility.escape(mmbr.tree.symbol.nameString)}></a>
- else <a name={docName(mmbr.tree.symbol)}></a>
- } } ++ (
- <dl>
- <dt>
- { attrsFor(mmbr.tree) }
- <code>
- { { for (str <- stringsFor(mmbr.mods)) yield Text(str + " ") } }
- { Text(codeFor(mmbr.kind)) }
- </code>
- <em>{ Text(nameFor(mmbr.tree)) }</em>
- { typesFor(mmbr) }{ argsFor(mmbr)}{resultFor(mmbr) }
- </dt>
- <dd>{ extendsFor(mmbr) }</dd>
- </dl>) ++ fullComment(mmbr) ++ hr(listSubclasses(mmbr)) ++ lists(mmbr))
-// { lists(mmbr) }
-
- /** Return a NodeSeq with the known subclasses for <code>mmbr</code>, if any.
- *
- * @param mmbr ...
- * @return ...
- */
- def listSubclasses(mmbr: HasTree): NodeSeq = {
- val subcs = subclasses(mmbr.tree.symbol)
- if (subcs.isEmpty)
- NodeSeq.Empty
- else
- <dl>
- <dt style="margin:10px 0 0 20px;">
- <b>Direct Known Subclasses:</b>
- </dt>
- <dd>{ {
- val links =
- for (subc <- subcs)
- yield aref(urlFor(subc), contentFrame, subc.nameString)
- links.reduceRight { (link: Seq[Node], seq: Seq[Node]) => link ++ Text(", ") ++ seq }
- } }</dd>
- </dl>;
- }
-
- def lists(mmbr: HasTree): NodeSeq = mmbr match {
- case cmod: ImplMod =>
- <span>
- { listMembersShort(mmbr) }
- { listMembersFull(mmbr) }
- </span>
- case _ =>
- NodeSeq.Empty
- }
-
- /**
- * @param mmbr ...
- * @return ...
- */
- def listMembersShort(mmbr: HasTree): NodeSeq =
- if (mmbr.isInstanceOf[Composite]) {
- val map = organize(mmbr.asInstanceOf[Composite], emptyMap)
- for (kind <- KINDS) yield Group(
- (if (map contains kind)
- <table cellpadding="3" class="member" summary="">
- <tr>
- <td colspan="2" class="title">{Text(labelFor(kind))} Summary</td>
- </tr>
- { {
- for (mmbr <- map(kind).toList) yield shortHeader(mmbr)
- } }
- </table>
- else
- NodeSeq.Empty
- ) ++ (listInheritedMembers(mmbr.tree.symbol, kind)))
- } else
- NodeSeq.Empty
-
- /**
- * @param sym the symbol
- * @param kind the selected kind of members
- * @return a sequence of HTML tables containing inherited members
- */
- def listInheritedMembers(sym: Symbol, kind: Kind): NodeSeq = {
- val ignored = List(definitions.ObjectClass, definitions.ScalaObjectClass)
- def isVisible(sym: Symbol) =
- (kind == DEF && sym.isMethod && !sym.isConstructor &&
- !sym.isCaseFactory && !sym.hasFlag(Flags.ACCESSOR)) ||
- (kind == VAR && sym.isVariable) ||
- (kind == VAL && sym.isValue && !sym.isVariable && sym.hasGetter)
- val parents = sym.info.parents
- for (p <- parents if !ignored.contains(p.symbol);
- val decls = p.decls.toList filter(member => isVisible(member));
- if !decls.isEmpty) yield Group(
- <table cellpadding="3" class="inherited" summary="">
- <tr>
- <td colspan="2" class="title">
- {Text(kind.toString + " inherited from ") ++ urlFor(p, contentFrame)}
- </td>
- </tr>
- <tr> {
- def aref1(sym: Symbol): NodeSeq = {
- val isJava = sym hasFlag Flags.JAVA
- if (isJava || (sym.sourceFile eq null)) {
- <a class={sym.owner.fullNameString.replace('.', '/')}
- href={"#" + docName(sym)}
- target={contentFrame}>{sym.nameString}</a>
- }
- else
- aref(urlFor(sym), contentFrame, sym.nameString)
- }
- val members = decls.sort(
- (x, y) => (x.nameString compareTo y.nameString) < 0)
- <td colspan="2" class="signature">
- {aref1(members.head)}
- {for (m <- members.tail) yield Text(", ") ++ aref1(m)}
- </td>
- } </tr>
- </table>)
- }
-
- /**
- * @param mmbr ...
- * @return ...
- */
- def listMembersFull(mmbr: HasTree): NodeSeq =
- if (mmbr.isInstanceOf[Composite]) {
- val map = organize(mmbr.asInstanceOf[Composite], emptyMap)
- val mmbrx = mmbr
- val pathx = path
- for (kind0 <- List(OBJECT, CLASS) if map contains kind0)
- for (mmbr <- map(kind0))
- new ContentFrame {
- def clazz = mmbr.asInstanceOf[ImplMod]
- def kind = kind0
- def title =
- labelFor(kind0) + " " + mmbr.tree.symbol.nameString + " in " +
- codeFor(mmbrx.kind) + " " + mmbr.tree.symbol.owner.fullNameString('.')
- }
- for (kind <- List(TRAIT, CONSTRUCTOR, VAL, VAR, DEF) if map contains kind) yield Group(
- <table cellpadding="3" class="member-detail" summary="">
- <tr>
- <td class="title">{Text(labelFor(kind))} Detail</td>
- </tr>
- </table>
- <div>
- {for (mmbr <- map(kind).toList) yield fullHeader(mmbr)}
- </div>)
- } else
- NodeSeq.Empty
-
- /**
- * @param mmbr ...
- * @return ...
- */
- def shortHeader(mmbr: HasTree): NodeSeq =
- <tr>
- <td valign="top" class="modifiers">
- { for (str <- stringsFor(mmbr.mods)) yield <code>{(Text(str + " "))}</code> }
- </td>
- <td class="signature">
- <code>{Text(codeFor(mmbr.kind))}</code>
- <em>{urlFor(mmbr.tree, contentFrame)}</em>
- { typesFor(mmbr) }
- { argsFor(mmbr) }
- {resultFor(mmbr) }
- <br>{shortComment(mmbr)}</br>
- </td>
- </tr>
-
- def fullComment(mmbr: HasTree): NodeSeq = {
- val sym = mmbr.tree.symbol
- val (sym1, kind1) =
- if (sym.isPrimaryConstructor) (sym.owner, CONSTRUCTOR)
- else (sym, if (sym.isConstructor) DEF else kindOf(mmbr.tree))
- comments.get(sym1) match {
- case Some(text) => comment(text, false, kind1)
- case None => NodeSeq.Empty
- }
- }
-
- def shortComment(mmbr: HasTree): NodeSeq =
- comments.get(mmbr.tree.symbol) match {
- case Some(text) => comment(text, true, kindOf(mmbr.tree))
- case None => NodeSeq.Empty
- }
-
- def ifT(cond: Boolean, nodes: NodeSeq) =
- if (cond) nodes else NodeSeq.Empty
-
- def ifT(tree: Tree, nodes: NodeSeq, before: Boolean) =
- if (tree != EmptyTree &&
- tree.tpe.symbol != definitions.AnyClass &&
- tree.tpe.symbol != definitions.AllClass) {
- if (before) nodes ++ forTree(tree)
- else {
- val ret = forTree(tree) ++ nodes
- //System.err.println("RET: " + ret)
- ret
- }
- } else NodeSeq.Empty
-
- def forType(tpe: Type): NodeSeq =
- urlFor(tpe, contentFrame)
-
- def forTree(tree: Tree): NodeSeq = tree match {
- case vdef: ValDef =>
- Text(vdef.symbol.name.toString()) ++ Text(": ") ++ forTree(vdef.tpt)
- case sel: Select =>
- forTree(sel.qualifier) ++ Text(sel.symbol.nameString)
- case tree: AbsTypeDef =>
- val cflags = if (tree.mods.isCovariant) "+"
- else if (tree.mods.isContravariant) "-"
- else ""
- Text(cflags + tree.symbol.nameString) ++ surround("[", "]", forTrees(tree.tparams)) ++ ifT(tree.hi, Text(" <: "), true) ++ ifT(tree.lo, Text(" >: "), true)
- case tpt: TypeTree =>
- urlFor(tpt.tpe, contentFrame)
- case id: Ident =>
- Text("YY: " + id.symbol.nameString)
- case EmptyTree =>
- NodeSeq.Empty
- case _ =>
- Text("XX=" + tree.getClass() + " " + tree.toString())
- }
-
- /**
- * @param trees ...
- * @return ...
- */
- def forTrees(trees: List[Tree]): NodeSeq =
- if (trees.isEmpty) NodeSeq.Empty
- else {
- val head = forTree(trees.head)
- head ++ (if (trees.tail.isEmpty) NodeSeq.Empty
- else Text(", ")) ++ forTrees(trees.tail)
- }
-
- private def surround(open: String, close: String, node: NodeSeq): NodeSeq =
- Text(open) ++ node ++ Text(close)
-
- /**
- * @param ht ...
- * @return ...
- */
- private def typesFor(ht: HasTree): NodeSeq = {
- val tparams = ht.tree match {
- case cdef: ClassDef => cdef.tparams
- case ddef: DefDef => ddef.tparams
- case adef: AliasTypeDef => adef.tparams
- case _ => Nil
- }
- if (tparams.isEmpty) Text("")
- else surround("[", "]", forTrees(tparams))
- }
-
- /**
- * @param ht ...
- * @return ...
- */
- private def argsFor(ht: HasTree): NodeSeq = ht.tree match {
- case ddef: DefDef =>
- if (!ddef.vparamss.isEmpty &&
- (!ddef.vparamss.tail.isEmpty || !ddef.vparamss.head.isEmpty)) {
- val nodes = for (vparams <- ddef.vparamss)
- yield surround("(", ")", forTrees(vparams));
- nodes.flatMap(x => x.toList)
- } else NodeSeq.Empty
- case _ => NodeSeq.Empty
- }
-
- /**
- * @param ht ...
- * @return ...
- */
- private def resultFor(ht: HasTree): NodeSeq = ht.tree match {
- case vdef: ValOrDefDef =>
- if (!vdef.symbol.nameString.equals("this"))
- Text(": ") ++ forType(vdef.tpt.tpe)
- else
- NodeSeq.Empty
- case _ =>
- NodeSeq.Empty
- }
- }
-
- abstract class ListClassContentFrame extends ContentFrame0 {
- def classes: ListMap[Kind, TreeSet[HasTree]]
- def module: ModuleClassSymbol
-
- def path = module.fullNameString('/') + "$content"
- def title = "All Classes and Objects in " + module.fullNameString('.')
-
- def body: NodeSeq =
- <div class="page-title">
- Scala 2<br/>API Specification
- </div>
- <p>
- This document is the API specification for Scala 2.
- </p> ++ (for (kind <- KINDS if classes contains kind) yield Group(hr(
- <table cellpadding="3" class="member" summary="">
- <tr>
- <td colspan="2" class="title">
- {labelFor(kind)} Summary
- </td>
- </tr>
- { {
- for (mmbr <- classes(kind).toList) yield shortHeader(mmbr)
- } }
- </table>)))
- }
-
- abstract class ContentFrame extends ContentFrame0 {
- def clazz: ImplMod
- def kind: Kind
- def body: NodeSeq = <span>{navigation}{header0}{fullHeader(clazz)}</span>;
-
- final def path = urlFor0(clazz.tree.symbol, clazz.tree.symbol)
-
- // <td class="navigation-enabled">{aref("help.html" , "_self", "Help" )}</td>
- // <td class="navigation-enabled">{aref("root-page.html", "_self", "Overview")}</td>
- // <td class="navigation-enabled">{aref("index.html" , null, "Index" )}</td>
- private def navigation: NodeSeq =
- <table class="navigation" summary="">
- <tr>
- <td valign="top" class="navigation-links">
- <table><tr>
- </tr></table>
- </td>
- <td align="right" valign="top" style="white-space:nowrap;" rowspan="2">
- {doctitle}
- </td>
- </tr>
- <tr><td></td></tr>
- </table>;
-
- private def header0: NodeSeq = {
- val sym = clazz.tree.symbol
- val dir =
- if (sym.toplevelClass.isPackageClass) sym.toplevelClass
- else sym.toplevelClass.owner
- val name = {
- //dir.fullNameString('/') + "/" + sym.sourceFile.name.replace(".scala", "")
- if (true) throw new Error
- ""
- }
- <span>
- <hr/>
- in {aref(urlFor(sym.owner), "_self", sym.owner.fullNameString('.'))}
- <div class="entity">
- {Text(codeFor(kind))}
- <span class="entity">{Text(sym.nameString)}</span>
- </div>
- <div style="font-size:smaller; color:gray;">
- [source: <a class={name} href=""><code>{name + ".scala"}</code></a>]
- </div>
- <hr/>
- </span>;
- }
- }
-
- private val kinds =
- new TreeMap[String, Symbol => Boolean] +
- "Constructor" -> ((s: Symbol) => s.isConstructor) +
- "Def" -> ((s: Symbol) => s.isMethod)
-
- /** This abstract class contains two abstract methods <code>sym</code> and
- * <code>descr</code> which must be defined for each primitive type in
- * order to generated the appropriate HTML documentation page.
- *
- * @author Stephane Micheloud
- * @version 1.0
- */
- private abstract class PrimitiveContentFrame extends ContentFrame0 {
- def sym: Symbol
- def descr: String
- def path = urlFor0(sym, sym)
- private def kind = CLASS // todo
- def title =
- labelFor(kind) + " " + sym.nameString + " in " +
- codeFor(kind) + " " + sym.owner.fullNameString('.')
- def body = NodeSeq.fromSeq(
- <table class="navigation" summary="">
- <tr>
- <td valign="top" class="navigation-links">
- <table><tr>
- </tr></table>
- </td>
- <td align="right" valign="top" style="white-space:nowrap;" rowspan="2">
- {doctitle}
- </td>
- </tr>
- </table>
- <hr/>
- <div>in {aref(urlFor(sym.owner), "_self", sym.owner.fullNameString('.'))}</div>
- <div class="entity">
- { Text(codeFor(kind)) }
- <span class="entity">{Text(sym.nameString)}</span>
- </div>
- <hr/>
- <dl>
- <dt>
- <code>{Text(Flags.flagsToString(sym.flags & ~Flags.TRAIT) + " class ")}</code>
- <em>{Text(sym.nameString)}</em>
- </dt>
- <dd>{
- if (sym.info.parents.isEmpty) NodeSeq.Empty
- else {
- val parent = sym.info.parents.head
- <code>{Text(" extends ")}</code> ++ (
- aref(urlFor(parent.symbol), contentFrame, parent.toString()))
- }
- }</dd>
- <dd>{comment(descr, true, kind)}</dd>
- </dl>
- <hr/> ++ ({
- val decls = sym.tpe.decls.toList
- //compute table members once for each relevant kind
- val tables = for (k <- kinds.keys.toList)
- yield (k, decls filter kinds(k))
- for ((k, members) <- tables if !members.isEmpty) yield
- <table cellpadding="3" class="member" summary="">
- <tr>
- <td colspan="2" class="title">{k} Summary</td>
- </tr>
- { {
- for (m <- members) yield
- <tr>
- <td valign="top" class="modifiers">
- </td>
- <td class="signature"><code>def</code>
- { Text(m.nameString + " ") ++ (m.tpe match {
- case MethodType(typeParams, resultType) =>
- (if (typeParams.isEmpty)
- NodeSeq.Empty
- else
- Text("(") ++ typeParams.map(forType) ++ (")")
- ) ++ (": ") ++ (forType(resultType))
- case PolyType(typeParams, resultType) =>
- val tp =
- if (typeParams.isEmpty) ""
- else (typeParams map (.defString)).mkString("[", ",", "]")
- Text(tp + ": ") ++ forType(resultType)
- case _ =>
- Text(": ") ++ forType(m.tpe)
- }) ++ (comments.get(m) match {
- case Some(text) => comment(text, false, DEF)
- case None => NodeSeq.Empty
- })
- }
- </td>
- </tr>
- } }
- </table>
- }))
- }
-
- private val loader = getClass().getClassLoader()
-
- /** Map a class to it's known subclasses */
- private val subclasses = new HashMap[Symbol, List[Symbol]] {
- override def default(key: Symbol): List[Symbol] = {
- this += key -> (Nil: List[Symbol])
- Nil: List[Symbol]
- }
- }
-
- def process(units: Iterator[CompilationUnit]): Unit = {
- var members = emptyMap
-
- var topLevel = ListMap.empty[ModuleClassSymbol, ListMap[Kind,TreeSet[HasTree]]]
- for (unit <- units) {
- val sourceMod = new SourceMod(unit)
- for (mmbr <- sourceMod.members) mmbr.tree match {
- case cdef: ImplDef =>
- assert(cdef.symbol.owner != NoSymbol)
- val sym = cdef.symbol.owner.asInstanceOf[ModuleClassSymbol]
- if (!sym.isEmptyPackageClass) {
- if (!topLevel.contains(sym))
- topLevel = topLevel.update(sym, emptyMap)
- topLevel = topLevel.update(sym, organize0(mmbr, topLevel(sym)))
- }
- for (p <- cdef.symbol.info.parents) {
- subclasses(p.symbol) = cdef.symbol :: subclasses(p.symbol)
- }
- import Flags._
- val mmbrs = cdef.symbol.info.findMember(nme.ANYNAME, MUTABLE | METHOD | BRIDGE | ACCESSOR, 0, false).alternatives
- for (c <- mmbrs if c.isClass)
- for (p <- c.info.parents) {
- subclasses(p.symbol) = c :: subclasses(p.symbol)
- }
-
- case _ =>
- error("unknown: " + mmbr.tree + " " + mmbr.tree.getClass())
- }
- }
-
- val modules0 = {
- var modules0 = new TreeMap[String, ModuleClassSymbol]
- for (top <- topLevel.elements)
- modules0 = modules0.insert(top._1.fullNameString, top._1)
- modules0
- }
-
- new ListModuleFrame {
- def modules = modules0
- }
- new ListModuleContentFrame {
- def modules = modules0
- }
-
- new Frame {
- def title="navigation"
- def path="nav-classes"
- override def body0(hasBody: Boolean, nodes: NodeSeq): NodeSeq =
- if (!hasBody) nodes
- else <body style="margin:1px 0 0 1px; padding:1px 0 0 1px;">{nodes}</body>;
- def body =
- <form>
- <select id="kinds" onchange="gotoKind()">
- <option value="#Classes" selected="selected">Classes</option>
- <option value="#Objects">Objects</option>
- <!--<option value="#Traits">Traits</option>-->
- </select>
- <span id="alphabet" style="font-family:Courier;word-spacing:-8px;">
- <a href={Unparsed("javascript:gotoName('A')")}>A</a>
- <a href={Unparsed("javascript:gotoName('B')")}>B</a>
- <a href={Unparsed("javascript:gotoName('C')")}>C</a>
- <a href={Unparsed("javascript:gotoName('D')")}>D</a>
- <a href={Unparsed("javascript:gotoName('E')")}>E</a>
- <a href={Unparsed("javascript:gotoName('G')")}>G</a>
- <a href={Unparsed("javascript:gotoName('I')")}>I</a>
- <a href={Unparsed("javascript:gotoName('L')")}>L</a>
- <a href={Unparsed("javascript:gotoName('M')")}>M</a>
- <a href={Unparsed("javascript:gotoName('P')")}>P</a>
- <a href={Unparsed("javascript:gotoName('R')")}>R</a>
- <a href={Unparsed("javascript:gotoName('T')")}>T</a>
- <a href={Unparsed("javascript:gotoName('V')")}>V</a>
- <a href={Unparsed("javascript:gotoName('X')")}>X</a>
- </span>
- </form>
- }
-
- new ListClassFrame {
- def classes = {
- var allClasses = emptyMap
- for (top <- topLevel.elements)
- allClasses = merge(allClasses, top._2)
- allClasses
- }
- def title = "List of all classes and objects"
- def path = "all-classes"
- def navLabel = "root-page"
- }
-
- // class from for each module.
- for (top <- topLevel.elements) {
- val module = top._1
- val members = top._2
-
- new ListClassFrame {
- def title =
- "List of classes and objects in package " + module.fullNameString('.')
- def classes = top._2
- def path = module.fullNameString('/') + NAME_SUFFIX_PACKAGE
- def navLabel = module.fullNameString('.')
- }
- val module0 = module
- new ListClassContentFrame {
- def classes = top._2
- def module = module0
- }
-
- // do root frame for each class and object
- for (kind <- members.elements) for (mmbr <- kind._2.toList) {
- val kind0 = kind._1
- new ContentFrame {
- def title =
- labelFor(kind0) + " " + mmbr.tree.symbol.nameString +
- " in package " + mmbr.tree.symbol.owner.fullNameString('.')
- def clazz = mmbr.asInstanceOf[ImplMod]
- def kind = kind0
- }
- }
-
- }
-
- new Frame {
- def title = windowTitle
- def body = index
- def path = "index"
- override def hasBody = false
- }
- new PrimitiveContentFrame {
- def sym = definitions.AllClass // Nothing
- def descr = """
- /** <p>
- * Class <code>Nothing</code> (previously named <code>All</code> in
- * <a href="http://scala-lang.org" target="_top">Scala</a> 2.2.0 and
- * older versions) is - together with class <a href="Null.html">
- * <code>Null</code></a> - at the bottom of the
- * <a href="http://scala-lang.org" target="_top">Scala</a> type
- * hierarchy.
- * </p>
- * <p>
- * Type <code>Nothing</code> is a subtype of every other type
- * (including <a href="Null.html"><code>Null</code></a>); there
- * exist <em>no instances</em> of this type. Even though type
- * <code>Nothing</code> is empty, it is nevertheless useful as a
- * type parameter. For instance, the <a href="http://scala-lang.org"
- * target="_top">Scala</a> library defines a value
- * <a href="Nil$object.html"><code>Nil</code></a> of type
- * <code><a href="List.html">List</a>[Nothing]</code>. Because lists
- * are covariant in <a href="http://scala-lang.org" target="_top">Scala</a>,
- * this makes <a href="Nil$object.html"><code>Nil</code></a> an
- * instance of <code><a href="List.html">List</a>[T]</code>, for
- * any element type <code>T</code>.
- * </p>
- */"""
- }
- new PrimitiveContentFrame {
- def sym = definitions.AllRefClass // Null
- def descr = """
- /** <p>
- * Class <code>Null</code> (previously named <code>AllRef</code> in
- * <a href="http://scala-lang.org" target="_top">Scala</a> 2.2.0 and
- * older versions) is - together with class <a href="Nothing.html">
- * <code>Nothing</code> - at the bottom of the
- * <a href="http://scala-lang.org" target="_top">Scala</a> type
- * hierarchy.
- * </p>
- * <p>
- * Type <code>Null</code> is a subtype of all reference types; its
- * only instance is the <code>null</code> reference.
- * Since <code>Null</code> is not a subtype of value types,
- * <code>null</code> is not a member of any such type. For instance,
- * it is not possible to assign <code>null</code> to a variable of
- * type <a href="Int.html"><code>Int</code></a>.
- * </p>
- */"""
- }
- new PrimitiveContentFrame {
- def sym = definitions.AnyClass
- def descr = """
- /** <p>
- * Class <code>Any</code> is the root of the <a
- * href="http://scala-lang.org/"
- * target="_top">Scala</a> class hierarchy. Every class in a
- * <a href="http://scala-lang.org/" target="_top">Scala</a> execution
- * environment inherits directly or indirectly from this class.
- * Class <code>Any</code> has two direct subclasses:
- * <a href="AnyRef.html"><code>AnyRef</code></a> and
- * <a href="AnyVal.html"><code>AnyVal</code></a>.
- * </p>
- */"""
- }
- comments(definitions.Object_isInstanceOf) = """
- /** <p>
- * The method <code>isInstanceOf</code> is the pendant of the Java
- * operator <code>instanceof</code>.
- * </p>
- * <p>
- * See also:
- * </p>
- * <ul>
- * <li>
- * Java Language Specification (2<sup>nd</sup> Ed.):
- * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#80289"
- * target="_top">Operator <code>instanceof</code></a>.
- * </li>
- * </ul>
- */"""
- comments(definitions.Object_synchronized) = """
- /** <p>
- * To make your programs thread-safe, you must first identify what
- * data will be shared across threads. If you are writing data that
- * may be read later by another thread, or reading data that may
- * have been written by another thread, then that data is shared,
- * and you must synchronize when accessing it.
- * </p>
- * <p>
- * See also:
- * <p>
- * <ul>
- * <li>
- * The Java Tutorials:
- * <a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/sync.html"
- * target="_top">Synchronization</a>.
- * </li>
- * <li>
- * IBM developerWorks:
- * <a href="http://www-128.ibm.com/developerworks/java/library/j-threads1.html"
- * target="_top">Synchronization is not the enemy</a>.
- * </li>
- * </ul>
- */"""
- new PrimitiveContentFrame {
- def sym = definitions.AnyRefClass
- def descr = """
- /** <p>
- * Class <code>AnyRef</code> is the root class of all
- * <em>reference types</em>.
- * </p>
- */"""
- }
- new PrimitiveContentFrame {
- def sym = definitions.AnyValClass
- def descr = """
- /** <p>
- * Class <code>AnyVal</code> is the root class of all
- * <em>value types</em>.
- * </p>
- * <p>
- * <code>AnyVal</code> has a fixed number subclasses, which
- * describe values which are not implemented as objects in the
- * underlying host system.
- * </p>
- * <p>
- * Classes <a href="Double.html"><code>Double</code></a>,
- * <a href="Float.html"><code>Float</code></a>,
- * <a href="Long.html"><code>Long</code></a>,
- * <a href="Int.html"><code>Int</code></a>,
- * <a href="Char.html"><code>Char</code></a>,
- * <a href="Short.html"><code>Short</code></a>, and
- * <a href="Byte.html"><code>Byte</code></a> are together called
- * <em>numeric value types</em>.
- * Classes <a href="Byte.html"><code>Byte</code></a>,
- * <a href="Short.html"><code>Short</code></a>, or
- * <a href="Char.html"><code>Char</code></a>
- * are called <em>subrange types</em>. Subrange types, as well as
- * <a href="Int.html"><code>Int</code></a> and
- * <a href="Long.html"><code>Long</code></a> are called
- * <em>integer types</em>, whereas
- * <a href="Float.html"><code>Float</code></a> and
- * <a href="Double.html"><code>Double</code></a> are called
- * <em>floating point types</em>.
- * </p>
- */"""
- }
- new PrimitiveContentFrame {
- def sym = definitions.BooleanClass
- def descr = """
- /** <p>
- * Class <code>Boolean</code> has only two values: <code>true</code>
- * and <code>false</code>.
- * </p>
- */"""
- }
- def numericValDescr(sym: Symbol) = {
- val maxValue = "MAX_" + sym.name.toString().toUpperCase()
- val minValue = "MIN_" + sym.name.toString().toUpperCase();
- """
- /** <p>
- * Class <code>""" + sym.name + """ </code> belongs to the value
- * classes whose instances are not represented as objects by the
- * underlying host system. All value classes inherit from class
- * <a href="AnyVal.html"><code>AnyVal</code></a>.
- * </p>
- * <p>
- * Values <code>""" + maxValue + """</code> and <code>""" + minValue + """</code>
- * are in defined in object <a href="Math$object.html">scala.Math</a>.
- * </p>
- */"""
- }
- new PrimitiveContentFrame {
- def sym = definitions.ByteClass
- def descr = numericValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.CharClass
- def descr = numericValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.DoubleClass
- def descr = numericValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.FloatClass
- def descr = numericValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.IntClass
- def descr = numericValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.LongClass
- def descr = numericValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.ShortClass
- def descr = numericValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.UnitClass
- def descr = """
- /** <p>
- * Class <code>Unit</code> has only one value: <code>()</code>.
- * </p>
- */"""
- }
- def boxedValDescr(sym: Symbol) = """
- /** <p>
- * Class <code>""" + sym.name + """</code> implements the
- * boxing/unboxing from/to value types.
- * </p>
- * <p>
- * Boxing and unboxing enable value types to be treated as objects;
- * they provide a unified view of the type system wherein a value
- * of any type can ultimately be treated as an object.
- * </p>
- */"""
- new PrimitiveContentFrame {
- def sym = definitions.getClass("scala.runtime.BoxedFloat")
- def descr = boxedValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.getClass("scala.runtime.BoxedInt")
- def descr = boxedValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.getClass("scala.runtime.BoxedLong")
- def descr = boxedValDescr(sym)
- }
- new PrimitiveContentFrame {
- def sym = definitions.getClass("scala.runtime.BoxedNumber")
- def descr = boxedValDescr(sym)
- }
- // The name of a resource is a '/'-separated path name that identifies the resource.
- val rsrcdir = "scala/tools/nsc/doc/"
- for (base <- List("style.css", "script.js")) {
- try {
- val in = loader.getResourceAsStream(rsrcdir + base)
- val out = new FileOutputStream(new File(outdir + File.separator + base))
- val buf = new Array[byte](1024)
- var len = 0
- while (len != -1) {
- out.write(buf, 0, len)
- len = in.read(buf)
- }
- in.close()
- out.close()
- } catch {
- case _ =>
- error("Resource file '" + base + "' not found")
- }
- }
- }
-
- def organize(c: Composite, map0: ListMap[Kind, TreeSet[HasTree]]) = {
- var map = map0
- //System.err.println("MemBERS: " + c.members.toList)
- for (mmbr <- c.members.toList) map = organize0(mmbr, map)
- map
- }
-
- def organize0(mmbr: HasTree, map0: ListMap[Kind, TreeSet[HasTree]]) = {
- var map = map0
- assert(mmbr.kind ne null)
- if (!map.contains(mmbr.kind))
- map = map.update(mmbr.kind, new TreeSet[HasTree])
- val sz = map(mmbr.kind).size
- map = map.update(mmbr.kind, map(mmbr.kind) + mmbr)
- /*if (map(mmbr.kind).size == sz)
- System.err.println(""+mmbr + " not added");*/
- map
- }
-
- def parse(str: String): NodeSeq = {
- new SpecialNode {
- def label = "#PCDATA"
- def toString(sb: StringBuilder): StringBuilder = {
- sb.append(str.trim())
- sb
- }
-
- }
- /*
- import java.io.StringReader;
- import org.xml.sax.InputSource;
- val isrc1 = new InputSource(new StringReader(str));
- val parsedxml1 = XML.load(isrc1);
- if (parsedxml1 eq null) Text("BAD_COMMENT???");
- else parsedxml1;
- */
- }
-
- //http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javadoc.html#javadoctags
- //http://java.sun.com/j2se/javadoc/writingdoccomments/
- //REMINDER: update file "src/manual/scala/man1/scaladoc.scala" accordingly!
- private def tag(name: String): NodeSeq =
- <b> {
- Text((name match {
- case "author" => "Author"
- case "deprecated" => "Deprecated"
- case "exception" => "Throws"
- case "param" => "Parameters"
- case "pre" => "Precondition"
- case "return" => "Returns"
- case "see" => "See Also"
- case "since" => "Since"
- case "throws" => "Throws"
- case "todo" => "Todo"
- case "version" => "Version"
- case _ => name
- }) + ":")
- } </b>
-
- // patterns for standard tags with 1 and 2 arguments
- private val pat1 = Pattern.compile(
- "[ \t]*@(author|deprecated|pre|return|see|since|todo|version)[ \t]*(.*)")
- private val pat2 = Pattern.compile(
- "[ \t]*@(exception|param|throws)[ \t]+(\\p{Graph}*)[ \t]*(.*)")
-
- // constructors have no description and get only attributes of the form 'pat2';
- // classes have a description and get only attributes of the form 'pat1';
- // no restriction applies to other kinds.
- private def comment(comment: String, isShort: Boolean, kind: Kind): NodeSeq = {
- var ret: List[Node] = Nil
- assert(comment ne null)
- // strip out any stars.
- var comment0 = comment.trim()
- assert(comment0 startsWith JDOC_START)
- comment0 = comment0.substring(JDOC_START.length())
- assert(comment0 endsWith JDOC_END)
- comment0 = comment0.substring(0, comment0.length() - JDOC_END.length())
- val buf = new StringBuilder
- type AttrDescr = (String, String, StringBuilder)
- val attributes = new ListBuffer[AttrDescr]
- var attr: AttrDescr = null
- val tok = new StringTokenizer(comment0, LINE_SEPARATOR)
- while (tok.hasMoreTokens) {
- val s = tok.nextToken.replaceFirst("\\p{Space}?\\*", "")
- val mat1 = pat1.matcher(s)
- if (mat1.matches) {
- attr = (mat1.group(1), null, new StringBuilder(mat1.group(2)))
- if (kind != CONSTRUCTOR) attributes += attr
- } else {
- val mat2 = pat2.matcher(s)
- if (mat2.matches) {
- attr = (mat2.group(1), mat2.group(2), new StringBuilder(mat2.group(3)))
- if (kind != CLASS) attributes += attr
- } else if (attr ne null)
- attr._3.append(s + LINE_SEPARATOR)
- else
- buf.append(s + LINE_SEPARATOR)
- }
- }
- val exceptions = new TreeMap[String, (Symbol, String)] +
- "Predef.IndexOutOfBoundsException" ->
- (definitions.PredefModule, "IndexOutOfBoundsException") +
- "Predef.NoSuchElementException" ->
- (definitions.PredefModule, "NoSuchElementException") +
- "Predef.NullPointerException" ->
- (definitions.PredefModule, "NullPointerException") +
- "Predef.UnsupportedOperationException" ->
- (definitions.PredefModule, "UnsupportedOperationException")
- val body = buf.toString
- if (isShort)
- <span>{parse(body)}</span>;
- else {
- val attrs = <dl>
- { {
- for (attr <- attributes.toList) yield
- <dt style="margin:10px 0 0 20px;">
- {tag(attr._1)}
- </dt>
- <dd> {
- if (attr._2 eq null) NodeSeq.Empty
- else if (attr._1.equals("throws"))
- <code>{ exceptions.get(attr._2) match {
- case Some(p) =>
- val (sym, s) = p
- val path = "../" //todo: fix path
- val href = path + sym.fullNameString('/') +
- (if (sym.isModule || sym.isModuleClass) NAME_SUFFIX_OBJECT else "") +
- "#" + s
- <a href={href}>{attr._2}</a>
- case None => Text(attr._2)
- }}{Text(" - ")}</code>
- else
- <code>{attr._2 + " - "}</code>
- } {(parse(attr._3.toString))}
- </dd>;
- } } </dl>;
- if (kind == CONSTRUCTOR) attrs
- else <span><dl><dd>{parse(body)}</dd></dl>{attrs}</span>;
- }
- }
-
- val index =
- <frameset cols="25%, 75%">
- <frameset rows="50%, 28, 50%">
- <frame src="modules.html" name={modulesFrame}></frame>
- <frame src="nav-classes.html" name="navigationFrame"></frame>
- <frame src="all-classes.html" name={classesFrame}></frame>
- </frameset>
- <frame src="root-content.html" name={contentFrame}></frame>
- </frameset>;
-
- val root = <b></b>
-
- private val NAME_SUFFIX_OBJECT = "$object"
- private val NAME_SUFFIX_PACKAGE = "$package"
- private val FILE_EXTENSION_HTML = ".html"
-
- private val JDOC_START = "/**"
- private val JDOC_END = "*/"
-}
diff --git a/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala b/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala
index 8e9d66f735..91ed949eba 100644
--- a/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala
+++ b/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala
@@ -376,7 +376,7 @@ trait ModelExtractor {
val Methods = Category("Method")(e => e.isValue && e.isMethod && !e.isConstructor && !e.hasFlag(symtab.Flags.ACCESSOR));
val Types = Category("Type")(e => e.isAliasType || e.isAbstractType);
- val categories = Constructors :: Types :: Values :: Methods :: Objects :: Classes :: Nil;
+ val categories = Constructors :: Types :: Values :: Methods :: Classes :: Objects :: Nil;
import java.util.regex.Pattern
diff --git a/src/compiler/scala/tools/nsc/doc/ModelFrames.scala b/src/compiler/scala/tools/nsc/doc/ModelFrames.scala
index 682fdf9864..a4ece5286f 100644
--- a/src/compiler/scala/tools/nsc/doc/ModelFrames.scala
+++ b/src/compiler/scala/tools/nsc/doc/ModelFrames.scala
@@ -190,7 +190,7 @@ trait ModelFrames extends ModelExtractor {
</table>;
}
- val classFrameKinds = Objects :: Classes :: Nil
+ val classFrameKinds = Classes :: Objects :: Nil;
abstract class ListClassFrame extends Frame {
def classes: Iterable[ClassOrObject]
def navLabel: String
@@ -273,12 +273,11 @@ trait ModelFrames extends ModelExtractor {
</table>;
private def header0: NodeSeq =
<xml:group>
- <div class="entity">
- {Text(clazz.kind)}
- <span class="entity">{Text(clazz.name)}</span> in
- {aref(urlFor(decode(clazz.sym.owner)), "_self", decode(clazz.sym.owner).fullNameString('.'))}
- </div>
- <hr/>
+ <div class="entity">
+ {aref(urlFor(decode(clazz.sym.owner)), "_self", decode(clazz.sym.owner).fullNameString('.'))}
+ <br/>
+ <span class="entity">{Text(clazz.kind)} {Text(clazz.name)}</span>
+ </div><hr/>
</xml:group>;
}
def longComment(cmnt: Comment): NodeSeq
diff --git a/src/compiler/scala/tools/nsc/util/Position.scala b/src/compiler/scala/tools/nsc/util/Position.scala
index b294dc8c4d..58994e9d32 100644
--- a/src/compiler/scala/tools/nsc/util/Position.scala
+++ b/src/compiler/scala/tools/nsc/util/Position.scala
@@ -9,24 +9,11 @@
// $Id$
package scala.tools.nsc.util
-object NoPosition extends Position {
- def offset = None
- def line = None
- def column = None
- def source = None
-}
-case class FakePos(msg : String) extends Position {
- def offset = None
- def line = None
- def column = None
- def source = None
-}
-
abstract class Position {
- def offset : Option[Int]
- def line : Option[Int]
- def column : Option[Int]
- def source : Option[SourceFile]
+ def offset : Option[Int] = None
+ def line : Option[Int] = None
+ def column : Option[Int] = None
+ def source : Option[SourceFile] = None
def lineContent: String =
if (!line.isEmpty && !source.isEmpty) source.get.lineToString(line.get - 1)
else "NO_LINE"
@@ -52,19 +39,23 @@ abstract class Position {
}
}
-case class LinePosition(line0 : Int, val source : Option[SourceFile]) extends Position {
+
+object NoPosition extends Position;
+case class FakePos(msg : String) extends Position;
+
+case class LinePosition(line0 : Int, override val source : Option[SourceFile]) extends Position {
def this(line0 : Int) = this(line0, None)
assert(line0 >= 1)
- def offset = None
- def column = None
- def line = Some(line0)
+ override def offset = None
+ override def column = None
+ override def line = Some(line0)
}
case class OffsetPosition(source0 : SourceFile, offset0 : Int) extends Position {
private val tabInc = 8
- def source = Some(source0)
- def offset = Some(offset0)
- def line = Some(source0.offsetToLine(offset0) + 1)
- def column = {
+ override def source = Some(source0)
+ override def offset = Some(offset0)
+ override def line = Some(source0.offsetToLine(offset0) + 1)
+ override def column = {
var column = 1
// find beginning offset for line
val line = source0.offsetToLine(offset0)
diff --git a/src/compiler/scala/tools/nsc/util/SourceFile.scala b/src/compiler/scala/tools/nsc/util/SourceFile.scala
index 28528ea455..ec4bd911b1 100644
--- a/src/compiler/scala/tools/nsc/util/SourceFile.scala
+++ b/src/compiler/scala/tools/nsc/util/SourceFile.scala
@@ -44,11 +44,8 @@ class SourceFile(val file: AbstractFile, _content: Array[Char]) {
else if (content(idx) == CR && idx + 1 < content.length && content(idx + 1) == LF) false
else true
- def position(offset: Int) =
- new OffsetPosition(this, offset)
-
- def position(line: Int, column: Int) =
- new OffsetPosition(this, lineToOffset(line) + column)
+ def position(offset: Int) = new OffsetPosition(this, offset)
+ def position(line: Int, column: Int) = new OffsetPosition(this, lineToOffset(line) + column)
/** Map a position to a position in the underlying source file.
* For regular source files, simply return the argument.