@@ -18,6 +18,7 @@ package com.lightbend.paradox.apidoc
1818
1919import com .lightbend .paradox .markdown .InlineDirective
2020import org .pegdown .Printer
21+ import org .pegdown .ast .DirectiveNode .Source
2122import org .pegdown .ast .{DirectiveNode , Visitor }
2223
2324class ApidocDirective (allClassesAndObjects : IndexedSeq [String ], properties : Map [String , String ])
@@ -29,9 +30,13 @@ class ApidocDirective(allClassesAndObjects: IndexedSeq[String], properties: Map[
2930
3031 val allClasses = allClassesAndObjects.filterNot(_.endsWith(" $" ))
3132
32- private case class Query (pattern : String , generics : String , linkToObject : Boolean ) {
33+ private case class Query (label : Option [ String ], pattern : String , generics : String , linkToObject : Boolean ) {
3334 def scalaLabel (matched : String ): String =
34- matched.split('.' ).last + generics
35+ label match {
36+ case None => matched.split('.' ).last + generics
37+ case Some (la) => la + generics
38+ }
39+
3540 def javaLabel (matched : String ): String =
3641 scalaLabel(matched)
3742 .replaceAll(" \\ [" , " <" )
@@ -44,19 +49,33 @@ class ApidocDirective(allClassesAndObjects: IndexedSeq[String], properties: Map[
4449 }
4550 private object Query {
4651 def apply (label : String ): Query = {
47- val (pattern, generics) = label.indexOf('[' ) match {
48- case - 1 => (label, " " )
49- case n => label.replaceAll(" \\\\ _" , " _" ).splitAt(n)
50- }
52+ val (pattern, generics) = splitGenerics(label)
53+ if (pattern.endsWith(" $" ))
54+ Query (None , pattern.init, generics, linkToObject = true )
55+ else
56+ Query (None , pattern, generics, linkToObject = false )
57+ }
58+
59+ def apply (label : String , pattern : String ): Query = {
60+ val (labelPattern, generics) = splitGenerics(label)
5161 if (pattern.endsWith(" $" ))
52- Query (pattern.init, generics, linkToObject = true )
62+ Query (Some (labelPattern), pattern.init, generics, linkToObject = true )
5363 else
54- Query (pattern, generics, linkToObject = false )
64+ Query (Some (labelPattern), pattern, generics, linkToObject = false )
5565 }
66+
67+ private def splitGenerics (label : String ): (String , String ) =
68+ label.indexOf('[' ) match {
69+ case - 1 => (label, " " )
70+ case n => label.replaceAll(" \\\\ _" , " _" ).splitAt(n)
71+ }
5672 }
5773
5874 def render (node : DirectiveNode , visitor : Visitor , printer : Printer ): Unit = {
59- val query = Query (node.label)
75+ val query = node.source match {
76+ case Source .Empty | _ : Source .Ref => Query (node.label)
77+ case s : Source .Direct => Query (node.label, s.value)
78+ }
6079 if (query.pattern.contains('.' )) {
6180 if (allClasses.contains(query.pattern)) {
6281 renderMatches(query, Seq (query.pattern), node, visitor, printer)
@@ -84,6 +103,7 @@ class ApidocDirective(allClassesAndObjects: IndexedSeq[String], properties: Map[
84103 doctype : String ,
85104 label : String ,
86105 fqcn : String ,
106+ anchor : String ,
87107 node : DirectiveNode
88108 ): DirectiveNode = {
89109 val attributes = new org.pegdown.ast.DirectiveAttributes .AttributeMap ()
@@ -98,7 +118,7 @@ class ApidocDirective(allClassesAndObjects: IndexedSeq[String], properties: Map[
98118 DirectiveNode .Format .Inline ,
99119 doctype + " doc" ,
100120 label,
101- new DirectiveNode .Source .Direct (fqcn),
121+ new DirectiveNode .Source .Direct (fqcn + anchor ),
102122 node.attributes,
103123 label, // contents
104124 null
@@ -114,6 +134,8 @@ class ApidocDirective(allClassesAndObjects: IndexedSeq[String], properties: Map[
114134 printer : Printer
115135 ): Unit = {
116136 val scalaClassSuffix = if (query.linkToObject) " $" else " "
137+ val sAnchor = node.attributes.value(" scala" , " " )
138+ val jAnchor = node.attributes.value(" java" , " " )
117139
118140 matches.size match {
119141 case 0 =>
@@ -122,20 +144,22 @@ class ApidocDirective(allClassesAndObjects: IndexedSeq[String], properties: Map[
122144 throw new java.lang.IllegalStateException (s " Match for $query only found in one language: ${matches(0 )}" )
123145 case 1 =>
124146 val pkg = matches(0 )
125- syntheticNode(" scala" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, node).accept(visitor)
126- if (hasJavadocUrl(pkg))
127- syntheticNode(" java" , " java" , query.javaLabel(pkg), pkg, node).accept(visitor)
128- else
129- syntheticNode(" java" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, node).accept(visitor)
147+ syntheticNode(" scala" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, sAnchor, node).accept(visitor)
148+ if (hasJavadocUrl(pkg)) {
149+ syntheticNode(" java" , " java" , query.javaLabel(pkg), pkg, jAnchor, node).accept(visitor)
150+ } else
151+ syntheticNode(" java" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, jAnchor, node).accept(visitor)
130152 case 2 if matches.forall(_.contains(" adsl" )) =>
131153 matches.foreach(pkg => {
132154 if (! pkg.contains(" javadsl" ))
133- syntheticNode(" scala" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, node).accept(visitor)
155+ syntheticNode(" scala" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, sAnchor, node)
156+ .accept(visitor)
134157 if (! pkg.contains(" scaladsl" )) {
135158 if (hasJavadocUrl(pkg))
136- syntheticNode(" java" , " java" , query.javaLabel(pkg), pkg, node).accept(visitor)
159+ syntheticNode(" java" , " java" , query.javaLabel(pkg), pkg, jAnchor, node).accept(visitor)
137160 else
138- syntheticNode(" java" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, node).accept(visitor)
161+ syntheticNode(" java" , " scala" , query.scalaLabel(pkg), pkg + scalaClassSuffix, jAnchor, node)
162+ .accept(visitor)
139163 }
140164 })
141165 case n =>
0 commit comments