summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/UnCurry.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/UnCurry.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index 05aa3be60b..7af0c4f56c 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -385,15 +385,32 @@ abstract class UnCurry extends InfoTransform with TypingTransformers {
// when calling into java varargs, make sure it's an array - see bug #1360
def forceToArray(arg: Tree) = {
val Typed(tree, _) = arg
- lazy val isTraversable = tree.tpe.baseClasses contains TraversableClass
- lazy val toArray = tree.tpe member nme.toArray
-
- if (isJava && isTraversable && toArray != NoSymbol)
- Apply(gen.mkAttributedSelect(tree, toArray), Nil) setType tree.tpe.memberType(toArray)
- else
- tree
+ if (!isJava || tree.tpe.typeSymbol == ArrayClass) tree
+ else {
+ val traversableTpe = tree.tpe.baseType(TraversableClass)
+ val toArray = tree.tpe member nme.toArray
+ if (traversableTpe != NoType && toArray != NoSymbol) {
+ val arguments =
+ if (toArray.tpe.paramTypes.isEmpty) List() // !!! old style toArray
+ else { // new style, with manifest
+ val manifestOpt = localTyper.findManifest(tree.tpe.typeArgs.head, false)
+ if (manifestOpt.tree.isEmpty) {
+ unit.error(tree.pos, "cannot find class manifest for element type of "+tree.tpe)
+ List(Literal(Constant(null)))
+ } else {
+ List(manifestOpt.tree)
+ }
+ }
+ atPhase(phase.next) {
+ localTyper.typed {
+ atPos(pos) {
+ Apply(gen.mkAttributedSelect(tree, toArray), arguments)
+ }
+ }
+ }
+ } else tree
+ }
}
-
if (args.isEmpty)
List(mkArrayValue(args))
else {