Skip to content

Commit ab38302

Browse files
committed
Add type and class/trait member search, fixes SI-9721 and SI-9722
1 parent ecc8944 commit ab38302

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,26 @@ class IndexScript(universe: doc.Universe) extends Page {
3030
case (pack, templates) => {
3131
val merged = mergeByQualifiedName(templates)
3232

33-
val ary = merged.keys.toList.sortBy(_.toLowerCase).map(key => {
33+
val ary = merged.keys.toList.sortBy(_.toLowerCase).map { key =>
34+
/** One pair is generated for the class/trait and one for the
35+
* companion object, both will have the same {"name": key}
36+
*
37+
* As such, we need to distinguish between the members that are
38+
* generated by the object, and the members generated by the
39+
* class/trait instance. Otherwise one of the member objects will be
40+
* overwritten.
41+
*/
3442
val pairs = merged(key).flatMap { t: DocTemplateEntity =>
43+
val kind = kindToString(t)
3544
Seq(
36-
kindToString(t) -> relativeLinkTo(t),
37-
"kind" -> kindToString(t),
38-
"members" -> membersToJSON(t.members.filter(!_.isShadowedOrAmbiguousImplicit)),
45+
kind -> relativeLinkTo(t),
46+
"kind" -> kind,
47+
s"members_$kind" -> membersToJSON(t.members.filter(!_.isShadowedOrAmbiguousImplicit), t),
3948
"shortDescription" -> shortDesc(t))
4049
}
4150

4251
JSONObject(Map(pairs : _*) + ("name" -> key))
43-
})
52+
}
4453

4554
pack.qualifiedName -> JSONArray(ary)
4655
}
@@ -83,10 +92,10 @@ class IndexScript(universe: doc.Universe) extends Page {
8392
}
8493

8594
/** Returns the json representation of the supplied members */
86-
def membersToJSON(entities: List[MemberEntity]): JSONType =
87-
JSONArray(entities map memberToJSON)
95+
def membersToJSON(entities: List[MemberEntity], parent: DocTemplateEntity): JSONType =
96+
JSONArray(entities map (memberToJSON(_, parent)))
8897

89-
private def memberToJSON(mbr: MemberEntity): JSONObject = {
98+
private def memberToJSON(mbr: MemberEntity, parent: DocTemplateEntity): JSONObject = {
9099
/** This function takes a member and gets eventual parameters and the
91100
* return type. For example, the definition:
92101
* {{{ def get(key: A): Option[B] }}}
@@ -100,6 +109,7 @@ class IndexScript(universe: doc.Universe) extends Page {
100109
}
101110
.mkString("(", ")(", "): " + d.resultType.name)
102111
case v: Val => ": " + v.resultType.name
112+
case _ => ""
103113
}
104114

105115
/** This function takes a member entity and return all modifiers in a
@@ -119,15 +129,15 @@ class IndexScript(universe: doc.Universe) extends Page {
119129
*/
120130
def jsonObject(m: MemberEntity): JSONObject =
121131
JSONObject(Map(
122-
"label" -> m.definitionName.replaceAll(".*#", ""), // member name
132+
"label" -> "[^\\.]*\\.([^#]+#)?".r.replaceAllIn(m.definitionName, ""), // member name
123133
"member" -> m.definitionName.replaceFirst("#", "."), // full member name
124134
"tail" -> memberTail(m),
125-
"kind" -> memberKindToString(m), // modifiers i.e. "abstract def"
126-
"link" -> memberToUrl(m))) // permalink to the member
135+
"kind" -> memberKindToString(m), // modifiers i.e. "abstract def"
136+
"link" -> memberToUrl(m))) // permalink to the member
127137

128138
mbr match {
129-
case d: Def => jsonObject(d)
130-
case v: Val => jsonObject(v)
139+
case x @ (_: Def | _: Val | _: Object | _: AliasType) => jsonObject(x)
140+
case e @ (_: Class | _: Trait) if parent.isRootPackage || !parent.isPackage => jsonObject(e)
131141
case m: MemberEntity =>
132142
JSONObject(Map("member" -> m.definitionName, "error" -> "unsupported entity"))
133143
}

src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,12 @@ function handleSearchedPackage(res, regExp) {
412412
*/
413413
function searchEntity(entity, ul, regExp) {
414414
return new Promise(function(resolve, reject) {
415-
var matchingMembers = $.grep(entity.members, function(member, i) {
415+
var allMembers =
416+
(entity.members_trait || [])
417+
.concat(entity.members_class || [])
418+
.concat(entity.members_object || [])
419+
420+
var matchingMembers = $.grep(allMembers, function(member, i) {
416421
return regExp.test(member.label);
417422
});
418423

0 commit comments

Comments
 (0)