rubocop 0.75.1 → 0.76.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +52 -53
  4. data/lib/rubocop.rb +10 -9
  5. data/lib/rubocop/ast/builder.rb +1 -0
  6. data/lib/rubocop/ast/node.rb +4 -0
  7. data/lib/rubocop/ast/node/return_node.rb +24 -0
  8. data/lib/rubocop/cli.rb +7 -4
  9. data/lib/rubocop/comment_config.rb +2 -2
  10. data/lib/rubocop/config.rb +7 -0
  11. data/lib/rubocop/config_loader.rb +1 -1
  12. data/lib/rubocop/config_loader_resolver.rb +2 -1
  13. data/lib/rubocop/config_obsoletion.rb +9 -0
  14. data/lib/rubocop/config_validator.rb +24 -15
  15. data/lib/rubocop/cop/commissioner.rb +15 -7
  16. data/lib/rubocop/cop/cop.rb +10 -6
  17. data/lib/rubocop/cop/corrector.rb +8 -7
  18. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  19. data/lib/rubocop/cop/layout/align_hash.rb +6 -2
  20. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  21. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  22. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  23. data/lib/rubocop/cop/layout/indent_first_argument.rb +9 -7
  24. data/lib/rubocop/cop/layout/indent_first_hash_element.rb +1 -1
  25. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  26. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  27. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  28. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -4
  29. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  30. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  31. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  32. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  33. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +23 -23
  34. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
  35. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  36. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +5 -5
  37. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  38. data/lib/rubocop/cop/lint/void.rb +4 -4
  39. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  40. data/lib/rubocop/cop/metrics/line_length.rb +1 -4
  41. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  42. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  43. data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
  44. data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
  45. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  46. data/lib/rubocop/cop/registry.rb +1 -1
  47. data/lib/rubocop/cop/style/attr.rb +2 -2
  48. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +6 -6
  49. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  50. data/lib/rubocop/cop/style/copyright.rb +11 -7
  51. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +2 -2
  52. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  53. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  54. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  55. data/lib/rubocop/cop/style/format_string.rb +10 -7
  56. data/lib/rubocop/cop/style/format_string_token.rb +2 -0
  57. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +10 -0
  58. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  59. data/lib/rubocop/cop/style/if_unless_modifier.rb +9 -2
  60. data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
  61. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  62. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  63. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  64. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  65. data/lib/rubocop/cop/style/nested_modifier.rb +4 -2
  66. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  67. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  68. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  69. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  70. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  71. data/lib/rubocop/cop/style/redundant_return.rb +25 -21
  72. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +4 -4
  73. data/lib/rubocop/cop/style/safe_navigation.rb +13 -10
  74. data/lib/rubocop/cop/style/semicolon.rb +2 -2
  75. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  76. data/lib/rubocop/cop/util.rb +1 -1
  77. data/lib/rubocop/cop/utils/format_string.rb +10 -18
  78. data/lib/rubocop/cop/variable_force.rb +7 -5
  79. data/lib/rubocop/node_pattern.rb +3 -1
  80. data/lib/rubocop/options.rb +12 -6
  81. data/lib/rubocop/result_cache.rb +1 -1
  82. data/lib/rubocop/runner.rb +32 -27
  83. data/lib/rubocop/target_finder.rb +12 -6
  84. data/lib/rubocop/version.rb +1 -1
  85. metadata +12 -11
@@ -5,27 +5,39 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for non-nil checks, which are usually redundant.
7
7
  #
8
- # @example
8
+ # With `IncludeSemanticChanges` set to `false` by default, this cop
9
+ # does not report offenses for `!x.nil?` and does no changes that might
10
+ # change behavior.
11
+ #
12
+ # With `IncludeSemanticChanges` set to `true`, this cop reports offenses
13
+ # for `!x.nil?` and autocorrects that and `x != nil` to solely `x`, which
14
+ # is **usually** OK, but might change behavior.
9
15
  #
16
+ # @example
10
17
  # # bad
11
18
  # if x != nil
12
19
  # end
13
20
  #
14
- # # good (when not allowing semantic changes)
15
- # # bad (when allowing semantic changes)
16
- # if !x.nil?
17
- # end
18
- #
19
- # # good (when allowing semantic changes)
21
+ # # good
20
22
  # if x
