Created
February 15, 2011 10:40
-
-
Save kschiess/827380 to your computer and use it in GitHub Desktop.
prints instance variable accesses inside a class methods.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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