Skip to content

Commit f3a3bf3

Browse files
committed
Render members in search results
1 parent e1be7c4 commit f3a3bf3

File tree

5 files changed

+142
-48
lines changed

5 files changed

+142
-48
lines changed

doc-tool/resources/_layouts/search.html

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -92,41 +92,72 @@ <h1>Member Results</h1>
9292
// Insert into list of results in package, no need to sort -
9393
// already sorted:
9494
var entityUl = entityResults[parent.name];
95-
var entityLi = document.createElement("li");
96-
if (entity.hasCompanion)
97-
entityLi.classList.add("entity-result-li", "with-companion");
98-
else
99-
entityLi.classList.add("entity-result-li");
100-
101-
var companion = !entity.hasCompanion ? "" : (
102-
'<a class="letter-anchor object" href="{{ site.baseurl }}/api/' + entity.companionPath.join('/') + '.html">O</a>'
103-
);
104-
105-
var letter =
106-
'<a class="letter-anchor ' + entity.kind + '" href="{{ site.baseurl }}/api/' + entity.path.join('/') + '.html">' +
107-
entity.kind.charAt(0).toUpperCase() +
108-
'</a>'
109-
110-
entityLi.innerHTML = (
111-
'<div class="entity-kinds">' +
112-
companion +
113-
letter +
114-
'</div>' +
115-
"<a class=\"entity-name\" href=\"{{ site.baseurl }}/api/" + entity.path.join('/') + ".html\">" +
116-
entity.name +
117-
"</a>"
118-
);
119-
entityUl.appendChild(entityLi);
95+
var selector = entity.path.slice(0, entity.path.length - 1).join('-') + '-' + entity.name;
96+
var entityLi = document.querySelector('#' + selector);
97+
if (!entityLi) {
98+
entityLi = document.createElement("li");
99+
if (entity.hasCompanion)
100+
entityLi.classList.add("entity-result-li", "with-companion");
101+
else
102+
entityLi.classList.add("entity-result-li");
103+
104+
entityLi.id = selector;
105+
106+
var companion = !entity.hasCompanion ? "" : (
107+
'<a class="letter-anchor object" href="{{ site.baseurl }}/api/' + entity.companionPath.join('/') + '.html">O</a>'
108+
);
109+
110+
var letter =
111+
'<a class="letter-anchor ' + entity.kind + '" href="{{ site.baseurl }}/api/' + entity.path.join('/') + '.html">' +
112+
entity.kind.charAt(0).toUpperCase() +
113+
'</a>'
114+
115+
entityLi.innerHTML = (
116+
'<div class="entity-kinds">' +
117+
companion +
118+
letter +
119+
'</div>' +
120+
"<a class=\"entity-name\" href=\"{{ site.baseurl }}/api/" + entity.path.join('/') + ".html\">" +
121+
entity.name +
122+
"</a>"
123+
);
124+
entityUl.appendChild(entityLi);
125+
}
120126
return entityLi;
121127
}
122128
else {
123-
return undefined;
129+
var path = entity.path.slice(0, entity.path.length - 1)
130+
return document.querySelector('#' + path + '-' + entity.name);
124131
}
125132
};
126133
};
127134

128135
var insertMember = function(member, li) {
129-
li.appendChild(document.createTextNode(", " + member.name));
136+
var div = document.createElement("div");
137+
div.classList.add("member-result");
138+
139+
var renderParamList = function(plist) {
140+
var start = plist.isImplicit ? "(implicit " : "(";
141+
var args = plist.list.join(', ');
142+
return start + args + ")";
143+
};
144+
145+
var concatenateStrings = function(acc, str) { return acc + str; };
146+
147+
var paramLists = !member.paramLists ? "" : (
148+
member.paramLists
149+
.map(renderParamList)
150+
.reduce(concatenateStrings, "")
151+
);
152+
153+
div.innerHTML =
154+
'<span class="member-kind">'+ member.kind +'</span>' +
155+
'<span class="member-name">'+ member.name +'</span>' +
156+
paramLists +
157+
':' +
158+
'<span class="member-return">'+ member.returnValue +'</span>'
159+
160+
li.appendChild(div);
130161
};
131162

132163
var entityResultsNode = document.getElementById("entity-results");
@@ -135,18 +166,17 @@ <h1>Member Results</h1>
135166
var memberResults = [];
136167