21
23
  # end
22
24
  #
23
- # Non-nil checks are allowed if they are the final nodes of predicate.
24
- #
25
+ # # Non-nil checks are allowed if they are the final nodes of predicate.
25
26
  # # good
26
27
  # def signed_in?
27
28
  # !current_user.nil?
28
29
  # end
30
+ #
31
+ # @example IncludeSemanticChanges: false (default)
32
+ # # good
33
+ # if !x.nil?
34
+ # end
35
+ #
36
+ # @example IncludeSemanticChanges: true
37
+ # # bad
38
+ # if !x.nil?
39
+ # end
40
+ #
29
41
  class NonNilCheck < Cop
30
42
  def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
31
43
  def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
@@ -14,7 +14,7 @@ module RuboCop
14
14
  # %w/swim run bike/
15
15
  # %w[shirt pants shoes]
16
16
  # %W(apple #{fruit} grape)
17
- class UnneededCapitalW < Cop
17
+ class RedundantCapitalW < Cop
18
18
  include PercentLiteral
19
19
 
20
20
  MSG = 'Do not use `%W` unless interpolation is needed. ' \
@@ -30,11 +30,11 @@ module RuboCop
30
30
  # c
31
31
  # end
32
32
  #
33
- class UnneededCondition < Cop
33
+ class RedundantCondition < Cop
34
34
  include RangeHelp
35
35
 
36
36
  MSG = 'Use double pipes `||` instead.'
37
- UNNEEDED_CONDITION = 'This condition is not needed.'
37
+ REDUNDANT_CONDITION = 'This condition is not needed.'
38
38
 
39
39
  def on_if(node)
40
40
  return if node.elsif_conditional?
@@ -61,7 +61,7 @@ module RuboCop
61
61
 
62
62
  def message(node)
63
63
  if node.modifier_form? || !node.else_branch
64
- UNNEEDED_CONDITION
64
+ REDUNDANT_CONDITION
65
65
  else
66
66
  MSG
67
67
  end
@@ -15,7 +15,7 @@ module RuboCop
15
15
  #
16
16
  # # good if @var is already a String
17
17
  # @var
18
- class UnneededInterpolation < Cop
18
+ class RedundantInterpolation < Cop
19
19
  include PercentLiteral
20
20
 
21
21
  MSG = 'Prefer `to_s` over string interpolation.'
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # time = "8 o'clock"
18
18
  # question = '"What did you say?"'
19
19
  #
20
- class UnneededPercentQ < Cop
20
+ class RedundantPercentQ < Cop
21
21
  MSG = 'Use `%<q_type>s` only for strings that contain both ' \
22
22
  'single quotes and double quotes%<extra>s.'
23
23
  DYNAMIC_MSG = ', or for dynamic strings that contain ' \
@@ -60,27 +60,38 @@ module RuboCop
60
60
  end
61
61
  alias on_defs on_def
62
62
 
63
- def autocorrect(node) # rubocop:disable Metrics/MethodLength
63
+ def autocorrect(node)
64
64
  lambda do |corrector|
65
- unless arguments?(node.children)
66
- corrector.replace(node.source_range, 'nil')
67
- next
65
+ if node.arguments?
66
+ correct_with_arguments(node, corrector)
67
+ else
68
+ correct_without_arguments(node, corrector)
68
69
  end
69
-
70
- return_value, = *node
71
- if node.children.size > 1
72
- add_brackets(corrector, node)
73
- elsif return_value.hash_type?
74
- add_braces(corrector, return_value) unless return_value.braces?
75
- end
76
- return_kw = range_with_surrounding_space(range: node.loc.keyword,
77
- side: :right)
78
- corrector.remove(return_kw)
79
70
  end
80
71
  end
81
72
 
82
73
  private
83
74
 
75
+ def correct_without_arguments(return_node, corrector)
76
+ corrector.replace(return_node.source_range, 'nil')
77
+ end
78
+
79
+ def correct_with_arguments(return_node, corrector)
80
+ if return_node.arguments.size > 1
81
+ add_brackets(corrector, return_node)
82
+ elsif hash_without_braces?(return_node.first_argument)
83
+ add_braces(corrector, return_node.first_argument)
84
+ end
85
+
86
+ keyword = range_with_surrounding_space(range: return_node.loc.keyword,
87
+ side: :right)
88
+ corrector.remove(keyword)
89
+ end
90
+
91
+ def hash_without_braces?(node)
92
+ node.hash_type? && !node.braces?
93
+ end
94
+
84
95
  def add_brackets(corrector, node)
