@@ -42,6 +42,24 @@ object GenerateFunctionConverters {
42
42
val run = new compiler.Run
43
43
44
44
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
+ }
45
63
46
64
implicit class IndentMe (v : Vector [String ]) {
47
65
def indent : Vector [String ] = v.map(" " + _)
@@ -177,7 +195,8 @@ object GenerateFunctionConverters {
177
195
val tnParams : List [TypeName ] = jfn.iface.typeParams.map(_.name.toTypeName)
178
196
val tdParams : List [TypeDef ] = tnParams.map(TypeDef (NoMods , _, Nil , EmptyTree ))
179
197
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)
181
200
182
201
// Conversion wrappers have three or four components that we need to name
183
202
// (1) The wrapper class that wraps a Java SAM as Scala function, or vice versa (ClassN)
@@ -220,9 +239,9 @@ object GenerateFunctionConverters {
220
239
} """
221
240
222
241
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 ]]
226
245
} """
227
246
228
247
val j2sImpTree =
@@ -234,9 +253,9 @@ object GenerateFunctionConverters {
234
253
} """
235
254
236
255
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 {
238
257
case $j2sCompanionN(f) => f.asInstanceOf[ $javaType[.. $javaTargs]]
239
- case _ => new $s2jClassN[.. $tnParams](sf)
258
+ case _ => new $s2jClassN[.. $tnParams](sf.asInstanceOf[ $scalaType [.. $scalaTargs ]] )
240
259
} """
241
260
242
261
// This is especially tricky because functions are contravariant in their arguments
0 commit comments