Skip to content

Commit 410d1ca

Browse files
committed
Fix searchbar to match only by name
1 parent cda0338 commit 410d1ca

File tree

4 files changed

+83
-2
lines changed

4 files changed

+83
-2
lines changed

scala3doc/src/dotty/dokka/compat.scala

Lines changed: 11 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,12 @@ 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 query[T <: DokkaPlugin, E](ctx: DokkaContext, queryFunction: (T) => ExtensionPoint[E])(implicit tag: ClassTag[T]): List[E] =
67+
ctx.get(queryFunction(ctx.plugin[T](getKotlinClass(tag.runtimeClass.asInstanceOf[Class[T]])))).asScala.toList
68+
69+
def querySingle[T <: DokkaPlugin, E](ctx: DokkaContext, queryFunction: (T) => ExtensionPoint[E])(implicit tag: ClassTag[T]): E =
70+
ctx.single(queryFunction(ctx.plugin[T](getKotlinClass(tag.runtimeClass.asInstanceOf[Class[T]]))))

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: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import dotty.dokka.model.api.HierarchyGraph
2121
import org.jetbrains.dokka.base.resolvers.local.LocationProvider
2222
import dotty.dokka.site.StaticPageNode
2323
import dotty.dokka.site.PartiallyRenderedContent
24+
import org.jetbrains.dokka.base.renderers.html.SearchbarDataInstaller
2425

2526
class SignatureRenderer(pageContext: ContentPage, sourceSetRestriciton: JSet[DisplaySourceSet], locationProvider: LocationProvider):
2627
def link(dri: DRI): Option[String] = Option(locationProvider.resolve(dri, sourceSetRestriciton, pageContext))
@@ -40,6 +41,19 @@ class SignatureRenderer(pageContext: ContentPage, sourceSetRestriciton: JSet[Dis
4041

4142
class ScalaHtmlRenderer(ctx: DokkaContext) extends HtmlRenderer(ctx) {
4243

44+
// TODO #239
45+
val hackScalaSearchbarDataInstaller: SearchbarDataInstaller = {
46+
import java.lang.reflect.Field;
47+
import java.lang.reflect.Modifier;
48+
val f = classOf[HtmlRenderer].getDeclaredField("searchbarDataInstaller")
49+
f.setAccessible(true)
50+
val modifiersField = classOf[Field].getDeclaredField("modifiers")
51+
modifiersField.setAccessible(true)
52+
modifiersField.setInt(f, f.getModifiers() & Modifier.FINAL.unary_~)
53+
f.set(this, ScalaSearchbarDataInstaller(ctx))
54+
f.get(this).asInstanceOf[ScalaSearchbarDataInstaller]
55+
}
56+
4357
// Implementation below is based on Kotlin bytecode and we will try to migrate it to dokka
4458
// TODO (https://github.com/lampepfl/scala3doc/issues/232): Move this method to dokka
4559
def withHtml(context: FlowContent, content: String): Unit = context match {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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+
20+
class ScalaSearchbarDataInstaller(val ctx: DokkaContext) extends SearchbarDataInstaller:
21+
22+
case class PageEntry(val name: String, val signature: String, val link: String, val pkg: String)
23+
24+
val pages = TrieMap[String, PageEntry]()
25+
26+
val signatureProvider = querySingle[DokkaBase, SignatureProvider](ctx, _.getSignatureProvider)
27+
28+
override def processPage(page: ContentPage, link: String) =
29+
Option(page.getDocumentable) match {
30+
case Some(member) => processMember(member, link)
31+
case None => ()
32+
}
33+
34+
def flattenToText(node: ContentNode): String = {
35+
def getContentTextNodes(node: ContentNode, sourceSetRestriciton: DisplaySourceSet): List[ContentText] = node match {
36+
case t: ContentText => List(t)
37+
case c: ContentComposite if c.getDci.getKind != ContentKind.Annotations => c.getChildren.asScala
38+
.filter(_.getSourceSets.asScala.contains(sourceSetRestriciton))
39+
.flatMap(getContentTextNodes(_, sourceSetRestriciton))
40+
.toList
41+
case _ => List.empty
42+
}
43+
44+
val sourceSetRestriciton = node.getSourceSets.asScala.find(_.getPlatform == Platform.common).getOrElse(node.getSourceSets.asScala.head)
45+
getContentTextNodes(node, sourceSetRestriciton).map(_.getText).mkString("")
46+
}
47+
48+
def processMember(member: Member, link: String) = {
49+
val memberSignature = flattenToText(signatureProvider.signature(member).get(0))
50+
val memberPackage = (Option(member.dri.getPackageName) ++ Option(member.dri.getClassNames) ++ Option(member.dri.getCallable)).mkString(".")
51+
pages.addOne(memberSignature + link, PageEntry(member.name, memberSignature, link, memberPackage))
52+
}
53+
54+
override def generatePagesList(): String = {
55+
val mapper = jacksonObjectMapper()
56+
val pagesList = pages.values.map(p => createSearchRecord(p.signature, p.pkg, p.link, List(p.name).asJava)).toList.asJava
57+
mapper.writeValueAsString(pagesList)
58+
}

0 commit comments

Comments
 (0)