aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/ast/tpd.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2016-03-23 18:36:38 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2016-04-18 14:44:23 +0200
commit0211e56d104934188007e3c02eac131b81460100 (patch)
tree5a5dcf383ba7139a9ea95df883cdf85c6d9a363c /src/dotty/tools/dotc/ast/tpd.scala
parent27deb1e0d41a4dfc24a4cac8a311c30471d454e5 (diff)
downloaddotty-0211e56d104934188007e3c02eac131b81460100.tar.gz
dotty-0211e56d104934188007e3c02eac131b81460100.tar.bz2
dotty-0211e56d104934188007e3c02eac131b81460100.zip
Get rid of all new***Array methods expect one.
This one is able to encode creation of array of any type and any dimension. Note, it does not handle value classes.
Diffstat (limited to 'src/dotty/tools/dotc/ast/tpd.scala')
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index a58ff7f51..528b5fa29 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -362,21 +362,21 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
* kind for the given element type in `typeArg`. No type arguments or
* `length` arguments are given.
*/
- def newArray(typeArg: Tree, pos: Position)(implicit ctx: Context): Tree = {
- val elemType = typeArg.tpe
- val elemClass = elemType.classSymbol
- def newArr(kind: String) =
- ref(defn.DottyArraysModule).select(s"new${kind}Array".toTermName).withPos(pos)
- if (TypeErasure.isUnboundedGeneric(elemType))
- newArr("Generic").appliedToTypeTrees(typeArg :: Nil)
- else if (elemClass.isPrimitiveValueClass)
- newArr(elemClass.name.toString)
- else {
- val typeApplied = newArr("Ref").appliedToTypeTrees(typeArg :: Nil)
- val classOfArg =
- ref(defn.Predef_classOf).appliedToTypeTrees(typeArg :: Nil)
- Apply(typeApplied, classOfArg :: Nil).withPos(typeArg.pos)
- }
+ def newArray(elemTpe: Type, returnTpe: Type, pos: Position, dims: JavaSeqLiteral)(implicit ctx: Context): Tree = {
+ val elemClass = elemTpe.classSymbol
+ def newArr(symbol: TermSymbol) =
+ ref(defn.DottyArraysModule).select(symbol).withPos(pos)
+
+ if (!ctx.erasedTypes)
+ if (TypeErasure.isUnboundedGeneric(elemTpe)) {
+ //exists only before erasure
+ assert(dims.elems.tail.isEmpty)
+ newArr(defn.newGenericArrayMethod).appliedToType(elemTpe).appliedTo(dims.elems.head)
+ }
+ else
+ newArr(defn.newArrayMethod).appliedToTypeTrees(TypeTree(returnTpe) :: Nil).appliedToArgs(clsOf(elemTpe) :: clsOf(returnTpe) :: dims :: Nil).withPos(pos)
+ else // after erasure
+ newArr(defn.newArrayMethod).appliedToArgs(clsOf(elemTpe) :: clsOf(returnTpe) :: dims :: Nil).withPos(pos)
}
// ------ Creating typed equivalents of trees that exist only in untyped form -------