@@ -74,16 +74,16 @@ object WrapFnGen {
74
74
case class SamConversionCode (
75
75
base : String ,
76
76
wrappedAsScala : Vector [String ],
77
+ asScalaAnyVal : Vector [String ],
77
78
implicitToScala : Vector [String ],
78
79
asScalaDef : Vector [String ],
79
80
wrappedAsJava : Vector [String ],
80
81
asJavaAnyVal : Vector [String ],
81
82
implicitToJava : Prioritized ,
82
83
asJavaDef : Vector [String ]
83
84
) {
84
- def impls : Vector [Vector [String ]] = Vector (wrappedAsScala, wrappedAsJava, asJavaAnyVal)
85
+ def impls : Vector [Vector [String ]] = Vector (wrappedAsScala, asScalaAnyVal, wrappedAsJava, asJavaAnyVal)
85
86
def defs : Vector [Vector [String ]] = Vector (asScalaDef, asJavaDef)
86
- def convs : Vector [Vector [String ]] = Vector (implicitToScala, implicitToJava.lines)
87
87
def withPriority (i : Int ): SamConversionCode = copy(implicitToJava = implicitToJava.withPriority(i))
88
88
}
89
89
object SamConversionCode {
@@ -100,19 +100,19 @@ object WrapFnGen {
100
100
def priorityName (n : Int , pure : Boolean = false ): String = {
101
101
val pre =
102
102
if (n <= 0 )
103
- if (pure) " functionConverters "
103
+ if (pure) " FunctionConverters "
104
104
else s " package object ${priorityName(n, pure = true )}"
105
105
else
106
106
if (pure) s " Priority ${n}FunctionConverters "
107
107
else s " trait ${priorityName(n, pure = true )}"
108
- if (! pure && n < sccDepthSet.size) s " $pre extends ${priorityName(n+ 1 , pure = true )}" else pre
108
+ if (! pure && n < ( sccDepthSet.size- 1 ) ) s " $pre extends ${priorityName(n+ 1 , pure = true )}" else pre
109
109
}
110
110
val impls =
111
111
" package functionConverterImpls {" +: {
112
112
codes.map(_.impls).mkVecVec().indent
113
113
} :+ " }"
114
114
val traits = codes.filter(_.implicitToJava.priority > 0 ).groupBy(_.implicitToJava.priority).toVector.sortBy(- _._1).map{ case (k,vs) =>
115
- s " trait Priority ${k} FunctionConverters {" +:
115
+ s " ${priorityName(k)} { " +:
116
116
s " import functionConverterImpls._ " +:
117
117
s " " +:
118
118
vs.map(_.implicitToJava.lines).mkVec().indent :+
@@ -125,7 +125,10 @@ object WrapFnGen {
125
125
s " " +:
126
126
{
127
127
explicitDefs.indent ++
128
- codes.filter(_.implicitToJava.priority == 0 ).map(_.convs).mkVecVec().indent
128
+ Vector .fill(3 )(" " ) ++
129
+ codes.filter(_.implicitToJava.priority == 0 ).map(_.implicitToJava.lines).mkVec().indent ++
130
+ Vector .fill(3 )(" " ) ++
131
+ codes.map(_.implicitToScala).mkVec().indent
129
132
} :+ " }"
130
133
(impls, traits :+ packageObj)
131
134
}
@@ -165,12 +168,13 @@ object WrapFnGen {
165
168
// (1) The wrapper class that wraps a Java SAM as Scala function, or vice versa (ClassN)
166
169
// (2) A value class that provides .asJava or .asScala to request the conversion (ValCN)
167
170
// (3) A name for an explicit conversion method (DefN)
168
- // (4) If nested-trait lookup is needed to pick types, an implicit conversion method name (ImpN)
171
+ // (4) An implicit conversion method name (ImpN) that invokes the value class
169
172
170
173
// Names for Java conversions to Scala
171
174
val j2sClassN = TypeName (" FromJava" + jfn.title)
172
175
val j2sValCN = TypeName (" Rich" + jfn.title + " As" + scalaType.name.encoded)
173
176
val j2sDefN = TermName (" asScalaFrom" + jfn.title)
177
+ val j2sImpN = TermName (" enrichAsScalaFrom" + jfn.title)
174
178
175
179
// Names for Scala conversions to Java
176
180
val s2jClassN = TypeName (" AsJava" + jfn.title)
@@ -190,12 +194,15 @@ object WrapFnGen {
190
194
} """
191
195
192
196
val j2sValCTree =
193
- q """ implicit class $j2sValCN[.. $tdParams](private val underlying: $javaType[.. $javaTargs]) extends AnyVal {
197
+ q """ class $j2sValCN[.. $tdParams](private val underlying: $javaType[.. $javaTargs]) extends AnyVal {
194
198
@inline def asScala: $scalaType[.. $scalaTargs] = new $j2sClassN[.. $tnParams](underlying)
195
199
} """
196
200
197
201
val j2sDefTree =
198
- q """ def $j2sDefN[.. $tdParams](jf: $javaType[.. $javaTargs]): $scalaType[.. $scalaTargs] = new $j2sClassN[.. $tnParams](jf) """
202
+ q """ @inline def $j2sDefN[.. $tdParams](jf: $javaType[.. $javaTargs]): $scalaType[.. $scalaTargs] = new $j2sClassN[.. $tnParams](jf) """
203
+
204
+ val j2sImpTree =
205
+ q """ @inline implicit def $j2sImpN[.. $tdParams](jf: $javaType[.. $javaTargs]): $j2sValCN[.. $tnParams] = new $j2sValCN[.. $tnParams](jf) """
199
206
200
207
val s2jClassTree =
201
208
q """ class $s2jClassN[.. $tdParams](sf: $scalaType[.. $scalaTargs]) extends $javaType[.. $javaTargs] {
@@ -208,14 +215,14 @@ object WrapFnGen {
208
215
} """
209
216
210
217
val s2jDefTree =
211
- q """ def $s2jDefN[.. $tdParams](sf: $scalaType[.. $scalaTargs]): $javaType[.. $javaTargs] = new $s2jClassN[.. $tnParams](sf) """
218
+ q """ @inline def $s2jDefN[.. $tdParams](sf: $scalaType[.. $scalaTargs]): $javaType[.. $javaTargs] = new $s2jClassN[.. $tnParams](sf) """
212
219
213
220
// This is especially tricky because functions are contravariant in their arguments
214
221
// Need to prevent e.g. Any => String from "downcasting" itself to Int => String; we want the more exact conversion
215
222
val s2jImpTree : (Tree , Int ) =
216
223
if (jfn.pTypes.forall(! _.isFinalType) && jfn.sig == jfn.sam.typeSignature)
217
224
(
218
- q """ implicit def $s2jImpN[.. $tdParams](sf: $scalaType[.. $scalaTargs]): $s2jValCN[.. $tnParams] = new $s2jValCN[.. $tnParams](sf) """ ,
225
+ q """ @inline implicit def $s2jImpN[.. $tdParams](sf: $scalaType[.. $scalaTargs]): $s2jValCN[.. $tnParams] = new $s2jValCN[.. $tnParams](sf) """ ,
219
226
tdParams.length
220
227
)
221
228
else {
@@ -243,7 +250,7 @@ object WrapFnGen {
243
250
dropRight(if (jfn.rType.isFinalType) 1 else 0 )
244
251
val evs = evidences.map{ case (generic, specific) => ValDef (NoMods , TermName (" ev" + generic.toString), tq " $generic =:= $specific" , EmptyTree ) }
245
252
val tree =
246
- q """ implicit def $s2jImpN[.. $scalafnTdefs](sf: $scalaType[.. $scalafnTnames])(implicit .. $evs): $s2jValCN[.. $tnParams] =
253
+ q """ @inline implicit def $s2jImpN[.. $scalafnTdefs](sf: $scalaType[.. $scalafnTnames])(implicit .. $evs): $s2jValCN[.. $tnParams] =
247
254
new $s2jValCN[.. $tnParams](sf.asInstanceOf[ $scalaType[.. $scalaTargs]])
248
255
"""
249
256
val depth = numberedA.size
@@ -253,7 +260,8 @@ object WrapFnGen {
253
260
SamConversionCode (
254
261
base = jfn.title,
255
262
wrappedAsScala = j2sClassTree.text,
256
- implicitToScala = j2sValCTree.text,
263
+ asScalaAnyVal = j2sValCTree.text,
264
+ implicitToScala = j2sImpTree.text,
257
265
asScalaDef = j2sDefTree.text,
258
266
wrappedAsJava = s2jClassTree.text,
259
267
asJavaAnyVal = s2jValCTree.text,
0 commit comments