123456789_123456789_123456789_123456789_123456789_

Exception: ActiveSupport::SyntaxErrorProxy

Do not use. This class is for internal use only.
Relationships & Source Files
Namespace Children
Classes:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, SyntaxError
Instance Chain:
self, SyntaxError
Inherits: SyntaxError
  • ::Object
Defined in: activesupport/lib/active_support/syntax_error_proxy.rb

Overview

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.

Instance Attribute Summary

Instance Method Summary

Instance Attribute Details

#source_location_eval?Boolean (readonly, private)

3.2 and older versions of Ruby

[ GitHub ]

  
# File 'activesupport/lib/active_support/syntax_error_proxy.rb', line 65

def source_location_eval?
  __getobj__.path.start_with?("(eval")
end

Instance Method Details

#backtrace

[ GitHub ]

  
# File 'activesupport/lib/active_support/syntax_error_proxy.rb', line 11

def backtrace
  parse_message_for_trace + super
end

#backtrace_locations

[ GitHub ]

  
# File 'activesupport/lib/active_support/syntax_error_proxy.rb', line 34

def backtrace_locations
  return nil if super.nil?

  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

#parse_message_for_trace (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/syntax_error_proxy.rb', line 47

def parse_message_for_trace
  if source_location_eval?
    # If the exception is coming from a call to eval, we need to keep
    # the path of the file in which eval was called to ensure we can
    # return the right source fragment to show the location of the
    # error
    location = __getobj__.backtrace_locations[0]
    ["#{location.path}:#{location.lineno}: #{__getobj__}"]
  else
    __getobj__.to_s.split("\n")
  end
end