@@ -164,7 +164,17 @@ class Devalify extends Optimisation {
164
164
case _ => t
165
165
}
166
166
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 {
168
178
case Typed (exp, _) => readingOnlyVals(exp)
169
179
170
180
case TypeApply (fun @ Select (rec, _), List (tp)) =>
@@ -173,29 +183,21 @@ class Devalify extends Optimisation {
173
183
else false
174
184
175
185
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 )
184
186
if (isGetterOfAImmutableField || isAccessingProductField || isImmutableCaseAccessor)
185
187
readingOnlyVals(rec)
186
188
else false
187
189
188
190
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 ) {
192
194
def isImmutableField = {
193
195
val fieldId = t.symbol.name.toString.drop(1 ).toInt - 1
194
196
! t.symbol.owner.caseAccessors(ctx)(fieldId).is(Mutable )
195
197
}
196
- if (isImmutableField) readingOnlyVals(rec) // accessing a field of a product
198
+ if (isImmutableField) readingOnlyVals(rec) // Accessing a field of a product
197
199
else false
198
- } else if (t.symbol.is( CaseAccessor ) && ! t.symbol.is( Mutable ) )
200
+ } else if (isImmutableCaseAccessor )
199
201
readingOnlyVals(rec)
200
202
else false
201
203
@@ -208,7 +210,7 @@ class Devalify extends Optimisation {
208
210
} else
209
211
readingOnlyVals(qual)
210
212
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 ] =>
212
214
desugarIdent(t) match {
213
215
case Some (t) => readingOnlyVals(t)
214
216
case None => true
@@ -228,5 +230,6 @@ class Devalify extends Optimisation {
228
230
case Literal (Constant (null )) => false
229
231
case t : Literal => true
230
232
case _ => false
233
+ }
231
234
}
232
235
}
0 commit comments