diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2016-03-23 18:36:38 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2016-04-18 14:44:23 +0200 |
commit | 0211e56d104934188007e3c02eac131b81460100 (patch) | |
tree | 5a5dcf383ba7139a9ea95df883cdf85c6d9a363c /src/dotty/tools/dotc/ast/tpd.scala | |
parent | 27deb1e0d41a4dfc24a4cac8a311c30471d454e5 (diff) | |
download | dotty-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.scala | 30 |
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 ------- |