From ab383024ec3c580d5e356565ad7613073cb326e6 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Wed, 30 Mar 2016 10:16:22 +0200 Subject: Add type and class/trait member search, fixes SI-9721 and SI-9722 --- .../tools/nsc/doc/html/page/IndexScript.scala | 36 ++++++++++++++-------- .../scala/tools/nsc/doc/html/resource/lib/index.js | 7 ++++- 2 files changed, 29 insertions(+), 14 deletions(-) (limited to 'src/scaladoc') diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala index dd242e6b3b..6b24c0f568 100644 --- a/src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala +++ b/src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala @@ -30,17 +30,26 @@ class IndexScript(universe: doc.Universe) extends Page { case (pack, templates) => { val merged = mergeByQualifiedName(templates) - val ary = merged.keys.toList.sortBy(_.toLowerCase).map(key => { + val ary = merged.keys.toList.sortBy(_.toLowerCase).map { key => + /** One pair is generated for the class/trait and one for the + * companion object, both will have the same {"name": key} + * + * As such, we need to distinguish between the members that are + * generated by the object, and the members generated by the + * class/trait instance. Otherwise one of the member objects will be + * overwritten. + */ val pairs = merged(key).flatMap { t: DocTemplateEntity => + val kind = kindToString(t) Seq( - kindToString(t) -> relativeLinkTo(t), - "kind" -> kindToString(t), - "members" -> membersToJSON(t.members.filter(!_.isShadowedOrAmbiguousImplicit)), + kind -> relativeLinkTo(t), + "kind" -> kind, + s"members_$kind" -> membersToJSON(t.members.filter(!_.isShadowedOrAmbiguousImplicit), t), "shortDescription" -> shortDesc(t)) } JSONObject(Map(pairs : _*) + ("name" -> key)) - }) + } pack.qualifiedName -> JSONArray(ary) } @@ -83,10 +92,10 @@ class IndexScript(universe: doc.Universe) extends Page { } /** Returns the json representation of the supplied members */ - def membersToJSON(entities: List[MemberEntity]): JSONType = - JSONArray(entities map memberToJSON) + def membersToJSON(entities: List[MemberEntity], parent: DocTemplateEntity): JSONType = + JSONArray(entities map (memberToJSON(_, parent))) - private def memberToJSON(mbr: MemberEntity): JSONObject = { + private def memberToJSON(mbr: MemberEntity, parent: DocTemplateEntity): JSONObject = { /** This function takes a member and gets eventual parameters and the * return type. For example, the definition: * {{{ def get(key: A): Option[B] }}} @@ -100,6 +109,7 @@ class IndexScript(universe: doc.Universe) extends Page { } .mkString("(", ")(", "): " + d.resultType.name) case v: Val => ": " + v.resultType.name + case _ => "" } /** This function takes a member entity and return all modifiers in a @@ -119,15 +129,15 @@ class IndexScript(universe: doc.Universe) extends Page { */ def jsonObject(m: MemberEntity): JSONObject = JSONObject(Map( - "label" -> m.definitionName.replaceAll(".*#", ""), // member name + "label" -> "[^\\.]*\\.([^#]+#)?".r.replaceAllIn(m.definitionName, ""), // member name "member" -> m.definitionName.replaceFirst("#", "."), // full member name "tail" -> memberTail(m), - "kind" -> memberKindToString(m), // modifiers i.e. "abstract def" - "link" -> memberToUrl(m))) // permalink to the member + "kind" -> memberKindToString(m), // modifiers i.e. "abstract def" + "link" -> memberToUrl(m))) // permalink to the member mbr match { - case d: Def => jsonObject(d) - case v: Val => jsonObject(v) + case x @ (_: Def | _: Val | _: Object | _: AliasType) => jsonObject(x) + case e @ (_: Class | _: Trait) if parent.isRootPackage || !parent.isPackage => jsonObject(e) case m: MemberEntity => JSONObject(Map("member" -> m.definitionName, "error" -> "unsupported entity")) } diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js index 55224eae52..56eb060ccf 100644 --- a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js +++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js @@ -412,7 +412,12 @@ function handleSearchedPackage(res, regExp) { */ function searchEntity(entity, ul, regExp) { return new Promise(function(resolve, reject) { - var matchingMembers = $.grep(entity.members, function(member, i) { + var allMembers = + (entity.members_trait || []) + .concat(entity.members_class || []) + .concat(entity.members_object || []) + + var matchingMembers = $.grep(allMembers, function(member, i) { return regExp.test(member.label); }); -- cgit v1.2.3