Bug #14889

TracePoint for :line never seems to trigger on argument list. Maybe by design?

Added by ioquatix (Samuel Williams) 18 days ago. Updated 17 days ago.

Target version:


I have the following code.

  30  1|        def print_summary(
  31  0|            output = $stdout
  32   |        )

In the margin is the line number followed by the number of hits according to :line trace point.

I feel like line 31 should also trigger a line trace point. It's an argument, but it must be executed.

Maybe a different trace point? :argument?


#1 [ruby-core:87730] Updated by ioquatix (Samuel Williams) 18 days ago

If this is by design, please feel free to close, but as it stands there is no way to check if optional argument evaluation occurred or not. For code coverage, this is a limitation.

#2 [ruby-core:87731] Updated by mame (Yusuke Endoh) 18 days ago

I'm unsure about your assumption. If you can insert a newline freely, you may want to write the following code:

  30  1|        def print_summary(
  31   |            output = (
  32  0|              $stdout
  33   |            )
  34   |        )

You can hook Line 32 as a :line event.

We usually write an optional argument in a line: def print_summary(out = $stdout). I don't think it is a good idea to deal with such a code as a :line event because for def foo(x = 1, y = 2) we cannot distinguish x event and y event.

As you say, if we really need this, we should add a new event type like :argument, but we need to design its API carefully based on actual use cases.

#3 [ruby-core:87732] Updated by shevegen (Robert A. Heiler) 17 days ago

I don't have anything overly helpful to the discussion to add; but I wanted
to add one thing to this:

We usually write an optional argument in a line: def print_summary(out = $stdout)

While I concur in general, I myself have experimented a little with layout
such as:

def foo(
   a = 'foo',
   b = 'bar',

The reason was primarily because it is, for my bad eyesight, easier to assess which
arguments are used; I only have to look at the left hand side mostly. Makes it easier
for me to keep track what is going on.

This may be a rare layout perhaps, but coming from this, I understand where Samuel
is coming from (but this is not me saying anything pro or con on the suggestion
itself; I really only wanted to comment on spaced-out optional arguments).

On a side note that may not be very relevant either, one can add strings to ')'
such as:

def foo(
    i = 'bar'
  )"hello world!"
  puts i


I don't even know if that is a bug or a feature or something totally irrelevant.
I just found it funny and golfing-worthy (even though I am a horrible code golfer).
Almost a bit like python doc strings! :D

Also available in: Atom PDF