Skip to content

Commit c042be9

Browse files
authored
Merge pull request #10595 from lampepfl/deprecated
Handle deprecated signatures in Scala3doc
2 parents e5e27a4 + 0d452e6 commit c042be9

File tree

13 files changed

+79
-42
lines changed

13 files changed

+79
-42
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package tests
2+
package deprecated
3+
4+
class A:
5+
def defInt: Int = 1
6+
@deprecated(message = "1")
7+
def def1: 1 = 1
8+
@deprecated("reason")
9+
val valInt: Int = 1
10+
val val1: 1 = 1
11+
var varInt: Int = 1
12+
var var1: 1 = 1
13+
class InnerA:
14+
val innerVal: Int = 1
15+
16+
class B extends A:
17+
@deprecated(since = "1", message = "some reason")
18+
def x: Int = 1
19+
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/model/api/api.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,12 @@ enum Origin:
8080
case class Annotation(val dri: DRI, val params: List[Annotation.AnnotationParameter])
8181

8282
object Annotation:
83-
sealed trait AnnotationParameter
84-
case class PrimitiveParameter(val name: Option[String] = None, val value: String) extends AnnotationParameter
85-
case class LinkParameter(val name: Option[String] = None, val dri: DRI, val value: String) extends AnnotationParameter
86-
case class UnresolvedParameter(val name: Option[String] = None, val unresolvedText: String) extends AnnotationParameter
83+
sealed trait AnnotationParameter {
84+
val name: Option[String]
85+
}
86+
case class PrimitiveParameter(name: Option[String] = None, value: String) extends AnnotationParameter
87+
case class LinkParameter(name: Option[String] = None, dri: DRI, value: String) extends AnnotationParameter
88+
case class UnresolvedParameter(name: Option[String] = None, unresolvedText: String) extends AnnotationParameter
8789

8890
// TODO (longterm) properly represent signatures
8991
case class Link(name: String, dri: DRI)
@@ -124,6 +126,7 @@ extension[T] (member: Member):
124126

125127
def signature: Signature = memberExt.fold(Signature(name))(_.signature)
126128
def asLink: LinkToType = LinkToType(signature, dri, kind)
129+
def deprecated: Option[Annotation] = memberExt.flatMap(_.annotations.find(a => a.dri.getPackageName == "scala" && a.dri.getClassNames == "deprecated"))
127130

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

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ 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,

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-

scala3doc/src/dotty/dokka/tasty/BasicSupport.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@ trait BasicSupport:
1717
val dri = annotTerm.tpe.typeSymbol.dri
1818
val params = annotTerm match
1919
case Apply(target, appliedWith) => {
20-
appliedWith.map {
21-
case Literal(constant) => Annotation.PrimitiveParameter(None, constant.value match {
20+
appliedWith.flatMap {
21+
case Literal(constant) => Some(Annotation.PrimitiveParameter(None, constant.value match {
2222
case s: String => "\"" + s"$s" + "\""
2323
case other => other.toString()
24-
})
25-
case Select(qual, name) =>
26-
val dri = qual.tpe.termSymbol.companionClass.dri
27-
Annotation.LinkParameter(None, dri, s"${dri.getClassNames}.$name") // TODO this is a nasty hack!
28-
29-
case other => Annotation.UnresolvedParameter(None, other.show)
24+
}))
25+
case NamedArg(name, Literal(constant)) => Some(Annotation.PrimitiveParameter(Some(name), constant.value match
26+
case s: String => "\"" + s"$s" + "\""
27+
case other => other.toString()
28+
))
29+
case x @ Select(qual, name) => None
30+
case other => Some(Annotation.UnresolvedParameter(None, other.show))
3031
}
3132
}
3233

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,11 @@ class ScalaPageContentBuilder(
494494
Signature("Exported from ", signatureName)
495495
case _ => Nil
496496
}
497-
497+
val styles: Set[Style] = if documentable.deprecated.isDefined then Set(TextStyle.Strikethrough) else Set.empty
498498
DocumentableElement(
499499
buildAnnotations(documentable),
500500
signatureBuilder.preName.reverse,
501-
documentable.getName,
501+
DocumentableNameWithStyles(documentable.getName, styles),
502502
signatureBuilder.names.reverse,
503503
docs.fold(Nil)(d => reset().rawComment(d.getRoot)),
504504
originInfo,

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,14 +323,34 @@ class ScalaPageCreator(
323323
case _ => withCompanion
324324
}
325325

326-
d match
326+
val withSource = d match
327327
case null => withExtensionInformation
328328
case m: Member =>
329329
ctx.sourceLinks.pathTo(m).fold(withCompanion){ link =>
330330
val sourceSets = m.getSourceSets.asScala.toSet
331331
withExtensionInformation.cell(sourceSets = sourceSets)(_.text("Source"))
332332
.cell(sourceSets = sourceSets)(_.resolvedLink("(source)", link))
333+
333334
}
335+
336+
d.deprecated match
337+
case None => withSource
338+
case Some(a) =>
339+
extension (b: ScalaPageContentBuilder#ScalaDocumentableContentBuilder)
340+
def annotationParameter(p: Option[Annotation.AnnotationParameter]): ScalaPageContentBuilder#ScalaDocumentableContentBuilder =
341+
p match
342+
case Some(Annotation.PrimitiveParameter(_, value)) => b.text(value.stripPrefix("\"").stripSuffix("\""))
343+
case Some(Annotation.LinkParameter(_, dri, text)) => b.driLink(text.stripPrefix("\"").stripSuffix("\""), dri)
344+
case Some(Annotation.UnresolvedParameter(_, value)) => b.text(value.stripPrefix("\"").stripSuffix("\""))
345+
case _ => b
346+
val since = a.params.find(_.name.contains("since"))
347+
val message = a.params.find(_.name.contains("message"))
348+
val sourceSets = d.getSourceSets.asScala.toSet
349+
withSource.cell(sourceSets = sourceSets)(_.text("Deprecated"))
350+
.cell(sourceSets = sourceSets) { b =>
351+
val withPossibleSince = if (since.isDefined) b.text("(Since version ").annotationParameter(since).text(") ") else b
352+
withPossibleSince.annotationParameter(message)
353+
}
334354
}
335355
}
336356
}

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)(using
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)(using
4244
res.asInstanceOf[ContentNodeBuilder].builder
4345
})
4446

