Skip to content

Commit 8ec8a2a

Browse files
committed
Handle deprecated signatures in Scala3doc
1 parent 85e48f7 commit 8ec8a2a

File tree

12 files changed

+79
-28
lines changed

12 files changed

+79
-28
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package tests
2+
package deprecated
3+
4+
@Deprecated
5+
class A:
6+
def defInt: Int = 1
7+
def def1: 1 = 1
8+
val valInt: Int = 1
9+
val val1: 1 = 1
10+
var varInt: Int = 1
11+
var var1: 1 = 1
12+
class InnerA:
13+
val innerVal: Int = 1
14+
15+
class B:
16+
@Deprecated
17+
def x: Int = 1
18+
val y: Int = 1

scala3doc/resources/dotty_res/styles/scalastyle.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@ th {
292292
padding-top: 0;
293293
}
294294

295+
span[data-unresolved-link].strikethrough, a.strikethrough, div.strikethrough {
296+
text-decoration: line-through;
297+
}
295298
.brief {
296299
white-space: pre-wrap;
297300
overflow: hidden;

scala3doc/src/dotty/dokka/DottyDokkaPlugin.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ class DottyDokkaPlugin extends DokkaJavaPlugin:
125125
.name("implicitMembersExtensionTransformer")
126126
)
127127

