protected override ICode VisitCall(ExprCall e) {
if (e.IsVirtualCall) {
var objType = e.Obj.Type.FullResolve(e.Ctx);
if (objType.Resolve().IsSealed) {
// Virtual calls to sealed classes can be rewritten as instance calls
var methods = objType.EnumResolvedMethods().ToArray();
var instMethod = methods.FirstOrDefault(x => x.MatchMethodOnly(e.CallMethod));
if (instMethod != null) {
var expr = new ExprCall(e.Ctx, instMethod, e.Obj, e.Args, false);
return expr;
}
}
}
return base.VisitCall(e);
}