Class: Parser::Runner::RubyRewrite

Inherits:
Parser::Runner show all
Defined in:
lib/parser/runner/ruby_rewrite.rb

Instance Method Summary collapse

Methods inherited from Parser::Runner

#execute, go, #input_size, #parse_options, #prepare_parser, #process_all_input, #process_buffer, #process_files, #process_fragments, #report_with_time

Constructor Details

#initializeRubyRewrite

Returns a new instance of RubyRewrite.



7
8
9
10
11
# File 'lib/parser/runner/ruby_rewrite.rb', line 7

def initialize
  super

  @rewriters = []
end

Instance Method Details

#load_and_discover(file) ⇒ Object (private)



27
28
29
30
31
32
33
34
35
36
37
# File 'lib/parser/runner/ruby_rewrite.rb', line 27

def load_and_discover(file)
  load file

  const_name = file.
    sub(/\.rb$/, '').
    gsub(/(^|_)([a-z])/) do |m|
      "#{$2.upcase}"
    end

  @rewriters << Object.const_get(const_name)
end

#process(initial_buffer) ⇒ Object (private)



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/parser/runner/ruby_rewrite.rb', line 39

def process(initial_buffer)
  buffer = initial_buffer

  @rewriters.each do |rewriter_class|
    @parser.reset
    ast = @parser.parse(buffer)

    rewriter = rewriter_class.new
    new_source = rewriter.rewrite(buffer, ast)

    new_buffer = Source::Buffer.new(initial_buffer.name +
                                '|after ' + rewriter_class.name)
    new_buffer.source = new_source

    @parser.reset
    new_ast = @parser.parse(new_buffer)

    unless ast == new_ast
      $stderr.puts "ASTs do not match:"

      old = Tempfile.new('old')
      old.write ast.inspect + "\n"; old.flush

      new = Tempfile.new('new')
      new.write new_ast.inspect + "\n"; new.flush

      IO.popen("diff -u #{old.path} #{new.path}") do |io|
        diff = io.read.
          sub(/^---.*/,    "--- #{buffer.name}").
          sub(/^\+\+\+.*/, "+++ #{new_buffer.name}")

        $stderr.write diff
      end

      exit 1
    end

    buffer = new_buffer
  end

  if File.exist?(buffer.name)
    File.open(buffer.name, 'w') do |file|
      file.write buffer.source
    end
  else
    if input_size > 1
      puts "Rewritten content of #{buffer.name}:"
    end

    puts buffer.source
  end
end

#runner_nameObject (private)



15
16
17
# File 'lib/parser/runner/ruby_rewrite.rb', line 15

def runner_name
  'ruby-rewrite'
end

#setup_option_parsingObject (private)



19
20
21
22
23
24
25
# File 'lib/parser/runner/ruby_rewrite.rb', line 19

def setup_option_parsing
  super

  @slop.on 'l=', 'load=', 'Load a rewriter' do |file|
    load_and_discover(file)
  end
end