Class: RubySimpleParser::LineClassifier
- Inherits:
-
Object
- Object
- RubySimpleParser::LineClassifier
- 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
- #block_balance(original_code_line, apply_normalize: true) ⇒ Object
- #block_spanning_constructs_regex ⇒ Object
- #block_wrappers_regex ⇒ Object
- #classify(original_code_line, apply_normalize: true) ⇒ Object
- #inline_block_spanning_constructs_regex_part ⇒ Object
- #is_false_block_spanning_construct?(code_line) ⇒ Boolean
- #normalize(original_line) ⇒ Object
- #strip_block_wrappers(original_code_line, apply_normalize: true) ⇒ Object
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_regex ⇒ Object
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_regex ⇒ Object
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_part ⇒ Object
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
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 |