Class: RubySimpleParser::LineClassifier

Inherits:
Object
  • Object
show all
Defined in:
lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb

Constant Summary collapse

BLOCK_SPANNING_CONSTRUCTS =
['if', 'unless', 'each', 'while', 'until', 'loop', 'for', 'begin', 'do', 'then']

Instance Method Summary collapse

Instance Method Details

#block_balance(original_code_line, apply_normalize: true) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# 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_regexObject



77
78
79
# 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_regexObject



81
82
83
# 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) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 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_partObject



73
74
75
# 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) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 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) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 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) ⇒ Object



85
86
87
88
# 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