Skip to content

Commit cbc5210

Browse files
authored
Merge pull request #10181 from pikinier20/infinite-loop-doctool
Fix infinite loop bug in scaladoc after dotty version bump
2 parents 28de1e0 + 97a3500 commit cbc5210

File tree

5 files changed

+59
-8
lines changed

5 files changed

+59
-8
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package tests
2+
package inheritanceLoop
3+
4+
class A
5+
{
6+
type I = Int
7+
object X
8+
class B extends C
9+
{
10+
class D extends C
11+
{
12+
class E extends C
13+
}
14+
}
15+
}
16+
17+
18+
class C extends A
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package tests
2+
package inheritedMembers1
3+
4+
5+
class A
6+
{
7+
def A: String
8+
= ???
9+
val B: Int
10+
= ???
11+
object X
12+
trait Z
13+
given B
14+
type I = Int
15+
/*<-*/extension (a: A) /*->*/def extension: String
16+
= ???
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package tests
2+
package inheritedMembers2
3+
4+
import tests.inheritedMembers1.A
5+
6+
class F extends A
7+

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ trait ClassLikeSupport:
130130
case _ => None
131131
)
132132

133+
private def parseInheritedMember(s: Tree): Option[Member] = processTreeOpt(s)(s match
134+
case c: ClassDef if c.symbol.shouldDocumentClasslike && !c.symbol.isGiven => Some(parseClasslike(c, signatureOnly = true))
135+
case other => parseMember(other)
136+
).map(_.withOrigin(Origin.InheritedFrom(s.symbol.owner.name, s.symbol.owner.dri)))
137+
133138
extension (c: ClassDef):
134139
def membersToDocument = c.body.filterNot(_.symbol.isHiddenByVisibility)
135140

@@ -139,14 +144,13 @@ trait ClassLikeSupport:
139144
.map(_.tree)
140145

141146
def extractMembers: Seq[Member] = {
142-
// val inherited = c.getNonTrivialInheritedMemberTrees.collect {
143-
// case dd: DefDef if !dd.symbol.isClassConstructor && !(dd.symbol.isSuperBridgeMethod || dd.symbol.isDefaultHelperMethod) => dd
144-
// case other => other
145-
// }
146-
147-
c.membersToDocument.flatMap(parseMember)
148-
// ++
149-
// inherited.flatMap(s => parseMember(s).map(_.withOrigin(Origin.InheritedFrom(s.symbol.owner.name, s.symbol.owner.dri))))
147+
val inherited = c.getNonTrivialInheritedMemberTrees.collect {
148+
case dd: DefDef if !dd.symbol.isClassConstructor && !(dd.symbol.isSuperBridgeMethod || dd.symbol.isDefaultHelperMethod) => dd
149+
case other => other
150+
}
151+
152+
c.membersToDocument.flatMap(parseMember) ++
153+
inherited.flatMap(s => parseInheritedMember(s))
150154
}
151155

152156
def getParents: List[Tree] =

scala3doc/test/dotty/dokka/SignatureTests.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,8 @@ class OpaqueTypes extends SingleFileTest("opaqueTypes", SingleFileTest.all)
5050
// class GivenSignatures extends SingleFileTest("givenSignatures", SingleFileTest.all)
5151

5252
class Annotations extends SingleFileTest("annotations", SingleFileTest.all)
53+
54+
class InheritanceLoop extends SingleFileTest("inheritanceLoop", SingleFileTest.all)
55+
56+
class InheritedMembers extends MultipleFileTest(List("inheritedMembers1", "inheritedMembers2"), List("inheritedMembers2"), MultipleFileTest.all.filter(_ != "class"))
57+

0 commit comments

Comments
 (0)