Skip to content

Commit d5f6fa2

Browse files
Test backwards compat of mirror API changes
1 parent 5af00fd commit d5f6fa2

File tree

5 files changed

+90
-0
lines changed

5 files changed

+90
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import scala.deriving.Mirror
2+
3+
package lib {
4+
5+
case class NewFoo(x: Int = 1, y: Int)
6+
7+
object NewMirrors {
8+
val mNewFoo = summon[Mirror.Of[NewFoo]]
9+
10+
val mOldFoo = summon[Mirror.Of[OldFoo]]
11+
val mOldBar = summon[Mirror.Of[OldBar]]
12+
}
13+
}
14+
15+
package app {
16+
import lib.*
17+
18+
object Main {
19+
20+
// defaultArgument implementation did not throw NoSuchElementException
21+
def foundDefaultArgument(m: Mirror.Product): Boolean = try {
22+
m.defaultArgument(0)
23+
true
24+
} catch {
25+
case _: NoSuchElementException => false
26+
}
27+
28+
def main(args: Array[String]): Unit = {
29+
30+
// NewFoo: normal case with support for default arguments
31+
32+
assert(NewMirrors.mNewFoo.defaultArgument(0) == 1)
33+
summon[NewMirrors.mNewFoo.MirroredElemHasDefaults =:= (true, false)]
34+
35+
// OldFoo: does not override the defaultArgument implementation
36+
37+
assert(!foundDefaultArgument(NewMirrors.mOldFoo)) // Expected: since mirror of old case class
38+
summon[NewMirrors.mOldFoo.MirroredElemHasDefaults =:= (false, false)] // Necessary: to be consistent with defaultArgument implementation
39+
40+
assert(!foundDefaultArgument(OldMirrors.mOldFoo)) // Expected: since mirror of old case class
41+
summon[scala.util.NotGiven[OldMirrors.mOldFoo.MirroredElemHasDefaults <:< (Boolean, Boolean)]] // reference to old mirror doesn't have any refinement
42+
summon[OldMirrors.mOldFoo.MirroredElemHasDefaults <:< Tuple] // but does inherit type member from Mirror trait
43+
44+
// OldBar: is anon mirror so could implement defaultArgument
45+
// but we manually keep behaviour consistent with other mirrors of old case classes
46+
47+
assert(NewMirrors.mOldBar ne lib.OldBar)
48+
assert(!foundDefaultArgument(NewMirrors.mOldBar))
49+
summon[NewMirrors.mOldBar.MirroredElemHasDefaults =:= (false, false)] // Ok: should be consistent with above
50+
51+
assert(OldMirrors.mOldBar ne lib.OldBar)
52+
assert(!foundDefaultArgument(OldMirrors.mOldBar))
53+
summon[scala.util.NotGiven[OldMirrors.mOldBar.MirroredElemHasDefaults <:< (Boolean, Boolean)]]
54+
summon[OldMirrors.mOldBar.MirroredElemHasDefaults <:< Tuple]
55+
56+
}
57+
}
58+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
lazy val lib = project.in(file("lib"))
2+
.settings(
3+
scalaVersion := "3.3.0"
4+
)
5+
6+
lazy val app = project.in(file("app"))
7+
.dependsOn(lib)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package lib
2+
3+
import deriving.Mirror
4+
5+
case class OldFoo(x: Int = 1, y: Int)
6+
7+
case class OldBar(x: Int = 1, y: Int)
8+
case object OldBar
9+
10+
object OldMirrors {
11+
val mOldFoo = summon[Mirror.ProductOf[OldFoo]]
12+
val mOldBar = summon[Mirror.ProductOf[OldBar]]
13+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import sbt._
2+
import Keys._
3+
4+
object DottyInjectedPlugin extends AutoPlugin {
5+
override def requires = plugins.JvmPlugin
6+
override def trigger = allRequirements
7+
8+
override val projectSettings = Seq(
9+
scalaVersion := sys.props("plugin.scalaVersion")
10+
)
11+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
> app/run

0 commit comments

Comments
 (0)