Skip to content

Instantly share code, notes, and snippets.

@kschiess
Created February 15, 2011 10:40
Show Gist options
  • Save kschiess/827380 to your computer and use it in GitHub Desktop.
Save kschiess/827380 to your computer and use it in GitHub Desktop.
prints instance variable accesses inside a class methods.
#!/usr/bin/env ruby
require 'ruby_parser'
class Graph
def initialize
@watch_lvars = []
end
def visit(tree)
type, *rest = tree
self.send("accept_#{type}", *rest)
end
def accept_block(*contents)
contents.each do |entry|
visit(entry)
end
end
def accept_class(name, _, definition)
name = visit(name)
visit(definition)
end
def accept_colon2(mod, name)
visit(mod) + "::" + name.to_s
end
def accept_const(name)
name.to_s
end
def accept_scope(content)
visit(content)
end
def accept_defn(name, args, content)
# p name
@ivars = []
visit(args)
visit(content)
@ivars.each do |ivar|
puts "#{name.to_s.inspect} -> #{ivar.to_s.inspect};"
end
# p [name, @ivars]
end
def accept_iasgn(var, value)
@ivars << var
visit(value)
end
def accept_ivar(name)
@ivars << name
end
def accept_lvar(name)
if @watch_lvars.include?(name.to_s)
p name
end
end
def accept_call(receiver, name, args)
visit(receiver)
visit(args)
if name =~ /attr_/
@watch_lvars += @syms
end
end
def accept_arglist(*list)
@syms = []
list.each { |el| visit(el) }
end
def accept_lit(literal)
if literal.respond_to?(:to_sym)
@syms << literal.to_s
end
end
DONTPRINT = [
:args, :array, :arglist, :until, :if,
:str, :splat, :lit, :lasgn, :dstr, :evstr,
:and, :not, :iter, :return, :op_asgn_or, :or]
def method_missing(sym, *args, &block)
if sym =~ /accept_(.*)/
return nil if args.size==0
# p [sym, args.size, *args.map { |e| e && e.respond_to?(:to_ary) && [e.first, '...'] || e }] \
# unless DONTPRINT.include?($1.to_sym)
args.each do |arg|
next unless arg.respond_to?(:to_ary)
visit(arg)
end
nil
else
super
end
end
end
tree = RubyParser.new.parse(ARGF.read)
graph = Graph.new
puts "digraph test {"
graph.visit(tree)
puts "}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment