rubocop 1.27.0 → 1.28.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +50 -9
  4. data/config/obsoletion.yml +10 -1
  5. data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
  6. data/lib/rubocop/cop/gemspec/date_assignment.rb +2 -2
  7. data/lib/rubocop/cop/layout/case_indentation.rb +16 -0
  8. data/lib/rubocop/cop/layout/indentation_width.rb +2 -2
  9. data/lib/rubocop/cop/layout/line_length.rb +4 -4
  10. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +19 -2
  11. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  12. data/lib/rubocop/cop/lint/duplicate_require.rb +10 -1
  13. data/lib/rubocop/cop/lint/unreachable_loop.rb +4 -4
  14. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  15. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +16 -2
  16. data/lib/rubocop/cop/mixin/allowed_pattern.rb +40 -0
  17. data/lib/rubocop/cop/mixin/comments_help.rb +3 -1
  18. data/lib/rubocop/cop/naming/method_name.rb +5 -5
  19. data/lib/rubocop/cop/offense.rb +1 -1
  20. data/lib/rubocop/cop/security/compound_hash.rb +105 -0
  21. data/lib/rubocop/cop/style/fetch_env_var.rb +76 -0
  22. data/lib/rubocop/cop/style/guard_clause.rb +45 -0
  23. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -4
  24. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -1
  25. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -4
  26. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +33 -11
  27. data/lib/rubocop/cop/style/object_then.rb +69 -0
  28. data/lib/rubocop/cop/style/redundant_initialize.rb +39 -4
  29. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +5 -0
  30. data/lib/rubocop/cop/style/single_argument_dig.rb +4 -0
  31. data/lib/rubocop/cop/style/sole_nested_conditional.rb +7 -7
  32. data/lib/rubocop/cop/style/special_global_vars.rb +66 -8
  33. data/lib/rubocop/cop/style/symbol_proc.rb +24 -0
  34. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  35. data/lib/rubocop/options.rb +27 -1
  36. data/lib/rubocop/result_cache.rb +3 -3
  37. data/lib/rubocop/rspec/shared_contexts.rb +2 -2
  38. data/lib/rubocop/runner.rb +29 -3
  39. data/lib/rubocop/version.rb +1 -1
  40. data/lib/rubocop.rb +4 -1
  41. metadata +9 -6
  42. data/lib/rubocop/cop/mixin/ignored_pattern.rb +0 -29
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Security
6
+ # This cop checks for implementations of the `hash` method which combine
7
+ # values using custom logic instead of delegating to `Array#hash`.
8
+ #
9
+ # Manually combining hashes is error prone and hard to follow, especially
10
+ # when there are many values. Poor implementations may also introduce
11
+ # performance or security concerns if they are prone to collisions.
12
+ # Delegating to `Array#hash` is clearer, faster, and safer.
13
+ #
14
+ # @safety
15
+ # This cop may be unsafe if the application logic depends on the hash
16
+ # value, however this is inadvisable anyway.
17
+ #
18
+ # @example
19
+ #
20
+ # # bad
21
+ # def hash
22
+ # @foo ^ @bar
23
+ # end
24
+ #
25
+ # # good
26
+ # def hash
27
+ # [@foo, @bar].hash
28
+ # end
29
+ class CompoundHash < Base
30
+ COMBINATOR_IN_HASH_MSG = 'Use `[...].hash` instead of combining hash values manually.'
31
+ MONUPLE_HASH_MSG =
32
+ 'Delegate hash directly without wrapping in an array when only using a single value'
33
+ REDUNDANT_HASH_MSG = 'Calling .hash on elements of a hashed array is redundant'
34
+
35
+ # @!method hash_method_definition?(node)
36
+ def_node_matcher :hash_method_definition?, <<~PATTERN
37
+ {#static_hash_method_definition? | #dynamic_hash_method_definition?}
38
+ PATTERN
39
+
40
+ # @!method dynamic_hash_method_definition?(node)
41
+ def_node_matcher :dynamic_hash_method_definition?, <<~PATTERN
42
+ (block
43
+ (send _ {:define_method | :define_singleton_method}
44
+ (sym :hash))
45
+ (args)
46
+ _)
47
+ PATTERN
48
+
49
+ # @!method static_hash_method_definition?(node)
50
+ def_node_matcher :static_hash_method_definition?, <<~PATTERN
51
+ ({def | defs _} :hash
52
+ (args)
53
+ _)
54
+ PATTERN
55
+
56
+ # @!method bad_hash_combinator?(node)
57
+ def_node_matcher :bad_hash_combinator?, <<~PATTERN
58
+ ({send | op-asgn} _ {:^ | :+ | :* | :|} _)
59
+ PATTERN
60
+
61
+ # @!method monuple_hash?(node)
62
+ def_node_matcher :monuple_hash?, <<~PATTERN
63
+ (send (array _) :hash)
64
+ PATTERN
65
+
66
+ # @!method redundant_hash?(node)
67
+ def_node_matcher :redundant_hash?, <<~PATTERN
68
+ (
69
+ ^^(send array ... :hash)
70
+ _ :hash
71
+ )
72
+ PATTERN
73
+
74
+ def contained_in_hash_method?(node, &block)
75
+ node.each_ancestor.any? do |ancestor|
76
+ hash_method_definition?(ancestor, &block)
77
+ end
78
+ end
79
+
80
+ def outer_bad_hash_combinator?(node)
81
+ bad_hash_combinator?(node) do
82
+ yield true if node.each_ancestor.none? { |ancestor| bad_hash_combinator?(ancestor) }
83
+ end
84
+ end
85
+
86
+ def on_send(node)
87
+ outer_bad_hash_combinator?(node) do
88
+ contained_in_hash_method?(node) do
89
+ add_offense(node, message: COMBINATOR_IN_HASH_MSG)
90
+ end
91
+ end
92
+
93
+ monuple_hash?(node) do
94
+ add_offense(node, message: MONUPLE_HASH_MSG)
95
+ end
96
+
97
+ redundant_hash?(node) do
98
+ add_offense(node, message: REDUNDANT_HASH_MSG)
99
+ end
100
+ end
101
+ alias on_op_asgn on_send
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop suggests `ENV.fetch` for the replacement of `ENV[]`.
7
+ # `ENV[]` silently fails and returns `nil` when the environment variable is unset,
8
+ # which may cause unexpected behaviors when the developer forgets to set it.
9
+ # On the other hand, `ENV.fetch` raises KeyError or returns the explicitly
10
+ # specified default value.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # ENV['X']
15
+ # ENV['X'] || z
16
+ # x = ENV['X']
17
+ #
18
+ # # good
19
+ # ENV.fetch('X')
20
+ # ENV.fetch('X', nil) || z
21
+ # x = ENV.fetch('X')
22
+ #
23
+ # # also good
24
+ # !ENV['X']
25
+ # ENV['X'].some_method # (e.g. `.nil?`)
26
+ #
27
+ class FetchEnvVar < Base
28
+ extend AutoCorrector
29
+
30
+ MSG = 'Use `ENV.fetch(%<key>s)` or `ENV.fetch(%<key>s, nil)` instead of `ENV[%<key>s]`.'
31
+
32
+ # @!method env_with_bracket?(node)
33
+ def_node_matcher :env_with_bracket?, <<~PATTERN
34
+ (send (const nil? :ENV) :[] $_)
35
+ PATTERN
36
+
37
+ def on_send(node)
38
+ env_with_bracket?(node) do |expression|
39
+ break if allowed_var?(expression)
40
+ break if allowable_use?(node)
41
+
42
+ add_offense(node, message: format(MSG, key: expression.source)) do |corrector|
43
+ corrector.replace(node, "ENV.fetch(#{expression.source}, nil)")
44
+ end
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def allowed_var?(expression)
51
+ expression.str_type? && cop_config['AllowedVars'].include?(expression.value)
52
+ end
53
+
54
+ def used_as_flag?(node)
55
+ return false if node.root?
56
+
57
+ node.parent.if_type? || (node.parent.send_type? && node.parent.prefix_bang?)
58
+ end
59
+
60
+ # Check if the node is a receiver and receives a message with dot syntax.
61
+ def message_chained_with_dot?(node)
62
+ return false if node.root?
63
+
64
+ node.parent.send_type? && node.parent.children.first == node && node.parent.dot?
65
+ end
66
+
67
+ # Allow if used as a flag (e.g., `if ENV['X']` or `!ENV['X']`) because
68
+ # it simply checks whether the variable is set.
69
+ # Also allow if receiving a message with dot syntax, e.g. `ENV['X'].nil?`.
70
+ def allowable_use?(node)
71
+ used_as_flag?(node) || message_chained_with_dot?(node)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -47,6 +47,37 @@ module RuboCop
47
47
  # # good
48
48
  # foo || raise('exception') if something
49
49
  # ok
50
+ #
51
+ # @example AllowConsecutiveConditionals: false (default)
52
+ # # bad
53
+ # if foo?
54
+ # work
55
+ # end
56
+ #
57
+ # if bar? # <- reports an offense
58
+ # work
59
+ # end
60
+ #
61
+ # @example AllowConsecutiveConditionals: true
62
+ # # good
63
+ # if foo?
64
+ # work
65
+ # end
66
+ #
67
+ # if bar?
68
+ # work
69
+ # end
70
+ #
71
+ # # bad
72
+ # if foo?
73
+ # work
74
+ # end
75
+ #
76
+ # do_someting
77
+ #
78
+ # if bar? # <- reports an offense
79
+ # work
80
+ # end
50
81
  class GuardClause < Base
51
82
  include MinBodyLength
52
83
  include StatementModifier
@@ -89,10 +120,20 @@ module RuboCop
89
120
 
90
121
  def check_ending_if(node)
91
122
  return if accepted_form?(node, ending: true) || !min_body_length?(node)
123
+ return if allowed_consecutive_conditionals? &&
124
+ consecutive_conditionals?(node.parent, node)
92
125
 
93
126
  register_offense(node, 'return', opposite_keyword(node))
94
127
  end
95
128
 
129
+ def consecutive_conditionals?(parent, node)
130
+ parent.each_child_node.inject(false) do |if_type, child|
131
+ break if_type if node == child
132
+
133
+ child.if_type?
134
+ end
135
+ end
136
+
96
137
  def opposite_keyword(node)
97
138
  node.if? ? 'unless' : 'if'
98
139
  end
@@ -135,6 +176,10 @@ module RuboCop
135
176
  !node.else? || node.elsif?
136
177
  end
137
178
  end
179
+
180
+ def allowed_consecutive_conditionals?
181
+ cop_config.fetch('AllowConsecutiveConditionals', false)
182
+ end
138
183
  end
139
184
  end
140
185
  end
@@ -37,7 +37,7 @@ module RuboCop
37
37
  class IfUnlessModifier < Base
38
38
  include StatementModifier
39
39
  include LineLengthHelp
40
- include IgnoredPattern
40
+ include AllowedPattern
41
41
  include RangeHelp
42
42
  extend AutoCorrector
43
43
 
@@ -87,8 +87,9 @@ module RuboCop
87
87
  !another_statement_on_same_line?(node)
88
88
  end
89
89
 
90
- def ignored_patterns
91
- config.for_cop('Layout/LineLength')['IgnoredPatterns'] || []
90
+ def allowed_patterns
91
+ line_length_config = config.for_cop('Layout/LineLength')
92
+ line_length_config['AllowedPatterns'] || line_length_config['IgnoredPatterns'] || []
92
93
  end
93
94
 
94
95
  def too_long_single_line?(node)
@@ -105,7 +106,7 @@ module RuboCop
105
106
  end
106
107
 
107
108
  def too_long_line_based_on_config?(range, line)
108
- return false if matches_ignored_pattern?(line)
109
+ return false if matches_allowed_pattern?(line)
109
110
 
110
111
  too_long = too_long_line_based_on_ignore_cop_directives?(range, line)
111
112
  return too_long unless too_long == :undetermined
@@ -13,7 +13,7 @@ module RuboCop
13
13
 
14
14
  def require_parentheses(node)
15
15
  return if ignored_method?(node.method_name)
16
- return if matches_ignored_pattern?(node.method_name)
16
+ return if matches_allowed_pattern?(node.method_name)
17
17
  return if eligible_for_parentheses_omission?(node)
18
18
  return unless node.arguments? && !node.parenthesized?
19
19
 
@@ -8,7 +8,7 @@ module RuboCop
8
8
  #
9
9
  # In the default style (require_parentheses), macro methods are ignored.
10
10
  # Additional methods can be added to the `IgnoredMethods`
11
- # or `IgnoredPatterns` list. These options are
11
+ # or `AllowedPatterns` list. These options are
12
12
  # valid only in the default style. Macros can be included by
13
13
  # either setting `IgnoreMacros` to false or adding specific macros to
14
14
  # the `IncludedMacros` list.
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # Precedence of options is all follows:
17
17
  #
18
18
  # 1. `IgnoredMethods`
19
- # 2. `IgnoredPatterns`
19
+ # 2. `AllowedPatterns`
20
20
  # 3. `IncludedMacros`
21
21
  #
22
22
  # eg. If a method is listed in both
@@ -68,7 +68,7 @@ module RuboCop
68
68
  # # okay with `puts` listed in `IgnoredMethods`
69
69
  # puts 'test'
70
70
  #
71
- # # okay with `^assert` listed in `IgnoredPatterns`
71
+ # # okay with `^assert` listed in `AllowedPatterns`
72
72
  # assert_equal 'test', x
73
73
  #
74
74
  # @example EnforcedStyle: omit_parentheses
@@ -198,7 +198,7 @@ module RuboCop
198
198
 
199
199
  include ConfigurableEnforcedStyle
200
200
  include IgnoredMethods
201
- include IgnoredPattern
201
+ include AllowedPattern
202
202
  include RequireParentheses
203
203
  include OmitParentheses
204
204
  extend AutoCorrector
@@ -6,7 +6,8 @@ module RuboCop
6
6
  # This cop checks for multi-line ternary op expressions.
7
7
  #
8
8
  # NOTE: `return if ... else ... end` is syntax error. If `return` is used before
9
- # multiline ternary operator expression, it cannot be auto-corrected.
9
+ # multiline ternary operator expression, it will be auto-corrected to single-line
10
+ # ternary operator. The same is true for `break`, `next`, and method call.
10
11
  #
11
12
  # @example
12
13
  # # bad
@@ -18,6 +19,10 @@ module RuboCop
18
19
  # b :
19
20
  # c
20
21
  #
22
+ # return cond ?
23
+ # b :
24
+ # c
25
+ #
21
26
  # # good
22
27
  # a = cond ? b : c
23
28
  # a = if cond
@@ -25,20 +30,39 @@ module RuboCop
25
30
  # else
26
31
  # c
27
32
  # end
33
+ #
34
+ # return cond ? b : c
35
+ #
28
36
  class MultilineTernaryOperator < Base
29
37
  extend AutoCorrector
30
38
 
31
- MSG = 'Avoid multi-line ternary operators, use `if` or `unless` instead.'
39
+ MSG_IF = 'Avoid multi-line ternary operators, use `if` or `unless` instead.'
40
+ MSG_SINGLE_LINE = 'Avoid multi-line ternary operators, use single-line instead.'
41
+ SINGLE_LINE_TYPES = %i[return break next send].freeze
32
42
 
33
43
  def on_if(node)
34
44
  return unless offense?(node)
35
45
 
36
- add_offense(node) do |corrector|
37
- # `return if ... else ... end` is syntax error. If `return` is used before
38
- # multiline ternary operator expression, it cannot be auto-corrected.
39
- next unless offense?(node) && !node.parent.return_type?
46
+ message = enforce_single_line_ternary_operator?(node) ? MSG_SINGLE_LINE : MSG_IF
47
+
48
+ add_offense(node, message: message) do |corrector|
49
+ next unless offense?(node)
50
+
51
+ corrector.replace(node, replacement(node))
52
+ end
53
+ end
54
+
55
+ private
40
56
 
41
- corrector.replace(node, <<~RUBY.chop)
57
+ def offense?(node)
58
+ node.ternary? && node.multiline?
59
+ end
60
+
61
+ def replacement(node)
62
+ if enforce_single_line_ternary_operator?(node)
63
+ "#{node.condition.source} ? #{node.if_branch.source} : #{node.else_branch.source}"
64
+ else
65
+ <<~RUBY.chop
42
66
  if #{node.condition.source}
43
67
  #{node.if_branch.source}
44
68
  else
@@ -48,10 +72,8 @@ module RuboCop
48
72
  end
49
73
  end
50
74
 
51
- private
52
-
53
- def offense?(node)
54
- node.ternary? && node.multiline?
75
+ def enforce_single_line_ternary_operator?(node)
76
+ SINGLE_LINE_TYPES.include?(node.parent.type)
55
77
  end
56
78
  end
57
79
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop enforces the use of consistent method names
7
+ # `Object#yield_self` or `Object#then`.
8
+ #
9
+ # @example EnforcedStyle: then (default)
10
+ #
11
+ # # bad
12
+ # obj.yield_self { |x| x.do_something }
13
+ #
14
+ # # good
15
+ # obj.then { |x| x.do_something }
16
+ #
17
+ # @example EnforcedStyle: yield_self
18
+ #
19
+ # # bad
20
+ # obj.then { |x| x.do_something }
21
+ #
22
+ # # good
23
+ # obj.yield_self { |x| x.do_something }
24
+ #
25
+ class ObjectThen < Base
26
+ include ConfigurableEnforcedStyle
27
+ extend AutoCorrector
28
+
29
+ MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
30
+
31
+ def on_block(node)
32
+ check_method_node(node.send_node)
33
+ end
34
+
35
+ def on_send(node)
36
+ return unless node.arguments.one? && node.first_argument.block_pass_type?
37
+
38
+ check_method_node(node)
39
+ end
40
+
41
+ private
42
+
43
+ def check_method_node(node)
44
+ return unless preferred_method(node)
45
+
46
+ message = message(node)
47
+ add_offense(node.loc.selector, message: message) do |corrector|
48
+ corrector.replace(node.loc.selector, style.to_s)
49
+ end
50
+ end
51
+
52
+ def preferred_method(node)
53
+ case style
54
+ when :then
55
+ node.method?(:yield_self)
56
+ when :yield_self
57
+ node.method?(:then)
58
+ else
59
+ false
60
+ end
61
+ end
62
+
63
+ def message(node)
64
+ format(MSG, prefer: style.to_s, current: node.method_name)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -18,6 +18,10 @@ module RuboCop
18
18
  # to purposely create an empty `initialize` method to override a superclass's
19
19
  # initializer.
20
20
  #
21
+ # @safety
22
+ # This cop is unsafe because if subclass overrides `initialize` method with
23
+ # a different arity than superclass.
24
+ #
21
25
  # @example
22
26
  # # bad
23
27
  # def initialize
@@ -76,7 +80,25 @@ module RuboCop
76
80
  # def initialize(...)
77
81
  # end
78
82
  #
83
+ # @example AllowComments: true (default)
84
+ #
85
+ # # good
86
+ # def initialize
87
+ # # Overriding to negate superclass `initialize` method.
88
+ # end
89
+ #
90
+ # @example AllowComments: false
91
+ #
92
+ # # bad
93
+ # def initialize
94
+ # # Overriding to negate superclass `initialize` method.
95
+ # end
96
+ #
79
97
  class RedundantInitialize < Base
98
+ include CommentsHelp
99
+ include RangeHelp
100
+ extend AutoCorrector
101
+
80
102
  MSG = 'Remove unnecessary `initialize` method.'
81
103
  MSG_EMPTY = 'Remove unnecessary empty `initialize` method.'
82
104
 
@@ -86,28 +108,41 @@ module RuboCop
86
108
  PATTERN
87
109
 
88
110
  def on_def(node)
89
- return unless node.method?(:initialize)
90
- return if forwards?(node)
111
+ return if acceptable?(node)
91
112
 
92
113
  if node.body.nil?
93
- add_offense(node, message: MSG_EMPTY)
114
+ register_offense(node, MSG_EMPTY)
94
115
  else
95
116
  return if node.body.begin_type?
96
117
 
97
118
  if (args, super_node = initialize_forwards?(node))
98
119
  return unless same_args?(super_node, args)
99
120
 
100
- add_offense(node)
121
+ register_offense(node, MSG)
101
122
  end
102
123
  end
103
124
  end
104
125
 
105
126
  private
106
127
 
128
+ def register_offense(node, message)
129
+ add_offense(node, message: message) do |corrector|
130
+ corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true))
131
+ end
132
+ end
133
+
134
+ def acceptable?(node)
135
+ !node.method?(:initialize) || forwards?(node) || allow_comments?(node)
136
+ end
137
+
107
138
  def forwards?(node)
