@@ -11,7 +11,8 @@ trait ClassLikeSupport:
11
11
private def bareClasslikeKind (symbol : Symbol ): Kind =
12
12
if symbol.flags.is(Flags .Module ) then Kind .Object
13
13
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 )
15
16
else Kind .Class (Nil , Nil )
16
17
17
18
private def kindForClasslike (classDef : ClassDef ): Kind =
@@ -39,7 +40,8 @@ trait ClassLikeSupport:
39
40
if classDef.symbol.flags.is(Flags .Module ) then Kind .Object
40
41
else if classDef.symbol.flags.is(Flags .Trait ) then
41
42
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)
43
45
else Kind .Class (typeArgs, args)
44
46
45
47
def mkClass (classDef : ClassDef )(
@@ -284,7 +286,7 @@ trait ClassLikeSupport:
284
286
285
287
def parseClasslike (classDef : ClassDef , signatureOnly : Boolean = false ): Member = classDef match
286
288
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)
288
290
case clazz => mkClass(classDef)(signatureOnly = signatureOnly)
289
291
290
292
def parseObject (classDef : ClassDef , signatureOnly : Boolean = false ): Member =
@@ -310,13 +312,15 @@ trait ClassLikeSupport:
310
312
case c : ClassDef if c.symbol.flags.is(Flags .Case ) && c.symbol.flags.is(Flags .Enum ) => processTree(c)(parseClasslike(c))
311
313
}.flatten
312
314
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)
318
316
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)
320
324
321
325
def parseMethod (
322
326
c : ClassDef ,
@@ -411,14 +415,17 @@ trait ClassLikeSupport:
411
415
case LambdaTypeTree (params, body) => (params.map(mkTypeArgument(_)), body)
412
416
case tpe => (Nil , tpe)
413
417
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
415
421
mkMember(typeDef.symbol, kind, tpeTree.asSignature)(deprecated = typeDef.symbol.isDeprecated())
416
422
417
423
def parseValDef (c : ClassDef , valDef : ValDef ): Member =
418
424
def defaultKind = if valDef.symbol.flags.is(Flags .Mutable ) then Kind .Var else Kind .Val
419
425
val memberInfo = unwrapMemberInfo(c, valDef.symbol)
420
426
val kind = if valDef.symbol.flags.is(Flags .Implicit ) then
421
427
Kind .Implicit (Kind .Val , extractImplicitConversion(valDef.tpt.tpe))
428
+ else if valDef.symbol.flags.is(Flags .Enum ) then Kind .EnumCase (Kind .Val )
422
429
else defaultKind
423
430
424
431
mkMember(valDef.symbol, kind, memberInfo.res.asSignature)(deprecated = valDef.symbol.isDeprecated())
0 commit comments