summaryrefslogtreecommitdiff
path: root/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala')
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
new file mode 100755
index 0000000000..1272906df5
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
@@ -0,0 +1,58 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Pedro Furlanetto
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+import scala.collection._
+
+object IndexModelFactory {
+
+ def makeIndex(universe: Universe): Index = new Index {
+
+ lazy val firstLetterIndex: Map[Char, SymbolMap] = {
+
+ object result extends mutable.HashMap[Char,SymbolMap] {
+
+ /* symbol name ordering */
+ implicit def orderingMap = math.Ordering.String
+
+ def addMember(d: MemberEntity) = {
+ val firstLetter = {
+ val ch = d.name.head.toLower
+ if(ch.isLetterOrDigit) ch else '_'
+ }
+ val letter = this.get(firstLetter).getOrElse {
+ immutable.SortedMap[String, SortedSet[MemberEntity]]()
+ }
+ val members = letter.get(d.name).getOrElse {
+ SortedSet.empty[MemberEntity](Ordering.by { _.toString })
+ } + d
+ this(firstLetter) = letter + (d.name -> members)
+ }
+ }
+
+ //@scala.annotation.tailrec // TODO
+ def gather(owner: DocTemplateEntity): Unit =
+ for(m <- owner.members if m.inDefinitionTemplates.isEmpty || m.inDefinitionTemplates.head == owner)
+ m match {
+ case tpl: DocTemplateEntity =>
+ result.addMember(tpl)
+ gather(tpl)
+ case non: MemberEntity if !non.isConstructor =>
+ result.addMember(non)
+ case x @ _ =>
+ }
+
+ gather(universe.rootPackage)
+
+ result.toMap
+
+ }
+
+ }
+
+}