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, comments) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#body_length(body) ⇒ Object



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

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

#check(sexp, comments) ⇒ Object

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
33
34
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 10

def check(sexp, comments)
  case sexp.loc.keyword.source
  when 'if'     then cond, body, _else = *sexp
  when 'unless' then cond, _else, body = *sexp
  else               cond, body = *sexp
  end

  return false if length(sexp) > 3

  body_length = body_length(body)

  return false if body_length == 0

  on_node(:lvasgn, cond) do
    return false
  end

  indentation = sexp.loc.keyword.column
  kw_length = sexp.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, comments)
end

#length(sexp) ⇒ Object



41
42
43
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 41

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

#max_line_lengthObject



36
37
38
39
# File 'lib/rubocop/cop/mixin/statement_modifier.rb', line 36

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