85
96
  kids = node.children.map(&:source_range)
86
97
  corrector.insert_before(kids.first, '[')
@@ -93,13 +104,6 @@ module RuboCop
93
104
  corrector.insert_after(kids.last, '}')
94
105
  end
95
106
 
96
- def arguments?(args)
97
- return false if args.empty?
98
- return true if args.size > 1
99
-
100
- !args.first.begin_type? || !args.first.children.empty?
101
- end
102
-
103
107
  # rubocop:disable Metrics/CyclomaticComplexity
104
108
  def check_branch(node)
105
109
  return unless node
@@ -49,13 +49,13 @@ module RuboCop
49
49
  # # good
50
50
  # arr.max_by(&:foo)
51
51
  #
52
- class UnneededSort < Cop
52
+ class RedundantSort < Cop
53
53
  include RangeHelp
54
54
 
55
55
  MSG = 'Use `%<suggestion>s` instead of '\
56
56
  '`%<sorter>s...%<accessor_source>s`.'
57
57
 
58
- def_node_matcher :unneeded_sort?, <<~MATCHER
58
+ def_node_matcher :redundant_sort?, <<~MATCHER
59
59
  {
60
60
  (send $(send _ $:sort ...) ${:last :first})
61
61
  (send $(send _ $:sort ...) ${:[] :at :slice} {(int 0) (int -1)})
@@ -72,7 +72,7 @@ module RuboCop
72
72
  MATCHER
73
73
 
74
74
  def on_send(node)
75
- unneeded_sort?(node) do |sort_node, sorter, accessor|
75
+ redundant_sort?(node) do |sort_node, sorter, accessor|
76
76
  range = range_between(
77
77
  sort_node.loc.selector.begin_pos,
78
78
  node.loc.expression.end_pos
@@ -87,7 +87,7 @@ module RuboCop
87
87
  end
88
88
 
89
89
  def autocorrect(node)
90
- sort_node, sorter, accessor = unneeded_sort?(node)
90
+ sort_node, sorter, accessor = redundant_sort?(node)
91
91
 
92
92
  lambda do |corrector|
93
93
  # Remove accessor, e.g. `first` or `[-1]`.
@@ -112,9 +112,8 @@ module RuboCop
112
112
  end
113
113
 
114
114
  def autocorrect(node)
115
- _check, body, = node.node_parts
116
- _checked_variable, matching_receiver, = extract_parts(node)
117
- method_call, = matching_receiver.parent
115
+ body = node.node_parts[1]
116
+ method_call = method_call(node)
118
117
 
119
118
  lambda do |corrector|
120
119
  corrector.remove(begin_range(node, body))
@@ -129,25 +128,29 @@ module RuboCop
129
128
  private
130
129
 
131
130
  def handle_comments(corrector, node, method_call)
132
- return if processed_source.comments.empty?
131
+ comments = comments(node)
132
+ return if comments.empty?
133
133
 
134
134
  corrector.insert_before(method_call.loc.expression,
135
- "#{comments(node).join("\n")}\n")
135
+ "#{comments.map(&:text).join("\n")}\n")
136
136
  end
137
137
 
138
138
  def comments(node)
139
- comments = processed_source.comments.select do |comment|
140
- comment.loc.first_line >= node.loc.first_line &&
141
- comment.loc.last_line <= node.loc.last_line
139
+ processed_source.comments.select do |comment|
140
+ comment.loc.first_line > node.loc.first_line &&
141
+ comment.loc.last_line < node.loc.last_line
142
142
  end
143
-
144
- comments.map(&:text)
145
143
  end
146
144
 
147
145
  def allowed_if_condition?(node)
148
146
  node.else? || node.elsif? || node.ternary?
149
147
  end
150
148
 
149
+ def method_call(node)
150
+ _checked_variable, matching_receiver, = extract_parts(node)
151
+ matching_receiver.parent
152
+ end
153
+
151
154
  def extract_parts(node)
152
155
  case node.type
153
156
  when :if
@@ -47,8 +47,8 @@ module RuboCop
47
47
  return if exprs.size < 2
48
48
 
49
49
  # create a map matching lines to the number of expressions on them
50
- exprs_lines = exprs.map { |e| e.source_range.line }
51
- lines = exprs_lines.group_by { |i| i }
50
+ exprs_lines = exprs.map(&:first_line)
51
+ lines = exprs_lines.group_by(&:itself)
52
52
 
53
53
  lines.each do |line, expr_on_line|
54
54
  # Every line with more than one expression on it is a
@@ -160,17 +160,15 @@ module RuboCop
160
160
  end
161
161
 
162
162
  def format_message(english, regular, global)
163
- if !regular.empty? && !english.empty?
163
+ if regular.empty?
164
+ format(MSG_ENGLISH, prefer: format_list(english), global: global)
165
+ elsif english.empty?
166
+ format(MSG_REGULAR, prefer: format_list(regular), global: global)
167
+ else
164
168
  format(MSG_BOTH,
165
169
  prefer: format_list(english),
166
170
  regular: format_list(regular),
167
171
  global: global)
168
- elsif !regular.empty?
169
- format(MSG_REGULAR, prefer: format_list(regular), global: global)
170
- elsif !english.empty?
171
- format(MSG_ENGLISH, prefer: format_list(english), global: global)
172
- else
173
- raise 'Bug in SpecialGlobalVars - global var w/o preferred vars!'
174
172
  end
175
173
  end
176
174
 
@@ -9,7 +9,7 @@ module RuboCop
9
9
  # Match literal regex characters, not including anchors, character
10
10
  # classes, alternatives, groups, repetitions, references, etc
11
11
  LITERAL_REGEX =
12
- /[\w\s\-,"'!#%&<>=;:`~]|\\[^AbBdDgGhHkpPRwWXsSzZ0-9]/.freeze
12
+ %r{[\w\s\-,"'!#%&<>=;:`~/]|\\[^AbBdDgGhHkpPRwWXsSzZ0-9]}.freeze
13
13
 
14
14
  module_function
15
15
 
@@ -44,15 +44,15 @@ module RuboCop
44
44
  attr_reader :begin_pos, :end_pos
45
45
  attr_reader :flags, :width, :precision, :name, :type
46
46
 
47
- def initialize(string, **opts)
48
- @source = string
49
- @begin_pos = opts[:begin_pos]
50
- @end_pos = opts[:end_pos]
51
- @flags = opts[:flags]
52
- @width = opts[:width]
53
- @precision = opts[:precision]
54
- @name = opts[:name]
55
- @type = opts[:type]
47
+ def initialize(match)
48
+ @source = match[0]
49
+ @begin_pos = match.begin(0)
50
+ @end_pos = match.end(0)
51
+ @flags = match[:flags].to_s + match[:more_flags].to_s
52
+ @width = match[:width]
53
+ @precision = match[:precision]
54
+ @name = match[:name]
55
+ @type = match[:type]
56
56
  end
57
57
 
58
58
  def percent?
@@ -109,16 +109,8 @@ module RuboCop
109
109
 
110
110
  def parse
111
111
  @source.to_enum(:scan, SEQUENCE).map do
112
- match = Regexp.last_match
113
112
  FormatSequence.new(
114
- match[0],
115
- begin_pos: match.begin(0),
116
- end_pos: match.end(0),
117
- flags: match[:flags].to_s + match[:more_flags].to_s,
118
- width: match[:width],
119
- precision: match[:precision],
120
- name: match[:name],
121
- type: match[:type]
113
+ Regexp.last_match
122
114
  )
123
115
  end
124
116
  end
@@ -284,11 +284,7 @@ module RuboCop
284
284
  def process_scope(node)
285
285
  if TWISTED_SCOPE_TYPES.include?(node.type)
286
286
  # See the comment at the end of file for this behavior.
287
- twisted_nodes = [node.children[0]]
288
- twisted_nodes << node.children[1] if node.class_type?
289
- twisted_nodes.compact!
290
-
291
- twisted_nodes.each do |twisted_node|
287
+ twisted_nodes(node).each do |twisted_node|
292
288
  process_node(twisted_node)
293
289
  scanned_nodes << twisted_node
294
290
  end
@@ -298,6 +294,12 @@ module RuboCop
298
294
  skip_children!
299
295
  end
300
296
 
297
+ def twisted_nodes(node)
298
+ twisted_nodes = [node.children[0]]
299
+ twisted_nodes << node.children[1] if node.class_type?
300
+ twisted_nodes.compact
301
+ end
302
+
301
303
  def process_send(node)
302
304
  _receiver, method_name, args = *node
303
305
  return unless method_name == :binding
@@ -429,12 +429,13 @@ module RuboCop
429
429
  [0..Float::INFINITY, 'true']
430
430
  end
431
431
 
432
+ # rubocop:disable Metrics/AbcSize
432
433
  # rubocop:disable Metrics/MethodLength
433
434
  def compile_any_order(capture_all = nil)
434
435
  rest = capture_rest = nil
435
436
  patterns = []
436
437
  with_temp_variables do |child, matched|
437
- tokens_until('>', 'any child').each do
438
+ tokens_until('>', 'any child') do
438
439
  fail_due_to 'ellipsis must be at the end of <>' if rest
439
440
  token = tokens.shift
440
441
  case token
@@ -448,6 +449,7 @@ module RuboCop
448
449
  end
449
450
  end
450
451
  # rubocop:enable Metrics/MethodLength
452
+ # rubocop:enable Metrics/AbcSize
451
453
 
452
454
  def insure_same_captures(enum, what)
453
455
  return to_enum __method__, enum, what unless block_given?
@@ -255,11 +255,17 @@ module RuboCop
255
255
  @options = options
256
256
  end
257
257
 
258
+ def validate_cop_options
259
+ %i[only except].each do |opt|
260
+ OptionsValidator.validate_cop_list(@options[opt])
261
+ end
262
+ end
263
+
258
264
  # rubocop:disable Metrics/AbcSize
259
265
  def validate_compatibility # rubocop:disable Metrics/MethodLength
260
- if only_includes_unneeded_disable?
261
- raise OptionArgumentError, 'Lint/UnneededCopDisableDirective can not ' \
262
- 'be used with --only.'
266
+ if only_includes_redundant_disable?
267
+ raise OptionArgumentError, 'Lint/RedundantCopDisableDirective can ' \
268
+ 'not be used with --only.'
263
269
  end
264
270
  if except_syntax?
265
271
  raise OptionArgumentError, 'Syntax checking can not be turned off.'
@@ -332,10 +338,10 @@ module RuboCop
332
338
  end
333
339
  end
334
340
 
335
- def only_includes_unneeded_disable?
341
+ def only_includes_redundant_disable?
336
342
  @options.key?(:only) &&
337
- (@options[:only] & %w[Lint/UnneededCopDisableDirective
338
- UnneededCopDisableDirective]).any?
343
+ (@options[:only] & %w[Lint/RedundantCopDisableDirective
344
+ RedundantCopDisableDirective]).any?
339
345
  end
340
346
 
341
347
  def display_only_fail_level_offenses_with_autocorrect?
@@ -100,7 +100,7 @@ module RuboCop
100
100
 
101
101
  begin
102
102
  FileUtils.mkdir_p(dir)
103
- rescue Errno::EACCES => e
103
+ rescue Errno::EACCES, Errno::EROFS => e
104
104
  warn "Couldn't create cache directory. Continuing without cache."\
105
105
  "\n #{e.message}"
106
106
  return
@@ -104,25 +104,20 @@ module RuboCop
104
104
  end
105
105
 
106
106
  def process_file(file)
107
- puts "Scanning #{file}" if @options[:debug]
108
107
  file_started(file)
109
-
110
108
  offenses = file_offenses(file)
111
- if @options[:display_only_fail_level_offenses]
112
- offenses = offenses.select { |o| considered_failure?(o) }
113
- end
114
- formatter_set.file_finished(file, offenses)
115
- offenses
116
109
  rescue InfiniteCorrectionLoop => e
117
- formatter_set.file_finished(file, e.offenses.compact.sort.freeze)
110
+ offenses = e.offenses.compact.sort.freeze
118
111
  raise
112
+ ensure
113
+ file_finished(file, offenses || [])
119
114
  end
120
115
 
121
116
  def file_offenses(file)
122
117
  file_offense_cache(file) do
123
118
  source = get_processed_source(file)
124
119
  source, offenses = do_inspection_loop(file, source)
125
- add_unneeded_disables(file, offenses.compact.sort, source)
120
+ add_redundant_disables(file, offenses.compact.sort, source)
126
121
  end
127
122
  end
128
123
 
@@ -146,33 +141,37 @@ module RuboCop
146
141
  offenses
147
142
  end
148
143
 
149
- def add_unneeded_disables(file, offenses, source)
150
- if check_for_unneeded_disables?(source)
151
- config = @config_store.for(file)
152
- if config.for_cop(Cop::Lint::UnneededCopDisableDirective)
153
- .fetch('Enabled')
154
- cop = Cop::Lint::UnneededCopDisableDirective.new(config, @options)
155
- if cop.relevant_file?(file)
156
- cop.check(offenses, source.disabled_line_ranges, source.comments)
157
- offenses += cop.offenses
158
- offenses += autocorrect_unneeded_disables(file, source, cop,
159
- offenses)
160
- end
144
+ def add_redundant_disables(file, offenses, source)
145
+ if check_for_redundant_disables?(source)
146
+ redundant_cop_disable_directive(file) do |cop|
147
+ cop.check(offenses, source.disabled_line_ranges, source.comments)
148
+ offenses += cop.offenses
149
+ offenses += autocorrect_redundant_disables(file, source, cop,
150
+ offenses)
161
151
  end
162
152
  end
163
153
 
164
154
  offenses.sort.reject(&:disabled?).freeze
165
155
  end
166
156
 
167
- def check_for_unneeded_disables?(source)
157
+ def check_for_redundant_disables?(source)
168
158
  !source.disabled_line_ranges.empty? && !filtered_run?
169
159
  end
170
160
 
161
+ def redundant_cop_disable_directive(file)
162
+ config = @config_store.for(file)
163
+ if config.for_cop(Cop::Lint::RedundantCopDisableDirective)
164
+ .fetch('Enabled')
165
+ cop = Cop::Lint::RedundantCopDisableDirective.new(config, @options)
166
+ yield cop if cop.relevant_file?(file)
167
+ end
168
+ end
169
+
171
170
  def filtered_run?
172
171
  @options[:except] || @options[:only]
173
172
  end
174
173
 
175
- def autocorrect_unneeded_disables(file, source, cop, offenses)
174
+ def autocorrect_redundant_disables(file, source, cop, offenses)
176
175
  cop.processed_source = source
177
176
 
178
177
  team = Cop::Team.new(RuboCop::Cop::Registry.new, nil, @options)
@@ -180,7 +179,7 @@ module RuboCop
180
179
 
181
180
  return [] unless team.updated_source_file?
182
181
 
183
- # Do one extra inspection loop if any unneeded disables were
182
+ # Do one extra inspection loop if any redundant disables were
184
183
  # removed. This is done in order to find rubocop:enable directives that
185
184
  # have now become useless.
186
185
  _source, new_offenses = do_inspection_loop(file,
@@ -189,11 +188,19 @@ module RuboCop
189
188
  end
190
189
 
191
190
  def file_started(file)
191
+ puts "Scanning #{file}" if @options[:debug]
192
192
  formatter_set.file_started(file,
193
193
  cli_options: @options,
194
194
  config_store: @config_store)
195
195
  end
196
196
 
197
+ def file_finished(file, offenses)
198
+ if @options[:display_only_fail_level_offenses]
199
+ offenses = offenses.select { |o| considered_failure?(o) }
200
+ end
201
+ formatter_set.file_finished(file, offenses)
202
+ end
203
+
197
204
  def cached_run?
198
205
  @cached_run ||=
199
206
  (@options[:cache] == 'true' ||
@@ -291,9 +298,7 @@ module RuboCop
291
298
  @mobilized_cop_classes[config.object_id] ||= begin
292
299
  cop_classes = Cop::Cop.all
293
300
 
294
- %i[only except].each do |opt|
295
- OptionsValidator.validate_cop_list(@options[opt])
296
- end
301
+ OptionsValidator.new(@options).validate_cop_options
297
302
 
298
303
  if @options[:only]
299
304
  cop_classes.select! { |c| c.match?(@options[:only]) }