rubocop 0.74.0 → 0.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/config/default.yml +366 -318
  4. data/lib/rubocop.rb +48 -32
  5. data/lib/rubocop/ast/builder.rb +1 -0
  6. data/lib/rubocop/ast/node.rb +5 -1
  7. data/lib/rubocop/ast/node/block_node.rb +2 -0
  8. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
  9. data/lib/rubocop/ast/node/return_node.rb +24 -0
  10. data/lib/rubocop/cli.rb +11 -227
  11. data/lib/rubocop/cli/command.rb +21 -0
  12. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  13. data/lib/rubocop/cli/command/base.rb +33 -0
  14. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  15. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  16. data/lib/rubocop/cli/command/show_cops.rb +73 -0
  17. data/lib/rubocop/cli/command/version.rb +17 -0
  18. data/lib/rubocop/cli/environment.rb +21 -0
  19. data/lib/rubocop/comment_config.rb +5 -4
  20. data/lib/rubocop/config.rb +12 -1
  21. data/lib/rubocop/config_loader.rb +21 -3
  22. data/lib/rubocop/config_loader_resolver.rb +4 -3
  23. data/lib/rubocop/config_obsoletion.rb +85 -11
  24. data/lib/rubocop/config_validator.rb +28 -19
  25. data/lib/rubocop/cop/autocorrect_logic.rb +3 -3
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  27. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  28. data/lib/rubocop/cop/commissioner.rb +15 -7
  29. data/lib/rubocop/cop/cop.rb +35 -9
  30. data/lib/rubocop/cop/corrector.rb +8 -7
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  35. data/lib/rubocop/cop/generator.rb +3 -3
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  37. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  40. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  41. data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
  42. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +11 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  46. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  48. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  50. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -7
  52. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
  53. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  54. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  55. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  56. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
  57. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +6 -6
  58. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  59. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
  60. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  64. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  67. data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
  68. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  69. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
  72. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  73. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
  74. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  75. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  77. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  78. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  79. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  80. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  82. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
  83. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  84. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  85. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  86. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  87. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  88. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
  89. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
  90. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  91. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
  92. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  93. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  94. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  95. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  96. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  97. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  98. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  99. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  100. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  101. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  102. data/lib/rubocop/cop/lint/void.rb +7 -26
  103. data/lib/rubocop/cop/message_annotator.rb +16 -7
  104. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  105. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  106. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  107. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  108. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  109. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  110. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  111. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  112. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  113. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  114. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  115. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
  116. data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
  117. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  118. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  119. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  120. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  121. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
  122. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  123. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  124. data/lib/rubocop/cop/offense.rb +29 -7
  125. data/lib/rubocop/cop/registry.rb +22 -1
  126. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  127. data/lib/rubocop/cop/style/alias.rb +1 -1
  128. data/lib/rubocop/cop/style/array_join.rb +1 -1
  129. data/lib/rubocop/cop/style/attr.rb +10 -2
  130. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  131. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
  132. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  133. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  134. data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
  135. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
  136. data/lib/rubocop/cop/style/copyright.rb +11 -7
  137. data/lib/rubocop/cop/style/documentation_method.rb +44 -0
  138. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
  139. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  140. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  141. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  142. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  143. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  144. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  145. data/lib/rubocop/cop/style/format_string.rb +10 -7
  146. data/lib/rubocop/cop/style/format_string_token.rb +19 -68
  147. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
  148. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  149. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  150. data/lib/rubocop/cop/style/if_unless_modifier.rb +93 -15
  151. data/lib/rubocop/cop/style/infinite_loop.rb +6 -5
  152. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  153. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  154. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  155. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
  156. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  157. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  158. data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
  159. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  160. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  161. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  162. data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
  163. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  164. data/lib/rubocop/cop/style/next.rb +5 -5
  165. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  166. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  167. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  168. data/lib/rubocop/cop/style/or_assignment.rb +6 -1
  169. data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
  170. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  171. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  172. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  173. data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
  174. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  175. data/lib/rubocop/cop/style/redundant_return.rb +39 -29
  176. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  177. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
  178. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  179. data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
  180. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  181. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  182. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  183. data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
  184. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  185. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  186. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  187. data/lib/rubocop/cop/team.rb +5 -0
  188. data/lib/rubocop/cop/util.rb +1 -1
  189. data/lib/rubocop/cop/utils/format_string.rb +120 -0
  190. data/lib/rubocop/cop/variable_force.rb +7 -5
  191. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  192. data/lib/rubocop/core_ext/string.rb +0 -24
  193. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  194. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  195. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  196. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  197. data/lib/rubocop/formatter/formatter_set.rb +16 -15
  198. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  199. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  200. data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
  201. data/lib/rubocop/formatter/tap_formatter.rb +18 -7
  202. data/lib/rubocop/magic_comment.rb +4 -0
  203. data/lib/rubocop/node_pattern.rb +4 -2
  204. data/lib/rubocop/options.rb +21 -26
  205. data/lib/rubocop/processed_source.rb +1 -1
  206. data/lib/rubocop/rake_task.rb +1 -0
  207. data/lib/rubocop/result_cache.rb +24 -8
  208. data/lib/rubocop/runner.rb +60 -33
  209. data/lib/rubocop/target_finder.rb +12 -6
  210. data/lib/rubocop/version.rb +1 -1
  211. metadata +48 -33
  212. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  213. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # The Lint/UnneededCopEnableDirective cop needs to be disabled so as