128+
val deprecatedTransfomer = extend(
129+
_.extensionPoint(CoreExtensions.INSTANCE.getDocumentableTransformer)
130+
.fromInstance(DeprecatedTransformer)
131+
.name("deprecatedTransformer")
132+
)
133+
128134
val customDocumentationProvider = extend(
129135
_.extensionPoint(dokkaBase.getHtmlPreprocessors)
130136
.fromRecipe(c => SitePagesCreator(c.siteContext))

scala3doc/src/dotty/dokka/model/api/api.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ extension[T] (member: Member):
124124

125125
def signature: Signature = memberExt.fold(Signature(name))(_.signature)
126126
def asLink: LinkToType = LinkToType(signature, dri, kind)
127+
def isDeprecated: Boolean = memberExt.fold(false)(_.deprecated)
127128

128129
def modifiers: Seq[dotty.dokka.model.api.Modifier] = memberExt.fold(Nil)(_.modifiers)
129130
def kind: Kind = memberExt.fold(Kind.Unknown)(_.kind)

scala3doc/src/dotty/dokka/model/api/internalExtensions.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ private [model] case class MemberExtension(
2424
visibility: Visibility,
2525
modifiers: Seq[dotty.dokka.model.api.Modifier],
2626
kind: Kind,
27-
val annotations: List[Annotation],
27+
annotations: List[Annotation],
2828
signature: Signature,
2929
sources: Option[TastyDocumentableSource] = None,
3030
origin: Origin = Origin.DefinedWithin,
3131
graph: HierarchyGraph = HierarchyGraph.empty,
32+
deprecated: Boolean = false, // directly or indirectly
3233
) extends ExtraProperty[Documentable]:
3334
override def getKey = MemberExtension
3435

@@ -71,6 +72,10 @@ extension (member: Member):
7172
val ext = MemberExtension.getFrom(member).getOrElse(MemberExtension.empty).copy(kind = kind)
7273
putInMember(ext)
7374

75+
def withDeprecated(deprecated: Boolean): Member =
76+
val ext = MemberExtension.getFrom(member).getOrElse(MemberExtension.empty).copy(deprecated = deprecated)
77+
putInMember(ext)
78+
7479
def withMembers(newMembers: Seq[Member]): Member =
7580
val original = member.compositeMemberExt.getOrElse(CompositeMemberExtension())
7681
val newExt = original.copy(members = newMembers)

scala3doc/src/dotty/dokka/model/scalaModel.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,15 @@ abstract class ScalaContentNode(params: ContentNodeParams) extends ContentNode:
8888
override def getExtra = params.extra
8989
override def withNewExtras(p: PropertyContainer[ContentNode]) = newInstance(params.copy(extra = p))
9090

91+
case class DocumentableNameWithStyles(
92+
name: String,
93+
styles: Set[Style] = Set.empty,
94+
)
95+
9196
case class DocumentableElement(
9297
annotations: Signature,
9398
modifiers: Signature,
94-
name: String,
99+
nameWithStyles: DocumentableNameWithStyles,
95100
signature: Signature,
96101
brief: Seq[ContentNode],
97102
originInfo: Signature,

scala3doc/src/dotty/dokka/site/PartiallyRenderedContent.scala

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,3 @@ case class PartiallyRenderedContent(
4040
}
4141
}// forrach does not work here
4242
document.outerHtml()
43-
44-
45-
class A:
46-
def defInt: Int = 1
47-
def def1: 1 = 1
48-
val valInt: Int = 1
49-
val val1: 1 = 1
50-
var varInt: Int = 1
51-
var var1: 1 = 1
52-
53-
object X:
54-
def x: Int = 1
55-
val x2: 1 = 1
56-
var x3: Int = 1
57-
58-
class B:
59-
val a = new A
60-
export a._
61-
export X._
62-
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dotty.dokka
2+
3+
import org.jetbrains.dokka.plugability.DokkaContext
4+
import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
5+
import org.jetbrains.dokka.model._
6+
import collection.JavaConverters
7+
import collection.JavaConverters._
8+
import org.jetbrains.dokka.plugability.DokkaContext
9+
import org.jetbrains.dokka.model.properties._
10+
import dotty.dokka.model.api.memberExt
11+
12+
import dotty.dokka.model._
13+
import dotty.dokka.model.api._
14+
15+
object DeprecatedTransformer extends DocumentableTransformer:
16+
17+
private def updateRecursively(member: Member, op: (Boolean, Member) => Member): Member =
18+
member.withMembers(member.allMembers.map { case m: Member => updateRecursively(op(member.isDeprecated, m), op) })
19+
20+
override def invoke(original: DModule, context: DokkaContext): DModule =
21+
def appendDeprecated(isParentDeprecated: Boolean, m: Member): Member =
22+
m.withDeprecated(isParentDeprecated || !m.annotations.filter(a => a.dri.getPackageName == "java.lang" && a.dri.getClassNames == "Deprecated" ).isEmpty)
23+
24+
original.updatePackages(_.map(p => updateRecursively(appendDeprecated(false, p), appendDeprecated).asInstanceOf[DPackage]))
25+
26+
27+

scala3doc/src/dotty/dokka/translators/ScalaContentBuilder.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -496,11 +496,11 @@ class ScalaPageContentBuilder(
496496
Signature("Exported from ", signatureName)
497497
case _ => Nil
498498
}
499-
499+
val styles: Set[Style] = if documentable.isDeprecated then Set(TextStyle.Strikethrough) else Set.empty
500500
DocumentableElement(
501501
buildAnnotations(documentable),
502502
signatureBuilder.preName.reverse,
503-
documentable.getName,
503+
DocumentableNameWithStyles(documentable.getName, styles),
504504
signatureBuilder.names.reverse,
505505
docs.fold(Nil)(d => reset().rawComment(d.getRoot)),
506506
originInfo,

scala3doc/src/dotty/dokka/translators/ScalaSignatureProvider.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ class ScalaSignatureProvider(contentConverter: CommentsToContentConverter, logge
2222

2323
private def signatureContent(d: Documentable)(
2424
func: ScalaPageContentBuilder#ScalaDocumentableContentBuilder => ScalaPageContentBuilder#ScalaDocumentableContentBuilder
25-
) = contentBuilder.contentForDocumentable(d, kind = ContentKind.Symbol, styles = styles, buildBlock = func)
25+
) =
26+
val styles = stylesIfDeprecated(d)
27+
contentBuilder.contentForDocumentable(d, kind = ContentKind.Symbol, styles = styles, buildBlock = func)
2628

2729

2830
case class ContentNodeBuilder(builder: ScalaPageContentBuilder#ScalaDocumentableContentBuilder) extends SignatureBuilder{
@@ -42,6 +44,10 @@ class ScalaSignatureProvider(contentConverter: CommentsToContentConverter, logge
4244
res.asInstanceOf[ContentNodeBuilder].builder
4345
})
4446

47+
private def stylesIfDeprecated(m: Member): Set[Style] =
48+
if m.isDeprecated then styles ++ Set(TextStyle.Strikethrough) else styles
49+
50+
4551
object ScalaSignatureProvider:
4652
def rawSignature(documentable: Documentable, builder: SignatureBuilder): SignatureBuilder =
4753
documentable match

scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class ScalaHtmlRenderer(ctx: DokkaContext, args: Args) extends HtmlRenderer(ctx)
8585
}
8686

8787
override def wrapGroup(f: FlowContent, node: ContentGroup, pageContext: ContentPage, childrenCallback: FlowContentConsumer) = {
88-
val additionalClasses = node.getStyle.asScala.map(_.toString.toLowerCase).mkString("", ",", "")
88+
val additionalClasses = node.getStyle.asScala.map(_.toString.toLowerCase).mkString("", " ", "")
8989
def buildSymbol: String = div(cls := s"symbol $additionalClasses")(
9090
raw(
9191
buildWithKotlinx(childrenCallback).toString
@@ -134,7 +134,7 @@ class ScalaHtmlRenderer(ctx: DokkaContext, args: Args) extends HtmlRenderer(ctx)
134134
span(cls := "other-modifiers")(otherModifiers.map(renderElement)),
135135
span(cls := "kind")(kind.map(renderElement)),
136136
),
137-
renderLink(element.name, element.params.dri, cls := "documentableName monospace"),
137+
renderLink(element.nameWithStyles.name, element.params.dri, cls := s"documentableName monospace ${element.nameWithStyles.styles.map(_.toString.toLowerCase).mkString(" ")}"),
138138
span(cls := "signature monospace")(element.signature.map(renderElement)),
139139
div(
140140
div(cls := "originInfo")(element.originInfo.map(renderElement)),

scala3doc/test/dotty/dokka/SignatureTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ abstract class SignatureTest(
103103
case c: ContentComposite =>
104104
c.getChildren.asScala.flatMap(flattenToText).toSeq
105105
case l: DocumentableElement =>
106-
(l.annotations ++ Seq(" ") ++ l.modifiers ++ Seq(l.name) ++ l.signature).map {
106+
(l.annotations ++ Seq(" ") ++ l.modifiers ++ Seq(l.nameWithStyles.name) ++ l.signature).map {
107107
case s: String => s
108108
case Link(s: String, _) => s
109109
}

0 commit comments

Comments
 (0)