summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGilles Dubochet <gilles.dubochet@epfl.ch>2009-12-02 17:31:28 +0000
committerGilles Dubochet <gilles.dubochet@epfl.ch>2009-12-02 17:31:28 +0000
commit6995333a275d0d403869a1cd9d7e92b530bd0e86 (patch)
tree810df836cfe5866a21a96cd1c5fdce02e8b6ad11
parent5697e1115b8895e06cb91a4a6e70d0f73e5aa9ab (diff)
downloadscala-6995333a275d0d403869a1cd9d7e92b530bd0e86.tar.gz
scala-6995333a275d0d403869a1cd9d7e92b530bd0e86.tar.bz2
scala-6995333a275d0d403869a1cd9d7e92b530bd0e86.zip
[scaladoc] Types are links.
-rw-r--r--src/compiler/scala/tools/ant/Scaladoc.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ScalaDoc.scala2
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocFactory.scala (renamed from src/compiler/scala/tools/nsc/doc/Processor.scala)11
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala (renamed from src/compiler/scala/tools/nsc/doc/html/SiteFactory.scala)2
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala36
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Index.scala2
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Template.scala60
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/index.html50
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css51
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js47
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css192
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js14
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/template.html45
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/Entity.scala4
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala (renamed from src/compiler/scala/tools/nsc/doc/model/EntityFactory.scala)41
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala2
-rwxr-xr-xtruncate7
17 files changed, 328 insertions, 240 deletions
diff --git a/src/compiler/scala/tools/ant/Scaladoc.scala b/src/compiler/scala/tools/ant/Scaladoc.scala
index 622f9da19f..94b50ab045 100644
--- a/src/compiler/scala/tools/ant/Scaladoc.scala
+++ b/src/compiler/scala/tools/ant/Scaladoc.scala
@@ -518,7 +518,7 @@ class Scaladoc extends MatchingTask {
val Pair(docSettings, sourceFiles) = initialize
val reporter = new ConsoleReporter(docSettings)
try {
- val docProcessor = new scala.tools.nsc.doc.Processor(reporter, docSettings)
+ val docProcessor = new scala.tools.nsc.doc.DocFactory(reporter, docSettings)
docProcessor.document(sourceFiles.map (_.toString))
if (reporter.ERROR.count > 0)
error(
diff --git a/src/compiler/scala/tools/nsc/ScalaDoc.scala b/src/compiler/scala/tools/nsc/ScalaDoc.scala
index fcaced5b41..4936135c8d 100644
--- a/src/compiler/scala/tools/nsc/ScalaDoc.scala
+++ b/src/compiler/scala/tools/nsc/ScalaDoc.scala
@@ -62,7 +62,7 @@ object ScalaDoc {
docSettings.assemrefs.value = docSettings.assemrefs.value + File.pathSeparator + libpath
}
- val docProcessor = new scala.tools.nsc.doc.Processor(reporter, docSettings)
+ val docProcessor = new scala.tools.nsc.doc.DocFactory(reporter, docSettings)
docProcessor.document(command.files)
}
diff --git a/src/compiler/scala/tools/nsc/doc/Processor.scala b/src/compiler/scala/tools/nsc/doc/DocFactory.scala
index 8e08010f2c..14ff8012b8 100644
--- a/src/compiler/scala/tools/nsc/doc/Processor.scala
+++ b/src/compiler/scala/tools/nsc/doc/DocFactory.scala
@@ -24,7 +24,7 @@ import reporters.Reporter
* @param settings The settings to be used by the documenter and compiler for generating documentation.
*
* @author Gilles Dubochet */
-class Processor(val reporter: Reporter, val settings: doc.Settings) { processor =>
+class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor =>
/** The unique compiler instance used by this processor and constructed from its `settings`. */
object compiler extends Global(settings, reporter) {
@@ -49,8 +49,13 @@ class Processor(val reporter: Reporter, val settings: doc.Settings) { processor
def document(files: List[String]): Unit = {
(new compiler.Run()) compile files
compiler.addSourceless
- if (!reporter.hasErrors)
- (new html.SiteFactory(reporter, settings)) generate (new model.EntityFactory(compiler, settings)).makeModel
+ if (!reporter.hasErrors) {
+ val modelFactory = (new model.ModelFactory(compiler, settings))
+ val htmlFactory = (new html.HtmlFactory(reporter, settings))
+ val docModel = modelFactory.makeModel
+ println("model contains " + modelFactory.templatesCount + " documentable templates")
+ htmlFactory generate docModel
+ }
}
}
diff --git a/src/compiler/scala/tools/nsc/doc/html/SiteFactory.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
index a605002b64..bb2201d6b5 100644
--- a/src/compiler/scala/tools/nsc/doc/html/SiteFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
@@ -16,7 +16,7 @@ import scala.collection._
/** A class that can generate Scaladoc sites to some fixed root folder.
* @author David Bernard
* @author Gilles Dubochet */
-class SiteFactory(val reporter: Reporter, val settings: Settings) {
+class HtmlFactory(val reporter: Reporter, val settings: Settings) {
/** The character encoding to be used for generated Scaladoc sites. This value is currently always UTF-8. */
def encoding: String = "UTF-8"
diff --git a/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
index 48073f8e59..3760099a26 100644
--- a/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
@@ -38,7 +38,7 @@ abstract class HtmlPage { thisPage =>
/** Writes this page as a file. The file's location is relative to the generator's site root, and the encoding is
* also defined by the generator.
* @param generator The generator that is writing this page. */
- def writeFor(site: SiteFactory): Unit = {
+ def writeFor(site: HtmlFactory): Unit = {
val pageFile = new File(site.siteRoot, absoluteLinkTo(thisPage.path))
val pageFolder = pageFile.getParentFile
if (!pageFolder.exists) pageFolder.mkdirs()
@@ -145,12 +145,34 @@ abstract class HtmlPage { thisPage =>
case Text(text) => Unparsed(text)
}
- def typeToHtml(tpe: model.TypeEntity): NodeSeq = {
-
- // TODO: Generate links using tpe's refEntity map
-
- xml.Text(tpe.name)
-
+ def typeToHtml(tpe: model.TypeEntity, hasLinks: Boolean): NodeSeq = {
+ val string = tpe.name
+ def toLinksOut(inPos: Int, starts: List[Int]): NodeSeq = {
+ if (starts.isEmpty && (inPos == string.length))
+ NodeSeq.Empty
+ else if (starts.isEmpty)
+ xml.Text(string.slice(inPos, string.length))
+ else if (inPos == starts.head)
+ toLinksIn(inPos, starts)
+ else {
+ xml.Text(string.slice(inPos, starts.head)) ++ toLinksIn(starts.head, starts)
+ }
+ }
+ def toLinksIn(inPos: Int, starts: List[Int]): NodeSeq = {
+ val (tpl, width) = tpe.refEntity(inPos)
+ (tpl match {
+ case dtpl:DocTemplateEntity if hasLinks =>
+ <a href={ relativeLinkTo(tpl) } class="extype" name={ dtpl.qualifiedName }>{
+ string.slice(inPos, inPos + width)
+ }</a>
+ case tpl =>
+ <span class="extype" name={ tpl.qualifiedName }>{ string.slice(inPos, inPos + width) }</span>
+ }) ++ toLinksOut(inPos + width, starts.tail)
+ }
+ if (hasLinks)
+ toLinksOut(0, tpe.refEntity.keySet.toList)
+ else
+ xml.Text(string)
}
}
diff --git a/src/compiler/scala/tools/nsc/doc/html/page/Index.scala b/src/compiler/scala/tools/nsc/doc/html/page/Index.scala
index 5ad0005679..f671380a53 100644
--- a/src/compiler/scala/tools/nsc/doc/html/page/Index.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/page/Index.scala
@@ -30,7 +30,7 @@ class Index(modelRoot: Package) extends HtmlPage {
def body =
<body>
<div id="browser">
- <input id="quickflt" type="text"/>
+ <input id="quickflt" type="text" accesskey="/"/>
<div id="tpl">{
def packageElem(pack: model.Package): NodeSeq = {
<xml:group>
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 47f2d4abed..b5aba6a31b 100644
--- a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
@@ -137,30 +137,28 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
if (tme.isDef) "def" else if (tme.isVal) "val" else if (tme.isVar) "var" else "type"
}
- def boundsToString(hi: Option[TypeEntity], lo: Option[TypeEntity]): String = {
- def bound0(bnd: Option[TypeEntity], pre: String): String = bnd match {
- case None => ""
- case Some(tpe) => pre + typeToHtml(tpe)
+ def boundsToHtml(hi: Option[TypeEntity], lo: Option[TypeEntity], hasLinks: Boolean): NodeSeq = {
+ def bound0(bnd: Option[TypeEntity], pre: String): NodeSeq = bnd match {
+ case None => NodeSeq.Empty
+ case Some(tpe) => xml.Text(pre) ++ typeToHtml(tpe, hasLinks)
}
- bound0(hi, " <: ") + bound0(lo, " >: ")
+ bound0(hi, " <: ") ++ bound0(lo, " >: ")
}
/** name, tparams, params, result */
def signature(mbr: MemberEntity, isSelf: Boolean): NodeSeq = {
- val inside: NodeSeq =
+ def inside(hasLinks: Boolean): NodeSeq =
<xml:group>
- <div class="kind">{ kindToString(mbr) }</div>
- <div class="symbol">
- <span class="name">{ if (mbr.isConstructor) tpl.name else mbr.name }</span>
- { def tparamsToHtml(tpss: List[TypeParam]): NodeSeq =
+ <span class="kind">{ kindToString(mbr) }</span>
+ <span class="symbol">
+ <span class="name">{ if (mbr.isConstructor) tpl.name else mbr.name }</span>{
+ def tparamsToHtml(tpss: List[TypeParam]): NodeSeq =
if (tpss.isEmpty) NodeSeq.Empty else {
def tparam0(tp: TypeParam): NodeSeq =
- <span name={ tp.name }>{
- tp.variance + tp.name + boundsToString(tp.hi, tp.lo)
- }</span>
+ <span name={ tp.name }>{ tp.variance + tp.name }{ boundsToHtml(tp.hi, tp.lo, hasLinks)}</span>
def tparams0(tpss: List[TypeParam]): NodeSeq = (tpss: @unchecked) match {
case tp :: Nil => tparam0(tp)
- case tp :: tps => tparam0(tp) ++ Text(",") ++ tparams0(tps)
+ case tp :: tps => tparam0(tp) ++ Text(", ") ++ tparams0(tps)
}
<span class="tparams">[{ tparams0(tpss) }]</span>
}
@@ -169,16 +167,14 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
case dfe: Def => tparamsToHtml(dfe.typeParams)
case _ => NodeSeq.Empty
}
- }
- { def paramsToHtml(vlsss: List[List[ValueParam]]): NodeSeq = {
+ }{
+ def paramsToHtml(vlsss: List[List[ValueParam]]): NodeSeq = {
def param0(vl: ValueParam): NodeSeq =
- <span name={ vl.name }>{
- vl.name + ": " + typeToHtml(vl.resultType)
- }</span>
+ <span name={ vl.name }>{ vl.name + ": " }{ typeToHtml(vl.resultType, hasLinks) }</span>
def params0(vlss: List[ValueParam]): NodeSeq = vlss match {
case Nil => NodeSeq.Empty
case vl :: Nil => param0(vl)
- case vl :: vls => param0(vl) ++ Text(",") ++ params0(vls)
+ case vl :: vls => param0(vl) ++ Text(", ") ++ params0(vls)
}
vlsss map { vlss => <span class="params">({ params0(vlss) })</span> }
}
@@ -188,32 +184,32 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
case dfe: Def => paramsToHtml(dfe.valueParams)
case _ => NodeSeq.Empty
}
- }
- { mbr match {
+ }{
+ mbr match {
case tpl: DocTemplateEntity if (!tpl.isPackage) =>
tpl.parentType match {
- case Some(st) => <span class="result">extends<span>{ typeToHtml(st) }</span></span>
+ case Some(st) => <span class="result"> extends { typeToHtml(st, hasLinks) }</span>
case None =>NodeSeq.Empty
}
case tme: MemberEntity if (tme.isDef || tme.isVal || tme.isVar) =>
- <span class="result">:<span>{ typeToHtml(tme.resultType) }</span></span>
+ <span class="result">: { typeToHtml(tme.resultType, hasLinks) }</span>
case abt: AbstractType =>
- val b2s = boundsToString(abt.hi, abt.lo)
- if (b2s != "")
- <span class="result"><span>{ b2s }</span></span>
+ val b2s = boundsToHtml(abt.hi, abt.lo, hasLinks)
+ if (b2s != NodeSeq.Empty)
+ <span class="result">{ b2s }</span>
else NodeSeq.Empty
case alt: AliasType =>
- <span class="result">=<span>{ typeToHtml(alt.alias) }</span></span>
+ <span class="result"> = { typeToHtml(alt.alias, hasLinks) }</span>
case _ => NodeSeq.Empty
}
}
- </div>
- </xml:group>
+ </span>
+ </xml:group>
mbr match {
case dte: DocTemplateEntity if !isSelf =>
- <a class="signature" href={ relativeLinkTo(dte) }>{ inside }</a>
+ <a class="signature" href={ relativeLinkTo(dte) }>{ inside(hasLinks = false) }</a>
case _ =>
- <div class="signature">{ inside }</div>
+ <div class="signature">{ inside(hasLinks = true) }</div>
}
}
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/index.html b/src/compiler/scala/tools/nsc/doc/html/resource/index.html
index 7b86491ad9..95fae3176e 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/index.html
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/index.html
@@ -10,57 +10,69 @@
<script type="text/javascript" src="lib/index.js"></script>
</head>
<body>
+ <h1>Documentation</h1>
<div id="browser">
- <input id="quickflt" type="text"/>
+ <input id="quickflt" type="text" accesskey="/"/>
<div id="tpl">
<ol class="packages">
<li>
- <h3><a class="tplshow" href="scala/collection/package.html">scala.collection</a></h3>
+ <h3><a href="scala/collection/package.html">scala.collection</a></h3>
<ol class="templates">
<li title="scala.collection.BitSet">
- <a class="tplshow" href="scala/collection/BitSet.html">BitSet <span class="class">(class)</span></a>
- <a class="tplshow" href="scala/collection/BitSet$.html"><span class="object">(object)</span></a>
+ <a href="scala/collection/BitSet$.html">
+ <span>(object)</span>
+ </a>
+ <a href="scala/collection/BitSet.html">
+ <span>(class)</span>
+ <span>BitSet</span>
+ </a>
</li>
<li title="scala.collection.BufferedIterator">
- <a class="tplshow" href="scala/collection/BufferedIterator.html">BufferedIterator <span class="trait">(trait)</span></a>
+ <a href="scala/collection/BufferedIterator.html">
+ <span>(trait)</span>
+ <span>BufferedIterator</span>
+ </a>
</li>
<li title="scala.collection.DefaultMap">
- <a class="tplshow" href="scala/collection/DefaultMap$.html">DefaultMap <span class="class">(object)</span></a>
+ <a href="scala/collection/DefaultMap$.html">
+ <span>(object)</span>
+ <span>DefaultMap</span>
+ </a>
</li>
<li title="scala.collection.Iterable">
- <a class="tplshow" href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
- <a class="tplshow" href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
+ <a href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
+ <a href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
</li>
</ol>
<ol class="packages">
<li>
- <h3>scala.collection.mutable</h3>
+ <h3><a class="tplshow">scala.collection.mutable</a></h3>
<ol class="templates">
<li title="scala.collection.mutable.DefaultMap">
- <a class="tplshow" href="scala/collection/DefaultMap$.html">DefaultMap <span class="class">(object)</span></a>
+ <a href="scala/collection/DefaultMap$.html">DefaultMap <span class="class">(object)</span></a>
</li>
<li title="scala.collection.mutable.Iterable">
- <a class="tplshow" href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
- <a class="tplshow" href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
+ <a href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
+ <a href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
</li>
<li title="scala.collection.mutable.Iterable">
- <a class="tplshow" href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
- <a class="tplshow" href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
+ <a href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
+ <a href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
</li>
<li title="scala.collection.mutable.Truc">
- <a class="tplshow" href="scala/collection/Truc.html">Truc <span class="class">(class)</span></a>
+ <a href="scala/collection/Truc.html">Truc <span class="class">(class)</span></a>
</li>
</ol>
</li>
<li>
- <h3>scala.collection.immutable</h3>
+ <h3><a class="tplshow">scala.collection.immutable</a></h3>
<ol class="templates">
<li class="template" title="scala.collection.DefaultMap">
- <a class="tplshow" href="scala/collection/DefaultMap$.html">DefaultMap <span class="class">(object)</span></a>
+ <a href="scala/collection/DefaultMap$.html">DefaultMap <span class="class">(object)</span></a>
</li>
<li class="template" title="scala.collection.Iterable">
- <a class="tplshow" href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
- <a class="tplshow" href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
+ <a href="scala/collection/Iterable.html">Iterable <span class="class">(class)</span></a>
+ <a href="scala/collection/Iterable$.html"><span class="object">(object)</span></a>
</li>
</ol>
</li>
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
index f9cd1f9ade..0b444eec13 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
@@ -1,13 +1,25 @@
* {
- color: black;
+ color: inherit;
+ font-size: 10pt;
text-decoration: none;
- font-size: inherit;
font-family: sans-serif;
border-width: 0px;
padding: 0px;
margin: 0px;
}
+a {
+ cursor: pointer;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+h1 {
+ display: none;
+}
+
#browser {
top: 0px;
left: 0px;
@@ -15,10 +27,11 @@
width: 300px;
display: block;
position: fixed;
- overflow: auto;
}
#quickflt {
+ display: block;
+ position: fixed;
height: 22px;
right: 0px;
left: 0px;
@@ -28,11 +41,13 @@
font-weight: bold;
color: #993300;
padding: 5px;
- font-size: 12px;
background-color: white;
}
#tpl {
+ display: block;
+ position: fixed;
+ overflow: auto;
right: 0px;
left: 0px;
bottom: 0px;
@@ -41,29 +56,25 @@
display: block;
}
-#tpl h3 {
- background-color: #142556;
- color: white;
- font-weight: bold;
- padding: 2px;
+#tpl .packhide {
display: block;
- font-size: 14px;
- border-bottom-color: white;
- border-bottom-style: solid;
- border-bottom-width: 1px;
+ float: right;
+ font-weight: normal;
+ color: white;
+ padding: 1px 4px 1px 4px;
}
-#tpl h3 a {
+#tpl .packages > li > h3 {
+ display: block;
+ background-color: #142556;
color: white;
+ padding: 1px 4px 1px 4px;
+ font-weight: bold;
+ display: block;
}
#tpl ol > li {
display: block;
- font-size: 14px;
- background-color: #cccccc;
- border-bottom-color: white;
- border-bottom-style: solid;
- border-bottom-width: 1px;
}
#tpl ol > li .icon {
@@ -74,7 +85,7 @@
#content {
border-left-width: 1px;
border-left-color: black;
- border-left-style: solid;
+ border-left-style: white;
right: 0px;
left: 0px;
bottom: 0px;
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
index 4ea93c74f1..8f9b366ea9 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
@@ -1,21 +1,24 @@
$(document).ready(function(){
cleanPackage($("#tpl"));
- $("#tpl ol > li span.class").replaceWith("<img class='icon' src='lib/class.png'/>");
- $("#tpl ol > li span.object").replaceWith("<img class='icon' src='lib/object.png'/>");
- $("#tpl ol > li span.trait").replaceWith("<img class='icon' src='lib/trait.png'/>");
- $("#tpl ol > li span.package").replaceWith("<img class='icon' src='lib/package.png'/>");
- $("#tpl a.tplshow").click(function(event){
+ $("#tpl ol > li span:contains('(class)')").replaceWith("<img class='icon' src='lib/class.png'/>");
+ $("#tpl ol > li span:contains('(object)')").replaceWith("<img class='icon' src='lib/object.png'/>");
+ $("#tpl ol > li span:contains('(trait)')").replaceWith("<img class='icon' src='lib/trait.png'/>");
+ $("#tpl ol > li span:contains('(package)')").replaceWith("<img class='icon' src='lib/package.png'/>");
+ $("#tpl a[href]").click(function(event){
$("#content>iframe").attr("src", event.currentTarget.href);
return false;
});
$("#quickflt").focus(function(event) {
$("#quickflt").select();
});
- $("#quickflt").keyup(function(event) {
- var b = $("#quickflt").attr("value");
+ $("#quickflt").bind("keyup", function(event) {
+ var query = $("#quickflt").attr("value");
+ // Regexp that matches CamelCase subbits: "BiSe" is
+ // "[a-z]*Bi[a-z]*Se" and matches "BitSet", "ABitSet", ...
+ var queryRegExp = new RegExp(query.replace(/([A-Z])/g,"[a-z]*$1"));
$("#tpl ol.templates > li").each(function(){
- var a = $(this).attr("title");
- if (a == "" || a.indexOf(b) >= 0) {
+ var item = $(this).attr("title");
+ if (item == "" || queryRegExp.test(item)) {
$(this).show();
$(this).removeClass("hide");
}
@@ -26,8 +29,22 @@ $(document).ready(function(){
});
cleanPackage($("#tpl"));
});
+ $("#tpl .packages > li").prepend("<a class='packhide'>hide</a>");
+ $("#tpl .packages > li > a.packhide").click(function(event){
+ var action = $(this).text();
+ if (action == "hide") {
+ $("~ ol", $(this)).hide();
+ $(this).text("show");
+ }
+ else {
+ $("~ ol", $(this)).show();
+ $(this).text("hide");
+ }
+ return false;
+ });
});
+/* Recusively go through the packages and show only those which contain visible items. */
function cleanPackage(pack) {
$("> ol.packages > li", pack).each(function(){ cleanPackage($(this)); });
if ($("> ol > li:not(.hide)", pack).length > 0) {
@@ -38,7 +55,13 @@ function cleanPackage(pack) {
pack.addClass("hide");
pack.hide();
};
- if ($("> ol.templates > li:not(.hide)", pack).length > 0) { $("> h3", pack).show(); }
- else { $("> h3", pack).hide(); };
+ if ($("> ol.templates > li:not(.hide)", pack).length > 0) {
+ $("> h3", pack).show();
+ $("> .packhide", pack).show();
+ }
+ else {
+ $("> h3", pack).hide();
+ $("> .packhide", pack).hide();
+ };
return false;
-} \ No newline at end of file
+}
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
index 39df51e4f2..00d95138e7 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
@@ -1,17 +1,29 @@
* {
color: black;
text-decoration: none;
- font-size: 11pt;
- font-family: sans-serif;
+ font-family: inherit;
+ font-size: inherit;
border-width: 0px;
padding: 0px;
margin: 0px;
}
+body {
+ font-family: sans-serif;
+ font-size: 10pt;
+}
+
+a {
+ cursor: pointer;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
#owner {
- padding: 12px;
+ padding: 4px;
font-size: 12pt;
- position: relative;
display: block;
}
@@ -47,141 +59,71 @@
background-color: #561414;
}
-.signature {
- clear: both;
- display: block;
- background-color: #cccccc;
+#comment {
+ padding-left: 8px;
}
-.value #definition + .signature {
- background-color: #ced8f4;
-}
-
-.type #definition + .signature {
- background-color: #f4cece;
-}
-
-.signature .kind {
- font-weight: bold;
- font-size: 12pt;
+#values > h3 {
+ color: white;
padding: 4px;
- text-align: right;
- float: left;
- width: 72px;
-}
-
-.signature .symbol {
- display: block;
+ background-color: #142556;
font-size: 12pt;
- margin-left: 80px;
-}
-
-.signature .name {
- display: inline-block;
- padding-bottom: 4px;
- padding-top: 4px;
font-weight: bold;
}
-.signature .tparams {
- padding: 4px;
-}
-
-.signature .tparams > span {
- margin-right: 2px;
- margin-left: 2px;
- padding: 4px;
-}
-
-.signature .params {
- padding: 4px;
-}
-
-.signature .params > span {
- margin-right: 2px;
- margin-left: 2px;
+#types > h3 {
padding: 4px;
+ color: white;
+ font-weight: bold;
+ font-size: 12pt;
+ background-color: #561414;
}
-.signature .result {
- padding-left: 0px;
- padding-bottom: 4px;
- padding-right: 4px;
- padding-top: 4px;
-}
-
-.signature .result span {
- margin-right: 2px;
- margin-left: 2px;
+#constructors > h3 {
padding: 4px;
+ color: white;
+ font-weight: bold;
+ font-size: 12pt;
+ background-color: #000000;
}
-#comment > p {
- margin: 8px;
-}
-
-#mbrsel {
- padding: 4px;
- background-color: #cccccc;
+.signature {
+ padding: 1px;
+ font-family: monospace;
+ font-size: 10pt;
+ clear: both;
display: block;
+ background-color: #dddddd;
}
-#mbrsel > div > h3 {
- padding: 4px;
- display: block;
+.signature .kind {
+ text-align: right;
float: left;
+ width: 72px;
}
-#mbrsel > div > ol {
+.signature .symbol {
+ display: block;
margin-left: 80px;
}
-#mbrsel > div > ol > li {
- display: block;
- padding: 4px 8px 4px 8px;
- font-weight: bold;
- background-color: white;
+.signature .name {
display: inline-block;
- cursor: crosshair;
+ font-weight: bold;
}
-#mbrsel > div > ol > li.in {
- background-color: white;
+#values .signature .name {
+ color: #142556;
}
-#mbrsel > div > ol > li.out {
- color: #888888;
- background-color: #bbbbbb;
+#types .signature .name {
+ color: #561414;
}
#template > div.members > ol {
background-color: white;
}
-#values > h3 {
- color: white;
- padding: 4px;
- background-color: #142556;
- font-size: 12pt;
- font-weight: bold;
-}
-
-#types > h3 {
- padding: 4px;
- color: white;
- font-weight: bold;
- font-size: 12pt;
- background-color: #561414;
-}
-
-#constructors > h3 {
- padding: 4px;
- color: white;
- font-weight: bold;
- font-size: 12pt;
- background-color: #000000;
-}
-
.members > ol > li {
display: block;
}
@@ -218,11 +160,43 @@
margin-left: 80px;
}
-.members .comment > p {
- margin-left: 0px;
+.comment > p {
margin-bottom: 4px;
- margin-right: 4px;
margin-top: 4px;
display: block;
}
+#mbrsel {
+ padding: 4px;
+ background-color: #cccccc;
+ display: block;
+}
+
+#mbrsel > div > h3 {
+ padding: 4px;
+ display: block;
+ float: left;
+}
+
+#mbrsel > div > ol {
+ margin-left: 80px;
+}
+
+#mbrsel > div > ol > li {
+ display: block;
+ padding: 4px 8px 4px 8px;
+ font-weight: bold;
+ background-color: white;
+ display: inline-block;
+ cursor: crosshair;
+}
+
+#mbrsel > div > ol > li.in {
+ background-color: white;
+}
+
+#mbrsel > div > ol > li.out {
+ color: #888888;
+ background-color: #bbbbbb;
+}
+
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
index 4da8b28882..f1b864137d 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
@@ -17,6 +17,20 @@ $(document).ready(function(){
};
filterInherit();
});
+ $(".signature .symbol .extype").hover(
+ function(event){
+ var full = $(this).attr("name");
+ var short = $(this).text();
+ $(this).attr("name", short);
+ $(this).text(full);
+ },
+ function(event){
+ var short = $(this).attr("name");
+ var full = $(this).text();
+ $(this).attr("name", full);
+ $(this).text(short);
+ }
+ );
});
function filterInherit() {
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/template.html b/src/compiler/scala/tools/nsc/doc/html/resource/template.html
index 66c3fbc9ce..6bf91d96ee 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/template.html
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/template.html
@@ -23,10 +23,15 @@
<span class="result">extends<span>A[X]</span> with <span>C[Y]</span> with <span>B</span></span>
</div>
</div>
- <div id="comment">
+ <div id="comment" class="comment">
<p>This class can be used as an adaptor to create mutable maps from immutable map implementations. Only method empty has to be redefined if the immutable map on which this mutable map is originally based is not empty. empty is supposed to return the representation of an empty map.</p>
<p>A subtrait of collection.IndexedSeq which represents sequences that can be mutated.</p>
- <p>The canonical builder for collections that are addable, i.e. that support an efficient + method which adds an element to the collection. Collections are built from their empty element using this + method.</p>
+ <p>The canonical builder for collections that are addable, i.e. that support an efficient + method which adds an element to the collection. Collections are <code>built</code> from their empty element using this + method.</p>
+ <code class="block">
+ Once upon a time<br/>
+ In a land far far away<br/>
+ There was a man
+ </code>
</div>
<div id="template">
<div id="mbrsel">
@@ -53,8 +58,8 @@
<div class="kind">def</div>
<div class="symbol">
<span class="name">transform</span>
- <span class="tparams">[<span name="T">T</span>,<span name="U">U ⊲ Int</span>]</span>
- <span class="params">(<span name="f">f: (A, B) => B</span>,<span name="b">b: Double</span>)</span>
+ <span class="tparams">[<span name="T">T</span>, <span name="U">U ⊲ Int</span>]</span>
+ <span class="params">(<span name="f">f: (A, B) => B</span>, <span name="b">b: <span class="extype" name="scala.Double">Double</span></span>)</span>
<span class="result">:<span>ImmutableMapAdaptor[A, B]</span></span>
</div>
</div>
@@ -83,8 +88,7 @@
<div class="kind">def</div>
<div class="symbol">
<span class="name">curry</span>
- <span class="params">(<span name="f">f: (A, B) => B</span>,<span name="b">b: Double</span>)</span><span class="params">(<span name="g">g: Int => B</span>,<span name="c">c: Double</span>)</span>
- <span class="result">:<span>ImmutableMapAdaptor[A, B]</span></span>
+ <span class="params">(<span name="f">f: (A, B) => B</span>, <span name="b">b: Double</span>)</span><span class="params">(<span name="g">g: Int => B</span>, <span name="c">c: Double</span>)</span><span class="result">: <span>ImmutableMapAdaptor[A, B]</span></span>
</div>
</div>
</li>
@@ -92,8 +96,7 @@
<div class="signature">
<div class="kind">val</div>
<div class="symbol">
- <span class="name">randomize</span>
- <span class="result">:<span>ImmutableMapAdaptor[A, B]</span></span>
+ <span class="name">randomize</span><span class="result">: <span>ImmutableMapAdaptor[A, B]</span></span>
</div>
</div>
<div class="comment">
@@ -181,22 +184,32 @@
</li>
<li>
<div class="signature">
- <div class="kind">type</div>
- <div class="symbol">
+ <span class="kind">type</span>
+ <span class="symbol">
<span class="name">U</span>
- <span class="result">=<span>ImmutableMapAdaptor[A, B]</span></span>
- </div>
- </div>
- <div class="comment">
- <p>A subtrait of collection.IndexedSeq which represents sequences that can be mutated.</p>
+ <span class="result">=<span><a href="">ImmutableMapAdaptor</a>[A, B]</span></span>
+ </span>
</div>
</li>
+ <li name="scala.CountedIterator">
+ <a href="CountedIterator.html" class="signature">
+ <span class="kind">trait</span>
+ <span class="symbol">
+ <span class="name">CountedIterator</span>
+ <span class="tparams">[<span name="A">+A</span>]</span>
+ <span class="result">extends Iterator[A]</span>
+ </span>
+ </a>
+ <div class="comment">
+ <p>Counted iterators keep track of the number of elements seen so far</p>
+ </div>
+ </li>
<li>
<div class="signature">
<div class="kind">type</div>
<div class="symbol">
<span class="name">V</span>
- <span class="result">⊲<span>Int</span>⊳<span>Boolean</span></span>
+ <span class="result">⊲ Int ⊳ Boolean</span>
</div>
</div>
<div class="comment">
diff --git a/src/compiler/scala/tools/nsc/doc/model/Entity.scala b/src/compiler/scala/tools/nsc/doc/model/Entity.scala
index 6314af39be..84cd76ef5f 100644
--- a/src/compiler/scala/tools/nsc/doc/model/Entity.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/Entity.scala
@@ -31,13 +31,14 @@ trait TemplateEntity extends Entity {
def isTrait: Boolean
def isClass: Boolean
def isObject: Boolean
+ def isDocTemplate: Boolean
}
trait NoDocTemplate extends TemplateEntity
/** A member of a class, trait, object or package. */
trait MemberEntity extends Entity {
def inTemplate: DocTemplateEntity
- def toRoot: List[DocTemplateEntity]
+ def toRoot: List[MemberEntity]
def inDefinitionTemplate: TemplateEntity
def definitionName: String
def visibility: Option[Paragraph]
@@ -123,7 +124,6 @@ trait AliasType extends NonTemplateMemberEntity {
trait ParameterEntity extends Entity {
def inTemplate: DocTemplateEntity
- def toRoot: List[DocTemplateEntity]
def isTypeParam: Boolean
def isValueParam: Boolean
}
diff --git a/src/compiler/scala/tools/nsc/doc/model/EntityFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
index 033b51e3e7..4e96b17da5 100644
--- a/src/compiler/scala/tools/nsc/doc/model/EntityFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
@@ -10,11 +10,14 @@ import scala.collection._
import symtab.Flags
/** This trait extracts all required information for documentation from compilation units */
-class EntityFactory(val global: Global, val settings: doc.Settings) { extractor =>
+class ModelFactory(val global: Global, val settings: doc.Settings) { extractor =>
import global._
import definitions.{ ObjectClass, ScalaObjectClass, RootPackage, EmptyPackage }
+ private var droppedPackages = 0
+ def templatesCount = templatesCache.size - droppedPackages
+
/** */
def makeModel: Package =
makePackage(RootPackage, null) getOrElse { throw new Error("no documentable class found in compilation units") }
@@ -35,7 +38,7 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
abstract class EntityImpl(val sym: Symbol, inTpl: => TemplateImpl) extends Entity {
val name = sym.nameString
def inTemplate = inTpl
- def toRoot: List[EntityImpl] = inTpl :: inTpl.toRoot
+ def toRoot: List[EntityImpl] = this :: inTpl.toRoot
def qualifiedName = name
val comment = {
val whichSym =
@@ -63,13 +66,15 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
/** Provides a default implementation for instances of the `WeakTemplateEntity` type. It must be instantiated as a
* `SymbolicEntity` to access the compiler symbol that underlies the entity. */
- class NoDocTemplateImpl(sym: Symbol, inTpl: => TemplateImpl) extends EntityImpl(sym, inTpl) with TemplateImpl with NoDocTemplate
+ class NoDocTemplateImpl(sym: Symbol, inTpl: => TemplateImpl) extends EntityImpl(sym, inTpl) with TemplateImpl with NoDocTemplate {
+ def isDocTemplate = false
+ }
/** Provides a default implementation for instances of the `MemberEntity` type. It must be instantiated as a
* `SymbolicEntity` to access the compiler symbol that underlies the entity. */
abstract class MemberImpl(sym: Symbol, inTpl: => DocTemplateImpl) extends EntityImpl(sym, inTpl) with MemberEntity {
override def inTemplate = inTpl
- override def toRoot: List[DocTemplateImpl] = inTpl :: inTpl.toRoot
+ override def toRoot: List[MemberImpl] = this :: inTpl.toRoot
lazy val inDefinitionTemplate = if (sym.owner == inTpl.sym) inTpl else makeTemplate(sym.owner)
val visibility = {
def qual = {
@@ -118,6 +123,7 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
* * All ancestors of the template (as weak templates);
* * All non-package members (including other templates, as full templates). */
abstract class DocTemplateImpl(sym: Symbol, inTpl: => DocTemplateImpl) extends MemberImpl(sym, inTpl) with TemplateImpl with DocTemplateEntity {
+ //if (inTpl != null) println("mbr " + sym + " in " + (inTpl.toRoot map (_.sym)).mkString(" > "))
templatesCache += ((sym, inTpl) -> this)
override def definitionName = inDefinitionTemplate.qualifiedName + "." + name
val inSource = if (sym.sourceFile != null) Some(sym.sourceFile, sym.pos.line) else None
@@ -140,11 +146,12 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
val abstractTypes = members partialMap { case t: AbstractType => t }
val aliasTypes = members partialMap { case t: AliasType => t }
override val isTemplate = true
+ def isDocTemplate = true
}
abstract class PackageImpl(sym: Symbol, inTpl: => PackageImpl) extends DocTemplateImpl(sym, inTpl) with Package {
override def inTemplate = inTpl
- override def toRoot: List[PackageImpl] = inTpl :: inTpl.toRoot
+ override def toRoot: List[PackageImpl] = this :: inTpl.toRoot
val packages = members partialMap { case p: Package => p }
}
@@ -155,7 +162,6 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
abstract class ParameterImpl(sym: Symbol, inTpl: => DocTemplateImpl) extends EntityImpl(sym, inTpl) with ParameterEntity {
override def inTemplate = inTpl
- override def toRoot: List[DocTemplateImpl] = inTpl :: inTpl.toRoot
}
/* ============== MAKER METHODS ============== */
@@ -184,7 +190,7 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
new PackageImpl(bSym, null) {
override val name = "root"
override def inTemplate = this
- override def toRoot = Nil
+ override def toRoot = this :: Nil
override def qualifiedName = "_root_"
override lazy val inheritedFrom = Nil
override val isRootPackage = true
@@ -195,7 +201,11 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
}
else
new PackageImpl(bSym, inTpl) {}
- if (pack.templates.isEmpty) None else Some(pack)
+ if (pack.templates.isEmpty) {
+ droppedPackages += 1
+ None
+ }
+ else Some(pack)
}
}
@@ -306,8 +316,9 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
})
else if (aSym.isPackage)
inTpl match { case inPkg: PackageImpl => makePackage(aSym, inPkg) }
- else if ((aSym.isClass || aSym.isModule) && (aSym.sourceFile != null) && aSym.isPublic && !aSym.isLocal)
- (inTpl.toRoot find (_.sym == aSym )) orElse Some(makeDocTemplate(aSym, inTpl))
+ else if ((aSym.isClass || aSym.isModule) && (aSym.sourceFile != null) && aSym.isPublic && !aSym.isLocal) {
+ (inTpl.toRoot find (_.sym == aSym )) orElse Some(makeDocTemplate(aSym, inTpl))
+ }
else
None
}
@@ -363,7 +374,7 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
def makeType(aType: Type): TypeEntity =
new TypeEntity {
private val nameBuffer = new StringBuilder
- private var refBuffer = new immutable.TreeMap[Int, (Entity, Int)]
+ private var refBuffer = new immutable.TreeMap[Int, (TemplateEntity, Int)]
private def appendTypes0(types: List[Type], sep: String): Unit = types match {
case Nil =>
case tp :: Nil =>
@@ -392,13 +403,13 @@ class EntityFactory(val global: Global, val settings: doc.Settings) { extractor
nameBuffer append ')'
case TypeRef(pre, aSym, targs) =>
val bSym = normalizeTemplate(aSym)
- if (bSym.isType)
+ if (bSym.isTypeMember)
nameBuffer append bSym.name
else {
- val refClass = makeTemplate(bSym)
+ val tpl = makeTemplate(bSym)
val pos0 = nameBuffer.length
- nameBuffer append refClass.name
- refBuffer += pos0 -> (refClass, nameBuffer.length)
+ refBuffer += pos0 -> (tpl, tpl.name.length)
+ nameBuffer append tpl.name
}
if (!targs.isEmpty) {
nameBuffer append '['
diff --git a/src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala b/src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala
index 2a0e4b9831..5e18e0d9bc 100644
--- a/src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala
@@ -17,7 +17,7 @@ abstract class TypeEntity {
/** Maps which parts of this type's name reference other entities. The map is indexed by the position of the first
* character that reference some entity, and contains the entity and the position of the last referenced
* character. The referenced character ranges do not to overlap or nest. The map is sorted by position. */
- def refEntity: SortedMap[Int, (Entity, Int)]
+ def refEntity: SortedMap[Int, (TemplateEntity, Int)]
override def toString =
name
diff --git a/truncate b/truncate
new file mode 100755
index 0000000000..b7f410e25d
--- /dev/null
+++ b/truncate
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+find . -type f -not -path "*.svn*" -name "*.scala" -exec sed -i "" -e 's/$ *Id.*$/$Id$/g' {} \;
+find . -type f -not -path "*.svn*" -name "*.java" -exec sed -i "" -e 's/$ *Id.*$/$Id$/g' {} \;
+find . -type f -not -path "*.svn*" -name "*.cs" -exec sed -i "" -e 's/$ *Id.*$/$Id$/g' {} \;
+find . -type f -not -path "*.svn*" -name "*.js" -exec sed -i "" -e 's/$ *Id.*$/$Id$/g' {} \;
+find . -type f -not -path "*.svn*" -name "*.scala.disabled" -exec sed -i "" -e 's/$ *Id.*$/$Id$/g' {} \;