rubocop 0.72.0 → 0.76.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 (249) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/bin/console +1 -0
  4. data/config/default.yml +93 -56
  5. data/lib/rubocop.rb +21 -10
  6. data/lib/rubocop/ast/builder.rb +1 -0
  7. data/lib/rubocop/ast/node.rb +12 -14
  8. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +4 -4
  9. data/lib/rubocop/ast/node/return_node.rb +24 -0
  10. data/lib/rubocop/ast/traversal.rb +3 -3
  11. data/lib/rubocop/cli.rb +7 -4
  12. data/lib/rubocop/comment_config.rb +5 -4
  13. data/lib/rubocop/config.rb +28 -537
  14. data/lib/rubocop/config_loader.rb +21 -3
  15. data/lib/rubocop/config_loader_resolver.rb +4 -3
  16. data/lib/rubocop/config_obsoletion.rb +222 -0
  17. data/lib/rubocop/config_validator.rb +248 -0
  18. data/lib/rubocop/cop/autocorrect_logic.rb +71 -1
  19. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  20. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  21. data/lib/rubocop/cop/commissioner.rb +18 -16
  22. data/lib/rubocop/cop/cop.rb +49 -14
  23. data/lib/rubocop/cop/corrector.rb +10 -10
  24. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  25. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +2 -2
  26. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  27. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  28. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  29. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  30. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  31. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  32. data/lib/rubocop/cop/generator.rb +4 -4
  33. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  34. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  35. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
  36. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  37. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
  38. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  39. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
  40. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  41. data/lib/rubocop/cop/layout/align_hash.rb +6 -2
  42. data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
  43. data/lib/rubocop/cop/layout/class_structure.rb +1 -1
  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 +14 -59
  52. data/lib/rubocop/cop/layout/indent_assignment.rb +10 -1
  53. data/lib/rubocop/cop/layout/indent_first_argument.rb +10 -8
  54. data/lib/rubocop/cop/layout/indent_first_hash_element.rb +1 -1
  55. data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -3
  56. data/lib/rubocop/cop/layout/indentation_width.rb +20 -6
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
  58. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  59. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  60. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +20 -4
  61. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  62. data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
  63. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  64. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
  65. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
  66. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  67. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
  68. data/lib/rubocop/cop/layout/tab.rb +10 -22
  69. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  70. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  71. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
  72. data/lib/rubocop/cop/lint/debugger.rb +4 -6
  73. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
  74. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  75. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
  76. data/lib/rubocop/cop/lint/erb_new_arguments.rb +62 -5
  77. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
  78. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  79. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  80. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
  81. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  82. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  83. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
  84. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  85. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  86. data/lib/rubocop/cop/lint/number_conversion.rb +3 -3
  87. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  88. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +24 -24
  89. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
  90. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +2 -2
  91. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +12 -7
  92. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  93. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  94. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +10 -11
  95. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  96. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  97. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  98. data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
  99. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  100. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  101. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  102. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  103. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
  104. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
  105. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  106. data/lib/rubocop/cop/lint/void.rb +7 -26
  107. data/lib/rubocop/cop/message_annotator.rb +16 -7
  108. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  109. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  110. data/lib/rubocop/cop/metrics/line_length.rb +7 -4
  111. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  112. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  113. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  114. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  115. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  116. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  117. data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
  118. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
  119. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
  120. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  121. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  122. data/lib/rubocop/cop/mixin/method_complexity.rb +3 -2
  123. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
  124. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
  125. data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
  126. data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
  127. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
  128. data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
  129. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  130. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  131. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  132. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  133. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  134. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  135. data/lib/rubocop/cop/offense.rb +18 -7
  136. data/lib/rubocop/cop/registry.rb +22 -1
  137. data/lib/rubocop/cop/security/eval.rb +1 -1
  138. data/lib/rubocop/cop/security/json_load.rb +1 -1
  139. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  140. data/lib/rubocop/cop/security/open.rb +1 -1
  141. data/lib/rubocop/cop/security/yaml_load.rb +1 -1
  142. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  143. data/lib/rubocop/cop/style/alias.rb +1 -1
  144. data/lib/rubocop/cop/style/attr.rb +2 -2
  145. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  146. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
  147. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  148. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  149. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  150. data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
  151. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -8
  152. data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
  153. data/lib/rubocop/cop/style/copyright.rb +11 -7
  154. data/lib/rubocop/cop/style/date_time.rb +3 -3
  155. data/lib/rubocop/cop/style/dir.rb +1 -1
  156. data/lib/rubocop/cop/style/documentation_method.rb +45 -1
  157. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  158. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  159. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  160. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  161. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  162. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  163. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  164. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  165. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -4
  166. data/lib/rubocop/cop/style/float_division.rb +4 -4
  167. data/lib/rubocop/cop/style/format_string.rb +17 -14
  168. data/lib/rubocop/cop/style/format_string_token.rb +19 -68
  169. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
  170. data/lib/rubocop/cop/style/guard_clause.rb +39 -10
  171. data/lib/rubocop/cop/style/hash_syntax.rb +4 -4
  172. data/lib/rubocop/cop/style/if_unless_modifier.rb +58 -15
  173. data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
  174. data/lib/rubocop/cop/style/inverse_methods.rb +21 -15
  175. data/lib/rubocop/cop/style/lambda.rb +0 -2
  176. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  177. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
  178. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  179. data/lib/rubocop/cop/style/min_max.rb +1 -1
  180. data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
  181. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  182. data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
  183. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  184. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  185. data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
  186. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  187. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
  188. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  189. data/lib/rubocop/cop/style/or_assignment.rb +8 -3
  190. data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
  191. data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
  192. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  193. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  194. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
  195. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  196. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  197. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  198. data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
  199. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  200. data/lib/rubocop/cop/style/redundant_return.rb +37 -21
  201. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  202. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +4 -4
  203. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  204. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  205. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  206. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  207. data/lib/rubocop/cop/style/safe_navigation.rb +24 -4
  208. data/lib/rubocop/cop/style/sample.rb +1 -1
  209. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  210. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  211. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  212. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  213. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
  214. data/lib/rubocop/cop/style/strip.rb +1 -1
  215. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  216. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  217. data/lib/rubocop/cop/style/ternary_parentheses.rb +20 -1
  218. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
  219. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  220. data/lib/rubocop/cop/style/unpack_first.rb +1 -1
  221. data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
  222. data/lib/rubocop/cop/style/zero_length_predicate.rb +5 -5
  223. data/lib/rubocop/cop/team.rb +15 -14
  224. data/lib/rubocop/cop/util.rb +1 -1
  225. data/lib/rubocop/cop/utils/format_string.rb +120 -0
  226. data/lib/rubocop/cop/variable_force.rb +7 -5
  227. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  228. data/lib/rubocop/core_ext/string.rb +0 -24
  229. data/lib/rubocop/error.rb +23 -0
  230. data/lib/rubocop/formatter/clang_style_formatter.rb +8 -3
  231. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  232. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  233. data/lib/rubocop/formatter/formatter_set.rb +16 -15
  234. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  235. data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
  236. data/lib/rubocop/formatter/tap_formatter.rb +17 -4
  237. data/lib/rubocop/magic_comment.rb +4 -0
  238. data/lib/rubocop/node_pattern.rb +5 -3
  239. data/lib/rubocop/options.rb +33 -21
  240. data/lib/rubocop/path_util.rb +1 -1
  241. data/lib/rubocop/processed_source.rb +4 -0
  242. data/lib/rubocop/result_cache.rb +1 -1
  243. data/lib/rubocop/rspec/expect_offense.rb +4 -1
  244. data/lib/rubocop/rspec/shared_contexts.rb +12 -0
  245. data/lib/rubocop/runner.rb +42 -31
  246. data/lib/rubocop/target_finder.rb +12 -4
  247. data/lib/rubocop/version.rb +1 -1
  248. metadata +21 -12
  249. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
