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.
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.
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
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.