Shopify/rotoscope

Calls from default argument values show inconsistent caller information

Opened this issue · 1 comments

For example, if we have a method defined with

def create_applied_discount_from(discount, code: discount.try(:code))

the discount.try(:code) call shows that line in the file path and line number for the call, but the entity and method name refer to the caller of create_applied_discount_from which is inconsistent with the file path. Ideally, for the discount.try(:code) call, the caller method would show up as create_applied_discount_from and the caller entity would be the class of the object that method was called on.

This is happening because rotoscope tries to keep information from the stack based by pushing a frame to this stack on call events and popping a stack from on a return event. However, in this case the call event hasn't happened yet.

This wouldn't be a problem if we weren't trying to surface the caller entity. We could use rb_profile_frames to get efficiently get the caller method name, which we already do to accurately get the caller file path.

Previously we were deriving the caller component from the caller entity, but now we can do that from the caller file path. We won't always have a caller entity anyways for anonymous classes/modules or from calls in blocks.