@@ -209,6 +209,8 @@ class Semantic {
209
209
else
210
210
val rhs = target.defTree.asInstanceOf [ValOrDefDef ].rhs
211
211
eval(rhs, thisRef, target.owner.asClass, cacheResult = true )
212
+ else if thisRef.canIgnoreMethodCall(target) then
213
+ Result (Hot , Nil )
212
214
else
213
215
val error = CallUnknown (target, source, trace)
214
216
Result (Hot , error :: Nil )
@@ -235,6 +237,8 @@ class Semantic {
235
237
else
236
238
val rhs = target.defTree.asInstanceOf [ValOrDefDef ].rhs
237
239
eval(rhs, warm, target.owner.asClass, cacheResult = true )
240
+ else if warm.canIgnoreMethodCall(target) then
241
+ Result (Hot , Nil )
238
242
else
239
243
val error = CallUnknown (target, source, trace)
240
244
Result (Hot , error :: Nil )
@@ -385,6 +389,17 @@ class Semantic {
385
389
case warm : Warm => // ignore
386
390
end extension
387
391
392
+ // ----- Policies ------------------------------------------------------
393
+ extension (value : Warm | ThisRef )
394
+ /** Can the method call on `value` be ignored?
395
+ *
396
+ * Note: assume overriding resolution has been performed.
397
+ */
398
+ def canIgnoreMethodCall (meth : Symbol )(using Context ): Boolean =
399
+ val cls = meth.owner
400
+ cls == defn.AnyClass ||
401
+ cls == defn.AnyValClass ||
402
+ cls == defn.ObjectClass
388
403
389
404
// ----- Semantic definition --------------------------------
390
405
0 commit comments