Class: RuboCop::Cop::Layout::SpaceAroundOperators

Inherits:
Cop
  • Object
show all
Includes:
PrecedingFollowingAlignment, RangeHelp, RationalLiteral
Defined in:
lib/rubocop/cop/layout/space_around_operators.rb

Overview

Checks that operators have space around them, except for ** which should or shouldn’t have surrounding space depending on configuration.

This cop has AllowForAlignment option. When true, allows most uses of extra spacing if the intent is to align with an operator on the previous or next line, not counting empty lines or comment lines.

Examples:

# bad
total = 3*4
"apple"+"juice"
my_number = 38/4

# good
total = 3 * 4
"apple" + "juice"
my_number = 38 / 4

AllowForAlignment: true (default)

# good
{
  1 =>  2,
  11 => 3
}

AllowForAlignment: false

# bad
{
  1 =>  2,
  11 => 3
}

EnforcedStyleForExponentOperator: no_space (default)

# bad
a ** b

# good
a**b

EnforcedStyleForExponentOperator: space

# bad
a**b

# good
a ** b

Constant Summary collapse

IRREGULAR_METHODS =
%i[[] ! []=].freeze
EXCESSIVE_SPACE =
'  '

Constants included from Util

Util::LITERAL_REGEX

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Class Method Summary collapse

Instance Method Summary collapse

Methods included from NodePattern::Macros

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

Methods inherited from Cop

#add_offense, all, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, #correct, department, #disable_uncorrectable, #duplicate_location?, #excluded_file?, #external_dependency_checksum, #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 AST::Sexp

#s

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_offense, #disable_uncorrectable?, #safe_autocorrect?, #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

Class Method Details

.autocorrect_incompatible_withObject



59
60
61
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 59

def self.autocorrect_incompatible_with
  [Style::SelfAssignment]
end

Instance Method Details

#autocorrect(range) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 135

def autocorrect(range)
  lambda do |corrector|
    if range.source =~ /\*\*/ && !space_around_exponent_operator?
      corrector.replace(range, '**')
    elsif range.source.end_with?("\n")
      corrector.replace(range, " #{range.source.strip}\n")
    else
      corrector.replace(range, " #{range.source.strip} ")
    end
  end
end

#on_assignment(node) ⇒ Object Also known as: on_lvasgn, on_masgn, on_ivasgn, on_cvasgn, on_gvasgn, on_or_asgn, on_and_asgn



98
99
100
101
102
103
104
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 98

def on_assignment(node)
  _, rhs, = *node

  return unless rhs

  check_operator(:assignment, node.loc.operator, rhs.source_range)
end

#on_binary(node) ⇒ Object Also known as: on_or, on_and, on_class



106
107
108
109
110
111
112
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 106

def on_binary(node)
  _, rhs, = *node

  return unless rhs

  check_operator(:binary, node.loc.operator, rhs.source_range)
end

#on_if(node) ⇒ Object



71
72
73
74
75
76
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 71

def on_if(node)
  return unless node.ternary?

  check_operator(:if, node.loc.question, node.if_branch.source_range)
  check_operator(:if, node.loc.colon, node.else_branch.source_range)
end

#on_pair(node) ⇒ Object



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

def on_pair(node)
  return unless node.hash_rocket?

  return if hash_table_style? && !node.parent.pairs_on_same_line?

  check_operator(:pair, node.loc.operator, node.source_range)
end

#on_resbody(node) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 78

def on_resbody(node)
  return unless node.loc.assoc

  _, variable, = *node

  check_operator(:resbody, node.loc.assoc, variable.source_range)
end

#on_send(node) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 86

def on_send(node)
  return if rational_literal?(node)

  if node.setter_method?
    on_special_asgn(node)
  elsif regular_operator?(node)
    check_operator(:send,
                   node.loc.selector,
                   node.first_argument.source_range)
  end
end

#on_special_asgn(node) ⇒ Object Also known as: on_casgn, on_op_asgn



114
115
116
117
118
119
120
# File 'lib/rubocop/cop/layout/space_around_operators.rb', line 114

def on_special_asgn(node)
  _, _, right, = *node

  return unless right

  check_operator(:special_asgn, node.loc.operator, right.source_range)
end