108
139
  node.arguments.each_child_node(:restarg, :kwrestarg, :forward_args, :forward_arg).any?
109
140
  end
110
141
 
142
+ def allow_comments?(node)
143
+ cop_config['AllowComments'] && contains_comments?(node)
144
+ end
145
+
111
146
  def same_args?(super_node, args)
112
147
  return true if super_node.zsuper_type?
113
148
 
@@ -63,6 +63,7 @@ module RuboCop
63
63
  next if expr.type != :set || expr.expressions.size != 1
64
64
  next if expr.negative?
65
65
  next if %i[set posixclass nonposixclass].include?(expr.expressions.first.type)
66
+ next if multiple_codepoins?(expr.expressions.first)
66
67
 
67
68
  yield expr
68
69
  end
@@ -79,6 +80,10 @@ module RuboCop
79
80
  !non_redundant
80
81
  end
81
82
 
83
+ def multiple_codepoins?(expression)
84
+ expression.respond_to?(:codepoints) && expression.codepoints.count >= 2
85
+ end
86
+
82
87
  def without_character_class(loc)
83
88
  without_character_class = loc.source[1..-2]
84
89
 
@@ -50,9 +50,13 @@ module RuboCop
50
50
 
51
51
  message = format(MSG, receiver: receiver, argument: argument, original: node.source)
