Skip to content

Commit f4c19d9

Browse files
Slight Devalify refactorings
1 parent be8bcee commit f4c19d9

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

compiler/src/dotty/tools/dotc/transform/localopt/Devalify.scala

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,17 @@ class Devalify extends Optimisation {
164164
case _ => t
165165
}
166166

167-
def readingOnlyVals(t: Tree)(implicit ctx: Context): Boolean = dropCasts(t) match {
167+
def readingOnlyVals(t: Tree)(implicit ctx: Context): Boolean = {
168+
def isGetterOfAImmutableField = t.symbol.isGetter && !t.symbol.is(Mutable)
169+
def isCaseClassWithVar = t.symbol.info.decls.exists(_.is(Mutable))
170+
def isAccessingProductField = t.symbol.exists &&
171+
t.symbol.owner.derivesFrom(defn.ProductClass) &&
172+
t.symbol.owner.is(CaseClass) &&
173+
t.symbol.name.isSelectorName &&
174+
!isCaseClassWithVar // Conservatively covers case class A(var x: Int)
175+
def isImmutableCaseAccessor = t.symbol.is(CaseAccessor) && !t.symbol.is(Mutable)
176+
177+
dropCasts(t) match {
168178
case Typed(exp, _) => readingOnlyVals(exp)
169179

170180
case TypeApply(fun @ Select(rec, _), List(tp)) =>
@@ -173,29 +183,21 @@ class Devalify extends Optimisation {
173183
else false
174184

175185
case Apply(Select(rec, _), Nil) =>
176-
def isGetterOfAImmutableField = t.symbol.isGetter && !t.symbol.is(Mutable)
177-
def isCaseClassWithVar = t.symbol.info.decls.exists(_.is(Mutable))
178-
def isAccessingProductField = t.symbol.exists &&
179-
t.symbol.owner.derivesFrom(defn.ProductClass) &&
180-
t.symbol.owner.is(CaseClass) &&
181-
t.symbol.name.isSelectorName &&
182-
!isCaseClassWithVar // Conservative Covers case class A(var x: Int)
183-
def isImmutableCaseAccessor = t.symbol.is(CaseAccessor) && !t.symbol.is(Mutable)
184186
if (isGetterOfAImmutableField || isAccessingProductField || isImmutableCaseAccessor)
185187
readingOnlyVals(rec)
186188
else false
187189

188190
case Select(rec, _) if t.symbol.is(Method) =>
189-
if (t.symbol.isGetter && !t.symbol.is(Mutable))
190-
readingOnlyVals(rec) // getter of a immutable field
191-
else if (t.symbol.owner.derivesFrom(defn.ProductClass) && t.symbol.owner.is(CaseClass) && t.symbol.name.isSelectorName) {
191+
if (isGetterOfAImmutableField)
192+
readingOnlyVals(rec) // Getter of an immutable field
193+
else if (isAccessingProductField) {
192194
def isImmutableField = {
193195
val fieldId = t.symbol.name.toString.drop(1).toInt - 1
194196
!t.symbol.owner.caseAccessors(ctx)(fieldId).is(Mutable)
195197
}
196-
if (isImmutableField) readingOnlyVals(rec) // accessing a field of a product
198+
if (isImmutableField) readingOnlyVals(rec) // Accessing a field of a product
197199
else false
198-
} else if (t.symbol.is(CaseAccessor) && !t.symbol.is(Mutable))
200+
} else if (isImmutableCaseAccessor)
199201
readingOnlyVals(rec)
200202
else false
201203

@@ -208,7 +210,7 @@ class Devalify extends Optimisation {
208210
} else
209211
readingOnlyVals(qual)
210212

211-
case t: Ident if !t.symbol.is(Mutable) && !t.symbol.is(Method) && !t.symbol.info.dealias.isInstanceOf[ExprType] =>
213+
case t: Ident if !t.symbol.is(Mutable | Method) && !t.symbol.info.dealias.isInstanceOf[ExprType] =>
212214
desugarIdent(t) match {
213215
case Some(t) => readingOnlyVals(t)
214216
case None => true
@@ -228,5 +230,6 @@ class Devalify extends Optimisation {
228230
case Literal(Constant(null)) => false
229231
case t: Literal => true
230232
case _ => false
233+
}
231234
}
232235
}

0 commit comments

Comments
 (0)