Sha256: ff952ee173aa3f0ea22ab6297e586ca47a4e61eb5a6180a91c0c6dd0d59421fb
Contents?: true
Size: 1.5 KB
Versions: 1
Compression:
Stored size: 1.5 KB
Contents
#!/usr/bin/ruby -ws require 'rubygems' require 'ruby_parser' ARGV.push "-" if ARGV.empty? class Racc::Parser def extract_defs ss = lexer.src src = ss.string pre_error = src[0...ss.pos] defs = pre_error.grep(/^ *def/) last_def_indent = defs.last[/^ */] post_error = src[ss.pos..-1] idx = post_error =~ /^#{last_def_indent}end.*/ raise "can't figure out where the bad code ends" unless idx src = pre_error + post_error[0..idx+$&.length] src.scan(/^(( *)def .*?^\2end)/m) end def retest_for_errors defs d :retest => defs.size parser = self.class.new parser.process(defs.join("\n\n")) rescue nil end end ARGV.replace ARGV.map { |path| if File.directory? path then Dir.glob File.join path, "**/*.rb" else path end }.flatten parser = RubyParser.new ARGV.each do |file| ruby = file == "-" ? $stdin.read : File.read(file) begin $stderr.print "Validating #{file}: " parser.process(ruby, file) $stderr.puts "good" rescue Racc::ParseError => e $stderr.puts "error: #{e.description}" $stderr.puts defs = parser.extract_defs abort "Can't reproduce error with just methods, punting..." if parser.retest_for_errors defs mandatory = defs.pop (1..defs.size).each do |perm_size| defs.combination(perm_size).each do |trial| trial << mandatory unless parser.retest_for_errors trial then puts trial.join "\n" abort "reduced repro found!" end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
ruby_parser-3.0.0.a3 | bin/ruby_parse_extract_error |