Class: RuboCop::Cop::Lint::DefEndAlignment

Inherits:
Cop
  • Object
show all
Includes:
EndKeywordAlignment
Defined in:
lib/rubocop/cop/lint/def_end_alignment.rb

Overview

This cop checks whether the end keywords of method definitions are aligned properly.

Two modes are supported through the EnforcedStyleAlignWith configuration parameter. If it’s set to start_of_line (which is the default), the end shall be aligned with the start of the line where the def keyword is. If it’s set to def, the end shall be aligned with the def keyword.

Examples:

EnforcedStyleAlignWith: start_of_line (default)

# bad

private def foo
            end

# good

private def foo
end

EnforcedStyleAlignWith: def

# bad

private def foo
            end

# good

private def foo
        end

Constant Summary collapse

MSG =
'`end` at %d, %d is not aligned with `%s` at %d, %d.'.freeze

Constants included from Util

Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::CONDITIONAL_NODES, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::LOGICAL_OPERATOR_NODES, Util::MODIFIER_NODES, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

Methods included from ConfigurableEnforcedStyle

#alternative_style, #alternative_styles, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #style, #style_detected, #style_parameter_name, #supported_styles, #unexpected_style_detected

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, #duplicate_location?, #excluded_file?, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #relevant_file?, #target_rails_version, #target_ruby_version

Methods included from AST::Sexp

#s

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 AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #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?, effective_column, ends_its_line?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, operator?, parentheses?, parenthesized_call?, precede?, range_between, range_by_whole_lines, range_with_surrounding_comma, range_with_surrounding_space, same_line?, source_range, strip_quotes, stripped_source_upto, symbol_without_quote?, to_string_literal, to_supported_styles, to_symbol_literal, within_node?

Methods included from PathUtil

absolute?, 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



63
64
65
66
67
68
69
# File 'lib/rubocop/cop/lint/def_end_alignment.rb', line 63

def autocorrect(node)
  if style == :start_of_line && node.parent && node.parent.send_type?
    align(node, node.parent)
  else
    align(node, node)
  end
end

#on_def(node) ⇒ Object Also known as: on_defs



41
42
43
# File 'lib/rubocop/cop/lint/def_end_alignment.rb', line 41

def on_def(node)
  check_end_kw_in_node(node)
end

#on_send(node) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rubocop/cop/lint/def_end_alignment.rb', line 46

def on_send(node)
  return unless node.def_modifier?

  method_def = node.each_descendant(:def, :defs).first
  expr = node.source_range

  line_start = range_between(expr.begin_pos,
                             method_def.loc.keyword.end_pos)
  align_with = {
    def: method_def.loc.keyword,
    start_of_line: line_start
  }

  check_end_kw_alignment(method_def, align_with)
  ignore_node(method_def) # Don't check the same `end` again.
end