@@ -6,6 +6,11 @@ module RuboCop
6
6
  # This cop checks for the presence of superfluous parentheses around the
7
7
  # condition of if/unless/while/until.
8
8
  #
9
+ # `AllowSafeAssignment` option for safe assignment.
10
+ # By safe assignment we mean putting parentheses around
11
+ # an assignment to indicate "I know I'm using an assignment
12
+ # as a condition. It's not a mistake."
13
+ #
9
14
  # @example
10
15
  # # bad
11
16
  # x += 1 while (x < 10)
@@ -23,6 +28,14 @@ module RuboCop
23
28
  # elsif x < 3
24
29
  # end
25
30
  #
31
+ # @example AllowSafeAssignment: true (default)
32
+ # # good
33
+ # foo unless (bar = baz)
34
+ #
35
+ # @example AllowSafeAssignment: false
36
+ # # bad
37
+ # foo unless (bar = baz)
38
+ #
26
39
  # @example AllowInMultilineConditions: false (default)
27
40
  # # bad
28
41
  # if (x > 10 &&
@@ -39,6 +52,7 @@ module RuboCop
39
52
  # if (x > 10 &&
40
53
  # y > 10)
41
54
  # end
55
+ #
42
56
  class ParenthesesAroundCondition < Cop
43
57
  include SafeAssignment
