Skip to content

Commit d1f9cd6

Browse files
authored
Merge pull request #11209 from BarkingBad/scala3doc/flattened-children
Fix flattened children graph
2 parents 53473a8 + d6af907 commit d1f9cd6

File tree

9 files changed

+54
-40
lines changed

9 files changed

+54
-40
lines changed

scala3doc-testcases/src/tests/hierarchy.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package hierarchy
55
trait A1
66
trait A2[T]
77
trait A3[A, B]
8-
8+
trait A4
99

1010
trait B1 extends A1
1111
trait B2 extends A1 with A2[Int]
@@ -15,7 +15,7 @@ class C1[A, B, C] extends B1 with B2 with B3
1515

1616
trait D1
1717
trait D2[T, R]
18-
trait D3
18+
trait D3 extends A4
1919

2020
class E1 extends C1[Int, String, Boolean] with D1
2121
class E2 extends C1[Int, Boolean, Any] with D2[Int, Boolean] with D3

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ extension[T] (member: Member)
177177
// TODO rename parent and knownChildren
178178
def allMembers: Seq[Member] = compositeMemberExt.fold(Nil)(_.members)
179179
def parents: Seq[LinkToType] = compositeMemberExt.fold(Nil)(_.parents)
180-
def directParents: Seq[Signature] = compositeMemberExt.fold(Nil)(_.directParents)
180+
def directParents: Seq[LinkToType] = compositeMemberExt.fold(Nil)(_.directParents)
181181
def knownChildren: Seq[LinkToType] = compositeMemberExt.fold(Nil)(_.knownChildren)
182182
def companion: Option[DRI] = compositeMemberExt.fold(None)(_.companion)
183183

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ object MemberExtension extends BaseKey[Documentable, MemberExtension]:
4040