3
+ # The Lint/RedundantCopEnableDirective cop needs to be disabled so as
4
4
  # to be able to provide a (bad) example of an unneeded enable.
5
5
 
6
- # rubocop:disable Lint/UnneededCopEnableDirective
6
+ # rubocop:disable Lint/RedundantCopEnableDirective
7
7
  module RuboCop
8
8
  module Cop
9
9
  module Lint
@@ -15,24 +15,24 @@ module RuboCop
15
15
  # @example
16
16
  # # bad
17
17
  # foo = 1
18
- # # rubocop:enable Metrics/LineLength
18
+ # # rubocop:enable Layout/LineLength
19
19
  #
20
20
  # # good
21
21
  # foo = 1
22
22
  # @example
23
23
  # # bad
24
- # # rubocop:disable Metrics/LineLength
24
+ # # rubocop:disable Layout/LineLength
25
25
  # baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
26
- # # rubocop:enable Metrics/LineLength
26
+ # # rubocop:enable Layout/LineLength
27
27
  # baz
28
28
  # # rubocop:enable all
29
29
  #
30
30
  # # good
31
- # # rubocop:disable Metrics/LineLength
31
+ # # rubocop:disable Layout/LineLength
32
32
  # baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
33
33
  # # rubocop:enable all
34
34
  # baz
35
- class UnneededCopEnableDirective < Cop
35
+ class RedundantCopEnableDirective < Cop
36
36
  include RangeHelp
37
37
  include SurroundingSpace
38
38
 
@@ -94,16 +94,14 @@ module RuboCop
94
94
 
95
95
  def range_to_remove(begin_pos, end_pos, comma_pos, comment)
96
96
  start = comment_start(comment)
97
- buffer = processed_source.buffer
98
- range_class = Parser::Source::Range
99
97
 
100
98
  case comma_pos
101
99
  when :before
102
- range_class.new(buffer, start + begin_pos - 1, start + end_pos)
100
+ range_between(start + begin_pos - 1, start + end_pos)
103
101
  when :after
104
- range_class.new(buffer, start + begin_pos, start + end_pos + 1)
102
+ range_between(start + begin_pos, start + end_pos + 1)
105
103
  else
106
- range_class.new(buffer, start, comment.loc.expression.end_pos)
104
+ range_between(start, comment.loc.expression.end_pos)
107
105
  end
108
106
  end
109
107
 
@@ -21,7 +21,7 @@ module RuboCop
21
21
  #
