Sha256: 384aa582916f2aa8b42728e622bfcc35fec53f5a8868b621ee07415834d5543f

Contents?: true

Size: 1.45 KB

Versions: 3

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

module RubyNext
  module Language
    module Rewriters
      class EndlessRange < Base
        NAME = "endless-range"
        SYNTAX_PROBE = "[0, 1][1..]"
        MIN_SUPPORTED_VERSION = Gem::Version.new("2.6.0")

        def on_index(node)
          @current_index = node
          new_index = process(node.children.last)
          return unless new_index != node.children.last

          node.updated(
            nil,
            [
              node.children.first,
              new_index
            ]
          )
        end

        def on_erange(node)
          return unless node.children.last.nil?

          context.track! self

          new_end =
            if index_arg?(node)
              s(:int, -1)
            else
              s(:const,
                s(:const,
                  s(:cbase), :Float),
                :INFINITY)
            end

          replace(node.loc.expression, "#{node.children.first.loc.expression.source}..#{unparse(new_end)}")

          node.updated(
            :irange,
            [
              node.children.first,
              new_end
            ]
          )
        end

        alias_method :on_irange, :on_erange

        private

        attr_reader :current_index

        def index_arg?(node)
          ((!((!current_index.nil? || nil) && current_index.children).nil? || nil) && ((!current_index.nil? || nil) && current_index.children).include?(node))
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ruby-next-core-0.11.1 lib/.rbnext/2.3/ruby-next/language/rewriters/endless_range.rb
ruby-next-core-0.11.0 lib/.rbnext/2.3/ruby-next/language/rewriters/endless_range.rb
ruby-next-core-0.10.5 lib/.rbnext/2.3/ruby-next/language/rewriters/endless_range.rb