@@ -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())
0 commit comments