class Gitlab::Styles::Rubocop::Cop::LineBreakAroundConditionalBlock

Ensures a line break around conditional blocks.

@example

# bad
do_something
if condition
  do_extra_stuff
end
do_something_more

# good
do_something

if condition
  do_extra_stuff
end

do_something_more

# bad
do_something
unless condition
  do_extra_stuff
end

do_something_more

# good
def a_method
  if condition
    do_something
  end
end

# good
on_block do
  if condition
    do_something
  end
end

Constants

MSG

Public Instance Methods

autocorrect(node) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 62
def autocorrect(node)
  lambda do |corrector|
    line = range_by_whole_lines(node.source_range)

    corrector.insert_before(line, "\n") unless previous_line_valid?(node)
    corrector.insert_after(line, "\n") unless last_line_valid?(node)
  end
end
on_if(node) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 52
def on_if(node)
  # This cop causes errors in haml files, so let's skip those
  return if in_haml?(node)
  return if node.single_line?
  return unless node.if? || node.unless?

  add_offense(node) unless previous_line_valid?(node)
  add_offense(node) unless last_line_valid?(node)
end

Private Instance Methods

assignment_line?(line) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 109
def assignment_line?(line)
  line =~ /^\s*.*=/
end
begin_line?(line) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 104
def begin_line?(line)
  # an assignment followed by a begin or ust a begin
  line =~ /^\s*(@?(\w|\|+|=|\[|\]|\s)+begin|begin)/
end
block_start?(line) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 117
def block_start?(line)
  line.match(/ (do|{)( \|.*?\|)?\s?(#.+)?\z/)
end
end_clause_line?(line) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 100
def end_clause_line?(line)
  line =~ /^\s*(#|rescue|else|elsif|when)/
end
end_line?(line) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 121
def end_line?(line)
  line =~ /^\s*(end|})/
end
in_haml?(node) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 125
def in_haml?(node)
  node.location.expression.source_buffer.name.end_with?('.haml.rb')
end
last_line(node) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 92
def last_line(node)
  processed_source[node.loc.last_line]
end
last_line_valid?(node) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 82
def last_line_valid?(node)
  last_line(node).empty? ||
    end_line?(last_line(node)) ||
    end_clause_line?(last_line(node))
end
previous_line(node) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 88
def previous_line(node)
  processed_source[node.loc.line - 2]
end
previous_line_valid?(node) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 73
def previous_line_valid?(node)
  previous_line(node).empty? ||
    start_clause_line?(previous_line(node)) ||
    block_start?(previous_line(node)) ||
    begin_line?(previous_line(node)) ||
    assignment_line?(previous_line(node)) ||
    rescue_line?(previous_line(node))
end
rescue_line?(line) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 113
def rescue_line?(line)
  line =~ /^\s*rescue/
end
start_clause_line?(line) click to toggle source
# File lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb, line 96
def start_clause_line?(line)
  line =~ /^\s*(def|=end|#|module|class|if|unless|else|elsif|ensure|when)/
end