Class: RuboCop::Cop::Layout::MultilineBlockLayout

Inherits:
Cop
  • Object
show all
Includes:
RangeHelp
Defined in:
lib/rubocop/cop/layout/multiline_block_layout.rb

Overview

This cop checks whether the multiline do end blocks have a newline after the start of the block. Additionally, it checks whether the block arguments, if any, are on the same line as the start of the block. Putting block arguments on separate lines, because the whole line would otherwise be too long, is accepted.

Examples:

# bad
blah do |i| foo(i)
  bar(i)
end

# bad
blah do
  |i| foo(i)
  bar(i)
end

# good
blah do |i|
  foo(i)
  bar(i)
end

# bad
blah { |i| foo(i)
  bar(i)
}

# good
blah { |i|
  foo(i)
  bar(i)
}

# good
blah { |
  long_list,
  of_parameters,
  that_would_not,
  fit_on_one_line
|
  foo(i)
  bar(i)
}

Constant Summary collapse

MSG =
'Block body expression is on the same line as ' \
'the block start.'
ARG_MSG =
'Block argument expression is not on the same line as the ' \
'block start.'
PIPE_SIZE =
'|'.length

Constants included from Util

Util::LITERAL_REGEX

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

Methods inherited from Cop

#add_offense, all, autocorrect_incompatible_with, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, #correct, department, #disable_uncorrectable, #duplicate_location?, #excluded_file?, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, #parse, qualified_cop_name, #reason_to_not_correct, #relevant_file?, #target_rails_version, #target_ruby_version

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first

Methods included from AST::Sexp

#s

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_offense, #disable_uncorrectable?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, comment_line?, double_quotes_required?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens, trim_string_interporation_escape_character

Methods included from PathUtil

absolute?, chdir, hidden_dir?, hidden_file_in_not_hidden_dir?, match_path?, pwd, relative_path, reset_pwd, smart_path

Constructor Details

This class inherits a constructor from RuboCop::Cop::Cop

Instance Method Details

#autocorrect(node) ⇒ Object


73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/rubocop/cop/layout/multiline_block_layout.rb', line 73

def autocorrect(node)
  lambda do |corrector|
    unless args_on_beginning_line?(node)
      autocorrect_arguments(corrector, node)
      expr_before_body = node.arguments.source_range.end
    end

    return unless node.body

    expr_before_body ||= node.loc.begin

    if expr_before_body.line == node.body.first_line
      autocorrect_body(corrector, node, node.body)
    end
  end
end

#on_block(node) ⇒ Object


60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rubocop/cop/layout/multiline_block_layout.rb', line 60

def on_block(node)
  return if node.single_line?

  unless args_on_beginning_line?(node) ||
         line_break_necessary_in_args?(node)
    add_offense_for_expression(node, node.arguments, ARG_MSG)
  end

  return unless node.body && node.loc.begin.line == node.body.first_line

  add_offense_for_expression(node, node.body, MSG)
end