22
22
  # # good
23
23
  # require 'unloaded_feature'
24
- class UnneededRequireStatement < Cop
24
+ class RedundantRequireStatement < Cop
25
25
  include RangeHelp
26
26
 
27
27
  MSG = 'Remove unnecessary `require` statement.'
@@ -49,7 +49,7 @@ module RuboCop
49
49
  # else
50
50
  # baz
51
51
  # end
52
- class UnneededSplatExpansion < Cop
52
+ class RedundantSplatExpansion < Cop
53
53
  MSG = 'Replace splat expansion with comma separated values.'
54
54
  ARRAY_PARAM_MSG = 'Pass array contents as separate arguments.'
55
55
  PERCENT_W = '%w'
@@ -70,7 +70,7 @@ module RuboCop
70
70
  PATTERN
71
71
 
72
72
  def on_splat(node)
73
- unneeded_splat_expansion(node) do
73
+ redundant_splat_expansion(node) do
74
74
  if array_splat?(node) &&
75
75
  (method_argument?(node) || part_of_an_array?(node))
76
76
  add_offense(node, message: ARRAY_PARAM_MSG)
@@ -90,7 +90,7 @@ module RuboCop
90
90
 
91
91
  private
92
92
 
93
- def unneeded_splat_expansion(node)
93
+ def redundant_splat_expansion(node)
94
94
  literal_expansion(node) do |expanded_item|
95
95
  if expanded_item.send_type?
96
96
  return if array_new_inside_array_literal?(expanded_item)
@@ -119,7 +119,7 @@ module RuboCop
119
119
  [node.parent.loc.expression, variable.source]
120
120
  elsif !variable.array_type?
121
121
  [loc.expression, "[#{variable.source}]"]
122
- elsif unneeded_brackets?(node)
122
+ elsif redundant_brackets?(node)
123
123
  [loc.expression, remove_brackets(variable)]
124
124
  else
125
125
  [loc.operator, '']
@@ -141,12 +141,12 @@ module RuboCop
141
141
  parent.array_type? && parent.loc.begin && parent.loc.end
142
142
  end
143
143
 
144
- def unneeded_brackets?(node)
144
+ def redundant_brackets?(node)
145
145
  parent = node.parent
146
146
  grandparent = node.parent.parent
147
147
 
148
148
  parent.when_type? || parent.send_type? || part_of_an_array?(node) ||
149
- (grandparent&.resbody_type?)
149
+ grandparent&.resbody_type?
150
150
  end
151
151
 
152
152
  def remove_brackets(array)
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # # good
18
18
  #
19
19
  # "result is #{something}"
20
- class StringConversionInInterpolation < Cop
20
+ class RedundantStringCoercion < Cop
21
21
  include Interpolation
22
22
 
23
23
  MSG_DEFAULT = 'Redundant use of `Object#to_s` in interpolation.'
@@ -50,7 +50,7 @@ module RuboCop
50
50
  def autocorrect(node)
51
51
  lambda do |corrector|
52
52
  redundant_with_index?(node) do |send|
53
- if send.method_name == :each_with_index
53
+ if send.method?(:each_with_index)
54
54
  corrector.replace(send.loc.selector, 'each')
55
55
  else
56
56
  corrector.remove(with_index_range(send))
@@ -63,7 +63,7 @@ module RuboCop
63
63
  private
64
64
 
65
65
  def message(node)
66
- if node.method_name == :each_with_index
66
+ if node.method?(:each_with_index)
67
67
  MSG_EACH_WITH_INDEX
68
68
  else
69
69
  MSG_WITH_INDEX
@@ -51,7 +51,7 @@ module RuboCop
51
51
  def autocorrect(node)
52
52
  lambda do |corrector|
53
53
  redundant_with_object?(node) do |send|
54
- if send.method_name == :each_with_object
54
+ if send.method?(:each_with_object)
55
55
  corrector.replace(with_object_range(send), 'each')
56
56
  else