137168
apiSearch.onmessage = function(res) {
169+
var package = res.data.package;
138170
switch(res.data.type) {
139171
case "entityResult": {
140172
var entity = res.data.entity;
141-
var package = res.data.package;
142173
//console.log("got entity: " + entity.name + ", in package: " + package.name);
143174
insertEntity(entityResultsNode, entityResults)(entity, package);
144175
break;
145176
}
146177
case "memberResult": {
147178
var member = res.data.member;
148179
var parent = res.data.parent;
149-
var package = res.data.package;
150180
//console.log("got member: " + member.name + ", in entity: " + parent.name);
151181
var li = insertEntity(memberResultsNode, memberResults)(parent, package);
152182
if (li) insertMember(member, li);

doc-tool/resources/css/search.css

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,25 @@ div.results li.entity-result-li:hover {
134134
margin-left: 0;
135135
}
136136

137+
div.results li.entity-result-li > div.member-result {
138+
transition: all 0.2s ease;
139+
margin-left: 105px;
140+
}
141+
142+
div.results li.entity-result-li:hover > div.member-result {
143+
margin-left: 23px;
144+
}
145+
146+
div.results li.entity-result-li > div.member-result > span.member-kind {
147+
margin-right: 5px;
148+
font-weight: 400;
149+
}
150+
151+
div.results li.entity-result-li > div.member-result > span.member-return {
152+
margin-left: 5px;
153+
font-weight: 400;
154+
}
155+
137156
div.results li.entity-result-li > div.entity-kinds {
138157
float: left;
139158
}

doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -265,17 +265,34 @@ object JavaConverters {
265265
"companionPath" -> e.companionPath.asJava
266266
)
267267

268-
(e match {
269-
case e: Package => entity(e) ++ members(e)
270-
case e: Class => entity(e) ++ members(e) ++ companion(e)
271-
case e: CaseClass => entity(e) ++ members(e) ++ companion(e)
272-
case e: Trait => entity(e) ++ members(e) ++ companion(e)
273-
case e: Object => entity(e) ++ members(e) ++ companion(e)
274-
case e: TypeAlias => entity(e)
275-
case e: Def => entity(e)
276-
case e: Val => entity(e)
268+
def typeParams(e: TypeParams) =
269+
Map("typeParams" -> e.typeParams.asJava)
270+
271+
def paramLists(e: Def) = Map(
272+
"paramLists" -> {
273+
e.paramLists.map { paramList =>
274+
Map(
275+
"isImplicit" -> paramList.isImplicit,
276+
"list" -> paramList.list.map(_.showReference).asJava
277+
).asJava
278+
}
279+
.asJava
280+
}
281+
)
282+
283+
def returnValue(e: ReturnValue) =
284+
Map("returnValue" -> e.returnValue.showReference)
285+
286+
entity(e) ++ (e match {
287+
case e: Package => members(e)
288+
case e: Class => members(e) ++ companion(e)
289+
case e: CaseClass => members(e) ++ companion(e)
290+
case e: Trait => members(e) ++ companion(e)
291+
case e: Object => members(e) ++ companion(e)
292+
case e: Def => typeParams(e) ++ paramLists(e) ++ returnValue(e)
293+
case e: TypeAlias => Map.empty
294+
case e: Val => Map.empty
277295
})
278-
.asJava
279-
}
296+
}.asJava
280297
}
281298
}

doc-tool/src/dotty/tools/dottydoc/model/references.scala

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,38 @@ object references {
3535
case _ => None
3636
}
3737
}
38+
39+
implicit class ReferenceShower(val ref: Reference) extends AnyVal {
40+
def showReference: String = ref match {
41+
case TypeReference(title, _, tparams) =>
42+
title + {
43+
if (tparams.nonEmpty) tparams.map(_.showReference).mkString("[", ",", "]")
44+
else ""
45+
}
46+
47+
case AndOrTypeReference(left, part, right) =>
48+
left.showReference + s" $part " + right.showReference
49+
50+
case FunctionReference(args, ret) =>
51+
if (args.isEmpty)
52+
"() => " + ret.showReference
53+
else if (args.tail.isEmpty)
54+
args.head + " => " + ret.showReference
55+
else
56+
args.mkString("(", ",", s") => ${ret.showReference}")
57+
58+
case TupleReference(xs) =>
59+
xs.mkString("(", ",", ")")
60+
61+
case BoundsReference(lo, hi) =>
62+
lo.showReference + "<: " + hi.showReference
63+
64+
case NamedReference(title, ref, isByName, isRepeated) =>
65+
val byName = if (isByName) "=> " else ""
66+
val repeated = if (isRepeated) "*" else ""
67+
s"$title: $byName${ref.showReference}$repeated"
68+
69+
case ConstantReference(title) => title
70+
}
71+
}
3872
}

doc-tool/test/PackageStructure.scala

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,8 @@ class PackageStructure extends DottyDocTest {
6060
""".stripMargin)
6161

6262
checkSources(source1 :: source2 :: Nil) { packages =>
63-
packages("scala") match {
64-
case PackageImpl(
65-
_,
66-
_,
67-
"scala",
68-
List(PackageImpl(_, _, "scala.collection", List(tA, tB), _, _, _, _)),
69-
_, _, _, _
70-
) =>
63+
packages("scala.collection") match {
64+
case PackageImpl(_, _, "scala.collection", List(tA, tB), _, _, _, _) =>
7165
assert(
7266
tA.name == "A" && tB.name == "B",
7367
s"trait A had name '${tA.name}' and trait B had name '${tB.name}'"

0 commit comments

Comments
 (0)