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