Skip to content

Commit 9e4bdc7

Browse files
committed
Fix searchbar to match only by name
1 parent 462a72f commit 9e4bdc7

File tree

4 files changed

+91
-2
lines changed

4 files changed

+91
-2
lines changed

scala3doc/src/dotty/dokka/compat.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import org.jetbrains.dokka.model.properties.ExtraProperty
1111
// import java.util.Stream // TODO reproduction uncomment
1212
import java.util.stream.Stream // comment out - wrong error!
1313
import java.util.stream.Collectors
14+
import org.jetbrains.dokka.plugability._
15+
import kotlin.jvm.JvmClassMappingKt.getKotlinClass
1416

1517
def mkDRI(packageName: String = null, extra: String = null) = new DRI(packageName, null, null, PointingToDeclaration.INSTANCE, extra)
1618

@@ -57,3 +59,15 @@ extension [V] (map: JMap[SourceSetWrapper, V]):
5759
extension [V](jlist: JList[V]):
5860
def ++ (other: JList[V]): JList[V] =
5961
Stream.of(jlist, other).flatMap(_.stream).collect(Collectors.toList())
62+
63+
object PluginUtils:
64+
import scala.reflect.ClassTag
65+
import scala.reflect._
66+
def plugin[T <: DokkaPlugin: ClassTag](ctx: DokkaContext) =
67+
ctx.plugin[T](getKotlinClass(implicitly[ClassTag[T]].runtimeClass.asInstanceOf[Class[T]]))
68+
69+
def query[T <: DokkaPlugin: ClassTag, E](ctx: DokkaContext, queryFunction: (T) => ExtensionPoint[E]): List[E] =
70+
ctx.get(queryFunction(plugin[T](ctx))).asScala.toList
71+
72+
def querySingle[T <: DokkaPlugin: ClassTag, E](ctx: DokkaContext, queryFunction: (T) => ExtensionPoint[E]): E =
73+
ctx.single(queryFunction(plugin[T](ctx)))

scala3doc/src/dotty/dokka/utils.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import org.jetbrains.dokka.model.properties.PropertyContainer
1414
import java.util.function.Consumer
1515
import kotlin.jvm.functions.Function2
1616
import org.jetbrains.dokka.DokkaConfiguration$DokkaSourceSet
17-
import org.jetbrains.dokka.plugability._
18-
import kotlin.jvm.JvmClassMappingKt.getKotlinClass
1917

2018
class BaseKey[T, V] extends ExtraProperty.Key[T, V]:
2119
override def mergeStrategyFor(left: V, right: V): MergeStrategy[T] =

scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.jetbrains.dokka.base.resolvers.local.LocationProvider
2323
import dotty.dokka.site.StaticPageNode
2424
import dotty.dokka.site.PartiallyRenderedContent
2525
import scala.util.Try
26+
import org.jetbrains.dokka.base.renderers.html.SearchbarDataInstaller
2627

