summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala')
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala90
1 files changed, 48 insertions, 42 deletions
diff --git a/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
index 0d19850cf2..6c599e1a88 100755
--- a/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
@@ -9,52 +9,58 @@ package model
import scala.collection._
-class IndexModelFactory {
-
- /** SortedMap[symbol name, SortedSet[owner template]] */
- type SymbolMap = immutable.SortedMap[String,SortedSet[model.TemplateEntity]]
- /** Map[symbol's first letter, SymbolMap] */
- type IndexModel = Map[Char, SymbolMap]
-
- def makeModel(universe:Universe)={
- import model._
-
- val index = new mutable.HashMap[Char,SymbolMap] {
- /* Owner template ordering */
- implicit def orderingSet = math.Ordering.String.on { x:TemplateEntity => x.name.toLowerCase }
- /* symbol name ordering */
- implicit def orderingMap = math.Ordering.String.on { x:String => x.toLowerCase }
-
- def addMember(d:MemberEntity) = {
- val firstLetter = {
- val ch = d.name.head.toLower
- if(ch.isLetterOrDigit) ch else '#'
- }
- this(firstLetter) =
- if(this.contains(firstLetter)) {
- val letter = this(firstLetter)
- val value = this(firstLetter).get(d.name).getOrElse(SortedSet.empty[TemplateEntity]) + d.inDefinitionTemplates.head
- letter + ((d.name, value))
- } else {
- immutable.SortedMap( (d.name, SortedSet(d.inDefinitionTemplates.head)) )
+object IndexModelFactory {
+
+ def makeIndex(universe: Universe): Index = new Index {
+
+ lazy val firstLetterIndex: Map[Char, SymbolMap] = {
+
+ val result = new mutable.HashMap[Char,SymbolMap] {
+
+ /* Owner template ordering */
+ implicit def orderingSet = math.Ordering.String.on { x: TemplateEntity => x.name.toLowerCase }
+ /* symbol name ordering */
+ implicit def orderingMap = math.Ordering.String.on { x: String => x.toLowerCase }
+
+ def addMember(d: MemberEntity) = {
+ val firstLetter = {
+ val ch = d.name.head.toLower
+ if(ch.isLetterOrDigit) ch else '#'
+ }
+ this(firstLetter) =
+ if(this.contains(firstLetter)) {
+ val letter = this(firstLetter)
+ val value = this(firstLetter).get(d.name).getOrElse(SortedSet.empty[TemplateEntity]) + d.inDefinitionTemplates.head
+ letter + ((d.name, value))
+ } else {
+ immutable.SortedMap( (d.name, SortedSet(d.inDefinitionTemplates.head)) )
+ }
}
- }
- }
- //@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 =>
- index.addMember(tpl)
- gather(tpl)
- case alias:AliasType => index.addMember(alias)
- case absType:AbstractType => index.addMember(absType)
- case non:NonTemplateMemberEntity if !non.isConstructor => index.addMember(non)
- case x @ _ =>
}
+ //@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 alias: AliasType =>
+ result.addMember(alias)
+ case absType: AbstractType =>
+ result.addMember(absType)
+ case non: NonTemplateMemberEntity if !non.isConstructor =>
+ result.addMember(non)
+ case x @ _ =>
+ }
+
gather(universe.rootPackage)
- index.toMap
+
+ result.toMap
+
+ }
+
}
+
} \ No newline at end of file