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