summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGilles Dubochet <gilles.dubochet@epfl.ch>2009-12-09 22:05:21 +0000
committerGilles Dubochet <gilles.dubochet@epfl.ch>2009-12-09 22:05:21 +0000
commite4fded72109ac35f8d74f36e51f882d0b85460d2 (patch)
tree2eafcf0fbc80a62c46cca5814e3c66410d2c45ba /src
parenteb8538483ca2aa4ba7d9e12b0c7784ac9198a911 (diff)
downloadscala-e4fded72109ac35f8d74f36e51f882d0b85460d2.tar.gz
scala-e4fded72109ac35f8d74f36e51f882d0b85460d2.tar.bz2
scala-e4fded72109ac35f8d74f36e51f882d0b85460d2.zip
[scaladoc] Known subclasses are printed.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala15
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Template.scala41
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/Entity.scala1
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala22
4 files changed, 53 insertions, 26 deletions
diff --git a/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
index 271f888bc5..455f9697ce 100644
--- a/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
@@ -184,4 +184,19 @@ abstract class HtmlPage { thisPage =>
xml.Text(string)
}
+ /** Returns the HTML code that represents the template in `tpl` as a hyperlinked name. */
+ def templateToHtml(tpl: TemplateEntity) = tpl match {
+ case dTpl: DocTemplateEntity =>
+ <a href={ relativeLinkTo(dTpl) }>{ dTpl.name }</a>
+ case ndTpl: NoDocTemplate =>
+ xml.Text(ndTpl.name)
+ }
+
+ /** Returns the HTML code that represents the templates in `tpls` as a list of hyperlinked names. */
+ def templatesToHtml(tplss: List[TemplateEntity], sep: NodeSeq): NodeSeq = tplss match {
+ case Nil => NodeSeq.Empty
+ case tpl :: Nil => templateToHtml(tpl)
+ case tpl :: tpls => templateToHtml(tpl) ++ sep ++ templatesToHtml(tpls, sep)
+ }
+
}
diff --git a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
index d39b0a9698..4ffdba4603 100644
--- a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
@@ -42,14 +42,10 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
val body =
<body class={ if (tpl.isTrait || tpl.isClass) "type" else "value" }>
- { def ownerLinks(otl: DocTemplateEntity): NodeSeq =
- if (otl.inTemplate.isRootPackage)
- <a href={ relativeLinkTo(otl) }>{ otl.name }</a>
- else ownerLinks(otl.inTemplate) ++ <xml:group>.<a href={ relativeLinkTo(otl) }>{ otl.name }</a></xml:group>
- if (tpl.isRootPackage || tpl.inTemplate.isRootPackage)
+ { if (tpl.isRootPackage || tpl.inTemplate.isRootPackage)
NodeSeq.Empty
else
- <p id="owner">{ ownerLinks(tpl.inTemplate) }</p>
+ <p id="owner">{ templatesToHtml(tpl.inTemplate.toRoot.reverse.tail, xml.Text(".")) }</p>
}
<div id="definition">
@@ -105,9 +101,9 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
}
def memberToCommentHtml(mbr: MemberEntity, isSelf: Boolean): NodeSeq = mbr match {
- case dte: DocTemplateEntity if isSelf && mbr.comment.isDefined =>
+ case dte: DocTemplateEntity if isSelf =>
<div id="comment" class="fullcomment">{ memberToFullCommentHtml(mbr, isSelf) }</div>
- case dte: DocTemplateEntity if !isSelf && mbr.comment.isDefined =>
+ case dte: DocTemplateEntity if mbr.comment.isDefined =>
<p class="comment cmt">{ inlineToHtml(mbr.comment.get.short) }</p>
case _ if mbr.comment.isDefined =>
<p class="shortcomment cmt">{ inlineToHtml(mbr.comment.get.short) }</p>
@@ -161,26 +157,27 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
}
{ val fvs: List[comment.Paragraph] = mbr.visibility.toList ::: mbr.flags
if (fvs.isEmpty) NodeSeq.Empty else
- <div class="block">{ fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } }</div>
+ <div class="block">
+ attributes: { fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } }
+ </div>
}
- { def inheritanceElem(tpl: TemplateEntity): NodeSeq = tpl match {
- case (dTpl: DocTemplateEntity) =>
- <a href={ relativeLinkTo(dTpl) }>{ dTpl.name }</a>
- case (ndTpl: NoDocTemplate) =>
- xml.Text(ndTpl.name)
- }
- def inheritanceChain(tplss: List[TemplateEntity]): NodeSeq = (tplss: @unchecked) match {
- case tpl :: Nil => inheritanceElem(tpl)
- case tpl :: tpls =>
- inheritanceElem(tpl) ++ xml.Text(" ⇐ ") ++ inheritanceChain(tpls)
- }
- val inDefTpls = mbr.inDefinitionTemplates
+ { val inDefTpls = mbr.inDefinitionTemplates
if (inDefTpls.tail.isEmpty && (inDefTpls.head == mbr.inTemplate)) NodeSeq.Empty else {
<div class="block">
- definition classes: { inheritanceChain(inDefTpls) }
+ definition classes: { templatesToHtml(inDefTpls, xml.Text(" ⇐ ")) }
</div>
}
}
+ { mbr match {
+ case dtpl: DocTemplateEntity if isSelf =>
+ val subClss = dtpl.subClasses
+ if (subClss.isEmpty) NodeSeq.Empty else
+ <div class="block">
+ known subclasses: { templatesToHtml(dtpl.subClasses, xml.Text(", ")) }
+ </div>
+ case _ => NodeSeq.Empty
+ }
+ }
</xml:group>
def kindToString(mbr: MemberEntity): String = mbr match {
diff --git a/src/compiler/scala/tools/nsc/doc/model/Entity.scala b/src/compiler/scala/tools/nsc/doc/model/Entity.scala
index ac28ff2219..3e61b7f4ee 100644
--- a/src/compiler/scala/tools/nsc/doc/model/Entity.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/Entity.scala
@@ -58,6 +58,7 @@ trait MemberEntity extends Entity {
/** A ''documentable'' class, trait or object (that is, a documentation page will be generated for it in the current
* site). */
trait DocTemplateEntity extends TemplateEntity with MemberEntity {
+ def toRoot: List[DocTemplateEntity]
def inSource: Option[(io.AbstractFile, Int)]
def typeParams: List[TypeParam]
def parentType: Option[TypeEntity]
diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
index 02fb60065a..0817cec4e2 100644
--- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
@@ -74,7 +74,12 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor =
override def inTemplate = inTpl
override def toRoot: List[MemberImpl] = this :: inTpl.toRoot
def inDefinitionTemplates =
- (if (sym.owner == inTpl.sym) inTpl else makeTemplate(sym.owner)) :: (sym.allOverriddenSymbols map { inhSym => makeTemplate(inhSym.owner) })
+ if (inTpl == null)
+ makePackage(RootPackage, null).toList
+ else if (sym.owner == inTpl.sym)
+ inTpl :: Nil
+ else
+ makeTemplate(sym.owner) :: (sym.allOverriddenSymbols map { inhSym => makeTemplate(inhSym.owner) })
val visibility = {
def qual = {
val qq =
@@ -124,17 +129,26 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor =
//if (inTpl != null) println("mbr " + sym + " in " + (inTpl.toRoot map (_.sym)).mkString(" > "))
templatesCache += ((sym, inTpl) -> this)
override def definitionName = inDefinitionTemplates.head.qualifiedName + "." + name
+ override def toRoot: List[DocTemplateImpl] = this :: inTpl.toRoot
val inSource = if (sym.sourceFile != null) Some(sym.sourceFile, sym.pos.line) else None
val typeParams = if (sym.isClass) sym.typeParams map (makeTypeParam(_, this)) else Nil
val parentType =
if (sym.isPackage) None else
Some(makeType(RefinedType(sym.tpe.parents filter (_ != ScalaObjectClass.tpe), EmptyScope)))
val linearization = {
+ sym.info.parents map { prt =>
+ makeTemplate(prt.typeSymbol) match {
+ case dtpl: DocTemplateImpl => dtpl.registerSubClass(this)
+ case _ =>
+ }
+ }
sym.ancestors filter (_ != ScalaObjectClass) map (makeTemplate(_))
- // TODO: Register subclasses
}
- private val subClassesCache = mutable.Buffer.empty[DocTemplateEntity]
- def registerSubClass(sc: DocTemplateEntity) = subClassesCache += sc
+ private lazy val subClassesCache = mutable.Buffer.empty[DocTemplateEntity]
+ def registerSubClass(sc: DocTemplateEntity) = {
+ assert(subClassesCache != null)
+ subClassesCache += sc
+ }
def subClasses = subClassesCache.toList
def memberSyms = sym.info.nonPrivateMembers
val members: List[MemberEntity] = memberSyms flatMap (makeMember(_, this))