Module: RuboCop::Cop::StatementModifier

Includes:
IfNode
Included in:
RuboCop::Cop::Style::IfUnlessModifier, RuboCop::Cop::Style::WhileUntilModifier
Defined in:
lib/rubocop/cop/mixin/statement_modifier.rb

Overview

Common functionality for modifier cops.

Instance Method Summary collapse

Methods included from IfNode

#elsif?, #if_else?, #modifier_if?, #ternary_op?

Instance Method Details

#body_has_comment?(body) ⇒ Boolean



51
52
53
54
55
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 51

def body_has_comment?(body)
  comment_lines = processed_source.comments.map(&:location).map(&:line)
  body_line = body.loc.expression.line
  comment_lines.include?(body_line)
end

#body_length(body) ⇒ Object



43
44
45
46
47
48
49
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 43

def body_length(body)
  if body && body.loc.expression
    body.loc.expression.size
  else
    0
  end
end

#fit_within_line_as_modifier_form?(node) ⇒ Boolean

TODO: Extremely ugly solution that needs lots of polish.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 10

def fit_within_line_as_modifier_form?(node)
  case node.loc.keyword.source
  when 'if'     then cond, body, _else = *node
  when 'unless' then cond, _else, body = *node
  else               cond, body = *node
  end

  return false if length(node) > 3

  body_length = body_length(body)

  return false if body_length == 0

  return false if cond.each_node.any?(&:lvasgn_type?)

  indentation = node.loc.keyword.column
  kw_length = node.loc.keyword.size
  cond_length = cond.loc.expression.size
  space = 1
  total = indentation + body_length + space + kw_length + space +
          cond_length
  total <= max_line_length && !body_has_comment?(body)
end

#length(node) ⇒ Object



39
40
41
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 39

def length(node)
  node.loc.expression.source.lines.to_a.size
end

#max_line_lengthObject



34
35
36
37
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 34

def max_line_length
  cop_config && cop_config['MaxLineLength'] ||
    config.for_cop('Metrics/LineLength')['Max']
end