module Utils::Editor::SourceLocationExtension

def source_location

def source_location
  filename   = nil
  linenumber = nil
  if respond_to?(:to_str)
    if (string = to_str) =~ FILE_LINENUMBER_REGEXP
      filename = $1
      linenumber = $2.to_i
      [ $1, linenumber ]
    else
      filename = string
    end
  else
    filename = to_s
  end
  array = linenumber ? [ filename, linenumber ] : [ filename, 1 ]
  array_singleton_class = class << array; self; end
  array_singleton_class.instance_eval do
    define_method(:filename) { filename }
    define_method(:linenumber) { linenumber }
    define_method(:to_s) { [ filename, linenumber ].compact * ':' }
  end
  array
end