Skip to content

Commit bdb89d8

Browse files
committed
Document 8 & use Option extractor over | Null
1 parent 3b9f0c9 commit bdb89d8

File tree

1 file changed

+21
-23
lines changed

1 file changed

+21
-23
lines changed

compiler/src/dotty/tools/dotc/transform/ArrayApply.scala

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)