summaryrefslogtreecommitdiff
path: root/src/scaladoc
diff options
context:
space:
mode:
Diffstat (limited to 'src/scaladoc')
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala36
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js31
2 files changed, 53 insertions, 14 deletions
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..5d72b9bf71 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
@@ -21,6 +21,20 @@ var Index = {};
}
})(Index);
+/** Find query string from URL */
+var QueryString = function(key) {
+ if (QueryString.map === undefined) { // only calc once
+ QueryString.map = {};
+ var keyVals = window.location.search.split("?").pop().split("&");
+ keyVals.forEach(function(elem) {
+ var pair = elem.split("=");
+ if (pair.length == 2) QueryString.map[pair[0]] = pair[1];
+ });
+ }
+
+ return QueryString.map[key];
+};
+
$(document).ready(function() {
// Clicking #doc-title returns the user to the root package
$("#doc-title").click(function() { document.location = toRoot + "index.html" });
@@ -39,6 +53,11 @@ $(document).ready(function() {
else
$("#textfilter > .input > .clear").hide();
});
+
+ if (QueryString("search") !== undefined) {
+ $("#index-input").val(QueryString("search"));
+ searchAll();
+ }
});
/* Handles all key presses while scrolling around with keyboard shortcuts in search results */
@@ -412,7 +431,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);
});
@@ -510,6 +534,11 @@ function searchAll() {
return;
}
+ // Replace ?search=X with current search string if not hosted locally on Chrome
+ try {
+ window.history.replaceState({}, "", "?search=" + searchStr);
+ } catch(e) {}
+
$("div#results-content > span.search-text").remove();
var memberResults = document.getElementById("member-results");