Skip to content

Commit ef48716

Browse files
authored
Merge pull request #11232 from BarkingBad/scala3doc/sealed-classes
Add sealed keyword to nodes in graphs"
2 parents 585c5e6 + 2b86d82 commit ef48716

34 files changed

+99
-30
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package tests
2+
package sealedClasses
3+
4+
sealed trait A
5+
6+
sealed trait B1 extends A
7+
case class B2(a: Int) extends A
8+
case object B3 extends A
9+
class B4 extends A
10+
object B4 extends A
11+
object B5 extends A
12+
case class B6(a: Int) extends A
13+
case object B6 extends A
14+
15+
sealed trait C1 extends B1
16+
case class C2(a: Int) extends B1
17+
case object C3 extends B1
18+
class C4 extends B1
19+
object C4 extends B1
20+
object C5 extends B1
21+
case class C6(a: Int) extends B1
22+
case object C6 extends B1
23+
sealed trait C7 extends B1
24+

scaladoc-testcases/src/tests/shadowingDRI.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ class S:
77
class R:
88
def findThisDeclaration = 1
99

10-
given R: A[B] with {}
10+
given R: A[B] with {}

scaladoc/src/dotty/tools/scaladoc/ScalaModuleCreator.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package dotty.tools.scaladoc
22

3-
import dotty.tools.scaladoc.tasty.DokkaTastyInspector
3+
import dotty.tools.scaladoc.tasty.ScaladocTastyInspector
44
import collection.JavaConverters._
55
import transformers._
66

77
case class Module(rootPackage: Member, members: Map[DRI, Member])
88

99
object ScalaModuleProvider:
1010
def mkModule()(using ctx: DocContext): Module =
11-
val (result, rootDoc) = DokkaTastyInspector().result()
11+
val (result, rootDoc) = ScaladocTastyInspector().result()
1212
val (rootPck, rest) = result.partition(_.name == "API")
1313
val packageMembers = (rest ++ rootPck.flatMap(_.members))
1414
.filter(p => p.members.nonEmpty || p.docs.nonEmpty).sortBy(_.name)
@@ -22,6 +22,7 @@ object ScalaModuleProvider:
2222

2323
val transformers = List(
2424
ImplicitMembersExtensionTransformer(),
25-
InheritanceInformationTransformer()
25+
InheritanceInformationTransformer(),
26+
SealedMarksGraphTransformer()
2627
)
2728
transformers.foldLeft(original)((module, transformer) => transformer.apply(module))

scaladoc/src/dotty/tools/scaladoc/api.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,9 @@ extension (s: Signature)
126126
def join(a: Signature): Signature = s ++ a
127127

