@@ -20,15 +20,13 @@ class ArrayApply extends MiniPhase {
2020 override def description : String = ArrayApply .description
2121
2222 private val TransformListApplyBudgetKey = new Property .Key [Int ]
23- private def transformListApplyBudget (using Context ) = ctx.property(TransformListApplyBudgetKey ).getOrElse(8 )
23+ private def transformListApplyBudget (using Context ) =
24+ ctx.property(TransformListApplyBudgetKey ).getOrElse(8 ) // default is 8, as originally implemented in nsc
2425
25- override def prepareForApply (tree : Apply )(using Context ): Context =
26- if isSeqApply(tree) then
27- val args = seqApplyArgsOrNull(tree)
28- if args != null then
29- ctx.fresh.setProperty(TransformListApplyBudgetKey , transformListApplyBudget - args.elems.length)
30- else ctx
31- else ctx
26+ override def prepareForApply (tree : Apply )(using Context ): Context = tree match
27+ case SeqApplyArgs (elems) =>
28+ ctx.fresh.setProperty(TransformListApplyBudgetKey , transformListApplyBudget - elems.length)
29+ case _ => ctx
3230
3331 override def transformApply (tree : Apply )(using Context ): Tree =
3432 if isArrayModuleApply(tree.symbol) then
@@ -44,15 +42,12 @@ class ArrayApply extends MiniPhase {
4442 case _ =>
4543 tree
4644
47- else if isSeqApply(tree) then
48- val args = seqApplyArgsOrNull(tree)
49- if args != null && (transformListApplyBudget > 0 || args.elems.isEmpty) then
50- val consed = args.elems.foldRight(ref(defn.NilModule )): (elem, acc) =>
45+ else tree match
46+ case SeqApplyArgs (elems) if transformListApplyBudget > 0 || elems.isEmpty =>
47+ val consed = elems.foldRight(ref(defn.NilModule )): (elem, acc) =>
5148 New (defn.ConsType , List (elem.ensureConforms(defn.ObjectType ), acc))
5249 consed.cast(tree.tpe)
53- else tree
54-
55- else tree
50+ case _ => tree
5651
5752 private def isArrayModuleApply (sym : Symbol )(using Context ): Boolean =
5853 sym.name == nme.apply
@@ -75,14 +70,17 @@ class ArrayApply extends MiniPhase {
7570 || sym == defn.CollectionSeqType .symbol.companionModule
7671 case _ => false
7772
78- private def seqApplyArgsOrNull (tree : Apply )(using Context ): JavaSeqLiteral | Null =
79- // assumes isSeqApply(tree)
80- tree.args match
81- // <List or Seq>(a, b, c) ~> new ::(a, new ::(b, new ::(c, Nil))) but only for reference types
82- case StripAscription (Apply (wrapArrayMeth, List (StripAscription (rest : JavaSeqLiteral )))) :: Nil
83- if defn.WrapArrayMethods ().contains(wrapArrayMeth.symbol) =>
84- rest
85- case _ => null
73+ private object SeqApplyArgs :
74+ def unapply (tree : Apply )(using Context ): Option [List [Tree ]] =
75+ if isSeqApply(tree) then
76+ tree.args match
77+ // <List or Seq>(a, b, c) ~> new ::(a, new ::(b, new ::(c, Nil))) but only for reference types
78+ case StripAscription (Apply (wrapArrayMeth, List (StripAscription (rest : JavaSeqLiteral )))) :: Nil
79+ if defn.WrapArrayMethods ().contains(wrapArrayMeth.symbol) =>
80+ Some (rest.elems)
81+ case _ => None
82+ else None
83+
8684
8785 /** Only optimize when classtag if it is one of
8886 * - `ClassTag.apply(classOf[XYZ])`
0 commit comments