Skip to content

Commit 90e1e40

Browse files
Mix scala 2 and scala 3 macros
Doesn't actually work because of a bug in scala 3: scala/scala3#16630
1 parent c75af96 commit 90e1e40

File tree

9 files changed

+67
-31
lines changed

9 files changed

+67
-31
lines changed

build.sbt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,14 @@ lazy val macros = crossProject(JSPlatform, JVMPlatform, NativePlatform)
169169
name := "enumeratum-macros",
170170
version := Versions.Macros.head,
171171
crossScalaVersions := scalaVersionsAll, // eventually move this to aggregateProject once more 2.13 libs are out
172-
libraryDependencies += {
172+
libraryDependencies ++= {
173173
if (scalaBinaryVersion.value == "3") {
174-
"org.scala-lang" %% "scala3-compiler" % scalaVersion.value % Provided
174+
Seq(
175+
"org.scala-lang" %% "scala3-compiler" % scalaVersion.value % Provided,
176+
"org.scala-lang" % "scala-reflect" % scala_2_13Version,
177+
)
175178
} else {
176-
"org.scala-lang" % "scala-reflect" % scalaVersion.value
179+
Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value)
177180
}
178181
},
179182
libraryDependencies += scalaXmlTest.value
@@ -202,7 +205,7 @@ lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform)
202205
if (useLocalVersion) {
203206
Seq.empty
204207
} else {
205-
Seq("com.beachape" %% "enumeratum-macros" % Versions.Macros.stable)
208+
Seq("com.beachape" %% "enumeratum-macros" % Versions.Macros.head)
206209
}
207210
},
208211
libraryDependencies += scalaXmlTest.value
@@ -811,7 +814,7 @@ lazy val compilerSettings = Seq(
811814

812815
val base = {
813816
if (scalaBinaryVersion.value == "3") {
814-
minimal :+ "-deprecation"
817+
minimal :+ "-Wconf:cat=deprecation:s"
815818
} else {
816819
minimal ++ Seq(
817820
// "-Ywarn-adapted-args",

enumeratum-core/src/main/scala-2/enumeratum/EnumCompat.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import scala.collection.immutable.IndexedSeq
44

55
import scala.language.experimental.macros
66

7+
import _root_.enumeratum.compat.EnumMacros
8+
79
private[enumeratum] trait EnumCompat[A <: EnumEntry] { _: Enum[A] =>
810

911
/** Returns a Seq of [[A]] objects that the macro was able to find.

enumeratum-core/src/main/scala-2/enumeratum/values/ValueEnumCompat.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import scala.language.experimental.macros
44

55
import scala.collection.immutable.IndexedSeq
66

7-
import _root_.enumeratum.{EnumMacros, ValueEnumMacros}
7+
import _root_.enumeratum.compat.{EnumMacros, ValueEnumMacros}
88

99
private[enumeratum] trait IntEnumCompanion {
1010

enumeratum-core/src/main/scala-3/enumeratum/EnumCompat.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package enumeratum
22

3+
import _root_.enumeratum.compat
4+
import scala.language.experimental.macros
5+
36
private[enumeratum] trait EnumCompat[A <: EnumEntry] { _enum: Enum[A] =>
47

58
/** Returns a Seq of [[A]] objects that the macro was able to find.
69
*
710
* You will want to use this in some way to implement your [[values]] method. In fact, if you
811
* aren't using this method... why are you even bothering with this lib?
912
*/
10-
inline def findValues: IndexedSeq[A] = ${ EnumMacros.findValuesImpl[A] }
13+
protected inline def findValues: IndexedSeq[A] = ${ EnumMacros.findValuesImpl[A] }
14+
protected def findValues: IndexedSeq[A] = macro compat.EnumMacros.findValuesImpl[A]
1115

1216
/** The sequence of values for your [[Enum]]. You will typically want to implement this in your
1317
* extending class as a `val` so that `withName` and friends are as efficient as possible.
@@ -23,5 +27,6 @@ private[enumeratum] trait EnumCompanion {
2327
/** Finds the `Enum` companion object for a particular `EnumEntry`. */
2428
implicit inline def materializeEnum[A <: EnumEntry]: Enum[A] =
2529
${ EnumMacros.materializeEnumImpl[A, Enum[A]] }
26-
30+
implicit def materializeEnum[A <: EnumEntry]: Enum[A] = macro
31+
compat.EnumMacros.materializeEnumImpl[A]
2732
}

enumeratum-core/src/main/scala-3/enumeratum/values/ValueEnumCompat.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package enumeratum.values
33
import scala.language.experimental.macros
44

55
import _root_.enumeratum.{Enum, EnumMacros, ValueEnumMacros}
6+
import _root_.enumeratum.compat
67

78
private[enumeratum] trait IntEnumCompanion {
89

910
/** Materializes an `IntEnum` for a given `IntEnumEntry`. */
1011
implicit inline def materialiseIntValueEnum[EntryType <: IntEnumEntry]: IntEnum[EntryType] = ${
1112
EnumMacros.materializeEnumImpl[EntryType, IntEnum[EntryType]]
1213
}
14+
implicit def materialiseIntValueEnum[EntryType <: IntEnumEntry]: IntEnum[EntryType] = macro
15+
compat.EnumMacros.materializeEnumImpl[EntryType]
1316
}
1417

1518
private[enumeratum] trait IntEnumCompat[A <: IntEnumEntry] { _enum: IntEnum[A] =>
@@ -21,6 +24,7 @@ private[enumeratum] trait IntEnumCompat[A <: IntEnumEntry] { _enum: IntEnum[A] =
2124
*/
2225
protected inline def findValues: IndexedSeq[A] =
2326
${ ValueEnumMacros.findIntValueEntriesImpl[A] }
27+
protected def findValues: IndexedSeq[A] = macro compat.ValueEnumMacros.findIntValueEntriesImpl[A]
2428
}
2529

2630
private[enumeratum] trait LongEnumCompanion {
@@ -30,6 +34,8 @@ private[enumeratum] trait LongEnumCompanion {
3034
implicit inline def materialiseLongValueEnum[EntryType <: LongEnumEntry]: LongEnum[EntryType] = ${
3135
EnumMacros.materializeEnumImpl[EntryType, LongEnum[EntryType]]
3236
}
37+
implicit def materialiseLongValueEnum[EntryType <: LongEnumEntry]: LongEnum[EntryType] = macro
38+
compat.EnumMacros.materializeEnumImpl[EntryType]
3339
}
3440

3541
private[enumeratum] trait LongEnumCompat[A <: LongEnumEntry] { _enum: LongEnum[A] =>
@@ -40,6 +46,7 @@ private[enumeratum] trait LongEnumCompat[A <: LongEnumEntry] { _enum: LongEnum[A
4046
* aren't using this method...why are you even bothering with this lib?
4147
*/
4248
protected inline def findValues: IndexedSeq[A] = ${ ValueEnumMacros.findLongValueEntriesImpl[A] }
49+
protected def findValues: IndexedSeq[A] = macro compat.ValueEnumMacros.findLongValueEntriesImpl[A]
4350
}
4451

4552
private[enumeratum] trait ShortEnumCompanion {
@@ -50,6 +57,8 @@ private[enumeratum] trait ShortEnumCompanion {
5057
${
5158
EnumMacros.materializeEnumImpl[EntryType, ShortEnum[EntryType]]
5259
}
60+
implicit def materialiseShortValueEnum[EntryType <: ShortEnumEntry]: ShortEnum[EntryType] = macro
61+
compat.EnumMacros.materializeEnumImpl[EntryType]
5362
}
5463

5564
private[enumeratum] trait ShortEnumCompat[A <: ShortEnumEntry] { _enum: ShortEnum[A] =>
@@ -62,6 +71,8 @@ private[enumeratum] trait ShortEnumCompat[A <: ShortEnumEntry] { _enum: ShortEnu
6271
protected inline def findValues: IndexedSeq[A] = ${
6372
ValueEnumMacros.findShortValueEntriesImpl[A]
6473
}
74+
protected def findValues: IndexedSeq[A] = macro
75+
compat.ValueEnumMacros.findShortValueEntriesImpl[A]
6576
}
6677

6778
private[enumeratum] trait StringEnumCompanion {
@@ -72,6 +83,9 @@ private[enumeratum] trait StringEnumCompanion {
7283
: StringEnum[EntryType] = ${
7384
EnumMacros.materializeEnumImpl[EntryType, StringEnum[EntryType]]
7485
}
86+
implicit def materialiseStringValueEnum[EntryType <: StringEnumEntry]: StringEnum[
87+
EntryType
88+
] = macro compat.EnumMacros.materializeEnumImpl[EntryType]
7589
}
7690

7791
private[enumeratum] trait StringEnumCompat[A <: StringEnumEntry] { _enum: StringEnum[A] =>
@@ -84,6 +98,8 @@ private[enumeratum] trait StringEnumCompat[A <: StringEnumEntry] { _enum: String
8498
protected inline def findValues: IndexedSeq[A] = ${
8599
ValueEnumMacros.findStringValueEntriesImpl[A]
86100
}
101+
protected def findValues: IndexedSeq[A] = macro
102+
compat.ValueEnumMacros.findStringValueEntriesImpl[A]
87103
}
88104

89105
private[enumeratum] trait ByteEnumCompanion {
@@ -93,6 +109,8 @@ private[enumeratum] trait ByteEnumCompanion {
93109
implicit inline def materialiseByteValueEnum[EntryType <: ByteEnumEntry]: ByteEnum[EntryType] = ${
94110
EnumMacros.materializeEnumImpl[EntryType, ByteEnum[EntryType]]
95111
}
112+
implicit def materialiseByteValueEnum[EntryType <: ByteEnumEntry]: ByteEnum[EntryType] = macro
113+
compat.EnumMacros.materializeEnumImpl[EntryType]
96114
}
97115

98116
private[enumeratum] trait ByteEnumCompat[A <: ByteEnumEntry] { _enum: ByteEnum[A] =>
@@ -105,6 +123,7 @@ private[enumeratum] trait ByteEnumCompat[A <: ByteEnumEntry] { _enum: ByteEnum[A
105123
protected inline def findValues: IndexedSeq[A] = ${
106124
ValueEnumMacros.findByteValueEntriesImpl[A]
107125
}
126+
protected def findValues: IndexedSeq[A] = macro compat.ValueEnumMacros.findByteValueEntriesImpl[A]
108127
}
109128

110129
private[enumeratum] trait CharEnumCompanion {
@@ -114,6 +133,8 @@ private[enumeratum] trait CharEnumCompanion {
114133
implicit inline def materialiseCharValueEnum[EntryType <: CharEnumEntry]: CharEnum[EntryType] = ${
115134
EnumMacros.materializeEnumImpl[EntryType, CharEnum[EntryType]]
116135
}
136+
implicit def materialiseCharValueEnum[EntryType <: CharEnumEntry]: CharEnum[EntryType] = macro
137+
compat.EnumMacros.materializeEnumImpl[EntryType]
117138
}
118139

119140
private[enumeratum] trait CharEnumCompat[A <: CharEnumEntry] { _enum: CharEnum[A] =>
@@ -126,4 +147,5 @@ private[enumeratum] trait CharEnumCompat[A <: CharEnumEntry] { _enum: CharEnum[A
126147
protected inline def findValues: IndexedSeq[A] = ${
127148
ValueEnumMacros.findCharValueEntriesImpl[A]
128149
}
150+
protected def findValues: IndexedSeq[A] = macro compat.ValueEnumMacros.findCharValueEntriesImpl[A]
129151
}

macros/compat/src/main/scala-3

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
scala-2.13

macros/src/main/scala-2/enumeratum/EnumMacros.scala renamed to macros/src/main/scala/enumeratum/compat/EnumMacros.scala

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
package enumeratum
2+
package compat
23

34
import ContextUtils.Context
45

@@ -10,7 +11,7 @@ object EnumMacros {
1011

1112
/** Finds any [A] in the current scope and returns an expression for a list of them
1213
*/
13-
def findValuesImpl[A: c.WeakTypeTag](c: Context): c.Expr[IndexedSeq[A]] = {
14+
def findValuesImpl[A: c.WeakTypeTag](c: Context): c.Tree = {
1415
import c.universe._
1516
val typeSymbol = weakTypeOf[A].typeSymbol
1617
validateType(c)(typeSymbol)
@@ -160,26 +161,22 @@ object EnumMacros {
160161
@SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf"))
161162
private[enumeratum] def buildSeqExpr[A: c.WeakTypeTag](c: Context)(
162163
subclassSymbols: Seq[c.universe.Symbol]
163-
) = {
164+
): c.Tree = {
164165
import c.universe._
165166
val resultType = weakTypeOf[A]
166167
val indexedSeq = Ident(c.mirror.staticModule(classOf[IndexedSeq[A]].getName))
167168
if (subclassSymbols.isEmpty) {
168-
c.Expr[IndexedSeq[A]](
169-
TypeApply(
170-
Select(indexedSeq, ContextUtils.termName(c)("empty")),
171-
List(TypeTree(resultType))
172-
)
169+
TypeApply(
170+
Select(indexedSeq, ContextUtils.termName(c)("empty")),
171+
List(TypeTree(resultType))
173172
)
174173
} else {
175-
c.Expr[IndexedSeq[A]](
176-
Apply(
177-
TypeApply(
178-
Select(indexedSeq, ContextUtils.termName(c)("apply")),
179-
List(TypeTree(resultType))
180-
),
181-
subclassSymbols.map(Ident(_)).toList
182-
)
174+
Apply(
175+
TypeApply(
176+
Select(indexedSeq, ContextUtils.termName(c)("apply")),
177+
List(TypeTree(resultType))
178+
),
179+
subclassSymbols.map(Ident(_)).toList
183180
)
184181
}
185182
}

macros/src/main/scala-2/enumeratum/ValueEnumMacros.scala renamed to macros/src/main/scala/enumeratum/compat/ValueEnumMacros.scala

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
package enumeratum
2+
package compat
23

34
import ContextUtils.Context
45

@@ -15,7 +16,7 @@ object ValueEnumMacros {
1516
*/
1617
def findIntValueEntriesImpl[ValueEntryType: c.WeakTypeTag](
1718
c: Context
18-
): c.Expr[IndexedSeq[ValueEntryType]] = {
19+
): c.Tree = {
1920
findValueEntriesImpl[ValueEntryType, ContextUtils.CTInt, Int](c)(identity)
2021
}
2122

@@ -25,7 +26,7 @@ object ValueEnumMacros {
2526
*/
2627
def findLongValueEntriesImpl[ValueEntryType: c.WeakTypeTag](
2728
c: Context
28-
): c.Expr[IndexedSeq[ValueEntryType]] = {
29+
): c.Tree = {
2930
findValueEntriesImpl[ValueEntryType, ContextUtils.CTLong, Long](c)(identity)
3031
}
3132

@@ -38,7 +39,7 @@ object ValueEnumMacros {
3839
*/
3940
def findShortValueEntriesImpl[ValueEntryType: c.WeakTypeTag](
4041
c: Context
41-
): c.Expr[IndexedSeq[ValueEntryType]] = {
42+
): c.Tree = {
4243
findValueEntriesImpl[ValueEntryType, ContextUtils.CTInt, Short](c)(
4344
_.toShort
4445
) // do a transform because there is no such thing as Short literals
@@ -52,7 +53,7 @@ object ValueEnumMacros {
5253
*/
5354
def findStringValueEntriesImpl[ValueEntryType: c.WeakTypeTag](
5455
c: Context
55-
): c.Expr[IndexedSeq[ValueEntryType]] = {
56+
): c.Tree = {
5657
findValueEntriesImpl[ValueEntryType, String, String](c)(identity)
5758
}
5859

@@ -64,7 +65,7 @@ object ValueEnumMacros {
6465
*/
6566
def findByteValueEntriesImpl[ValueEntryType: c.WeakTypeTag](
6667
c: Context
67-
): c.Expr[IndexedSeq[ValueEntryType]] = {
68+
): c.Tree = {
6869
findValueEntriesImpl[ValueEntryType, ContextUtils.CTInt, Byte](c)(_.toByte)
6970
}
7071

@@ -76,7 +77,7 @@ object ValueEnumMacros {
7677
*/
7778
def findCharValueEntriesImpl[ValueEntryType: c.WeakTypeTag](
7879
c: Context
79-
): c.Expr[IndexedSeq[ValueEntryType]] = {
80+
): c.Tree = {
8081
findValueEntriesImpl[ValueEntryType, ContextUtils.CTChar, Char](c)(identity)
8182
}
8283

@@ -88,7 +89,7 @@ object ValueEnumMacros {
8889
ProcessedValue
8990
](c: Context)(
9091
processFoundValues: ValueType => ProcessedValue
91-
): c.Expr[IndexedSeq[ValueEntryType]] = {
92+
): c.Tree = {
9293
import c.universe._
9394
val typeSymbol = weakTypeOf[ValueEntryType].typeSymbol
9495
EnumMacros.validateType(c)(typeSymbol)
@@ -104,7 +105,11 @@ object ValueEnumMacros {
104105
processFoundValues
105106
)
106107

107-
if (weakTypeOf[ValueEntryType] <:< c.typeOf[AllowAlias]) {
108+
if (
109+
weakTypeOf[ValueEntryType].baseClasses.contains(
110+
c.mirror.staticClass(classOf[AllowAlias].getName)
111+
)
112+
) {
108113
// Skip the uniqueness check
109114
} else {
110115
// Make sure the processed found value implementations are unique

macros/src/test/scala-2/enumeratum/FindValEnums.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package enumeratum
22

3+
import enumeratum.compat.ValueEnumMacros
34
import scala.language.experimental.macros
45

56
/** Created by Lloyd on 1/4/17.

0 commit comments

Comments
 (0)