module Utils::Xt::SourceLocationExtension
def decorate_object(object, filename: nil, linenumber: nil, rangeend: nil)
def decorate_object(object, filename: nil, linenumber: nil, rangeend: nil) sc = object.singleton_class sc.instance_eval do define_method(:filename) { filename } define_method(:linenumber) { linenumber } define_method(:rangeend) { rangeend } define_method(:to_s) { [ filename, linenumber ].compact * ':' } define_method(:range) { rangeend ? "#{to_s}-#{rangeend}" : "#{to_s}" } end object end
def source_location
-
(Array- an array containing the filename and line number,)
def source_location filename = nil linenumber = nil rangeend = nil if defined? super filename, linenumber = super end if respond_to?(:to_str) string = to_str case when string =~ FILE_LINENUMBER_REGEXP && File.exist?($1) filename = $1 linenumber = $2.to_i rangeend = $3&.to_i when string =~ CLASS_METHOD_REGEXP && !File.exist?(string) klassname = $1 method_kind = $2 == '#' ? :instance_method : :method methodname = $3 filename, linenumber = ::Object.const_get(klassname). __send__(method_kind, methodname).source_location else filename = string end elsif !linenumber filename = to_s end array = linenumber ? [ filename, linenumber ] : [ filename, 1 ] decorate_object(array, filename:, linenumber:, rangeend:) end