Skip to content

Commit 51c73b9

Browse files
authored
Merge pull request #11513 from lampepfl/scaladoc/enum-children-missing
Scaladoc: Enums and enum cases fix
2 parents 7967eac + aa10eca commit 51c73b9

File tree

8 files changed

+47
-27
lines changed

8 files changed

+47
-27
lines changed

scaladoc-testcases/src/tests/enumSignatures.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ enum Enum1
99
case C
1010
}
1111
enum Enum2(val i: Int):
12-
case A(val s: String) extends Enum2(1)
13-
case B(val t: String) extends Enum2(2)
14-
case C(val u: String) extends Enum2(3)
12+
case A(s: String) extends Enum2/*<-*/(1)/*->*/
13+
case B(t: String) extends Enum2/*<-*/(2)/*->*/
14+
case C(u: String) extends Enum2/*<-*/(3)/*->*/
1515

1616
enum Enum3(val param: Int):
17-
case A extends Enum3(1) with A
18-
case B extends Enum3(2)
19-
case C extends Enum3(3)
17+
case A extends Enum3/*<-*/(1)/*->*/ with A
18+
case B extends Enum3/*<-*/(2)/*->*/
19+
case C extends Enum3/*<-*/(3)/*->*/
2020

2121
enum Enum4[+T]:
2222
case G(s: String)
2323
case B extends Enum4[Int] with A
24-
case C[V](s:String) extends Enum4[V]
24+
case C[V](s: String) extends Enum4[V]
2525
case D[T](s: String) extends Enum4[T]
2626

2727
trait A

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ enum Kind(val name: String){
5454
case Object extends Kind("object") with Classlike
5555
case Trait(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList])
5656
extends Kind("trait") with Classlike
57-
case Enum extends Kind("enum") with Classlike
58-
case EnumCase(kind: Object.type | Type | Val.type) extends Kind("case")
57+
case Enum(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList]) extends Kind("enum") with Classlike
58+
case EnumCase(kind: Object.type | Type | Val.type | Class) extends Kind("case")
5959
case Def(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList])
6060
extends Kind("def")
6161
case Extension(on: ExtensionTarget, m: Kind.Def) extends Kind("def")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ object DotDiagramBuilder:
99
case _ : Kind.Class => "fill: #45AD7D;"
1010
case Kind.Object => "fill: #285577;"
1111
case _ : Kind.Trait => "fill: #1CAACF;"
12-
case Kind.Enum => "fill: #B66722;"
13-
case _ : Kind.EnumCase => "fill: #B66722;"
12+
case e if e.isInstanceOf[Kind.Enum] => "fill: #B66722;"
13+
case e if e.isInstanceOf[Kind.EnumCase] => "fill: #B66722;"
1414
case other => report.error(s"unexpected value: $other")
1515