47+
private def stylesIfDeprecated(m: Member): Set[Style] =
48+
if m.deprecated.isDefined 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/dokka/translators/ScalaSignatureUtils.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ trait SignatureBuilder extends ScalaSignatureUtils {
5555
else this
5656

5757
private def addParameterName(txt: Option[String]): SignatureBuilder = txt match {
58-
case Some(name) => this.text(s"$txt = ")
58+
case Some(name) => this.text(s"$name = ")
5959
case _ => this
6060
}
6161

scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class ScalaHtmlRenderer(using ctx: DokkaContext) extends HtmlRenderer(ctx) {
8686
}
8787

8888
override def wrapGroup(f: FlowContent, node: ContentGroup, pageContext: ContentPage, childrenCallback: FlowContentConsumer) = {
89-
val additionalClasses = node.getStyle.asScala.map(_.toString.toLowerCase).mkString("", ",", "")
89+
val additionalClasses = node.getStyle.asScala.map(_.toString.toLowerCase).mkString("", " ", "")
9090
def buildSymbol: String = div(cls := s"symbol $additionalClasses")(
9191
raw(
9292
buildWithKotlinx(childrenCallback).toString
@@ -128,7 +128,7 @@ class ScalaHtmlRenderer(using ctx: DokkaContext) extends HtmlRenderer(ctx) {
128128
span(cls := "other-modifiers")(otherModifiers.map(renderElement)),
129129
span(cls := "kind")(kind.map(renderElement)),
130130
),
131-
renderLink(element.name, element.params.dri, cls := "documentableName monospace"),
131+
renderLink(element.nameWithStyles.name, element.params.dri, cls := s"documentableName monospace ${element.nameWithStyles.styles.map(_.toString.toLowerCase).mkString(" ")}"),
132132
span(cls := "signature monospace")(element.signature.map(renderElement)),
133133
div(
134134
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
@@ -104,7 +104,7 @@ abstract class SignatureTest(
104104
case c: ContentComposite =>
105105
c.getChildren.asScala.flatMap(flattenToText).toSeq
106106
case l: DocumentableElement =>
107-
(l.annotations ++ Seq(" ") ++ l.modifiers ++ Seq(l.name) ++ l.signature).map {
107+
(l.annotations ++ Seq(" ") ++ l.modifiers ++ Seq(l.nameWithStyles.name) ++ l.signature).map {
108108
case s: String => s
109109
case Link(s: String, _) => s
110110
}

0 commit comments

Comments
 (0)