class ReVIEW::Repository

Public Class Methods

new(param) click to toggle source
# File lib/review/preprocessor.rb, line 324
def initialize(param)
  @repository = {}
  @config = param
  @logger = ReVIEW.logger
end

Public Instance Methods

fetch(file, type, name) click to toggle source
# File lib/review/preprocessor.rb, line 338
def fetch(file, type, name)
  table = file_descripter(file)[type] or return nil
  table[name]
end
fetch_file(file) click to toggle source
# File lib/review/preprocessor.rb, line 330
def fetch_file(file)
  file_descripter(file)['file']
end
fetch_range(file, name) click to toggle source
# File lib/review/preprocessor.rb, line 334
def fetch_range(file, name)
  fetch(file, 'range', name)
end

Private Instance Methods

_parse_file(f) click to toggle source
# File lib/review/preprocessor.rb, line 370
def _parse_file(f)
  whole = []
  repo = { 'file' => whole }
  curr = { 'WHOLE' => whole }
  lineno = 1
  yacchack = false # remove ';'-only lines.
  opened = [['(not opened)', '(not opened)']] * 3

  f.each do |line|
    case line
    when /(?:\A\#@|\#@@)([a-z]+)_(begin|end)\((.*)\)/
      type = check_type($1)
      direction = $2
      spec = check_spec($3)
      case direction
      when 'begin'
        key = "#{type}/#{spec}"
        if curr[key]
          error "begin x2: #{key}"
        end
        (repo[type] ||= {})[spec] = curr[key] = []
      when 'end'
        curr.delete("#{type}/#{spec}") or
          error "end before begin: #{type}/#{spec}"
      else
        raise 'must not happen'
      end

    when %r{(?:\A\#@|\#@@)([a-z]+)/(\w+)\{}
      type = check_type($1)
      spec = check_spec($2)
      key = "#{type}/#{spec}"
      if curr[key]
        error "begin x2: #{key}"
      end
      (repo[type] ||= {})[spec] = curr[key] = []
      opened.push [type, spec]

    when %r{(?:\A\#@|\#@@)([a-z]+)/(\w+)\}}
      type = check_type($1)
      spec = check_spec($2)
      curr.delete("#{type}/#{spec}") or
        error "end before begin: #{type}/#{spec}"
      opened.delete "#{type}/#{spec}"

    when /(?:\A\#@|\#@@)\}/
      type, spec = opened.last
      curr.delete("#{type}/#{spec}") or
        error "closed before open: #{type}/#{spec}"
      opened.pop

    when /(?:\A\#@|\#@@)yacchack/
      yacchack = true

    when /\A\#@-/ # does not increment line number.
      line = canonical($')
      curr.each_value { |list| list.push Line.new(nil, line) }

    else
      next if yacchack and line.strip == ';'
      line = canonical(line)
      curr.each_value { |list| list.push Line.new(lineno, line) }
      lineno += 1
    end
  end
  if curr.size > 1
    curr.delete 'WHOLE'
    curr.each { |range, lines| @logger.warn "#{filename}: unclosed range: #{range} (begin @#{lines.first.number})" }
    raise ApplicationError, 'ERROR'
  end

  repo
end
canonical(line) click to toggle source
# File lib/review/preprocessor.rb, line 444
def canonical(line)
  if @leave_content
    return line
  end

  tabwidth = @config['tabwidth'] || 8
  if tabwidth > 0
    detab(line, tabwidth).rstrip + "\n"
  else
    line
  end
end
check_spec(spec) click to toggle source
# File lib/review/preprocessor.rb, line 462
def check_spec(spec)
  error "wrong spec: #{spec.inspect}" unless /\A\w+\z/ =~ spec
  spec
end
check_type(type) click to toggle source
# File lib/review/preprocessor.rb, line 457
def check_type(type)
  error "wrong type: #{type.inspect}" unless Preprocessor::TYPES.index(type)
  type
end
file_descripter(fname) click to toggle source
# File lib/review/preprocessor.rb, line 345
def file_descripter(fname)
  @leave_content = File.extname(fname) == '.re'
  return @repository[fname] if @repository[fname]

  @repository[fname] = git?(fname) ? parse_git_blob(fname) : parse_file(fname)
end
git?(fname) click to toggle source
# File lib/review/preprocessor.rb, line 352
def git?(fname)
  fname.start_with?('git|')
end
parse_file(fname) click to toggle source
# File lib/review/preprocessor.rb, line 363
def parse_file(fname)
  File.open(fname, 'r:BOM|utf-8') do |f|
    init_errorutils f
    return _parse_file(f)
  end
end
parse_git_blob(g_obj) click to toggle source
# File lib/review/preprocessor.rb, line 356
def parse_git_blob(g_obj)
  IO.popen('git show ' + g_obj.sub(/\Agit\|/, ''), 'r') do |f|
    init_errorutils f
    return _parse_file(f)
  end
end