@@ -20,15 +20,13 @@ class ArrayApply extends MiniPhase {
20
20
override def description : String = ArrayApply .description
21
21
22
22
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
24
25
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
32
30
33
31
override def transformApply (tree : Apply )(using Context ): Tree =
34
32
if isArrayModuleApply(tree.symbol) then
@@ -44,15 +42,12 @@ class ArrayApply extends MiniPhase {
44
42
case _ =>
45
43
tree
46
44
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) =>
51
48
New (defn.ConsType , List (elem.ensureConforms(defn.ObjectType ), acc))
52
49
consed.cast(tree.tpe)
53
- else tree
54
-
55
- else tree
50
+ case _ => tree
56
51
57
52
private def isArrayModuleApply (sym : Symbol )(using Context ): Boolean =
58
53
sym.name == nme.apply
@@ -75,14 +70,17 @@ class ArrayApply extends MiniPhase {
75
70
|| sym == defn.CollectionSeqType .symbol.companionModule
76
71
case _ => false
77
72
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
+
86
84
87
85
/** Only optimize when classtag if it is one of
88
86
* - `ClassTag.apply(classOf[XYZ])`
0 commit comments