class Parser::Source::Range

Public Instance Methods

<=>(other) click to toggle source

Compare ranges, first by begin_pos, then by end_pos.

# File lib/parser_tree_rewriter/source/range.rb, line 90
def <=>(other)
  return nil unless other.is_a?(::Parser::Source::Range) &&
    @source_buffer == other.source_buffer
  (@begin_pos <=> other.begin_pos).nonzero? ||
  (@end_pos <=> other.end_pos)
end
adjust(begin_pos: 0, end_pos: 0) click to toggle source

@param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos @return [Range] the same range as this range but with the given end point(s) adjusted by the given amount(s)

# File lib/parser_tree_rewriter/source/range.rb, line 20
def adjust(begin_pos: 0, end_pos: 0)
  Range.new(@source_buffer, @begin_pos + begin_pos, @end_pos + end_pos)
end
contained?(other) click to toggle source

Return `other.contains?(self)`

Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?

@param [Range] other @return [Boolean]

# File lib/parser_tree_rewriter/source/range.rb, line 70
def contained?(other)
  other.contains?(self)
end
contains?(other) click to toggle source

Returns true iff this range contains (strictly) `other`.

Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?

@param [Range] other @return [Boolean]

# File lib/parser_tree_rewriter/source/range.rb, line 58
def contains?(other)
  (other.begin_pos <=> @begin_pos) + (@end_pos <=> other.end_pos) >= (other.empty? ? 2 : 1)
end
crossing?(other) click to toggle source

Returns true iff both ranges intersect and also have different elements from one another.

Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?

@param [Range] other @return [Boolean]

# File lib/parser_tree_rewriter/source/range.rb, line 82
def crossing?(other)
  return false unless overlaps?(other)
  (@begin_pos <=> other.begin_pos) * (@end_pos <=> other.end_pos) == 1
end
disjoint?(other) click to toggle source

Return `true` iff this range and `other` are disjoint.

Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?

@param [Range] other @return [Boolean]

# File lib/parser_tree_rewriter/source/range.rb, line 32
def disjoint?(other)
  if empty? && other.empty?
    @begin_pos != other.begin_pos
  else
    @begin_pos >= other.end_pos || other.begin_pos >= @end_pos
  end
end
overlaps?(other) click to toggle source

Return `true` iff this range is not disjoint from `other`.

@param [Range] other @return [Boolean] `true` if this range and `other` overlap

# File lib/parser_tree_rewriter/source/range.rb, line 46
def overlaps?(other)
  !disjoint?(other)
end
with(begin_pos: @begin_pos, end_pos: @end_pos) click to toggle source

@param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos @return [Range] the same range as this range but with the given end point(s) changed to the given value(s).

# File lib/parser_tree_rewriter/source/range.rb, line 11
def with(begin_pos: @begin_pos, end_pos: @end_pos)
  Range.new(@source_buffer, begin_pos, end_pos)
end