128128
case class LinkToType(signature: Signature, dri: DRI, kind: Kind)
129-
case class HierarchyGraph(edges: Seq[(LinkToType, LinkToType)]):
130-
private def vertecies: Seq[LinkToType] = edges.flatten((a, b) => Seq(a, b)).distinct
129+
130+
case class HierarchyGraph(edges: Seq[(LinkToType, LinkToType)], sealedNodes: Set[LinkToType] = Set.empty):
131+
def vertecies: Seq[LinkToType] = edges.flatten((a, b) => Seq(a, b)).distinct
131132
def verteciesWithId: Map[LinkToType, Int] = vertecies.zipWithIndex.toMap
132133
def +(edge: (LinkToType, LinkToType)): HierarchyGraph = HierarchyGraph((edges :+ edge).distinct)
133134
def ++(edges: Seq[(LinkToType, LinkToType)]): HierarchyGraph = edges.foldLeft(this) {
@@ -137,7 +138,6 @@ object HierarchyGraph:
137138
def empty = HierarchyGraph(Seq.empty)
138139
def withEdges(edges: Seq[(LinkToType, LinkToType)]) = HierarchyGraph.empty ++ edges
139140

140-
141141
case class Member(
142142
name: String,
143143
dri: DRI,

scaladoc/src/dotty/tools/scaladoc/renderers/DotDiagramBuilder.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import util.HTML._
55

66
object DotDiagramBuilder:
77
def build(diagram: HierarchyGraph, renderer: SignatureRenderer)(using DocContext): String =
8-
def getStyle(vertex: LinkToType) = vertex.kind match
8+
def getStyle(kind: Kind) = kind match
99
case _ : Kind.Class => "fill: #45AD7D;"
1010
case Kind.Object => "fill: #285577;"
1111
case _ : Kind.Trait => "fill: #1CAACF;"
@@ -14,8 +14,9 @@ object DotDiagramBuilder:
1414
case other => report.error(s"unexpected value: $other")
1515

1616
val vWithId = diagram.verteciesWithId
17+
val sealedNodes = diagram.sealedNodes
1718
val vertecies = vWithId.map { (vertex, id) =>
18-
s"""node${id} [id=node${id}, label="${getHtmlLabel(vertex, renderer)}", style="${getStyle(vertex)}"];\n"""
19+
s"""node${id} [id=node${id}, label="${getHtmlLabel(vertex, renderer, sealedNodes)}", style="${getStyle(vertex.kind)}"];\n"""
1920
}.mkString
2021

2122
val edges = diagram.edges.map { (from, to) =>
@@ -29,8 +30,9 @@ object DotDiagramBuilder:
2930
|}
3031
|""".stripMargin
3132

32-
private def getHtmlLabel(vertex: LinkToType, renderer: SignatureRenderer): String =
33+
private def getHtmlLabel(vertex: LinkToType, renderer: SignatureRenderer, sealedNodes: Set[LinkToType]): String =
3334
span(style := "color: #FFFFFF;")(
35+
if sealedNodes.contains(vertex) then "sealed " else "",
3436
vertex.kind.name,
3537
" ",
3638
vertex.signature.map(renderer.renderElementWith(_))

scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ trait ClassLikeSupport:
4848
signatureOnly: Boolean = false,
4949
modifiers: Seq[Modifier] = classDef.symbol.getExtraModifiers(),
5050
): Member =
51-
5251
def unpackTreeToClassDef(tree: Tree): ClassDef = tree match
5352
case tree: ClassDef => tree
5453
case TypeDef(_, tbt: TypeBoundsTree) => unpackTreeToClassDef(tbt.tpe.typeSymbol.tree)
@@ -73,14 +72,15 @@ trait ClassLikeSupport:
7372
}
7473
val selfSiangture: DSignature = typeForClass(classDef).asSignature
7574

76-
val graph = HierarchyGraph.withEdges(getSupertypesGraph(classDef,
77-
LinkToType(selfSiangture, classDef.symbol.dri, bareClasslikeKind(classDef.symbol))))
75+
val graph = HierarchyGraph.withEdges(
76+
getSupertypesGraph(classDef, LinkToType(selfSiangture, classDef.symbol.dri, bareClasslikeKind(classDef.symbol)))
77+
)
7878

7979
val baseMember = mkMember(classDef.symbol, kindForClasslike(classDef), selfSiangture)(
80-
modifiers = modifiers,
81-
graph = graph,
82-
deprecated = classDef.symbol.isDeprecated()
83-
)
80+
modifiers = modifiers,
81+
graph = graph,
82+
deprecated = classDef.symbol.isDeprecated()
83+
)
8484

8585
if signatureOnly then baseMember else baseMember.copy(
8686
members = classDef.extractPatchedMembers,

scaladoc/src/dotty/tools/scaladoc/tasty/TastyParser.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import java.nio.file.Files
2121
*
2222
* Delegates most of the work to [[TastyParser]] [[dotty.tools.scaladoc.tasty.TastyParser]].
2323
*/
24-
case class DokkaTastyInspector()(using ctx: DocContext) extends DocTastyInspector:
24+
case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspector:
2525

2626
private val topLevels = Seq.newBuilder[(String, Member)]
2727
private var rootDoc: Option[Comment] = None
@@ -137,7 +137,7 @@ case class DokkaTastyInspector()(using ctx: DocContext) extends DocTastyInspecto
137137
/** Parses a single Tasty compilation unit. */
138138
case class TastyParser(
139139
qctx: Quotes,
140-
inspector: DokkaTastyInspector,
140+
inspector: ScaladocTastyInspector,
141141
)(
142142
isSkipped: qctx.reflect.Symbol => Boolean
143143
)(
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package dotty.tools.scaladoc
2+
package transformers
3+
4+
5+
class SealedMarksGraphTransformer(using context: DocContext) extends (Module => Module):
6+
override def apply(original: Module): Module =
7+
val sealedRelations = getSealedRelations(original.rootPackage)
8+
original.updateMembers { m =>
9+
m.copy(graph = m.graph.copy(sealedNodes = m.graph.vertecies.filter { v =>
10+
sealedRelations.contains(v.dri)
11+
}.toSet))
12+
}
13+
14+
private def getSealedRelations(c: Member): Set[DRI] =
15+
val selfMapping = if c.modifiers.contains(Modifier.Sealed) then Set(c.dri) else Set.empty
16+
selfMapping ++ c.members.flatMap(getSealedRelations)

scaladoc/src/scala/tasty/inspector/DocTastyInspector.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ abstract class DocTastyInspector extends OldTastyInspector:
66
def inspectFilesInDocContext(
77
classpath: List[String],
88
filePaths: List[String])(
9-
using Context): Unit = inspectFilesInContext(classpath, filePaths)
9+
using Context): Unit = inspectFilesInContext(classpath, filePaths)

0 commit comments

Comments
 (0)