4141
case class CompositeMemberExtension(
4242
members : Seq[Member] = Nil,
43-
directParents: Seq[Signature] = Nil,
43+
directParents: Seq[LinkToType] = Nil,
4444
parents: Seq[LinkToType] = Nil,
4545
knownChildren: Seq[LinkToType] = Nil,
4646
companion: Option[DRI] = None,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ extension (s: Signature)
2020

2121
extension (m: Member)
2222
def getDirectParentsAsStrings: Seq[String] =
23-
m.directParents.map(_.getName).sorted
23+
m.directParents.map(_.signature.getName).sorted
2424
def getParentsAsStrings: Seq[String] =
2525
m.parents.map(_.signature.getName).sorted
2626
def getKnownChildrenAsStrings: Seq[String] =

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,16 @@ trait ClassLikeSupport:
8888
val graph = HierarchyGraph.withEdges(getSupertypesGraph(classDef,
8989
LinkToType(selfSiangture, classDef.symbol.dri, bareClasslikeKind(classDef.symbol))))
9090

91+
9192
val compositeExt =
9293
if signatureOnly then CompositeMemberExtension.empty
9394
else CompositeMemberExtension(
9495
classDef.extractPatchedMembers,
95-
classDef.getParents.map(_.dokkaType.asSignature),
96+
classDef.getParentsAsLinkToTypes,
9697
supertypes,
9798
Nil,
9899
classDef.getCompanion
99100
)
100-
101101
mkMember(
102102
classDef.symbol,
103103
MemberExtension(
@@ -206,7 +206,7 @@ trait ClassLikeSupport:
206206
Kind.Class(Nil, Nil)
207207

208208
parsedClasslike.withKind(
209-
Kind.Given(cls, givenParents, parentTpe.flatMap(extractImplicitConversion))
209+
Kind.Given(cls, givenParents.map(_.signature), parentTpe.flatMap(extractImplicitConversion))
210210
)
211211
}
212212

@@ -257,13 +257,20 @@ trait ClassLikeSupport:
257257

258258
}
259259

260-
def getParents: List[Tree] =
260+
def getTreeOfFirstParent: Option[Tree] =
261+
c.getParentsAsTreeSymbolTuples.headOption.map(_._1)
262+
263+
def getParentsAsLinkToTypes: List[LinkToType] =
264+
c.getParentsAsTreeSymbolTuples.map {
265+
(tree, symbol) => LinkToType(tree.dokkaType.asSignature, symbol.dri, bareClasslikeKind(symbol))
266+
}
267+
268+
def getParentsAsTreeSymbolTuples: List[(Tree, Symbol)] =
261269
for
262270
parentTree <- c.parents if isValidPos(parentTree.pos) // We assume here that order is correct
263271
parentSymbol = if parentTree.symbol.isClassConstructor then parentTree.symbol.owner else parentTree.symbol
264272
if parentSymbol != defn.ObjectClass && parentSymbol != defn.AnyClass
265-
yield parentTree
266-
273+
yield (parentTree, parentSymbol)
267274

268275
def getConstructors: List[Symbol] = membersToDocument.collect {
269276
case d: DefDef if d.symbol.isClassConstructor && c.constructor.symbol != d.symbol => d.symbol

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,32 @@ trait TypesSupport:
88
self: TastyParser =>
99
import qctx.reflect._
1010

11-
def getGivenInstance(method: DefDef): Option[Bound] = {
11+
def getGivenInstance(method: DefDef): Option[Bound] =
1212
def extractTypeSymbol(t: Tree): Option[Symbol] = t match
13-
case tpeTree: TypeTree =>
14-
inner(tpeTree.tpe)
15-
case other => None
13+
case tpeTree: TypeTree =>
14+
inner(tpeTree.tpe)
15+
case other => None
1616

1717
def inner(tpe: TypeRepr): Option[Symbol] = tpe match
18-
case ThisType(tpe) => inner(tpe)
19-
case AnnotatedType(tpe, _) => inner(tpe)
20-
case AppliedType(tpe, _) => inner(tpe)
21-
case tp @ TermRef(qual, typeName) =>
22-
qual match
23-
case _: TypeRepr | _: NoPrefix => Some(tp.termSymbol)
24-
case other => None
25-
case tp @ TypeRef(qual, typeName) =>
26-
qual match
27-
case _: TypeRepr | _: NoPrefix => Some(tp.typeSymbol)
28-
case other => None
18+
case ThisType(tpe) => inner(tpe)
19+
case AnnotatedType(tpe, _) => inner(tpe)
20+
case AppliedType(tpe, _) => inner(tpe)
21+
case tp @ TermRef(qual, typeName) =>
22+
qual match
23+
case _: TypeRepr | _: NoPrefix => Some(tp.termSymbol)
24+
case other => None
25+
case tp @ TypeRef(qual, typeName) =>
26+
qual match
27+
case _: TypeRepr | _: NoPrefix => Some(tp.typeSymbol)
28+
case other => None
2929

3030
val typeSymbol = extractTypeSymbol(method.returnTpt)
3131

3232
typeSymbol.map(_.tree).collect {
33-
case c: ClassDef => c.getParents.headOption
34-
case _ => Some(method.returnTpt)
33+
case c: ClassDef => c.getTreeOfFirstParent
34+
case _ => Some(method.returnTpt)
3535
}.flatten.map(_.dokkaType)
36-
}
36+
3737

3838
given TreeSyntax: AnyRef with
3939
extension (tpeTree: Tree)

scala3doc/src/dotty/dokka/transformers/InheritanceInformationTransformer.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ class InheritanceInformationTransformer(using context: DocContext) extends Modul
1414
override def apply(original: DModule): DModule =
1515
val subtypes = getSupertypes(original.getPackages.get(0)).groupBy(_._1).transform((k, v) => v.map(_._2))
1616
original.updateMembers { m =>
17-
val st: Seq[LinkToType] = subtypes.getOrElse(m.dri, Nil)
18-
val rootMemberWithBareClasslikeKind = m.asLink.copy(kind = bareClasslikeKind(m.kind))
19-
m.withKnownChildren(st).withNewGraphEdges(st.map(_ -> rootMemberWithBareClasslikeKind))
17+
val edges = getEdges(m.asLink.copy(kind = bareClasslikeKind(m.kind)), subtypes)
18+
val st: Seq[LinkToType] = edges.map(_._1).distinct
19+
m.withKnownChildren(st).withNewGraphEdges(edges)
2020
}
2121

22+
private def getEdges(ltt: LinkToType, subtypes: Map[DRI, Seq[LinkToType]]): Seq[(LinkToType, LinkToType)] =
23+
val st: Seq[LinkToType] = subtypes.getOrElse(ltt.dri, Nil)
24+
st.flatMap(s => Seq(s -> ltt) ++ getEdges(s, subtypes))
25+
2226
private def bareClasslikeKind(kind: Kind): Kind = kind match
2327
case _: Kind.Trait => Kind.Trait(Nil, Nil)
2428
case _: Kind.Class => Kind.Class(Nil, Nil)
@@ -27,5 +31,5 @@ class InheritanceInformationTransformer(using context: DocContext) extends Modul
2731
private def getSupertypes(c: Member): Seq[(DRI, LinkToType)] =
2832
val selfMapping =
2933
if !c.kind.isInstanceOf[Classlike] then Nil
30-
else c.parents.map(_._2 -> c.asLink)
34+
else c.directParents.map(_._2 -> c.asLink)
3135
c.allMembers.flatMap(getSupertypes) ++ selfMapping

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ object ScalaSignatureProvider:
7979
member.directParents match
8080
case Nil => builder
8181
case extendType :: withTypes =>
82-
val extendPart = builder.text(" extends ").signature(extendType)
83-
withTypes.foldLeft(extendPart)((bdr, tpe) => bdr.text(" with ").signature(tpe))
82+
val extendPart = builder.text(" extends ").signature(extendType.signature)
83+
withTypes.foldLeft(extendPart)((bdr, tpe) => bdr.text(" with ").signature(tpe.signature))
8484

8585
private def givenClassSignature(member: Member, cls: Kind.Class, builder: SignatureBuilder): SignatureBuilder =
8686
val prefixes = builder

scala3doc/test/dotty/dokka/diagram/HierarchyTest.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class HierarchyTest extends ScaladocTest("hierarchy"):
4444
)
4545
}
4646
if (x.getName == "E2") {
47-
assertEquals(List("A1", "A2[Int]", "A3[Int, String]", "Any", "B1", "B2", "B3", "C1[Int, Boolean, Any]", "D2[Int, Boolean]", "D3", "Matchable", "Object"), x.getParentsAsStrings)
47+
assertEquals(List("A1", "A2[Int]", "A3[Int, String]", "A4", "Any", "B1", "B2", "B3", "C1[Int, Boolean, Any]", "D2[Int, Boolean]", "D3", "Matchable", "Object"), x.getParentsAsStrings)
4848
assertEquals(List("C1[Int, Boolean, Any]", "D2[Int, Boolean]", "D3"), x.getDirectParentsAsStrings)
4949
assertEquals(List.empty, x.getKnownChildrenAsStrings)
5050
val graph = MemberExtension.getFrom(x).map(_.graph)
@@ -55,6 +55,7 @@ class HierarchyTest extends ScaladocTest("hierarchy"):
5555
"A1" -> "Object",
5656
"A2[Int]" -> "Object",
5757
"A3[Int, String]" -> "Object",
58+
"A4" -> "Object",
5859
"B1" -> "Object",
5960
"B1" -> "A1",
6061
"B2" -> "Object",
@@ -72,6 +73,7 @@ class HierarchyTest extends ScaladocTest("hierarchy"):
7273
"E2" -> "D2[Int, Boolean]",
7374
"E2" -> "D3",
7475
"D2[Int, Boolean]" -> "Object",
76+
"D3" -> "A4",
7577
"D3" -> "Object",
7678
"E2" -> "C1[Int, Boolean, Any]"
7779
),
@@ -90,11 +92,12 @@ class HierarchyTest extends ScaladocTest("hierarchy"):
9092
"Matchable" -> "Any",
9193
"Object" -> "Any",
9294
"A2[T]" -> "Object",
93-
"B2" -> "A2[T]", // These are not actually true, becuase we lose information about hierarchy in subtypes and their possible mapping to supertypes other that that type itself, e. g. linking to `Object`
95+
"B2" -> "A2[T]",
9496
"B3" -> "A2[T]",
95-
"C1[A, B, C]" -> "A2[T]",
96-
"E1" -> "A2[T]",
97-
"E2" -> "A2[T]"
97+
"C1[A, B, C]" -> "B2",
98+
"C1[A, B, C]" -> "B3",
99+
"E1" -> "C1[A, B, C]",
100+
"E2" -> "C1[A, B, C]"
98101
),
99102
graph.get.edges.map((a, b) => (a.signature.getName, b.signature.getName)).toSet
100103
)

0 commit comments

Comments
 (0)