@@ -3,12 +3,14 @@ package transform
33
44import core ._
55import Names ._
6+ import StdNames .nme
67import Types ._
78import dotty .tools .dotc .transform .TreeTransforms .{AnnotationTransformer , TransformerInfo , MiniPhaseTransform , TreeTransformer }
8- import ast .Trees .flatten
9+ import ast .Trees ._
910import Flags ._
1011import Contexts .Context
1112import Symbols ._
13+ import Constants ._
1214import Denotations ._ , SymDenotations ._
1315import Decorators .StringInterpolators
1416import dotty .tools .dotc .ast .tpd
@@ -56,9 +58,33 @@ class ElimRepeated extends MiniPhaseTransform with InfoTransformer with Annotati
5658 override def transformSelect (tree : Select )(implicit ctx : Context , info : TransformerInfo ): Tree =
5759 transformTypeOfTree(tree)
5860
59- override def transformApply (tree : Apply )(implicit ctx : Context , info : TransformerInfo ): Tree =
60- transformTypeOfTree(tree) // should also transform the tree if argument needs adaptation
61+ override def transformApply (tree : Apply )(implicit ctx : Context , info : TransformerInfo ): Tree = {
62+ val args1 = tree.args.map {
63+ case arg : Typed if isWildcardStarArg(arg) =>
64+ if (tree.fun.symbol.is(JavaDefined ) && arg.expr.tpe.derivesFrom(defn.SeqClass ))
65+ seqToArray(arg.expr)
66+ else arg.expr
67+ case arg => arg
68+ }
69+ transformTypeOfTree(cpy.Apply (tree)(tree.fun, args1))
70+ }
6171
72+ /** Convert sequence argument to Java array */
73+ private def seqToArray (tree : Tree )(implicit ctx : Context ): Tree = tree match {
74+ case SeqLiteral (elems) =>
75+ JavaSeqLiteral (elems)
76+ case _ =>
77+ val elemType = tree.tpe.firstBaseArgInfo(defn.SeqClass )
78+ var elemClass = elemType.classSymbol
79+ if (defn.PhantomClasses contains elemClass) elemClass = defn.ObjectClass
80+ ref(defn.DottyArraysModule )
81+ .select(nme.seqToArray)
82+ .appliedToType(elemType)
83+ .appliedTo(tree, Literal (Constant (elemClass.typeRef)))
84+ .ensureConforms(defn.ArrayType (elemType))
85+ // Because of phantomclasses, the Java array's type might not conform to the resturn type
86+ }
87+
6288 override def transformTypeApply (tree : TypeApply )(implicit ctx : Context , info : TransformerInfo ): Tree =
6389 transformTypeOfTree(tree)
6490
0 commit comments