class RubySimpleParser::LineClassifier

Constants

BLOCK_SPANNING_CONSTRUCTS

Public Instance Methods

block_balance(original_code_line, apply_normalize: true) click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 90
def block_balance(original_code_line, apply_normalize: true)
  code_line = if apply_normalize then normalize original_code_line else original_code_line end
  balance = 0

  block_wrappers_tokens = strip_block_wrappers code_line, apply_normalize: false

  block_wrappers_tokens.each do |token|
    if BLOCK_SPANNING_CONSTRUCTS.include? token or token == '{' or token == '['
      balance += 1
    elsif ['end', '}', ']'].include? token
      balance -= 1
    end
  end

  balance
end
block_spanning_constructs_regex() click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 77
def block_spanning_constructs_regex
  Regexp.new '\b' + BLOCK_SPANNING_CONSTRUCTS.join('\b|\b') + '\b'
end
block_wrappers_regex() click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 81
def block_wrappers_regex
  Regexp.new('\b' +  BLOCK_SPANNING_CONSTRUCTS.join('\b|\b') + '\b|\bend\b|\{|\}|\[|\]')
end
classify(original_code_line, apply_normalize: true) click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 5
def classify(original_code_line, apply_normalize: true)
  code_line = if apply_normalize then normalize original_code_line else original_code_line end

  if code_line =~ /def (self\.)?\w+/
    return METHOD_START

  elsif code_line =~ /^\s*class\s*/
    return CLASS_START

  elsif code_line == ''
    return EMPTY

  elsif is_false_block_spanning_construct? code_line
    return CODE_WITHOUT_BLOCK

  elsif code_line == 'private'
    return PRIVATE_BLOCK

  end

  block_balance = block_balance code_line, apply_normalize: false

  if block_balance > 0
    CODE_WITH_BLOCK
  elsif block_balance < 0
    BLOCK_END
  else
    CODE_WITHOUT_BLOCK
  end
end
inline_block_spanning_constructs_regex_part() click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 73
def inline_block_spanning_constructs_regex_part
  '(\b' + ['if', 'unless', 'while', 'until'].join('\b|\b') + '\b)'
end
is_false_block_spanning_construct?(code_line) click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 55
def is_false_block_spanning_construct?(code_line)
  keywords_regex_part = inline_block_spanning_constructs_regex_part

  return false if code_line =~ /.+\s*=\s*#{keywords_regex_part}/ # variable = if condition

  # return if condition then 'a' else 'b' end
  return true if code_line =~ /\breturn\b\s*#{keywords_regex_part}\s+.+\bthen\b.+\bend\b/

  # return if condition then
  #   'a' else 'b' end
  return false if code_line =~ /\breturn\b\s*#{keywords_regex_part}.+\bthen\b.*/

  # return [something] if condition
  return true if code_line =~ /\breturn\b.*#{keywords_regex_part}/

  return true if code_line =~ /[^\s]+.*#{keywords_regex_part}/ # something if condition
end
normalize(original_line) click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 36
def normalize(original_line)
  line = original_line.strip

  return line if line == ''

  substrings = line.scan(/".*?"|'.*?'/)
  map = {}
  count = 0

  substrings.each do |substring|
    placeholder = "RUBY_SIMPLE_PARSER_STRING_#{count}"
    count += 1
    line.gsub!(substring, placeholder)
    map[placeholder] = substring
  end

  line.split('#').first.strip
end
strip_block_wrappers(original_code_line, apply_normalize: true) click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb, line 85
def strip_block_wrappers(original_code_line, apply_normalize: true)
  code_line = if apply_normalize then normalize original_code_line else original_code_line end
  code_line.strip.scan block_wrappers_regex
end