1616
val vWithId = diagram.verteciesWithId

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
283283
buildGroup("Type members", Seq(
284284
("Classlikes", rest.filter(m => m.kind.isInstanceOf[Classlike])),
285285
("Types", rest.filter(_.kind.isInstanceOf[Kind.Type])),
286-
("Enum entries", rest.filter(_.kind == Kind.EnumCase)),
286+
("Enum entries", rest.filter(_.kind.isInstanceOf[Kind.EnumCase])),
287287
)),
288288
buildGroup("Value members", Seq(
289289
("Constructors", rest.filter(_.kind.isInstanceOf[Kind.Constructor])),

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ trait ClassLikeSupport:
1111
private def bareClasslikeKind(symbol: Symbol): Kind =
1212
if symbol.flags.is(Flags.Module) then Kind.Object
1313
else if symbol.flags.is(Flags.Trait) then Kind.Trait(Nil, Nil)
14-
else if symbol.flags.is(Flags.Enum) then Kind.Enum
14+
else if symbol.flags.is(Flags.Enum) then Kind.Enum(Nil, Nil)
15+
else if symbol.flags.is(Flags.Enum) && symbol.flags.is(Flags.Case) then Kind.EnumCase(Kind.Object)
1516
else Kind.Class(Nil, Nil)
1617

1718
private def kindForClasslike(classDef: ClassDef): Kind =
@@ -39,7 +40,8 @@ trait ClassLikeSupport:
3940
if classDef.symbol.flags.is(Flags.Module) then Kind.Object
4041
else if classDef.symbol.flags.is(Flags.Trait) then
4142
Kind.Trait(typeArgs, args)
42-
else if classDef.symbol.flags.is(Flags.Enum) then Kind.Enum
43+
else if classDef.symbol.flags.is(Flags.Enum) && classDef.symbol.flags.is(Flags.Case) then Kind.EnumCase(Kind.Class(typeArgs, args))
44+
else if classDef.symbol.flags.is(Flags.Enum) then Kind.Enum(typeArgs, args)
4345
else Kind.Class(typeArgs, args)
4446

4547
def mkClass(classDef: ClassDef)(
@@ -284,7 +286,7 @@ trait ClassLikeSupport:
284286

285287
def parseClasslike(classDef: ClassDef, signatureOnly: Boolean = false): Member = classDef match
286288
case c: ClassDef if classDef.symbol.flags.is(Flags.Module) => parseObject(c, signatureOnly)
287-
case c: ClassDef if classDef.symbol.flags.is(Flags.Enum) => parseEnum(c, signatureOnly)
289+
case c: ClassDef if classDef.symbol.flags.is(Flags.Enum) && !classDef.symbol.flags.is(Flags.Case) => parseEnum(c, signatureOnly)
288290
case clazz => mkClass(classDef)(signatureOnly = signatureOnly)
289291

290292
def parseObject(classDef: ClassDef, signatureOnly: Boolean = false): Member =
@@ -310,13 +312,15 @@ trait ClassLikeSupport:
310312
case c: ClassDef if c.symbol.flags.is(Flags.Case) && c.symbol.flags.is(Flags.Enum) => processTree(c)(parseClasslike(c))
311313
}.flatten
312314

313-
val classlikie = mkClass(classDef)(modifiers = extraModifiers, signatureOnly = signatureOnly)
314-
val cases =
315-
enumNested.map(_.withKind(Kind.EnumCase(Kind.Object))) ++
316-
enumTypes.map(et => et.withKind(Kind.EnumCase(et.kind.asInstanceOf[Kind.Type]))) ++
317-
enumVals.map(_.withKind(Kind.EnumCase(Kind.Val)))
315+
val enumClass = mkClass(classDef)(modifiers = extraModifiers, signatureOnly = signatureOnly)
318316

319-
classlikie.withNewMembers(cases)
317+
val cases = (
318+
enumNested ++
319+
enumTypes ++
320+
enumVals.map(m => m.copy(dri = m.dri.copy(location = enumClass.dri.location)))
321+
)
322+
323+
enumClass.withMembers(cases)
320324

321325
def parseMethod(
322326
c: ClassDef,
@@ -411,14 +415,17 @@ trait ClassLikeSupport:
411415
case LambdaTypeTree(params, body) => (params.map(mkTypeArgument(_)), body)
412416
case tpe => (Nil, tpe)
413417

414-
val kind = Kind.Type(!isTreeAbstract(typeDef.rhs), typeDef.symbol.isOpaque, generics)
418+
val defaultKind = Kind.Type(!isTreeAbstract(typeDef.rhs), typeDef.symbol.isOpaque, generics).asInstanceOf[Kind.Type]
419+
val kind = if typeDef.symbol.flags.is(Flags.Enum) then Kind.EnumCase(defaultKind)
420+
else defaultKind
415421
mkMember(typeDef.symbol, kind, tpeTree.asSignature)(deprecated = typeDef.symbol.isDeprecated())
416422

417423
def parseValDef(c: ClassDef, valDef: ValDef): Member =
418424
def defaultKind = if valDef.symbol.flags.is(Flags.Mutable) then Kind.Var else Kind.Val
419425
val memberInfo = unwrapMemberInfo(c, valDef.symbol)
420426
val kind = if valDef.symbol.flags.is(Flags.Implicit) then
421427
Kind.Implicit(Kind.Val, extractImplicitConversion(valDef.tpt.tpe))
428+
else if valDef.symbol.flags.is(Flags.Enum) then Kind.EnumCase(Kind.Val)
422429
else defaultKind
423430

424431
mkMember(valDef.symbol, kind, memberInfo.res.asSignature)(deprecated = valDef.symbol.isDeprecated())

scaladoc/src/dotty/tools/scaladoc/transformers/InheritanceInformationTransformer.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ class InheritanceInformationTransformer(using DocContext) extends (Module => Mod
1717
private def bareClasslikeKind(kind: Kind): Kind = kind match
1818
case _: Kind.Trait => Kind.Trait(Nil, Nil)
1919
case _: Kind.Class => Kind.Class(Nil, Nil)
20+
case e if e.isInstanceOf[Kind.Enum] => Kind.Enum(Nil, Nil)
21+
case ec if ec.isInstanceOf[Kind.EnumCase] => Kind.EnumCase(Kind.Object)
2022
case o => o
2123

2224
private def getSupertypes(c: Member): Seq[(DRI, LinkToType)] =
2325
val selfMapping =
24-
if !c.kind.isInstanceOf[Classlike] then Nil
25-
else c.directParents.map(_._2 -> c.asLink)
26+
if !c.kind.isInstanceOf[Classlike] && !c.kind.isInstanceOf[Kind.EnumCase] then Nil
27+
else c.directParents.map(p => p.dri -> c.asLink)
2628
c.members.flatMap(getSupertypes) ++ selfMapping

scaladoc/src/dotty/tools/scaladoc/translators/ScalaSignatureProvider.scala

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ object ScalaSignatureProvider:
2626
givenPropertySignature(documentable, builder)
2727
case cls: Kind.Class =>
2828
classSignature(documentable, cls, builder)
29-
case Kind.Object | Kind.Enum =>
29+
case enm: Kind.Enum =>
30+
enumSignature(documentable, enm, builder)
31+
case Kind.Object =>
3032
objectSignature(documentable, builder)
3133
case trt: Kind.Trait =>
3234
traitSignature(documentable, trt, builder)
@@ -44,7 +46,7 @@ object ScalaSignatureProvider:
4446
private def enumEntrySignature(member: Member, cls: Kind.Class, bdr: SignatureBuilder): SignatureBuilder =
4547
val withPrefixes: SignatureBuilder = bdr
4648
.text("case ")
47-
.memberName(member.name, member.dri)
49+
.name(member.name, member.dri)
4850
.generics(cls.typeParams)
4951

5052
val withParameters = withPrefixes.functionParameters(cls.argsLists)
@@ -107,6 +109,15 @@ object ScalaSignatureProvider:
107109

108110
parentsSignature(clazz, selfSignature)
109111

112+
private def enumSignature(clazz: Member, cls: Kind.Enum, builder: SignatureBuilder): SignatureBuilder =
113+
val selfSignature = builder
114+
.modifiersAndVisibility(clazz, clazz.kind.name)
115+
.name(clazz.name, clazz.dri)
116+
.generics(cls.typeParams)
117+
.functionParameters(cls.argsLists)
118+
119+
parentsSignature(clazz, selfSignature)
120+
110121
private def extensionSignature(extension: Member, fun: Kind.Def, builder: SignatureBuilder): SignatureBuilder =
111122
val withSignature = builder
112123
.modifiersAndVisibility(extension, "def")

scaladoc/test/dotty/tools/scaladoc/signatures/TranslatableSignaturesTestCases.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ExtensionMethodSignature extends SignatureTest("extensionMethodSignatures"
4343

4444
class ClassModifiers extends SignatureTest("classModifiers", SignatureTest.classlikeKinds)
4545

46-
// class EnumSignatures extends SignatureTest("enumSignatures", SignatureTest.all)
46+
class EnumSignatures extends SignatureTest("enumSignatures", SignatureTest.all)
4747

4848
class StructuralTypes extends SignatureTest("structuralTypes", SignatureTest.members)
4949

0 commit comments

Comments
 (0)