Skip to content

Commit 2b86d82

Browse files
committed
Add sealed keyword to graphs to put emphasis on sealed relation
1 parent 49c59f5 commit 2b86d82

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)

scaladoc/test/dotty/dokka/RaportingTest.scala renamed to scaladoc/test/dotty/tools/scaladoc/RaportingTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ class ReportingTest:
5757
assertNoErrors(diag)
5858

5959
assertMessagesAbout(diag.infoMsgs)("generation completed successfully")
60-
}
60+
}

scaladoc/test/dotty/dokka/ScaladocTest.scala renamed to scaladoc/test/dotty/tools/scaladoc/ScaladocTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ abstract class ScaladocTest(val name: String):
1313

1414

1515
def withModule(op: DocContext ?=> Module => Unit) =
16-
given DocContext = testDocContext
16+
given DocContext = testDocContext(tastyFiles(name))
1717
op(ScalaModuleProvider.mkModule())
1818

1919
private def getTempDir() : TemporaryFolder =

scaladoc/test/dotty/dokka/diagram/HierarchyTest.scala renamed to scaladoc/test/dotty/tools/scaladoc/diagram/HierarchyTest.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,3 @@ class HierarchyTest extends ScaladocTest("hierarchy"):
9595
x.graph.edges.map((a, b) => (a.signature.getName, b.signature.getName)).toSet
9696
)
9797
case _ =>
98-
99-
100-
101-
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dotty.tools.scaladoc
2+
package diagram
3+
4+
import dotty.tools.scaladoc.ScaladocTest
5+
import scala.jdk.CollectionConverters.{ListHasAsScala, SeqHasAsJava}
6+
import org.junit.Assert.{assertSame, assertTrue, assertEquals}
7+
8+
class SealedHierarchyTest extends ScaladocTest("sealedClasses"):
9+
override def runTest = withModule(_.visitMembers(checkMember))
10+
11+
def checkMember(x: Member) = x.name match
12+
case "A" =>
13+
assertEquals(4, x.graph.sealedNodes.size)
14+
assertEquals(
15+
Set("A", "B1", "C1", "C7"),
16+
x.graph.sealedNodes.map(_.signature.getName)
17+
)
18+
case "B1" =>
19+
assertEquals(4, x.graph.sealedNodes.size)
20+
assertEquals(
21+
Set("A", "B1", "C1", "C7"),
22+
x.graph.sealedNodes.map(_.signature.getName)
23+
)
24+
case "C1" =>
25+
assertEquals(3, x.graph.sealedNodes.size)
26+
assertEquals(
27+
Set("A", "B1", "C1"),
28+
x.graph.sealedNodes.map(_.signature.getName)
29+
)
30+
case _ =>

scaladoc/test/dotty/dokka/renderers/LocationTests.scala renamed to scaladoc/test/dotty/tools/scaladoc/renderers/LocationTests.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.junit.Assert.{assertSame, assertTrue, assertEquals}
66
import dotty.tools.scaladoc.util.HTML._
77

88
class LocationTests:
9-
given DocContext = testDocContext
9+
given DocContext = testDocContext()
1010
object locations extends Locations:
1111
val members = Map.empty
1212

@@ -36,4 +36,4 @@ class LocationTests:
3636
assertEquals(
3737
"../../annotation",
3838
path("api/scala/annotation/meta/beanGetter", "api/scala/annotation"),
39-
)
39+
)

scaladoc/test/dotty/dokka/testUtils.scala renamed to scaladoc/test/dotty/tools/scaladoc/testUtils.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def testArgs(files: Seq[File] = Nil, dest: File = new File("notUsed")) = Scalado
5858

5959
def testContext = (new ContextBase).initialCtx.fresh.setReporter(new TestReporter)
6060

61-
def testDocContext = DocContext(testArgs(), testContext)
61+
def testDocContext(files: Seq[File] = Nil) = DocContext(testArgs(files), testContext)
6262

6363
def tastyFiles(name: String) =
6464
def listFilesSafe(dir: File) = Option(dir.listFiles).getOrElse {
@@ -69,4 +69,4 @@ def tastyFiles(name: String) =
6969
case f if f.getName endsWith ".tasty" => f :: Nil
7070
case _ => Nil
7171
}
72-
collectFiles(File(s"${BuildInfo.test_testcasesOutputDir}/tests/$name"))
72+
collectFiles(File(s"${BuildInfo.test_testcasesOutputDir}/tests/$name"))

0 commit comments

Comments
 (0)