Bug #14889
closedTracePoint for :line never seems to trigger on argument list. Maybe by design?
Description
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
?
Updated by ioquatix (Samuel Williams) over 6 years 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.
Updated by mame (Yusuke Endoh) over 6 years 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.
Updated by shevegen (Robert A. Heiler) over 6 years 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
end
foo
:-)
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
Updated by jeremyevans0 (Jeremy Evans) over 3 years ago
- Related to Bug #15634: TracePoint seems to be skipping some methods. added
Updated by jeremyevans0 (Jeremy Evans) over 3 years ago
This is basically the same issue as #15634. The default argument evaluation is not considered a separate expression, so no line event is generated. If you force it to use a separate expression by wrapping in parentheses, you can get a line event, as @mame (Yusuke Endoh) demonstrated.
Note that when not using a separate expression, the coverage
shows a nil for the line. If you force a separate expression and line, the coverage
library can tell if the line was covered or not.
Updated by jeremyevans0 (Jeremy Evans) over 3 years ago
- Status changed from Open to Closed