diff options
author | Gilles Dubochet <gilles.dubochet@epfl.ch> | 2009-12-09 22:05:21 +0000 |
---|---|---|
committer | Gilles Dubochet <gilles.dubochet@epfl.ch> | 2009-12-09 22:05:21 +0000 |
commit | e4fded72109ac35f8d74f36e51f882d0b85460d2 (patch) | |
tree | 2eafcf0fbc80a62c46cca5814e3c66410d2c45ba /src/compiler | |
parent | eb8538483ca2aa4ba7d9e12b0c7784ac9198a911 (diff) | |
download | scala-e4fded72109ac35f8d74f36e51f882d0b85460d2.tar.gz scala-e4fded72109ac35f8d74f36e51f882d0b85460d2.tar.bz2 scala-e4fded72109ac35f8d74f36e51f882d0b85460d2.zip |
[scaladoc] Known subclasses are printed.
Diffstat (limited to 'src/compiler')
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)) |