Skip to content

Commit f6237bf

Browse files
authored
Use scala version driven import on Captor macro (#361)
1 parent 6d9e264 commit f6237bf

File tree

4 files changed

+48
-24
lines changed

4 files changed

+48
-24
lines changed

.bsp/sbt.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"name":"sbt","version":"1.4.6","bspVersion":"2.0.0-M5","languages":["scala"],"argv":["/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java","-Xms100m","-Xmx100m","-classpath","/Users/bbonanno/Library/Application Support/JetBrains/IntelliJIdea2020.3/plugins/Scala/launcher/sbt-launch.jar","xsbt.boot.Boot","-bsp"]}
1+
{"name":"sbt","version":"1.4.7","bspVersion":"2.0.0-M5","languages":["scala"],"argv":["/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java","-Xms100m","-Xmx100m","-classpath","/Users/bbonanno/Library/Application Support/JetBrains/IntelliJIdea2020.3/plugins/Scala/launcher/sbt-launch.jar","xsbt.boot.Boot","-bsp"]}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.mockito.internal
2+
3+
import scala.util.Properties
4+
5+
sealed trait ScalaVersion
6+
object ScalaVersion {
7+
case object V2_11 extends ScalaVersion
8+
case object V2_12 extends ScalaVersion
9+
case object V2_13 extends ScalaVersion
10+
11+
val Current: ScalaVersion = {
12+
val version = Properties.scalaPropOrElse("version.number", "unknown")
13+
if (version.startsWith("2.11")) ScalaVersion.V2_11
14+
else if (version.startsWith("2.12")) ScalaVersion.V2_12
15+
else if (version.startsWith("2.13")) ScalaVersion.V2_13
16+
else throw new Exception(s"Unsupported scala version $version")
17+
}
18+
}

macro-common/src/main/scala/org/mockito/internal/ValueClassExtractor.scala

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.mockito.internal
22

33
import org.mockito.internal.MacroDebug.debugResult
4+
import org.mockito.internal.ScalaVersion.{ V2_11, V2_12, V2_13 }
45

56
import scala.reflect.macros.blackbox
6-
import scala.util.Properties
77

88
trait ValueClassExtractor[VC] extends Serializable {
99
def isValueClass: Boolean = true
@@ -30,8 +30,6 @@ class ReflectionExtractor[VC] extends ValueClassExtractor[VC] {
3030
object ValueClassExtractor {
3131
def apply[T: ValueClassExtractor]: ValueClassExtractor[T] = implicitly[ValueClassExtractor[T]]
3232

33-
private val ScalaVersion = Properties.scalaPropOrElse("version.number", "unknown")
34-
3533
implicit def instance[VC]: ValueClassExtractor[VC] = macro materialise[VC]
3634

3735
def materialise[VC: c.WeakTypeTag](c: blackbox.Context): c.Expr[ValueClassExtractor[VC]] = {
@@ -41,24 +39,25 @@ object ValueClassExtractor {
4139
val isValueClass = typeSymbol.isClass && typeSymbol.asClass.isDerivedValueClass
4240

4341
val r =
44-
if (isValueClass)
45-
if (ScalaVersion.startsWith("2.12") || ScalaVersion.startsWith("2.13"))
46-
c.Expr[ValueClassExtractor[VC]](q"new _root_.org.mockito.internal.ReflectionExtractor[$tpe]")
47-
else if (ScalaVersion.startsWith("2.11"))
48-
c.Expr[ValueClassExtractor[VC]] {
49-
val companion = typeSymbol.companion
42+
if (isValueClass) {
43+
ScalaVersion.Current match {
44+
case V2_12 | V2_13 =>
45+
c.Expr[ValueClassExtractor[VC]](q"new _root_.org.mockito.internal.ReflectionExtractor[$tpe]")
46+
case V2_11 =>
47+
c.Expr[ValueClassExtractor[VC]] {
48+
val companion = typeSymbol.companion
5049

51-
if (companion.info.decls.exists(_.name.toString == "unapply"))
52-
q"""
53-
new _root_.org.mockito.internal.ValueClassExtractor[$tpe] {
54-
override def extract(vc: $tpe): Any = $companion.unapply(vc).get
50+
if (companion.info.decls.exists(_.name.toString == "unapply"))
51+
q"""
52+
new _root_.org.mockito.internal.ValueClassExtractor[$tpe] {
53+
override def extract(vc: $tpe): Any = $companion.unapply(vc).get
54+
}
55+
"""
56+
else
57+
q"new _root_.org.mockito.internal.NormalClassExtractor[$tpe]"
5558
}
56-
"""
57-
else
58-
q"new _root_.org.mockito.internal.NormalClassExtractor[$tpe]"
59-
}
60-
else throw new Exception(s"Unsupported scala version $ScalaVersion")
61-
else
59+
}
60+
} else
6261
c.Expr[ValueClassExtractor[VC]](q"new _root_.org.mockito.internal.NormalClassExtractor[$tpe]")
6362

6463
debugResult(c)("mockito-print-extractor")(r.tree)

macro/src/main/scala/org/mockito/captor/Captor.scala

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package org.mockito.captor
22

3-
import org.mockito.internal.MacroDebug.debugResult
3+
import org.mockito.exceptions.base.MockitoAssertionError
44
import org.mockito.exceptions.verification.{ ArgumentsAreDifferent, TooFewActualInvocations, TooManyActualInvocations }
5+
import org.mockito.internal.MacroDebug.debugResult
6+
import org.mockito.internal.ScalaVersion
7+
import org.mockito.internal.ScalaVersion.{ V2_11, V2_12, V2_13 }
58
import org.mockito.{ clazz, ArgumentCaptor }
69
import org.scalactic.Equality
710
import org.scalactic.TripleEquals._
11+
812
import scala.collection.JavaConverters._
913
import scala.reflect.ClassTag
1014
import scala.reflect.macros.blackbox
1115
import scala.util.{ Failure, Try }
1216

13-
import org.mockito.exceptions.base.MockitoAssertionError
14-
1517
trait Captor[T] {
1618
def capture: T
1719

@@ -75,10 +77,15 @@ object Captor {
7577
.head
7678
val paramType = tpe.decl(param.name).typeSignature.finalResultType
7779

80+
val collectionConverters = ScalaVersion.Current match {
81+
case V2_11 | V2_12 => q"import _root_.scala.collection.JavaConverters._"
82+
case V2_13 => q"import _root_.scala.jdk.CollectionConverters._"
83+
}
84+
7885
q"""
7986
new _root_.org.mockito.captor.Captor[$tpe] {
8087

81-
import _root_.scala.collection.JavaConverters._
88+
$collectionConverters
8289

8390
private val argumentCaptor = _root_.org.mockito.ArgumentCaptor.forClass(classOf[$paramType])
8491

0 commit comments

Comments
 (0)