class CommentCollector

Constants

Comment
VERSION

Public Class Methods

get(src) click to toggle source
# File lib/comment_collector.rb, line 7
def self.get(src)
  new(src).comments
end
new(src) click to toggle source
# File lib/comment_collector.rb, line 11
def initialize(src)
  @last_of_lines = Array.new(src.lines.size, 0)
  @exists_any_node = Array.new(src.lines.size, false)
  @end_of_lines = src.lines.map { |l| l.size - 1 } # for 0-index
  @src = src

  traverse(Parser::CurrentRuby.parse(src))
end

Public Instance Methods

comments() click to toggle source
# File lib/comment_collector.rb, line 20
def comments
  return @_comments if defined?(@_comments)
  comments = []
  value = ''
  multi_line_comment_f = false
  first_lineno = -1
  first_column = -1
  last_lineno = -1

  @src.lines.each_with_index do |line, lineno|
    sp = @last_of_lines[lineno]
    l = line[sp..-1]

    break if line.start_with?('__END__')

    if l =~ /^\s*#/
      if value.empty?
        first_lineno = lineno
        first_column = sp + l.index('#')
        value = l.lstrip
      elsif sp.zero?
        value += l
      else
        comments << Comment.new(value, first_lineno, first_column, last_lineno, @end_of_lines[last_lineno])
        first_lineno = lineno
        first_column = sp + l.index('#')
        value = l.lstrip
      end

      last_lineno = lineno
    elsif l =~ /^=begin/
      value = l
      first_lineno = lineno
      first_column = 0
      multi_line_comment_f = true
    elsif l =~ /^=end/
      value += l
      comments << Comment.new(value, first_lineno, first_column, lineno, @end_of_lines[lineno])
      value = ''
      multi_line_comment_f = false
    elsif multi_line_comment_f
      value += l
    elsif !value.empty? && (line =~ /^\s+$/ || @exists_any_node[lineno])
      comments << Comment.new(value, first_lineno, first_column, last_lineno, @end_of_lines[last_lineno])
      value = ''
    end
  end

  unless value.empty?
    comments << Comment.new(value, first_lineno, first_column, last_lineno, @end_of_lines[last_lineno])
  end

  @_comments = comments
end

Private Instance Methods

traverse(parent) click to toggle source
# File lib/comment_collector.rb, line 77
def traverse(parent)
  return if parent.nil?

  loc = parent.loc

  unless [:args].include?(parent.type)
    first_lineno = loc.line - 1
    first_column = loc.column
    last_lineno = loc.last_line - 1
    last_column = loc.last_column

    @last_of_lines[first_lineno] = [@last_of_lines[first_lineno], first_column].max
    @last_of_lines[last_lineno] = [@last_of_lines[last_lineno], last_column].max
    @exists_any_node[first_lineno] = @exists_any_node[last_lineno] = true
  end

  parent.children.select { |n| n.instance_of?(Parser::AST::Node) }.each do |child|
    traverse(child)
  end
end