class RubyNext::Language::Rewriters::Base

Attributes

context[R]
locals[R]

Public Class Methods

new(context) click to toggle source
Calls superclass method
# File lib/ruby-next/language/rewriters/base.rb, line 85
def initialize(context)
  @context = context
  @locals = LocalsTracker.new
  super()
end
unsupported_syntax?() click to toggle source

Returns true if the syntax is supported by the current Ruby (performs syntax check, not version check)

# File lib/ruby-next/language/rewriters/base.rb, line 59
def unsupported_syntax?
  save_verbose, $VERBOSE = $VERBOSE, nil
  eval_mid = Kernel.respond_to?(:eval_without_ruby_next) ? :eval_without_ruby_next : :eval
  Kernel.send eval_mid, self::SYNTAX_PROBE, nil, __FILE__, __LINE__
  false
rescue SyntaxError, StandardError
  true
ensure
  $VERBOSE = save_verbose
end
unsupported_version?(version) click to toggle source

Returns true if the syntax is supported by the specified version

# File lib/ruby-next/language/rewriters/base.rb, line 72
def unsupported_version?(version)
  self::MIN_SUPPORTED_VERSION > version
end

Private Class Methods

transform(source) click to toggle source
# File lib/ruby-next/language/rewriters/base.rb, line 78
def transform(source)
  Language.transform(source, rewriters: [self], using: false)
end

Public Instance Methods

s(type, *children) click to toggle source
# File lib/ruby-next/language/rewriters/base.rb, line 91
def s(type, *children)
  ::Parser::AST::Node.new(type, children)
end

Private Instance Methods

find_child(node) { |child| ... } click to toggle source

BFS with predicate block

# File lib/ruby-next/language/rewriters/base.rb, line 98
def find_child(node)
  queue = [node]

  loop do
    break if queue.empty?

    child = queue.shift
    next unless child.is_a?(::Parser::AST::Node)

    return child if yield child

    queue.push(*child.children)
  end

  nil
end
insert_after(range, ast) click to toggle source
# File lib/ruby-next/language/rewriters/base.rb, line 123
def insert_after(range, ast)
  @source_rewriter&.insert_after(range, unparse(ast))
end
insert_before(range, ast) click to toggle source
# File lib/ruby-next/language/rewriters/base.rb, line 127
def insert_before(range, ast)
  @source_rewriter&.insert_before(range, unparse(ast))
end
remove(range) click to toggle source
# File lib/ruby-next/language/rewriters/base.rb, line 119
def remove(range)
  @source_rewriter&.remove(range)
end
replace(range, ast) click to toggle source
# File lib/ruby-next/language/rewriters/base.rb, line 115
def replace(range, ast)
  @source_rewriter&.replace(range, unparse(ast))
end
unparse(ast) click to toggle source
# File lib/ruby-next/language/rewriters/base.rb, line 131
def unparse(ast)
  return ast if ast.is_a?(String)

  Unparser.unparse(ast).chomp
end