lib/synvert/rewriter/action.rb in synvert-0.0.13 vs lib/synvert/rewriter/action.rb in synvert-0.0.14
- old
+ new
@@ -1,47 +1,75 @@
# encoding: utf-8
module Synvert
+ # Action defines rewriter action, add, replace or remove code.
class Rewriter::Action
+ # Initialize an action.
+ #
+ # @param instance [Synvert::Rewriter::Instance]
+ # @param code {String] new code to add, replace or remove.
def initialize(instance, code)
@instance = instance
@code = code
@node = @instance.current_node
end
+ # Line number of the node.
+ #
+ # @return [Integer] line number.
def line
@node.loc.expression.line
end
+ # The rewritten source code with proper indent.
+ #
+ # @return [String] rewritten code.
def rewritten_code
if rewritten_source.split("\n").length > 1
"\n\n" + rewritten_source.split("\n").map { |line|
indent(@node) + line
}.join("\n")
else
"\n" + indent(@node) + rewritten_source
end
end
+ # The rewritten source code.
+ #
+ # @return [String] rewritten source code.
def rewritten_source
@rewritten_source ||= @node.rewritten_source(@code)
end
+ # Compare actions by begin position.
+ #
+ # @param action [Synvert::Rewriter::Action]
+ # @return [Integer] -1, 0 or 1
def <=>(action)
self.begin_pos <=> action.begin_pos
end
end
+ # ReplaceWithAction to replace code.
class Rewriter::ReplaceWithAction < Rewriter::Action
+ # Begin position of code to replace.
+ #
+ # @return [Integer] begin position.
def begin_pos
@node.loc.expression.begin_pos
end
+ # End position of code to replace.
+ #
+ # @return [Integer] end position.
def end_pos
@node.loc.expression.end_pos
end
+ # The rewritten source code with proper indent.
+ #
+ # @return [String] rewritten code.
def rewritten_code
if rewritten_source.split("\n").length > 1
"\n\n" + rewritten_source.split("\n").map { |line|
indent(@node) + line
}.join("\n")
@@ -50,50 +78,75 @@
end
end
private
+ # Indent of the node
+ #
+ # @param node [Parser::AST::Node]
+ # @return [String] n times whitesphace
def indent(node)
' ' * node.indent
end
end
+ # AppendWithAction to append code to the bottom of node body.
class Rewriter::AppendAction < Rewriter::Action
+ # Begin position to append code.
+ #
+ # @return [Integer] begin position.
def begin_pos
if :begin == @node.type
@node.loc.expression.end_pos
else
@node.loc.expression.end_pos - 4
end
end
+ # End position, always same to begin position.
+ #
+ # @return [Integer] end position.
def end_pos
begin_pos
end
private
+ # Indent of the node.
+ #
+ # @param node [Parser::AST::Node]
+ # @return [String] n times whitesphace
def indent(node)
if [:block, :class].include? node.type
' ' * (node.indent + 2)
else
' ' * node.indent
end
end
end
+ # InsertAction to insert code to the top of node body.
class Rewriter::InsertAction < Rewriter::Action
+ # Begin position to insert code.
+ #
+ # @return [Integer] begin position.
def begin_pos
insert_position(@node)
end
+ # End position, always same to begin position.
+ #
+ # @return [Integer] end position.
def end_pos
begin_pos
end
private
+ # Insert position.
+ #
+ # @return [Integer] insert position.
def insert_position(node)
case node.type
when :block
node.children[1].children.empty? ? node.children[0].loc.expression.end_pos + 3 : node.children[1].loc.expression.end_pos
when :class
@@ -101,47 +154,70 @@
else
node.children.last.loc.expression.end_pos
end
end
+ # Indent of the node.
+ #
+ # @param node [Parser::AST::Node]
+ # @return [String] n times whitesphace
def indent(node)
if [:block, :class].include? node.type
' ' * (node.indent + 2)
else
' ' * node.indent
end
end
end
+ # InsertAfterAction to insert code next to the node.
class Rewriter::InsertAfterAction < Rewriter::Action
+ # Begin position to insert code.
+ #
+ # @return [Integer] begin position.
def begin_pos
@node.loc.expression.end_pos
end
+ # End position, always same to begin position.
+ #
+ # @return [Integer] end position.
def end_pos
begin_pos
end
private
+ # Indent of the node.
+ #
+ # @param node [Parser::AST::Node]
+ # @return [String] n times whitesphace
def indent(node)
' ' * node.indent
end
end
+ # RemoveAction to remove code.
class Rewriter::RemoveAction < Rewriter::Action
def initialize(instance, code=nil)
super
end
+ # Begin position of code to replace.
+ #
+ # @return [Integer] begin position.
def begin_pos
@node.loc.expression.begin_pos
end
+ # End position of code to replace.
+ #
+ # @return [Integer] end position.
def end_pos
@node.loc.expression.end_pos
end
+ # The rewritten code, always empty string.
def rewritten_code
''
end
end
end