Skip to content

Commit d669c0b

Browse files
committed
Protect against double definition. Update semanticdb
1 parent 66885a3 commit d669c0b

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,10 @@ object DesugarEnums {
171171
constraints.enumCases.map((i, enumValue) => CaseDef(Literal(Constant(i)), EmptyTree, enumValue))
172172
:+ default(ordinal)))
173173

174-
scaffolding ::: valueCtor ::: fromOrdinal :: Nil
174+
if !enumClass.exists then
175+
Nil
176+
else
177+
scaffolding ::: valueCtor ::: fromOrdinal :: Nil
175178
end enumLookupMethods
176179

177180
/** A creation method for a value of enum type `E`, which is defined as follows:
@@ -281,8 +284,8 @@ object DesugarEnums {
281284
ordinalMeth(Literal(Constant(ord)))
282285

283286
def fromOrdinalMeth(body: Tree => Tree)(using Context): DefDef =
284-
DefDef(nme.fromOrdinal, Nil, List(param(nme.ordinalDollar_, defn.IntType) :: Nil),
285-
rawRef(enumClass.typeRef), body(Ident(nme.ordinalDollar_))).withFlags(Synthetic)
287+
DefDef(nme.fromOrdinal, Nil, (param(nme.ordinal, defn.IntType) :: Nil) :: Nil,
288+
rawRef(enumClass.typeRef), body(Ident(nme.ordinal))).withFlags(Synthetic)
286289

287290
/** Expand a module definition representing a parameterless enum case */
288291
def expandEnumModule(name: TermName, impl: Template, mods: Modifiers, definesLookups: Boolean, span: Span)(using Context): Tree = {

tests/run/enum-values.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ enum ClassOnly: // this should still generate the `ordinal` and `fromOrdinal` co
3131
@main def Test: Unit =
3232
import Color._, Tag._, Expr._, ListLike._, TypeCtorsK._, MixedParams._, ClassOnly._
3333

34-
type FromOrdinal[T <: AnyRef] = {
34+
type FromOrdinal[T] = {
3535
def fromOrdinal(ordinal: Int): T
3636
}
3737

38-
type ValueOf[T <: AnyRef] = {
38+
type ValueOf[T] = {
3939
def valueOf(s: String): T
4040
}
4141

tests/semanticdb/metac.expect

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ Schema => SemanticDB v4
641641
Uri => Enums.scala
642642
Text => empty
643643
Language => Scala
644-
Symbols => 181 entries
644+
Symbols => 185 entries
645645
Occurrences => 203 entries
646646

647647
Symbols:
@@ -651,37 +651,35 @@ _empty_/Enums.Coin#`<init>`(). => primary ctor <init>
651651
_empty_/Enums.Coin#`<init>`().(value) => param value
652652
_empty_/Enums.Coin#value. => val method value
653653
_empty_/Enums.Coin. => final object Coin
654-
_empty_/Enums.Coin.$fromOrdinal(). => method $fromOrdinal
655-
_empty_/Enums.Coin.$fromOrdinal().(_$ordinal) => param _$ordinal
656654
_empty_/Enums.Coin.$values. => val method $values
657655
_empty_/Enums.Coin.Dime. => case val static enum method Dime
658656
_empty_/Enums.Coin.Dollar. => case val static enum method Dollar
659657
_empty_/Enums.Coin.Nickel. => case val static enum method Nickel
660658
_empty_/Enums.Coin.Penny. => case val static enum method Penny
661659
_empty_/Enums.Coin.Quarter. => case val static enum method Quarter
660+
_empty_/Enums.Coin.fromOrdinal(). => method fromOrdinal
661+
_empty_/Enums.Coin.fromOrdinal().(ordinal) => param ordinal
662662
_empty_/Enums.Coin.valueOf(). => method valueOf
663663
_empty_/Enums.Coin.valueOf().($name) => param $name
664664
_empty_/Enums.Coin.values(). => method values
665665
_empty_/Enums.Colour# => abstract sealed enum class Colour
666666
_empty_/Enums.Colour#`<init>`(). => primary ctor <init>
667667
_empty_/Enums.Colour. => final object Colour
668-
_empty_/Enums.Colour.$fromOrdinal(). => method $fromOrdinal
669-
_empty_/Enums.Colour.$fromOrdinal().(_$ordinal) => param _$ordinal
670668
_empty_/Enums.Colour.$new(). => method $new
671669
_empty_/Enums.Colour.$new().($name) => param $name
672670
_empty_/Enums.Colour.$new().(_$ordinal) => param _$ordinal
673671
_empty_/Enums.Colour.$values. => val method $values
674672
_empty_/Enums.Colour.Blue. => case val static enum method Blue
675673
_empty_/Enums.Colour.Green. => case val static enum method Green
676674
_empty_/Enums.Colour.Red. => case val static enum method Red
675+
_empty_/Enums.Colour.fromOrdinal(). => method fromOrdinal
676+
_empty_/Enums.Colour.fromOrdinal().(ordinal) => param ordinal
677677
_empty_/Enums.Colour.valueOf(). => method valueOf
678678
_empty_/Enums.Colour.valueOf().($name) => param $name
679679
_empty_/Enums.Colour.values(). => method values
680680
_empty_/Enums.Directions# => abstract sealed enum class Directions
681681
_empty_/Enums.Directions#`<init>`(). => primary ctor <init>
682682
_empty_/Enums.Directions. => final object Directions
683-
_empty_/Enums.Directions.$fromOrdinal(). => method $fromOrdinal
684-
_empty_/Enums.Directions.$fromOrdinal().(_$ordinal) => param _$ordinal
685683
_empty_/Enums.Directions.$new(). => method $new
686684
_empty_/Enums.Directions.$new().($name) => param $name
687685
_empty_/Enums.Directions.$new().(_$ordinal) => param _$ordinal
@@ -690,15 +688,15 @@ _empty_/Enums.Directions.East. => case val static enum method East
690688
_empty_/Enums.Directions.North. => case val static enum method North
691689
_empty_/Enums.Directions.South. => case val static enum method South
692690
_empty_/Enums.Directions.West. => case val static enum method West
691+
_empty_/Enums.Directions.fromOrdinal(). => method fromOrdinal
692+
_empty_/Enums.Directions.fromOrdinal().(ordinal) => param ordinal
693693
_empty_/Enums.Directions.valueOf(). => method valueOf
694694
_empty_/Enums.Directions.valueOf().($name) => param $name
695695
_empty_/Enums.Directions.values(). => method values
696696
_empty_/Enums.Maybe# => abstract sealed enum class Maybe
697697
_empty_/Enums.Maybe#[A] => covariant typeparam A
698698
_empty_/Enums.Maybe#`<init>`(). => primary ctor <init>
699699
_empty_/Enums.Maybe. => final object Maybe
700-
_empty_/Enums.Maybe.$fromOrdinal(). => method $fromOrdinal
701-
_empty_/Enums.Maybe.$fromOrdinal().(_$ordinal) => param _$ordinal
702700
_empty_/Enums.Maybe.$values. => val method $values
703701
_empty_/Enums.Maybe.Just# => final case enum class Just
704702
_empty_/Enums.Maybe.Just#[A] => covariant typeparam A
@@ -721,6 +719,8 @@ _empty_/Enums.Maybe.Just.unapply(). => method unapply
721719
_empty_/Enums.Maybe.Just.unapply().(x$1) => param x$1
722720
_empty_/Enums.Maybe.Just.unapply().[A] => typeparam A
723721
_empty_/Enums.Maybe.None. => case val static enum method None
722+
_empty_/Enums.Maybe.fromOrdinal(). => method fromOrdinal
723+
_empty_/Enums.Maybe.fromOrdinal().(ordinal) => param ordinal
724724
_empty_/Enums.Maybe.valueOf(). => method valueOf
725725
_empty_/Enums.Maybe.valueOf().($name) => param $name
726726
_empty_/Enums.Maybe.values(). => method values
@@ -744,14 +744,14 @@ _empty_/Enums.Planet.Neptune. => case val static enum method Neptune
744744
_empty_/Enums.Planet.Saturn. => case val static enum method Saturn
745745
_empty_/Enums.Planet.Uranus. => case val static enum method Uranus
746746
_empty_/Enums.Planet.Venus. => case val static enum method Venus
747+
_empty_/Enums.Planet.fromOrdinal(). => method fromOrdinal
748+
_empty_/Enums.Planet.fromOrdinal().(ordinal) => param ordinal
747749
_empty_/Enums.Planet.valueOf(). => method valueOf
748750
_empty_/Enums.Planet.valueOf().($name) => param $name
749751
_empty_/Enums.Planet.values(). => method values
750752
_empty_/Enums.Suits# => abstract sealed enum class Suits
751753
_empty_/Enums.Suits#`<init>`(). => primary ctor <init>
752754
_empty_/Enums.Suits. => final object Suits
753-
_empty_/Enums.Suits.$fromOrdinal(). => method $fromOrdinal
754-
_empty_/Enums.Suits.$fromOrdinal().(_$ordinal) => param _$ordinal
755755
_empty_/Enums.Suits.$new(). => method $new
756756
_empty_/Enums.Suits.$new().($name) => param $name
757757
_empty_/Enums.Suits.$new().(_$ordinal) => param _$ordinal
@@ -765,26 +765,26 @@ _empty_/Enums.Suits.extension_isBlack(). => method extension_isBlack
765765
_empty_/Enums.Suits.extension_isBlack().(suit) => param suit
766766
_empty_/Enums.Suits.extension_isRed(). => method extension_isRed
767767
_empty_/Enums.Suits.extension_isRed().(suit) => param suit
768+
_empty_/Enums.Suits.fromOrdinal(). => method fromOrdinal
769+
_empty_/Enums.Suits.fromOrdinal().(ordinal) => param ordinal
768770
_empty_/Enums.Suits.valueOf(). => method valueOf
769771
_empty_/Enums.Suits.valueOf().($name) => param $name
770772
_empty_/Enums.Suits.values(). => method values
771773
_empty_/Enums.Tag# => abstract sealed enum class Tag
772774
_empty_/Enums.Tag#[A] => typeparam A
773775
_empty_/Enums.Tag#`<init>`(). => primary ctor <init>
774776
_empty_/Enums.Tag. => final object Tag
775-
_empty_/Enums.Tag.$fromOrdinal(). => method $fromOrdinal
776-
_empty_/Enums.Tag.$fromOrdinal().(_$ordinal) => param _$ordinal
777777
_empty_/Enums.Tag.$values. => val method $values
778778
_empty_/Enums.Tag.BooleanTag. => case val static enum method BooleanTag
779779
_empty_/Enums.Tag.IntTag. => case val static enum method IntTag
780+
_empty_/Enums.Tag.fromOrdinal(). => method fromOrdinal
781+
_empty_/Enums.Tag.fromOrdinal().(ordinal) => param ordinal
780782
_empty_/Enums.Tag.valueOf(). => method valueOf
781783
_empty_/Enums.Tag.valueOf().($name) => param $name
782784
_empty_/Enums.Tag.values(). => method values
783785
_empty_/Enums.WeekDays# => abstract sealed enum class WeekDays
784786
_empty_/Enums.WeekDays#`<init>`(). => primary ctor <init>
785787
_empty_/Enums.WeekDays. => final object WeekDays
786-
_empty_/Enums.WeekDays.$fromOrdinal(). => method $fromOrdinal
787-
_empty_/Enums.WeekDays.$fromOrdinal().(_$ordinal) => param _$ordinal
788788
_empty_/Enums.WeekDays.$new(). => method $new
789789
_empty_/Enums.WeekDays.$new().($name) => param $name
790790
_empty_/Enums.WeekDays.$new().(_$ordinal) => param _$ordinal
@@ -796,6 +796,8 @@ _empty_/Enums.WeekDays.Sunday. => case val static enum method Sunday
796796
_empty_/Enums.WeekDays.Thursday. => case val static enum method Thursday
797797
_empty_/Enums.WeekDays.Tuesday. => case val static enum method Tuesday
798798
_empty_/Enums.WeekDays.Wednesday. => case val static enum method Wednesday
799+
_empty_/Enums.WeekDays.fromOrdinal(). => method fromOrdinal
800+
_empty_/Enums.WeekDays.fromOrdinal().(ordinal) => param ordinal
799801
_empty_/Enums.WeekDays.valueOf(). => method valueOf
800802
_empty_/Enums.WeekDays.valueOf().($name) => param $name
801803
_empty_/Enums.WeekDays.values(). => method values
@@ -817,6 +819,8 @@ _empty_/Enums.`<:<`.Refl.toString(). => method toString
817819
_empty_/Enums.`<:<`.Refl.unapply(). => method unapply
818820
_empty_/Enums.`<:<`.Refl.unapply().(x$1) => param x$1
819821
_empty_/Enums.`<:<`.Refl.unapply().[C] => typeparam C
822+
_empty_/Enums.`<:<`.fromOrdinal(). => method fromOrdinal
823+
_empty_/Enums.`<:<`.fromOrdinal().(ordinal) => param ordinal
820824
_empty_/Enums.`<:<`.given_T(). => final implicit method given_T
821825
_empty_/Enums.`<:<`.given_T().[T] => typeparam T
822826
_empty_/Enums.extension_unwrap(). => method extension_unwrap

0 commit comments

Comments
 (0)