Class: Parser::Source::Range

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/parser_tree_rewriter/source/range.rb

Instance Method Summary collapse

Instance Method Details

#<=>(other) ⇒ Object

Compare ranges, first by begin_pos, then by end_pos.



90
91
92
93
94
95
# 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) ⇒ Range

by the given amount(s)

Parameters:

  • Endpoint(s) (Hash)

    to change, any combination of :begin_pos or :end_pos

Returns:

  • (Range)

    the same range as this range but with the given end point(s) adjusted



20
21
22
# 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) ⇒ Boolean

Return ‘other.contains?(self)`

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

Parameters:

Returns:

  • (Boolean)


70
71
72
# File 'lib/parser_tree_rewriter/source/range.rb', line 70

def contained?(other)
  other.contains?(self)
end

#contains?(other) ⇒ Boolean

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

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

Parameters:

Returns:

  • (Boolean)


58
59
60
# 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) ⇒ Boolean

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?

Parameters:

Returns:

  • (Boolean)


82
83
84
85
# 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) ⇒ Boolean

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

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

Parameters:

Returns:

  • (Boolean)


32
33
34
35
36
37
38
# 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) ⇒ Boolean

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

Parameters:

Returns:

  • (Boolean)

    ‘true` if this range and `other` overlap



46
47
48
# 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) ⇒ Range

to the given value(s).

Parameters:

  • Endpoint(s) (Hash)

    to change, any combination of :begin_pos or :end_pos

Returns:

  • (Range)

    the same range as this range but with the given end point(s) changed



11
12
13
# 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