@@ -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