2728
class SignatureRenderer(pageContext: ContentPage, sourceSetRestriciton: JSet[DisplaySourceSet], locationProvider: LocationProvider):
2829
def link(dri: DRI): Option[String] = Option(locationProvider.resolve(dri, sourceSetRestriciton, pageContext))
@@ -42,6 +43,14 @@ class SignatureRenderer(pageContext: ContentPage, sourceSetRestriciton: JSet[Dis
4243

4344
class ScalaHtmlRenderer(ctx: DokkaContext) extends HtmlRenderer(ctx) {
4445

46+
// TODO #239
47+
val hackScalaSearchbarDataInstaller: SearchbarDataInstaller = {
48+
val f = classOf[HtmlRenderer].getDeclaredField("searchbarDataInstaller")
49+
f.setAccessible(true)
50+
f.set(this, ScalaSearchbarDataInstaller(ctx))
51+
f.get(this).asInstanceOf[ScalaSearchbarDataInstaller]
52+
}
53+
4554
// Implementation below is based on Kotlin bytecode and we will try to migrate it to dokka
4655
// TODO (https://github.com/lampepfl/scala3doc/issues/232): Move this method to dokka
4756
def withHtml(context: FlowContent, content: String): Unit = context match {
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package dotty.dokka
2+
3+
import com.fasterxml.jackson.module.kotlin.ExtensionsKt._
4+
import org.jetbrains.dokka.base.renderers.html.{SearchbarDataInstaller, SearchRecord}
5+
import java.util.{List => JList}
6+
import java.util.concurrent.ConcurrentHashMap
7+
import collection.JavaConverters._
8+
import org.jetbrains.dokka.pages._
9+
import dotty.dokka.model.api._
10+
import org.jetbrains.dokka.plugability._
11+
import org.jetbrains.dokka.plugability.DokkaContext
12+
import org.jetbrains.dokka.plugability.DokkaPluginKt._
13+
import org.jetbrains.dokka.base.DokkaBase
14+
import dotty.dokka.PluginUtils._
15+
import org.jetbrains.dokka.base.signatures.SignatureProvider
16+
import org.jetbrains.dokka._
17+
import org.jetbrains.dokka.model._
18+
import scala.collection.concurrent.TrieMap
19+
import dotty.dokka.site.StaticPageNode
20+
21+
class ScalaSearchbarDataInstaller(val ctx: DokkaContext) extends SearchbarDataInstaller:
22+
23+
case class PageEntry(val name: String, val signature: String, val link: String, val pkg: String)
24+
25+
// We need to use there mutable, concurrent collections because Dokka renders content concurrently
26+
// and adds entry to searchbar on start of processing page
27+
val pages = TrieMap[String, PageEntry]()
28+
29+
val signatureProvider = querySingle[DokkaBase, SignatureProvider](ctx, _.getSignatureProvider)
30+
31+
override def processPage(page: ContentPage, link: String) =
32+
Option(page.getDocumentable) match {
33+
case Some(member) => processMember(member, link)
34+
case None => page match {
35+
case p: StaticPageNode => processStaticSite(p, link)
36+
case _ => ()
37+
}
38+
}
39+
40+
def flattenToText(node: ContentNode): String = {
41+
def getContentTextNodes(node: ContentNode, sourceSetRestriciton: DisplaySourceSet): List[ContentText] = node match {
42+
case t: ContentText => List(t)
43+
case c: ContentComposite if c.getDci.getKind != ContentKind.Annotations => c.getChildren.asScala
44+
.filter(_.getSourceSets.asScala.contains(sourceSetRestriciton))
45+
.flatMap(getContentTextNodes(_, sourceSetRestriciton))
46+
.toList
47+
case _ => List.empty
48+
}
49+
50+
val sourceSetRestriciton = node.getSourceSets.asScala.find(_.getPlatform == Platform.common).getOrElse(node.getSourceSets.asScala.head)
51+
getContentTextNodes(node, sourceSetRestriciton).map(_.getText).mkString("")
52+
}
53+
54+
def processMember(member: Member, link: String) = {
55+
val memberSignature = flattenToText(signatureProvider.signature(member).get(0))
56+
val memberPackage = (Option(member.dri.getPackageName) ++ Option(member.dri.getClassNames) ++ Option(member.dri.getCallable)).mkString(".")
57+
pages.addOne(memberSignature + link, PageEntry(member.name, memberSignature, link, memberPackage))
58+
}
59+
60+
def processStaticSite(p: StaticPageNode, link: String) = {
61+
pages.addOne(p.getName + link, PageEntry(p.getName, p.getName, link, ""))
62+
}
63+
64+
override def generatePagesList(): String = {
65+
val mapper = jacksonObjectMapper()
66+
val pagesList = pages.values.map(p => createSearchRecord(p.signature, p.pkg, p.link, List(p.name).asJava)).toList.asJava
67+
mapper.writeValueAsString(pagesList)
68+
}

0 commit comments

Comments
 (0)