Sha256: 811319e3156eda72b5b4cad14dd3c2842153aff1e15fa5010534f782fc141ace

Contents?: true

Size: 1.32 KB

Versions: 3

Compression:

Stored size: 1.32 KB

Contents

require 'tins/deep_const_get'

module Utils
  module Xt
    module SourceLocationExtension
      include Tins::DeepConstGet

      CLASS_METHOD_REGEXP    = /\A([A-Z][\w:]+)([#.])([\w!?]+)/

      FILE_LINENUMBER_REGEXP = /\A\s*([^:]+):(\d+)/

      def source_location
        filename   = nil
        linenumber = nil
        if respond_to?(:to_str)
          string = to_str
          case
          when string =~ FILE_LINENUMBER_REGEXP && File.exist?($1)
            filename = $1
            linenumber = $2.to_i
          when string =~ CLASS_METHOD_REGEXP && !File.exist?(string)
            klassname   = $1
            method_kind = $2 == '#' ? :instance_method : :method
            methodname  = $3
            filename, linenumber =
              deep_const_get(klassname).__send__(method_kind, methodname).source_location
          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
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
utils-0.9.0 lib/utils/xt/source_location_extension.rb
utils-0.2.4 lib/utils/xt/source_location_extension.rb
utils-0.2.3 lib/utils/xt/source_location_extension.rb