Skip to content

Commit 5bc7a0e

Browse files
BarkingBadromanowski
authored andcommitted
Removed Edge and Vertex abstraction to simplify graph
1 parent 8ae147f commit 5bc7a0e

File tree

4 files changed

+19
-31
lines changed

4 files changed

+19
-31
lines changed

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

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -98,28 +98,15 @@ extension (s: Signature):
9898
def join(a: Signature): Signature = s ++ a
9999

100100
case class LinkToType(signature: Signature, dri: DRI, kind: Kind)
101-
102-
case class Vertex(id: Int, body: LinkToType)
103-
case class Edge(from: Vertex, to: Vertex)
104-
case class HierarchyGraph private (edges: Seq[Edge], private val nextId: Int):
105-
def vertecies = edges.flatMap(edge => Seq(edge.from, edge.to)).distinct
106-
def +(edge: (LinkToType, LinkToType)) =
107-
val from = vertecies.find(_.body == edge._1).getOrElse(Vertex(nextId, edge._1))
108-
val to = vertecies.find(_.body == edge._2).getOrElse {
109-
val id = if from.id == nextId then nextId + 1 else nextId
110-
Vertex(id, edge._2)
111-
}
112-
val higherId = List(from.id, to.id).max
113-
val newNextId = if higherId >= nextId then higherId + 1 else nextId
114-
HierarchyGraph(edges ++ Seq(Edge(from, to)), newNextId)
115-
116-
def ++(edges: Seq[(LinkToType, LinkToType)]) = edges.foldLeft(this) {
101+
case class HierarchyGraph(edges: Seq[(LinkToType, LinkToType)]):
102+
def vertecies: Seq[LinkToType] = edges.flatten((a, b) => Seq(a, b)).distinct
103+
val verteciesWithId: Map[LinkToType, Int] = vertecies.zipWithIndex.toMap
104+
def +(edge: (LinkToType, LinkToType)): HierarchyGraph = HierarchyGraph((edges :+ edge).distinct)
105+
def ++(edges: Seq[(LinkToType, LinkToType)]): HierarchyGraph = edges.foldLeft(this) {
117106
case (acc, edge) => acc + edge
118107
}
119-
120108
object HierarchyGraph:
121-
def empty = HierarchyGraph(Seq.empty, 0)
122-
def withEdge(edge: (LinkToType, LinkToType)) = HierarchyGraph.empty + edge
109+
def empty = HierarchyGraph(Seq.empty)
123110
def withEdges(edges: Seq[(LinkToType, LinkToType)]) = HierarchyGraph.empty ++ edges
124111

125112

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ trait ClassLikeSupport:
5555
}
5656
val selfSiangture: DSignature = typeForClass(classDef).dokkaType.asSignature
5757

58-
val graph = HierarchyGraph.empty ++ getSupertypesGraph(classDef, LinkToType(selfSiangture, classDef.symbol.dri, kindForClasslike(classDef.symbol)))
58+
val graph = HierarchyGraph.withEdges(getSupertypesGraph(classDef, LinkToType(selfSiangture, classDef.symbol.dri, kindForClasslike(classDef.symbol))))
5959
val baseExtra = PropertyContainer.Companion.empty()
6060
.plus(ClasslikeExtension(classDef.getConstructorMethod, classDef.getCompanion))
6161
.plus(MemberExtension(

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -430,14 +430,14 @@ class ScalaPageCreator(
430430
}
431431
}
432432

433-
graph.fold(withSubtypes) { g =>
434-
if g.edges.size == 0 then withSubtypes else
433+
graph.fold(withSubtypes) { graph =>
434+
if graph.edges.isEmpty then withSubtypes else
435435
withSubtypes.header(2, "Type hierarchy")().group(
436436
kind = ContentKind.Comment,
437437
styles = Set(ContentStyle.WithExtraAttributes),
438438
extra = PropertyContainer.Companion.empty plus SimpleAttr.Companion.header("Type hierarchy")
439439
) { _.group(kind = ContentKind.Symbol, styles = Set(TextStyle.Monospace)) {
440-
_.dotDiagram(g)
440+
_.dotDiagram(graph)
441441
}
442442
}
443443
}

scala3doc/src/dotty/renderers/DotDiagramBuilder.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ import dotty.dokka.model.api._
1111

1212
object DotDiagramBuilder:
1313
def build(diagram: HierarchyGraph, renderer: SignatureRenderer): String =
14-
val vertecies = diagram.edges.flatMap(edge => Seq(edge.from, edge.to)).distinct.map { vertex =>
15-
s"""node${vertex.id} [label="${getHtmlLabel(vertex, renderer)}", style="${getStyle(vertex)}"];\n"""
14+
val vWithId = diagram.verteciesWithId
15+
val vertecies = vWithId.map { (vertex, id) =>
16+
s"""node${id} [label="${getHtmlLabel(vertex, renderer)}", style="${getStyle(vertex)}"];\n"""
1617
}.mkString
1718

18-
val edges = diagram.edges.map { edge =>
19-
s"""node${edge.from.id} -> node${edge.to.id};\n"""
19+
val edges = diagram.edges.map { (from, to) =>
20+
s"""node${vWithId(from)} -> node${vWithId(to)};\n"""
2021
}.mkString
2122

2223
s""" digraph g {
@@ -27,7 +28,7 @@ object DotDiagramBuilder:
2728
|""".stripMargin
2829

2930

30-
private def getStyle(vertex: Vertex) = vertex.body.kind match
31+
private def getStyle(vertex: LinkToType) = vertex.kind match
3132
case Kind.Class => "fill: #45AD7D;"
3233
case Kind.Object => "fill: #285577;"
3334
case Kind.Trait => "fill: #1CAACF;"
@@ -36,9 +37,9 @@ object DotDiagramBuilder:
3637
case other => sys.error(s"unexpected value: $other")
3738

3839

39-
private def getHtmlLabel(vertex: Vertex, renderer: SignatureRenderer): String =
40+
private def getHtmlLabel(vertex: LinkToType, renderer: SignatureRenderer): String =
4041
span(style := "color: #FFFFFF;")(
41-
vertex.body.kind.name,
42+
vertex.kind.name,
4243
" ",
43-
vertex.body.signature.map(renderer.renderElementWith(_))
44+
vertex.signature.map(renderer.renderElementWith(_))
4445
).toString.replace("\"", "\\\"")

0 commit comments

Comments
 (0)