Sha256: 06d808181c9525afa1fa9b01308ce90b379a0e7e9069208603a75a39134775b9

Contents?: true

Size: 1.38 KB

Versions: 6

Compression:

Stored size: 1.38 KB

Contents

# frozen_string_literal: true

require "delegate"

module ActiveSupport
  # This is a class for wrapping syntax errors.  The purpose of this class
  # is to enhance the backtraces on SyntaxError exceptions to include the
  # source location of the syntax error.  That way we can display the error
  # source on error pages in development.
  class SyntaxErrorProxy < DelegateClass(SyntaxError) # :nodoc:
    def backtrace
      parse_message_for_trace + super
    end

    class BacktraceLocation < Struct.new(:path, :lineno, :to_s) # :nodoc:
      def spot(_)
      end

      def label
      end
    end

    class BacktraceLocationProxy < DelegateClass(Thread::Backtrace::Location) # :nodoc:
      def initialize(loc, ex)
        super(loc)
        @ex = ex
      end

      def spot(_)
        super(@ex.__getobj__)
      end
    end

    def backtrace_locations
      parse_message_for_trace.map { |trace|
        file, line = trace.match(/^(.+?):(\d+).*$/, &:captures) || trace
        BacktraceLocation.new(file, line.to_i, trace)
        # We have to wrap these backtrace locations because we need the
        # spot information to come from the originating exception, not the
        # proxy object that's generating these
      } + super.map { |loc| BacktraceLocationProxy.new(loc, self) }
    end

    private
      def parse_message_for_trace
        __getobj__.to_s.split("\n")
      end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
activesupport-7.1.2 lib/active_support/syntax_error_proxy.rb
activesupport-7.1.1 lib/active_support/syntax_error_proxy.rb
activesupport-7.1.0 lib/active_support/syntax_error_proxy.rb
activesupport-7.1.0.rc2 lib/active_support/syntax_error_proxy.rb
activesupport-7.1.0.rc1 lib/active_support/syntax_error_proxy.rb
activesupport-7.1.0.beta1 lib/active_support/syntax_error_proxy.rb