57
57
  corrector.remove(with_object_range(send))
@@ -64,7 +64,7 @@ module RuboCop
64
64
  private
65
65
 
66
66
  def message(node)
67
- if node.method_name == :each_with_object
67
+ if node.method?(:each_with_object)
68
68
  MSG_EACH_WITH_OBJECT
69
69
  else
70
70
  MSG_WITH_OBJECT
@@ -42,9 +42,9 @@ module RuboCop
42
42
 
43
43
  method_chain = method_chain(node)
44
44
  location =
45
- Parser::Source::Range.new(node.loc.expression.source_buffer,
46
- safe_nav.loc.expression.end_pos,
47
- method_chain.loc.expression.end_pos)
45
+ Parser::Source::Range.new(node.source_range.source_buffer,
46
+ safe_nav.source_range.end_pos,
47
+ method_chain.source_range.end_pos)
48
48
  add_offense(node, location: location)
49
49
  end
50
50
  end
@@ -54,9 +54,8 @@ module RuboCop
54
54
  def method_chain(node)
55
55
  chain = node
56
56
  while chain.send_type?
57
- chain = chain.parent if chain.parent &&
58
- %i[send csend].include?(chain.parent.type)
59
- break
57
+ chain = chain.parent if chain.parent&.call_type?
58
+ break # FIXME: Unconditional break. Why while "loop" then?
60
59
  end
61
60
  chain
62
61
  end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ #
7
+ # This cop checks for `send`, `public_send`, and `__send__` methods
8
+ # when using mix-in.
9
+ #
10
+ # `include` and `prepend` methods were private methods until Ruby 2.0,
11
+ # they were mixed-in via `send` method. This cop uses Ruby 2.1 or
12
+ # higher style that can be called by public methods.
13
+ # And `extend` method that was originally a public method is also targeted
14
+ # for style unification.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # Foo.send(:include, Bar)
19
+ # Foo.send(:prepend, Bar)
20
+ # Foo.send(:extend, Bar)
21
+ #
22
+ # # bad
23
+ # Foo.public_send(:include, Bar)
24
+ # Foo.public_send(:prepend, Bar)
25
+ # Foo.public_send(:extend, Bar)
26
+ #
27
+ # # bad
28
+ # Foo.__send__(:include, Bar)
29
+ # Foo.__send__(:prepend, Bar)
30
+ # Foo.__send__(:extend, Bar)
31
+ #
32
+ # # good
33
+ # Foo.include Bar
34
+ # Foo.prepend Bar
35
+ # Foo.extend Bar
36
+ #
37
+ class SendWithMixinArgument < Cop
38
+ include RangeHelp
39
+
40
+ MSG = 'Use `%<method>s %<module_name>s` instead of `%<bad_method>s`.'
41
+ MIXIN_METHODS = %i[include prepend extend].freeze
42
+
43
+ def_node_matcher :send_with_mixin_argument?, <<~PATTERN
44
+ (send
45
+ (const _ _) {:send :public_send :__send__}
46
+ ({sym str} $#mixin_method?)
47
+ $(const _ _))
48
+ PATTERN
49
+
50
+ def on_send(node)
51
+ send_with_mixin_argument?(node) do |method, module_name|
52
+ message = message(
53
+ method, module_name.source, bad_location(node).source
54
+ )
55
+
56
+ add_offense(node, location: bad_location(node), message: message)
57
+ end
58
+ end
59
+
60
+ def autocorrect(node)
61
+ send_with_mixin_argument?(node) do |method, module_name|
62
+ lambda do |corrector|
63
+ corrector.replace(
64
+ bad_location(node), "#{method} #{module_name.source}"
65
+ )
66
+ end
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def bad_location(node)
73
+ loc = node.loc
74
+
75
+ range_between(loc.selector.begin_pos, loc.expression.end_pos)
76
+ end
77
+
78
+ def message(method, module_name, bad_method)
79
+ format(
80
+ MSG,
81
+ method: method, module_name: module_name, bad_method: bad_method
82
+ )
83
+ end
84
+
85
+ def mixin_method?(node)
86
+ MIXIN_METHODS.include?(node.to_sym)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -74,7 +74,7 @@ module RuboCop
74
74
  # rescue
75
75
  # # do nothing but comment
76
76
  # end
77
- class HandleExceptions < Cop
77
+ class SuppressedException < Cop
78
78
  MSG = 'Do not suppress exceptions.'
79
79
 
80
80
  def on_resbody(node)
@@ -6,9 +6,7 @@ module RuboCop
6
6
  # This cop checks for unused block arguments.
7
7
  #
8
8
  # @example
9
- #
10
9
  # # bad
11
- #
12
10
  # do_something do |used, unused|
13
11
  # puts used
14
12
  # end
@@ -21,10 +19,7 @@ module RuboCop
21
19
  # puts :baz
22
20
  # end
23
21
  #
24
- # @example
25
- #
26
- # #good
27
- #
22
+ # # good
28
23
  # do_something do |used, _unused|
29
24
  # puts used
30
25
  # end
@@ -36,6 +31,27 @@ module RuboCop
36
31
  # define_method(:foo) do |_bar|
37
32
  # puts :baz
38
33
  # end
34
+ #
35
+ # @example IgnoreEmptyBlocks: true (default)
36
+ # # good
37
+ # do_something { |unused| }
38
+ #
39
+ # @example IgnoreEmptyBlocks: false
40
+ # # bad
41
+ # do_something { |unused| }
42
+ #
43
+ # @example AllowUnusedKeywordArguments: false (default)
44
+ # # bad
45
+ # do_something do |unused: 42|
46
+ # foo
47
+ # end
48
+ #
49
+ # @example AllowUnusedKeywordArguments: true
50
+ # # good
51
+ # do_something do |unused: 42|
52
+ # foo
53
+ # end
54
+ #
39
55
  class UnusedBlockArgument < Cop
40
56
  include UnusedArgument
41
57
 
@@ -6,20 +6,38 @@ module RuboCop
6
6
  # This cop checks for unused method arguments.
7
7
  #
8
8
  # @example
9
- #
10
9
  # # bad
11
- #
12
10
  # def some_method(used, unused, _unused_but_allowed)
13
11
  # puts used
14
12
  # end
15
13
  #
16
- # @example
17
- #
18
14
  # # good
19
- #
20
15
  # def some_method(used, _unused, _unused_but_allowed)
21
16
  # puts used
22
17
  # end
18
+ #
19
+ # @example AllowUnusedKeywordArguments: false (default)
20
+ # # bad
21
+ # def do_something(used, unused: 42)
22
+ # used
23
+ # end
24
+ #
25
+ # @example AllowUnusedKeywordArguments: true
26
+ # # good
27
+ # def do_something(used, unused: 42)
28
+ # used
29
+ # end
30
+ #
31
+ # @example IgnoreEmptyMethods: true (default)
32
+ # # good
33
+ # def do_something(unused)
34
+ # end
35
+ #
36
+ # @example IgnoreEmptyMethods: false
37
+ # # bad
38
+ # def do_something(unused)
39
+ # end
40
+ #
23
41
  class UnusedMethodArgument < Cop
24
42
  include UnusedArgument
25
43
 
@@ -9,23 +9,64 @@ module RuboCop
9
9
  # always being defined, and thus access modifiers guarding such methods
10
10
  # are not redundant.
11
11
  #
12
- # @example
12
+ # This cop has `ContextCreatingMethods` option. The default setting value
13
+ # is an empty array that means no method is specified.
14
+ # This setting is an array of methods which, when called, are known to
15
+ # create its own context in the module's current access context.
16
+ #
17
+ # It also has `MethodCreatingMethods` option. The default setting value
18
+ # is an empty array that means no method is specified.
19
+ # This setting is an array of methods which, when called, are known to
20
+ # create other methods in the module's current access context.
13
21
  #
22
+ # @example
23
+ # # bad
14
24
  # class Foo
15
25
  # public # this is redundant (default access is public)
16
26
  #
17
27
  # def method
18
28
  # end
29
+ # end
19
30
  #
20
- # private # this is not redundant (a method is defined)
21
- # def method2
31
+ # # bad
32
+ # class Foo
33
+ # # The following is redundant (methods defined on the class'
34
+ # # singleton class are not affected by the public modifier)
35
+ # public
36
+ #
37
+ # def self.method3
22
38
  # end
39
+ # end
23
40
  #
41
+ # # bad
42
+ # class Foo
43
+ # protected
44
+ #
45
+ # define_method(:method2) do
46
+ # end
47
+ #
48
+ # protected # this is redundant (repeated from previous modifier)
49
+ #
50
+ # [1,2,3].each do |i|
51
+ # define_method("foo#{i}") do
52
+ # end
53
+ # end
54
+ # end
55
+ #
56
+ # # bad
57
+ # class Foo
24
58
  # private # this is redundant (no following methods are defined)
25
59
  # end
26
60
  #
27
- # @example
61
+ # # good
62
+ # class Foo
63
+ # private # this is not redundant (a method is defined)
64
+ #
65
+ # def method2
66
+ # end
67
+ # end
28
68
  #
69
+ # # good
29
70
  # class Foo
30
71
  # # The following is not redundant (conditionally defined methods are
31
72
  # # considered as always defining a method)
@@ -35,31 +76,22 @@ module RuboCop
35
76
  # def method
36
77
  # end
37
78
  # end
79
+ # end
38
80
  #
39
- # protected # this is not redundant (method is defined)
81
+ # # good
82
+ # class Foo
83
+ # protected # this is not redundant (a method is defined)
40
84
  #
41
85
  # define_method(:method2) do
42
86
  # end
43
- #
44
- # protected # this is redundant (repeated from previous modifier)
45
- #
46
- # [1,2,3].each do |i|
47
- # define_method("foo#{i}") do
48
- # end
49
- # end
50
- #
51
- # # The following is redundant (methods defined on the class'
52
- # # singleton class are not affected by the public modifier)
53
- # public
54
- #
55
- # def self.method3
56
- # end
57
87
  # end
58
88
  #
59
- # @example
89
+ # @example ContextCreatingMethods: concerning
60
90
  # # Lint/UselessAccessModifier:
61
91
  # # ContextCreatingMethods:
62
92
  # # - concerning
93
+ #
94
+ # # good
63
95
  # require 'active_support/concern'
64
96
  # class Foo
65
97
  # concerning :Bar do
@@ -79,10 +111,12 @@ module RuboCop
79
111
  # end
80
112
  # end
81
113
  #
82
- # @example
114
+ # @example MethodCreatingMethods: delegate
83
115
  # # Lint/UselessAccessModifier:
84
116
  # # MethodCreatingMethods:
85
117
  # # - delegate
118
+ #
119
+ # # good
86
120
  # require 'active_support/core_ext/module/delegation'
87
121
  # class Foo
88
122
  # # this is not redundant because `delegate` creates methods
@@ -141,7 +175,7 @@ module RuboCop
141
175
 
142
176
  def access_modifier?(node)
143
177
  node.bare_access_modifier? ||
144
- node.method_name == :private_class_method
178
+ node.method?(:private_class_method)
145
179
  end
146
180
 
147
181
  def check_scope(node)
@@ -169,7 +203,7 @@ module RuboCop
169
203
  def check_send_node(node, cur_vis, unused)
170
204
  if node.bare_access_modifier?
171
205
  check_new_visibility(node, unused, node.method_name, cur_vis)
172
- elsif node.method_name == :private_class_method && !node.arguments?
206
+ elsif node.method?(:private_class_method) && !node.arguments?
173
207
  add_offense(node, message: format(MSG, current: node.method_name))
174
208
  [cur_vis, unused]
175
209
  end