class Capataz::Rewriter
Attributes
logs[R]
Public Class Methods
new(options = {})
click to toggle source
# File lib/capataz/rewriter.rb, line 9 def initialize(options = {}) @options = options || {} @logs = options[:logs] || {} @self_linker = options[:self_linker] @self_send_prefixer = options[:self_send_prefixer] @capatized_nodes = Set.new end
Public Instance Methods
on_array(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 28 def on_array(node) super node.children.each { |child| decapatize(child) } end
on_casgn(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 61 def on_casgn(node) report_error('can not define (or override) constants') unless Capataz.can_declare?(:constant) super capatize(node.children[2]) end
on_class(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 72 def on_class(node) report_error('can not define classes') unless Capataz.can_declare?(:class) super end
on_cvar(_)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 112 def on_cvar(_) report_error('can not access class variables') unless Capataz.can_declare?(:cvar) super end
on_cvasgn(_)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 107 def on_cvasgn(_) report_error('can not access class variables') unless Capataz.can_declare?(:cvar) super end
on_def(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 82 def on_def(node) report_error('can not define methods') unless Capataz.can_declare?(:def) super insert_before(node.location.expression, ";::Capataz.denied_override_of(self, :#{node.children[0]});") unless Capataz.allow_method_overrides end
on_gvar(_)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 117 def on_gvar(_) report_error('can not access global variables') unless Capataz.can_declare?(:gvar) super end
on_gvasgn(_)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 122 def on_gvasgn(_) report_error('can not access global variables') unless Capataz.can_declare?(:gvar) super end
on_ivar(_)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 102 def on_ivar(_) report_error('can not access instance variables') unless Capataz.can_declare?(:ivar) super end
on_ivasgn(_)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 97 def on_ivasgn(_) report_error('can not access instance variables') unless Capataz.can_declare?(:ivar) super end
on_lvasgn(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 67 def on_lvasgn(node) super capatize(node.children[1]) end
on_module(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 77 def on_module(node) report_error('can not define modules') unless Capataz.can_declare?(:module) super end
on_return(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 55 def on_return(node) report_error('can not use return') unless Capataz.can_declare?(:return) super capatize(node.children[2]) end
on_self(_)
click to toggle source
# File lib/capataz/rewriter.rb, line 88 def on_self(_) report_error('can not access to self') unless Capataz.can_declare?(:self) end
on_send(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 33 def on_send(node) super unless Capataz.allows_invocation_of(method_name = node.children[1]) report_error("invoking method #{method_name} is not allowed") end if (left = node.children[0]) capatize(left) elsif node.type == :send unless @self_linker.link?(method_name) report_error("error linking #{method_name}") end if @self_linker (@logs[:self_sends] ||= Set.new) << method_name prefix = @self_send_prefixer ? @self_send_prefixer.prefix(method_name, @self_linker) : '' insert_before(node.location.expression, "::Capataz.handle(self).#{prefix}") end i = 2 while i < node.children.length decapatize(node.children[i]) i += 1 end end
on_yield(node)
click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 92 def on_yield(node) report_error('can not make yield calls') unless Capataz.can_declare?(:yield) super end
rewrite(source_buffer, ast)
click to toggle source
# File lib/capataz/rewriter.rb, line 17 def rewrite(source_buffer, ast) @logs.clear @capatized_nodes.clear @source_rewriter = Capataz::SourceRewriter.new(source_buffer) process(ast) @source_rewriter.preprocess @source_rewriter.process end
Private Instance Methods
capatize(node, options = {})
click to toggle source
# File lib/capataz/rewriter.rb, line 137 def capatize(node, options = {}) if node && !@capatized_nodes.include?(node) @capatized_nodes << node options[:constant] = true if node.type == :const @source_rewriter.insert_before_multi(node.location.expression, '::Capataz.handle(') if !options.empty? @source_rewriter.insert_after_multi(node.location.expression, ", #{options.to_a.collect { |item| "#{item[0]}: #{item[1]}" }.join(',')})") else @source_rewriter.insert_after_multi(node.location.expression, ')') end end end
const_from(node)
click to toggle source
# File lib/capataz/rewriter.rb, line 157 def const_from(node) if node const_from(node.children[0]) + '::' + node.children[1].to_s else '' end end
decapatize(node)
click to toggle source
# File lib/capataz/rewriter.rb, line 150 def decapatize(node) unless node.type == :hash @source_rewriter.insert_before_multi(node.location.expression, '(') @source_rewriter.insert_after_multi(node.location.expression, ').capataz_slave') end end
report_error(message)
click to toggle source
# File lib/capataz/rewriter.rb, line 129 def report_error(message) if @options[:halt_on_error] fail message else (logs[:errors] ||= []) << message end end