class RSpec::Support::Source
@private Represents a Ruby
source file and provides access to AST and tokens.
Constants
- Location
-
@private Represents a source location of node or token.
Attributes
Public Class Methods
# File rspec-support/lib/rspec/support/source.rb, line 23 def self.from_file(path) source = File.read(path) new(source, path) end
# File rspec-support/lib/rspec/support/source.rb, line 29 def initialize(source_string, path=nil) @source = RSpec::Support::EncodedString.new(source_string, Encoding.default_external) @path = path ? File.expand_path(path) : '(string)' end
Public Instance Methods
# File rspec-support/lib/rspec/support/source.rb, line 54 def ast @ast ||= begin require 'ripper' sexp = Ripper.sexp(source) raise SyntaxError unless sexp Node.new(sexp) end end
# File rspec-support/lib/rspec/support/source.rb, line 46 def inspect "#<#{self.class} #{path}>" end
# File rspec-support/lib/rspec/support/source.rb, line 42 def lines @lines ||= source.split("\n") end
# File rspec-support/lib/rspec/support/source.rb, line 71 def nodes_by_line_number @nodes_by_line_number ||= begin nodes_by_line_number = ast.select(&:location).group_by { |node| node.location.line } Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) end end
# File rspec-support/lib/rspec/support/source.rb, line 63 def tokens @tokens ||= begin require 'ripper' tokens = Ripper.lex(source) Token.tokens_from_ripper_tokens(tokens) end end
# File rspec-support/lib/rspec/support/source.rb, line 78 def tokens_by_line_number @tokens_by_line_number ||= begin nodes_by_line_number = tokens.group_by { |token| token.location.line } Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) end end