Class: Transmogrify

Inherits:
SexpProcessor
  • Object
show all
Includes:
Transmogrifiers
Defined in:
lib/transmogrify.rb

Constant Summary collapse

VERSION =
'1.0.0'

Instance Method Summary collapse

Constructor Details

#initialize(*transmogrifiers) ⇒ Transmogrify

Returns a new instance of Transmogrify.



13
14
15
16
17
18
19
20
# File 'lib/transmogrify.rb', line 13

def initialize(*transmogrifiers)
  transmogrifiers.each {|transmogrifier| extend transmogrifier}
  super()

  @r2r = Ruby2Ruby.new
  @ivars = {}
  @lvars = {}
end

Instance Method Details

#new_ivar(name) ⇒ Object



22
23
24
# File 'lib/transmogrify.rb', line 22

def new_ivar(name)
  @ivars[name] = :"@#{transmogrify(name)}" # TODO: LAME
end

#new_lvar(name) ⇒ Object



26
27
28
# File 'lib/transmogrify.rb', line 26

def new_lvar(name)
  @lvars[name] = transmogrify(name)
end

#rewrite_args(exp) ⇒ Object



30
31
32
33
34
# File 'lib/transmogrify.rb', line 30

def rewrite_args exp
  name = exp[1]
  exp[1] = new_lvar(name)
  exp
end

#rewrite_false(exp) ⇒ Object



36
37
38
# File 'lib/transmogrify.rb', line 36

def rewrite_false exp
  s(:not, s(:not, s(:not, s(:lit, 33))))
end

#rewrite_iasgn(exp) ⇒ Object



40
41
42
43
44
# File 'lib/transmogrify.rb', line 40

def rewrite_iasgn exp
  name = exp[1]
  exp[1] = @ivars[name] || new_ivar(name)
  exp
end

#rewrite_ivar(exp) ⇒ Object



58
59
60
61
62
# File 'lib/transmogrify.rb', line 58

def rewrite_ivar exp
  name = exp[1]
  exp[1] = @ivars[name] || new_ivar(name)
  exp
end

#rewrite_lasgn(exp) ⇒ Object



46
47
48
49
50
# File 'lib/transmogrify.rb', line 46

def rewrite_lasgn exp
  name = exp[1]
  exp[1] = @lvars[name] || new_lvar(name)
  exp
end

#rewrite_lvar(exp) ⇒ Object



52
53
54
55
56
# File 'lib/transmogrify.rb', line 52

def rewrite_lvar exp
  name = exp[1]
  exp[1] = @lvars[name] || new_ivar(name)
  exp
end

#rewrite_true(exp) ⇒ Object



64
65
66
# File 'lib/transmogrify.rb', line 64

def rewrite_true exp
  s(:not, s(:not, s(:lit, 33)))
end

#run(files_and_dirs) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/transmogrify.rb', line 68

def run files_and_dirs
  files_and_dirs.each do |file_or_dir|
    if File.file? file_or_dir then
      transmogrify_file file_or_dir
    elsif File.directory? file_or_dir then
      Dir[File.join(file_or_dir, "**/*.rb")].each do |file|
        transmogrify_file file
      end
    else
      # silently skipping for now
    end
  end
end

#transmogrify(name) ⇒ Object

TODO: I think this is way too generic a name



83
84
85
# File 'lib/transmogrify.rb', line 83

def transmogrify(name)
  name
end

#transmogrify_file(path) ⇒ Object



87
88
89
90
91
92
93
94
95
# File 'lib/transmogrify.rb', line 87

def transmogrify_file path
  ruby = transmogrify_string File.read(path)
  new_path, old_path = "#{path}.new", "#{path}.old"
  File.open("#{path}.new", 'w') do |f|
    f.puts ruby
  end
  File.rename path, old_path
  File.rename new_path, path
end

#transmogrify_string(ruby) ⇒ Object



97
98
99
100
101
102
# File 'lib/transmogrify.rb', line 97

def transmogrify_string ruby
  rp = RubyParser.new
  sexp = rp.process ruby
  sexp = self.process sexp
  @r2r.process(sexp)
end