Sha256: b22216a88b92128e0c1667d9cde6e2f2c50a7dd4980ea6a439e1bdedeef3a31d

Contents?: true

Size: 1.75 KB

Versions: 4

Compression:

Stored size: 1.75 KB

Contents

module Steep
  module AST
    class Location
      attr_reader :buffer
      attr_reader :start_pos
      attr_reader :end_pos

      def initialize(buffer:, start_pos:, end_pos:)
        @buffer = buffer
        @start_pos = start_pos
        @end_pos = end_pos
      end

      def inspect
        "#<#{self.class}:#{self.__id__} @buffer=..., @start_pos=#{start_pos}, @end_pos=#{end_pos}, source='#{source.lines.first}', start_line=#{start_line}, start_column=#{start_column}>"
      end

      def name
        buffer.name
      end

      def start_line
        start_loc[0]
      end

      def start_column
        start_loc[1]
      end

      def end_line
        end_loc[0]
      end

      def end_column
        end_loc[1]
      end

      def start_loc
        @start_loc ||= buffer.pos_to_loc(start_pos)
      end

      def end_loc
        @end_loc ||= buffer.pos_to_loc(end_pos)
      end

      def source
        @source ||= buffer.source(start_pos...end_pos)
      end

      def to_s
        "#{start_line}:#{start_column}...#{end_line}:#{end_column}"
      end

      def ==(other)
        other.is_a?(Location) &&
          other.buffer == buffer &&
          other.start_pos == start_pos &&
          other.end_pos == end_pos
      end

      def +(other)
        raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer

        self.class.new(buffer: buffer,
                       start_pos: start_pos,
                       end_pos: other.end_pos)
      end

      def self.concat(*locations)
        locations.inject {|l1, l2|
          l1 + l2
        }
      end

      def pred?(loc)
        loc.is_a?(Location) &&
          loc.name == name &&
          loc.start_pos == end_pos
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
steep-0.4.0 lib/steep/ast/location.rb
steep-0.3.0 lib/steep/ast/location.rb
steep-0.2.0 lib/steep/ast/location.rb
steep-0.1.0 lib/steep/ast/location.rb