52
52
  add_offense(node, message: message) do |corrector|
53
+ next if part_of_ignored_node?(node)
54
+
53
55
  correct_access = "#{receiver}[#{argument}]"
54
56
  corrector.replace(node, correct_access)
55
57
  end
58
+
59
+ ignore_node(node)
56
60
  end
57
61
  end
58
62
  end
@@ -110,9 +110,12 @@ module RuboCop
110
110
  def autocorrect_outer_condition_basic(corrector, node, if_branch)
111
111
  correct_from_unless_to_if(corrector, node) if node.unless?
112
112
 
113
+ outer_condition = node.condition
114
+ correct_outer_condition(corrector, outer_condition)
115
+
113
116
  and_operator = if_branch.unless? ? ' && !' : ' && '
114
117
  if if_branch.modifier_form?
115
- correct_for_guard_condition_style(corrector, node, if_branch, and_operator)
118
+ correct_for_guard_condition_style(corrector, outer_condition, if_branch, and_operator)
116
119
  else
117
120
  correct_for_basic_condition_style(corrector, node, if_branch, and_operator)
118
121
  correct_for_comment(corrector, node, if_branch)
@@ -136,10 +139,7 @@ module RuboCop
136
139
  end
137
140
  end
138
141
 
139
- def correct_for_guard_condition_style(corrector, node, if_branch, and_operator)
140
- outer_condition = node.condition
141
- correct_outer_condition(corrector, outer_condition)
142
-
142
+ def correct_for_guard_condition_style(corrector, outer_condition, if_branch, and_operator)
143
143
  condition = if_branch.condition
144
144
  corrector.insert_after(outer_condition, "#{and_operator}#{replace_condition(condition)}")
145
145
 
@@ -177,7 +177,7 @@ module RuboCop
177
177
  end
178
178
 
179
179
  def correct_outer_condition(corrector, condition)
180
- return unless requrie_parentheses?(condition)
180
+ return unless require_parentheses?(condition)
181
181
 
182
182
  end_pos = condition.loc.selector.end_pos
183
183
  begin_pos = condition.first_argument.source_range.begin_pos
@@ -187,7 +187,7 @@ module RuboCop
187
187
  corrector.insert_after(condition.last_argument.source_range, ')')
188
188
  end
189
189
 
190
- def requrie_parentheses?(condition)
190
+ def require_parentheses?(condition)
191
191
  condition.send_type? && !condition.arguments.empty? && !condition.parenthesized? &&
192
192
  !condition.comparison_method?
193
193
  end