8000 use java box types in explicit java converters · scala/scala@6cda90d · GitHub
[go: up one dir, main page]

Skip to content

Commit 6cda90d

Browse files
committed
use java box types in explicit java converters
1 parent 6281c22 commit 6cda90d

File tree

5 files changed

+286
-232
lines changed

5 files changed

+286
-232
lines changed

project/GenerateFunctionConverters.scala

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,24 @@ object GenerateFunctionConverters {
4242
val run = new compiler.Run
4343

4444
import compiler._, definitions._
45+
locally {
46+
val f = classOf[scala.reflect.internal.Definitions#DefinitionsClass].getDeclaredField("UnqualifiedOwners")
47+
f.setAccessible(true)
48+
f.set(definitions, definitions.UnqualifiedOwners.filter(_.fullNameString != "java.lang"))
49+
}
50+
51+
def primitiveBox(tp: Type): Type = tp.typeSymbol match {
52+
case UnitClass => BoxedUnitClass.tpe
53+
case ByteClass => BoxedByteClass.tpe
54+
case ShortClass => BoxedShortClass.tpe
55+
case CharClass => BoxedCharacterClass.tpe
56+
case IntClass => BoxedIntClass.tpe
57+
case LongClass => BoxedLongClass.tpe
58+
case FloatClass => BoxedFloatClass.tpe
59+
case DoubleClass => BoxedDoubleClass.tpe
60+
case BooleanClass => BoxedBooleanClass.tpe
61+
case _ => tp
62+
}
4563

4664
implicit class IndentMe(v: Vector[String]) {
4765
def indent: Vector[String] = v.map(" " + _)
@@ -177,7 +195,8 @@ object GenerateFunctionConverters {
177195
val tnParams: List[TypeName] = jfn.iface.typeParams.map(_.name.toTypeName)
178196
val tdParams: List[TypeDef] = tnParams.map(TypeDef(NoMods, _, Nil, EmptyTree))
179197
val javaTargs: List[Tree] = tdParams.map(_.name).map(Ident(_))
180-
val scalaTargs: List[Tree] = jfn.pTypes.map(mkRef) :+ mkRef(jfn.rType)
198+
val scalaTargsBoxed: List[Tree] = jfn.pTypes.map(t => mkRef(primitiveBox(t))) :+ mkRef(primitiveBox(jfn.rType))
199+
val scalaTargs: List[Tree] = jfn.pTypes.map(t => mkRef(t)) :+ mkRef(jfn.rType)
181200

182201
// Conversion wrappers have three or four components that we need to name
183202
// (1) The wrapper class that wraps a Java SAM as Scala function, or vice versa (ClassN)
@@ -220,9 +239,9 @@ object GenerateFunctionConverters {
220239
}"""
221240

222241
val j2sDefTree =
223-
q"""@inline def $j2sDefN[..$tdParams](jf: $javaType[..$javaTargs]): $scalaType[..$scalaTargs] = jf match {
224-
case $s2jCompanionN(f) => f.asInstanceOf[$scalaType[..$scalaTargs]]
225-
case _ => new $j2sClassN[..$tnParams](jf)
242+
q"""@inline def $j2sDefN[..$tdParams](jf: $javaType[..$javaTargs]): $scalaType[..$scalaTargsBoxed] = jf match {
243+
case $s2jCompanionN(f) => f.asInstanceOf[$scalaType[..$scalaTargsBoxed]]
244+
case _ => new $j2sClassN[..$tnParams](jf).asInstanceOf[$scalaType[..$scalaTargsBoxed]]
226245
}"""
227246

228247
val j2sImpTree =
@@ -234,9 +253,9 @@ object GenerateFunctionConverters {
234253
}"""
235254

236255
val s2jDefTree =
237-
q"""@inline def $s2jDefN[..$tdParams](sf: $scalaType[..$scalaTargs]): $javaType[..$javaTargs] = sf match {
256+
q"""@inline def $s2jDefN[..$tdParams](sf: $scalaType[..$scalaTargsBoxed]): $javaType[..$javaTargs] = (sf: AnyRef) match {
238257
case $j2sCompanionN(f) => f.asInstanceOf[$javaType[..$javaTargs]]
239-
case _ => new $s2jClassN[..$tnParams](sf)
258+
case _ => new $s2jClassN[..$tnParams](sf.asInstanceOf[$scalaType[..$scalaTargs]])
240259
}"""
241260

242261
// This is especially tricky because functions are contravariant in their arguments

0 commit comments

Comments
 (0)
0