44
58
  include Parentheses
@@ -60,7 +74,7 @@ module RuboCop
60
74
 
61
75
  private
62
76
 
63
- def_node_matcher :control_op_condition, <<-PATTERN
77
+ def_node_matcher :control_op_condition, <<~PATTERN
64
78
  (begin $_ ...)
65
79
  PATTERN
66
80
 
@@ -27,7 +27,7 @@ module RuboCop
27
27
  MSG = 'Prefer ranges when generating random numbers instead of ' \
28
28
  'integers with offsets.'
29
29
 
30
- def_node_matcher :integer_op_rand?, <<-PATTERN
30
+ def_node_matcher :integer_op_rand?, <<~PATTERN
31
31
  (send
32
32
  int {:+ :-}
33
33
  (send
@@ -36,7 +36,7 @@ module RuboCop
36
36
  {int irange erange}))
37
37
  PATTERN
38
38
 
39
- def_node_matcher :rand_op_integer?, <<-PATTERN
39
+ def_node_matcher :rand_op_integer?, <<~PATTERN
40
40
  (send
41
41
  (send
42
42
  {nil? (const nil? :Random) (const nil? :Kernel)}
@@ -46,7 +46,7 @@ module RuboCop
46
46
  int)
47
47
  PATTERN
48
48
 
49
- def_node_matcher :rand_modified?, <<-PATTERN
49
+ def_node_matcher :rand_modified?, <<~PATTERN
50
50
  (send
51
51
  (send
52
52
  {nil? (const nil? :Random) (const nil? :Kernel)}
@@ -80,7 +80,7 @@ module RuboCop
80
80
 
81
81
  private
82
82
 
83
- def_node_matcher :random_call, <<-PATTERN
83
+ def_node_matcher :random_call, <<~PATTERN
84
84
  {(send (send $_ _ $_) ...)
85
85
  (send _ _ (send $_ _ $_))}
86
86
  PATTERN
@@ -128,7 +128,7 @@ module RuboCop
128
128
  end
129
129
  end
130
130
 
131
- def_node_matcher :namespace, <<-PATTERN
131
+ def_node_matcher :namespace, <<~PATTERN
132
132
  {$nil? (const nil? $_)}
133
133
  PATTERN
134
134
 
@@ -149,7 +149,7 @@ module RuboCop
149
149
  end
150
150
  end
151
151
 
152
- def_node_matcher :to_int, <<-PATTERN
152
+ def_node_matcher :to_int, <<~PATTERN
153
153
  (int $_)
154
154
  PATTERN
155
155
  end
@@ -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
@@ -53,11 +53,11 @@ module RuboCop
53
53
  format(MSG, msg: msg)
54
54
  end
55
55
 
56
- def_node_matcher :redundant_condition?, <<-RUBY
56
+ def_node_matcher :redundant_condition?, <<~RUBY
57
57
  (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) true false)
58
58
  RUBY
59
59
 
60
- def_node_matcher :redundant_condition_inverted?, <<-RUBY
60
+ def_node_matcher :redundant_condition_inverted?, <<~RUBY
61
61
  (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) false true)
62
62
  RUBY
63
63
 
@@ -47,11 +47,11 @@ module RuboCop
47
47
  end
48
48
  end
49
49
 
50
- def_node_matcher :exploded?, <<-PATTERN
50
+ def_node_matcher :exploded?, <<~PATTERN
51
51
  (send nil? ${:raise :fail} (const nil? :RuntimeError) $_)
52
52
  PATTERN
53
53
 
54
- def_node_matcher :compact?, <<-PATTERN
54
+ def_node_matcher :compact?, <<~PATTERN
55
55
  (send nil? {:raise :fail} $(send (const nil? :RuntimeError) :new $_))
56
56
  PATTERN
57
57
  end
@@ -51,7 +51,7 @@ module RuboCop
51
51
  end
52
52
  end
53
53
 
54
- def_node_matcher :operation_produces_immutable_object?, <<-PATTERN
54
+ def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
55
55
  {
56
56
  (begin (send {float int} {:+ :- :* :** :/ :% :<<} _))
57
57
  (begin (send !(str _) {:+ :- :* :** :/ :%} {float int}))
@@ -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.'
@@ -40,7 +40,7 @@ module RuboCop
40
40
 
41
41
  def parens_allowed?(node)
42
42
  empty_parentheses?(node) ||
43
- hash_literal_as_first_arg?(node) ||
43
+ first_arg_begins_with_hash_literal?(node) ||
44
44
  rescue?(node) ||
45
45
  allowed_expression?(node)
46
46
  end
@@ -76,12 +76,21 @@ module RuboCop
76
76
  node.children.empty?
77
77
  end
78
78
 
79
- def hash_literal_as_first_arg?(node)
80
- # Don't flag `method ({key: value})`
81
- node.children.first.hash_type? && first_argument?(node) &&
79
+ def first_arg_begins_with_hash_literal?(node)
80
+ # Don't flag `method ({key: value})` or `method ({key: value}.method)`
81
+ method_chain_begins_with_hash_literal?(node.children.first) &&
82
+ first_argument?(node) &&
82
83
  !parentheses?(node.parent)
83
84
  end
84
85
 
86
+ def method_chain_begins_with_hash_literal?(node)
87
+ return false if node.nil?
88
+ return true if node.hash_type?
89
+ return false unless node.send_type?
90
+
91
+ method_chain_begins_with_hash_literal?(node.children.first)
92
+ end
93
+
85
94
  def check(begin_node)
86
95
  node = begin_node.children.first
87
96
  if keyword_with_redundant_parentheses?(node)
@@ -203,11 +212,11 @@ module RuboCop
203
212
  first_send_argument?(node) || first_super_argument?(node)
204
213
  end
205
214
 
206
- def_node_matcher :first_send_argument?, <<-PATTERN
215
+ def_node_matcher :first_send_argument?, <<~PATTERN
207
216
  ^(send _ _ equal?(%0) ...)
208
217
  PATTERN
209
218
 
210
- def_node_matcher :first_super_argument?, <<-PATTERN
219
+ def_node_matcher :first_super_argument?, <<~PATTERN
211
220
  ^(super equal?(%0) ...)
212
221
  PATTERN
213
222
 
@@ -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 ' \
@@ -35,6 +35,18 @@ module RuboCop
35
35
  # end
36
36
  # end
37
37
  #
38
+ # @example AllowMultipleReturnValues: false (default)
39
+ # # bad
40
+ # def test
41
+ # return x, y
42
+ # end
43
+ #
44
+ # @example AllowMultipleReturnValues: true
45
+ # # good
46
+ # def test
47
+ # return x, y
48
+ # end
49
+ #
38
50
  class RedundantReturn < Cop
39
51
  include RangeHelp
40
52
 
@@ -48,27 +60,38 @@ module RuboCop
48
60
  end
49
61
  alias on_defs on_def
50
62
 
51
- def autocorrect(node) # rubocop:disable Metrics/MethodLength
63
+ def autocorrect(node)
52
64
  lambda do |corrector|
53
- unless arguments?(node.children)
54
- corrector.replace(node.source_range, 'nil')
55
- next
65
+ if node.arguments?
66
+ correct_with_arguments(node, corrector)
67
+ else
68
+ correct_without_arguments(node, corrector)
56
69
  end
57
-
58
- return_value, = *node
59
- if node.children.size > 1
60
- add_brackets(corrector, node)
61
- elsif return_value.hash_type?
62
- add_braces(corrector, return_value) unless return_value.braces?
63
- end
64
- return_kw = range_with_surrounding_space(range: node.loc.keyword,
65
- side: :right)
66
- corrector.remove(return_kw)
67
70
  end
68
71
  end
69
72
 
70
73
  private
71
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
+
72
95
  def add_brackets(corrector, node)
73
96
  kids = node.children.map(&:source_range)
74
97
  corrector.insert_before(kids.first, '[')
@@ -81,13 +104,6 @@ module RuboCop
81
104
  corrector.insert_after(kids.last, '}')
82
105
  end
83
106
 
84
- def arguments?(args)
85
- return false if args.empty?
86
- return true if args.size > 1
87
-
88
- !args.first.begin_type? || !args.first.children.empty?
89
- end
90
-
91
107
  # rubocop:disable Metrics/CyclomaticComplexity
92
108
  def check_branch(node)
93
109
  return unless node
@@ -83,9 +83,16 @@ module RuboCop
83
83
  on_argument(node)
84
84
  end
85
85
 
86
+ def on_masgn(node)
87
+ lhs, rhs = *node
88
+ lhs.children.each do |child|
89
+ add_lhs_to_local_variables_scopes(rhs, child.to_a.first)
90
+ end
91
+ end
92
+
86
93
  def on_lvasgn(node)
87
94
  lhs, rhs = *node
88
- @local_variables_scopes[rhs] << lhs
95
+ add_lhs_to_local_variables_scopes(rhs, lhs)
89
96
  end
90
97
 
91
98
  def on_send(node)
@@ -148,6 +155,16 @@ module RuboCop
148
155
 
149
156
  @allowed_send_nodes << node
150
157
  end
158
+
159
+ def add_lhs_to_local_variables_scopes(rhs, lhs)
160
+ if rhs&.send_type? && !rhs.arguments.empty?
161
+ rhs.arguments.each do |argument|
162
+ @local_variables_scopes[argument] << lhs
163
+ end
164
+ else
165
+ @local_variables_scopes[rhs] << lhs
166
+ end
167
+ end
151
168
  end
152
169
  end
153
170
  end
@@ -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]`.
@@ -20,7 +20,7 @@ module RuboCop
20
20
 
21
21
  MSG = 'Use `sort` instead of `sort_by { |%<var>s| %<var>s }`.'
22
22
 
23
- def_node_matcher :redundant_sort_by, <<-PATTERN
23
+ def_node_matcher :redundant_sort_by, <<~PATTERN
24
24
  (block $(send _ :sort_by) (args (arg $_x)) (lvar _x))
25
25
  PATTERN
26
26
 
@@ -5,16 +5,40 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for uses of rescue in its modifier form.
7
7
  #
8
+ # The cop to check `rescue` in its modifier form is added for following
9
+ # reasons:
10
+ #
11
+ # * The syntax of modifier form `rescue` can be misleading because it
12
+ # might led us to believe that `rescue` handles the given exception
13
+ # but it actually rescue all exceptions to return the given rescue
14
+ # block. In this case, value returned by handle_error or
15
+ # SomeException.
16
+ #
17
+ # * Modifier form `rescue` would rescue all the exceptions. It would
18
+ # silently skip all exception or errors and handle the error.
19
+ # Example: If `NoMethodError` is raised, modifier form rescue would
20
+ # handle the exception.
21
+ #
8
22
  # @example
9
23
  # # bad
10
24
  # some_method rescue handle_error
11
25
  #
26
+ # # bad
27
+ # some_method rescue SomeException
28
+ #
12
29
  # # good
13
30
  # begin
14
31
  # some_method
15
32
  # rescue
16
33
  # handle_error
17
34
  # end
35
+ #
36
+ # # good
37
+ # begin
38
+ # some_method
39
+ # rescue SomeException
40
+ # handle_error
41
+ # end
18
42
  class RescueModifier < Cop
19
43
  include Alignment
20
44
  include RescueNode
@@ -80,11 +80,11 @@ module RuboCop
80
80
  MSG_EXPLICIT = 'Avoid rescuing without specifying ' \
81
81
  'an error class.'
82
82
 
83
- def_node_matcher :rescue_without_error_class?, <<-PATTERN
83
+ def_node_matcher :rescue_without_error_class?, <<~PATTERN
84
84
  (resbody nil? _ _)
85
85
  PATTERN
86
86
 
87
- def_node_matcher :rescue_standard_error?, <<-PATTERN
87
+ def_node_matcher :rescue_standard_error?, <<~PATTERN
88
88
  (resbody $(array (const nil? :StandardError)) _ _)
89
89
  PATTERN
90
90