introspection/tracepoint_call_in_block_no_parens.rb

tests/_examples/introspection/tracepoint_call_in_block_no_parens.rb in the metorex repository.

# A :call event names the method, file, and line of a method defined and
# called inside a block, written here with as few parentheses as Ruby allows.

def run_it
  yield
end

class Runner
  def run(&block)
    Object.new.instance_exec(&block)
  end
end

seen = []
run_it do
  TracePoint.new(:call) { |trace| seen << [trace.method_id, trace.lineno] }.enable do
    def defined_in_block; end
    defined_in_block
  end
end
p seen

inspected = []
Runner.new.run do
  TracePoint.new(:call) { |trace|
    next unless trace.path == __FILE__
    inspected << trace.inspect.sub(__FILE__, "FILE")
  }.enable do
    def defined_in_instance_exec; end
    defined_in_instance_exec
  end
end
p inspected

paths = []
Runner.new.run do
  TracePoint.new(:call) { |trace| paths << [trace.method_id, trace.path == __FILE__] }.enable do
    def defined_again; end
    defined_again
  end
end
p paths
p Runner.private_instance_methods(false).include?(:defined_again)

Output:

[[:defined_in_block, 17]]
["#<TracePoint:call 'defined_in_instance_exec' FILE:29>"]
[[:defined_again, true]]
false