Class: Fast::Rewriter

Inherits:
Parser::TreeRewriter
  • Object
show all
Defined in:
lib/fast.rb

Overview

Note:

the standalone class needs to combines #affect_types to properly generate the ‘on_<node-type>` methods depending on the expression being used.

Rewriter encapsulates #match_index to allow ExperimentFile#partial_replace in a ExperimentFile.

Examples:

Simple Rewriter

ast = Fast.ast("a = 1")
buffer = Parser::Source::Buffer.new('replacement')
buffer.source = ast.loc.expression.source
rewriter = Rewriter.new
rewriter.buffer = buffer
rewriter.search ='(lvasgn _ ...)'
rewriter.replacement =  -> (node) { replace(node.location.name, 'variable_renamed') }
rewriter.affect_types(:lvasgn)
rewriter.rewrite(buffer, ast) # => "variable_renamed = 1"

See Also:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Rewriter

Returns a new instance of Rewriter.



286
287
288
289
# File 'lib/fast.rb', line 286

def initialize(*args)
  super
  @match_index = 0
end

Instance Attribute Details

#bufferObject

Returns the value of attribute buffer.



285
286
287
# File 'lib/fast.rb', line 285

def buffer
  @buffer
end

#match_indexInteger (readonly)

Returns with occurrence index.

Returns:

  • (Integer)

    with occurrence index



284
285
286
# File 'lib/fast.rb', line 284

def match_index
  @match_index
end

#replacementObject

Returns the value of attribute replacement.



285
286
287
# File 'lib/fast.rb', line 285

def replacement
  @replacement
end

#searchObject

Returns the value of attribute search.



285
286
287
# File 'lib/fast.rb', line 285

def search
  @search
end

Instance Method Details

#affect_types(*types) ⇒ Object

Generate methods for all affected types.

See Also:



297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
# File 'lib/fast.rb', line 297

def affect_types(*types) # rubocop:disable Metrics/MethodLength
  types.map do |type|
    self.class.send :define_method, "on_#{type}" do |node|
      if captures = match?(node) # rubocop:disable Lint/AssignmentInCondition
        @match_index += 1
        if replacement.parameters.length == 1
          instance_exec node, &replacement
        else
          instance_exec node, captures, &replacement
        end
      end
      super(node)
    end
  end
end

#match?(node) ⇒ Boolean

Returns:

  • (Boolean)


291
292
293
# File 'lib/fast.rb', line 291

def match?(node)
  Fast.match?(node, search)
end