rubocop 0.87.1 → 0.89.1

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 (339) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +153 -22
  5. data/lib/rubocop.rb +22 -4
  6. data/lib/rubocop/cli.rb +2 -2
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +3 -3
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +20 -3
  14. data/lib/rubocop/config_loader.rb +22 -9
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -1
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +14 -6
  22. data/lib/rubocop/cop/commissioner.rb +0 -1
  23. data/lib/rubocop/cop/cop.rb +1 -1
  24. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  25. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  26. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  27. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  28. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  29. data/lib/rubocop/cop/force.rb +1 -0
  30. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  31. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  32. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  33. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  35. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  36. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  37. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  38. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  39. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  40. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  41. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  42. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  43. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  44. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  45. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  46. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  47. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  48. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  49. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -5
  50. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  51. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  52. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  53. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  54. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  55. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  56. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  57. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  58. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  59. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  60. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  61. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  62. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  63. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  64. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  65. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  66. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  67. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  68. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  69. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  70. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  71. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  72. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  73. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  74. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  75. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  76. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  77. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  78. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  79. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  80. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  82. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  83. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  84. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  85. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  86. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  87. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  88. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  89. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  90. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  91. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  92. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  93. data/lib/rubocop/cop/lint/loop.rb +23 -2
  94. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  95. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  96. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  97. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  98. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  99. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  100. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  101. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  102. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  103. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  104. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  105. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  106. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  107. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  108. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  109. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  110. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  111. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  112. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  113. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  114. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  115. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  116. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  117. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  118. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  119. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  120. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  121. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  122. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  123. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  124. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  125. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  126. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  127. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  128. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  129. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  130. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  131. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  132. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  133. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  134. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  135. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  136. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  137. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  138. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  139. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  140. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  141. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  142. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  143. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  144. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  145. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  146. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  147. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  148. data/lib/rubocop/cop/lint/void.rb +3 -7
  149. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  150. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  151. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  152. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  153. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  154. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  155. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  156. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  157. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  158. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  159. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  160. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  161. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  162. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  163. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  164. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  165. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  166. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  167. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  168. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  169. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  170. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  171. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  172. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  173. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  174. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  175. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  176. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  177. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  178. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  179. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  180. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  181. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  182. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  183. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  184. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  185. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  186. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  187. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  188. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  189. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  190. data/lib/rubocop/cop/registry.rb +3 -3
  191. data/lib/rubocop/cop/security/eval.rb +2 -2
  192. data/lib/rubocop/cop/security/json_load.rb +6 -8
  193. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  194. data/lib/rubocop/cop/security/open.rb +2 -2
  195. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  196. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  197. data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
  198. data/lib/rubocop/cop/style/alias.rb +41 -36
  199. data/lib/rubocop/cop/style/and_or.rb +9 -11
  200. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  201. data/lib/rubocop/cop/style/array_join.rb +6 -8
  202. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  203. data/lib/rubocop/cop/style/attr.rb +11 -9
  204. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  205. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  206. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  207. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
  208. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  209. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  210. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  211. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  212. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  213. data/lib/rubocop/cop/style/class_check.rb +7 -9
  214. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  215. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  216. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  217. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  218. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  219. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  220. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  221. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  222. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  223. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  224. data/lib/rubocop/cop/style/copyright.rb +12 -12
  225. data/lib/rubocop/cop/style/date_time.rb +1 -1
  226. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  227. data/lib/rubocop/cop/style/dir.rb +7 -10
  228. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  229. data/lib/rubocop/cop/style/documentation.rb +6 -8
  230. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  231. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  232. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  233. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  234. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  235. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  236. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  237. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  238. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  239. data/lib/rubocop/cop/style/encoding.rb +5 -9
  240. data/lib/rubocop/cop/style/end_block.rb +4 -6
  241. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  242. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  243. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  244. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  245. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  246. data/lib/rubocop/cop/style/float_division.rb +8 -11
  247. data/lib/rubocop/cop/style/for.rb +11 -15
  248. data/lib/rubocop/cop/style/format_string.rb +21 -19
  249. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  250. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  251. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  252. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  253. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  254. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  255. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  256. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  257. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  258. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  259. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  260. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  261. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  262. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  263. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  264. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  265. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  266. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  267. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  268. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  269. data/lib/rubocop/cop/style/lambda.rb +7 -12
  270. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  271. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  272. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  273. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  274. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  275. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  276. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  277. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  278. data/lib/rubocop/cop/style/min_max.rb +8 -12
  279. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  280. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  281. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  282. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  283. data/lib/rubocop/cop/style/module_function.rb +10 -13
  284. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  285. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  286. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  287. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  288. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  289. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  290. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  291. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  292. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  293. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  294. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  295. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  296. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  297. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  298. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  299. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  300. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  301. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  302. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  303. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  304. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  305. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  306. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  307. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  308. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  309. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  310. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  311. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  312. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  313. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  314. data/lib/rubocop/cop/team.rb +1 -1
  315. data/lib/rubocop/cop/tokens_util.rb +84 -0
  316. data/lib/rubocop/cop/util.rb +3 -13
  317. data/lib/rubocop/cop/variable_force.rb +0 -2
  318. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  319. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  320. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  321. data/lib/rubocop/error.rb +1 -0
  322. data/lib/rubocop/file_finder.rb +12 -12
  323. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  324. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  325. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  326. data/lib/rubocop/options.rb +3 -3
  327. data/lib/rubocop/path_util.rb +17 -17
  328. data/lib/rubocop/rake_task.rb +1 -0
  329. data/lib/rubocop/result_cache.rb +12 -8
  330. data/lib/rubocop/rspec/expect_offense.rb +31 -5
  331. data/lib/rubocop/rspec/shared_contexts.rb +13 -14
  332. data/lib/rubocop/runner.rb +6 -7
  333. data/lib/rubocop/target_finder.rb +13 -10
  334. data/lib/rubocop/version.rb +2 -2
  335. metadata +28 -8
  336. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  337. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  338. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  339. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -73,7 +73,7 @@ module RuboCop
73
73
 
74
74
  def move_comment(node, corrector)
75
75
  LineBreakCorrector.move_comment(
76
- eol_comment: end_of_line_comment(node.source_range.line),
76
+ eol_comment: processed_source.comment_at_line(node.source_range.line),
77
77
  node: node, corrector: corrector
78
78
  )
79
79
  end
@@ -34,9 +34,10 @@ module RuboCop
34
34
  end
35
35
 
36
36
  def autocorrect(node)
37
- if style == :require_parentheses
37
+ case style
38
+ when :require_parentheses
38
39
  missing_parentheses_corrector(node)
39
- elsif style == :require_no_parentheses
40
+ when :require_no_parentheses
40
41
  unwanted_parentheses_corrector(node)
41
42
  end
42
43
  end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where string concatenation
7
+ # can be replaced with string interpolation.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # email_with_name = user.name + ' <' + user.email + '>'
12
+ #
13
+ # # good
14
+ # email_with_name = "#{user.name} <#{user.email}>"
15
+ # email_with_name = format('%s <%s>', user.name, user.email)
16
+ #
17
+ class StringConcatenation < Base
18
+ include Util
19
+ extend AutoCorrector
20
+
21
+ MSG = 'Prefer string interpolation to string concatenation.'
22
+
23
+ def_node_matcher :string_concatenation?, <<~PATTERN
24
+ {
25
+ (send str_type? :+ _)
26
+ (send _ :+ str_type?)
27
+ }
28
+ PATTERN
29
+
30
+ def on_send(node)
31
+ return unless node.method?(:+)
32
+ return unless string_concatenation?(node)
33
+
34
+ topmost_plus_node = find_topmost_plus_node(node)
35
+
36
+ parts = []
37
+ collect_parts(topmost_plus_node, parts)
38
+
39
+ add_offense(topmost_plus_node) do |corrector|
40
+ corrector.replace(topmost_plus_node, replacement(parts))
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def find_topmost_plus_node(node)
47
+ current = node
48
+ while (parent = current.parent) && plus_node?(parent)
49
+ current = parent
50
+ end
51
+ current
52
+ end
53
+
54
+ def collect_parts(node, parts)
55
+ return unless node
56
+
57
+ if plus_node?(node)
58
+ collect_parts(node.receiver, parts)
59
+ collect_parts(node.first_argument, parts)
60
+ else
61
+ parts << node
62
+ end
63
+ end
64
+
65
+ def plus_node?(node)
66
+ node.send_type? && node.method?(:+)
67
+ end
68
+
69
+ def replacement(parts)
70
+ interpolated_parts =
71
+ parts.map do |part|
72
+ if part.str_type?
73
+ if single_quoted?(part)
74
+ part.value.gsub('\\') { '\\\\' }
75
+ else
76
+ escape_string(part.value)
77
+ end
78
+ else
79
+ "\#{#{part.source}}"
80
+ end
81
+ end
82
+
83
+ "\"#{interpolated_parts.join}\""
84
+ end
85
+
86
+ def single_quoted?(str_node)
87
+ str_node.source.start_with?("'")
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -33,7 +33,7 @@ module RuboCop
33
33
 
34
34
  def autocorrect(node)
35
35
  lambda do |corrector|
36
- corrector.remove(range_with_surrounding_space(range: node.loc.keyword))
36
+ corrector.remove(range_with_surrounding_space(range: node.loc.keyword, newlines: false))
37
37
  corrector.replace(node.loc.operator, '=')
38
38
 
39
39
  correct_parent(node.parent_class, corrector)
@@ -74,7 +74,7 @@ module RuboCop
74
74
  if c.dsym_type?
75
75
  string_literal = to_string_literal(c.source)
76
76
 
77
- ':' + trim_string_interporation_escape_character(string_literal)
77
+ ":#{trim_string_interporation_escape_character(string_literal)}"
78
78
  else
79
79
  to_symbol_literal(c.value.to_s)
80
80
  end
@@ -84,7 +84,7 @@ module RuboCop
84
84
  arg_range = args.last.source_range
85
85
  arg_range = range_with_surrounding_comma(arg_range, :right)
86
86
  replacement = " &:#{method_name}"
87
- replacement = ',' + replacement unless arg_range.source.end_with?(',')
87
+ replacement = ",#{replacement}" unless arg_range.source.end_with?(',')
88
88
  corrector.insert_after(arg_range, replacement)
89
89
  corrector.remove(block_range_with_space(node))
90
90
  end
@@ -33,8 +33,8 @@ module RuboCop
33
33
  # end
34
34
  # end
35
35
  #
36
- class TrailingMethodEndStatement < Cop
37
- include Alignment
36
+ class TrailingMethodEndStatement < Base
37
+ extend AutoCorrector
38
38
 
39
39
  MSG = 'Place the end statement of a multi-line method on ' \
40
40
  'its own line.'
@@ -42,13 +42,11 @@ module RuboCop
42
42
  def on_def(node)
43
43
  return unless trailing_end?(node)
44
44
 
45
- add_offense(node, location: end_token(node).pos)
46
- end
47
-
48
- def autocorrect(node)
49
- lambda do |corrector|
50
- break_line_before_end(node, corrector)
51
- remove_semicolon(node, corrector)
45
+ add_offense(node.loc.end) do |corrector|
46
+ corrector.insert_before(
47
+ node.loc.end,
48
+ "\n#{' ' * node.loc.keyword.column}"
49
+ )
52
50
  end
53
51
  end
54
52
 
@@ -60,30 +58,9 @@ module RuboCop
60
58
  body_and_end_on_same_line?(node)
61
59
  end
62
60
 
63
- def end_token(node)
64
- tokens(node).reverse.find(&:end?)
65
- end
66
-
67
61
  def body_and_end_on_same_line?(node)
68
- end_token(node).line == token_before_end(node).line
69
- end
70
-
71
- def token_before_end(node)
72
- i = tokens(node).index(end_token(node))
73
- tokens(node)[i - 1]
74
- end
75
-
76
- def break_line_before_end(node, corrector)
77
- corrector.insert_before(
78
- end_token(node).pos,
79
- "\n" + ' ' * configured_indentation_width
80
- )
81
- end
82
-
83
- def remove_semicolon(node, corrector)
84
- return unless token_before_end(node).semicolon?
85
-
86
- corrector.remove(token_before_end(node).pos)
62
+ last_child = node.children.last
63
+ last_child.loc.last_line == node.loc.end.last_line
87
64
  end
88
65
  end
89
66
  end
@@ -30,6 +30,8 @@ module RuboCop
30
30
  NONZERO_MSG = 'Use `!empty?` instead of ' \
31
31
  '`%<lhs>s %<opr>s %<rhs>s`.'
32
32
 
33
+ LENGTH_METHODS = %i[size length].freeze
34
+
33
35
  def on_send(node)
34
36
  check_zero_length_predicate(node)
35
37
  check_nonzero_length_predicate(node)
@@ -44,31 +46,33 @@ module RuboCop
44
46
  private
45
47
 
46
48
  def check_zero_length_predicate(node)
47
- zero_length_predicate = zero_length_predicate(node)
49
+ return unless LENGTH_METHODS.include?(node.method_name)
48
50
 
51
+ zero_length_predicate = zero_length_predicate(node.parent)
49
52
  return unless zero_length_predicate
50
53
 
51
54
  lhs, opr, rhs = zero_length_predicate
52
55
 
53
- return if non_polymorphic_collection?(node)
56
+ return if non_polymorphic_collection?(node.parent)
54
57
 
55
58
  add_offense(
56
- node,
59
+ node.parent,
57
60
  message: format(ZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
58
61
  )
59
62
  end
60
63
 
61
64
  def check_nonzero_length_predicate(node)
62
- nonzero_length_predicate = nonzero_length_predicate(node)
65
+ return unless LENGTH_METHODS.include?(node.method_name)
63
66
 
67
+ nonzero_length_predicate = nonzero_length_predicate(node.parent)
64
68
  return unless nonzero_length_predicate
65
69
 
66
70
  lhs, opr, rhs = nonzero_length_predicate
67
71
 
68
- return if non_polymorphic_collection?(node)
72
+ return if non_polymorphic_collection?(node.parent)
69
73
 
70
74
  add_offense(
71
- node,
75
+ node.parent,
72
76
  message: format(NONZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
73
77
  )
74
78
  end
@@ -43,7 +43,7 @@ module RuboCop
43
43
  cop_classes = Registry.new(cop_classes.to_a) unless cop_classes.is_a?(Registry)
44
44
  only = options.fetch(:only, [])
45
45
  safe = options.fetch(:safe, false)
46
- cop_classes.enabled(config, only, safe).map do |cop_class|
46
+ cop_classes.enabled(config, only, only_safe: safe).map do |cop_class|
47
47
  cop_class.new(config, options)
48
48
  end
49
49
  end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # Common methods and behaviors for dealing with tokens.
5
+ module TokensUtil
6
+ module_function
7
+
8
+ # rubocop:disable Metrics/AbcSize
9
+ def tokens(node)
10
+ @tokens ||= {}
11
+ return @tokens[node.object_id] if @tokens[node.object_id]
12
+
13
+ @tokens[node.object_id] =
14
+ # The tokens list is always sorted by token position,
15
+ # except for cases when heredoc is passed as a method argument.
16
+ # In this case tokens are interleaved by heredoc contents' tokens.
17
+ # We can try a fast (binary) search, assuming the mentioned cases are rare,
18
+ # and fallback to linear search if failed.
19
+ if (tokens = fast_tokens(node))
20
+ tokens
21
+ else
22
+ begin_pos = node.source_range.begin_pos
23
+ end_pos = node.source_range.end_pos
24
+
25
+ processed_source.tokens.select do |token|
26
+ token.end_pos <= end_pos && token.begin_pos >= begin_pos
27
+ end
28
+ end
29
+ end
30
+ # rubocop:enable Metrics/AbcSize
31
+
32
+ def index_of_first_token(node)
33
+ index = fast_index_of_first_token(node)
34
+ return index if index
35
+
36
+ begin_pos = node.source_range.begin_pos
37
+ processed_source.tokens.index { |token| token.begin_pos == begin_pos }
38
+ end
39
+
40
+ def index_of_last_token(node)
41
+ index = fast_index_of_last_token(node)
42
+ return index if index
43
+
44
+ end_pos = node.source_range.end_pos
45
+ processed_source.tokens.index { |token| token.end_pos == end_pos }
46
+ end
47
+
48
+ private
49
+
50
+ def fast_index_of_first_token(node)
51
+ begin_pos = node.source_range.begin_pos
52
+ tokens = processed_source.tokens
53
+
54
+ index = tokens.bsearch_index { |token| token.begin_pos >= begin_pos }
55
+ index if index && tokens[index].begin_pos == begin_pos
56
+ end
57
+
58
+ def fast_index_of_last_token(node)
59
+ end_pos = node.source_range.end_pos
60
+ tokens = processed_source.tokens
61
+
62
+ index = tokens.bsearch_index { |token| token.end_pos >= end_pos }
63
+ index if index && tokens[index].end_pos == end_pos
64
+ end
65
+
66
+ def fast_tokens(node)
67
+ begin_index = index_of_first_token(node)
68
+ end_index = index_of_last_token(node)
69
+
70
+ tokens = processed_source.tokens[begin_index..end_index]
71
+ tokens if sorted_tokens?(tokens)
72
+ end
73
+
74
+ def sorted_tokens?(tokens)
75
+ prev_begin_pos = -1
76
+ tokens.each do |token|
77
+ return false if token.begin_pos < prev_begin_pos
78
+
79
+ prev_begin_pos = token.begin_pos
80
+ end
81
+ true
82
+ end
83
+ end
84
+ end
@@ -5,6 +5,7 @@ module RuboCop
5
5
  # This module contains a collection of useful utility methods.
6
6
  module Util
7
7
  include PathUtil
8
+ include TokensUtil
8
9
 
9
10
  # Match literal regex characters, not including anchors, character
10
11
  # classes, alternatives, groups, repetitions, references, etc
@@ -13,10 +14,12 @@ module RuboCop
13
14
 
14
15
  module_function
15
16
 
17
+ # This is a bad API
16
18
  def comment_line?(line_source)
17
19
  /^\s*#/.match?(line_source)
18
20
  end
19
21
 
22
+ # @deprecated Use `ProcessedSource#line_with_comment?`, `contains_comment` or similar
20
23
  def comment_lines?(node)
21
24
  processed_source[line_range(node)].any? { |line| comment_line?(line) }
22
25
  end
@@ -127,19 +130,6 @@ module RuboCop
127
130
  .sub('Style', 'Styles')
128
131
  end
129
132
 
130
- def tokens(node)
131
- @tokens ||= {}
132
- return @tokens[node.object_id] if @tokens[node.object_id]
133
-
134
- source_range = node.source_range
135
- begin_pos = source_range.begin_pos
136
- end_pos = source_range.end_pos
137
-
138
- @tokens[node.object_id] = processed_source.tokens.select do |token|
139
- token.end_pos <= end_pos && token.begin_pos >= begin_pos
140
- end
141
- end
142
-
143
133
  private
144
134
 
145
135
  def compatible_external_encoding_for?(src)
@@ -197,7 +197,6 @@ module RuboCop
197
197
  regexp.named_captures.keys
198
198
  end
199
199
 
200
- # rubocop:disable Metrics/AbcSize
201
200
  def process_variable_operator_assignment(node)
202
201
  if LOGICAL_OPERATOR_ASSIGNMENT_TYPES.include?(node.type)
203
202
  asgn_node, rhs_node = *node
@@ -232,7 +231,6 @@ module RuboCop
232
231
 
233
232
  skip_children!
234
233
  end
235
- # rubocop:enable Metrics/AbcSize
236
234
 
237
235
  def process_variable_multiple_assignment(node)
238
236
  lhs_node, rhs_node = *node
@@ -49,6 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def self.inherited(subclass)
52
+ super
52
53
  classes << subclass
53
54
  end
54
55
 
@@ -38,14 +38,14 @@ module RuboCop
38
38
  !@references.empty?
39
39
  end
40
40
 
41
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
41
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
42
42
  def reference!(node)
43
43
  reference = Reference.new(node, @scope)
44
44
  @references << reference
45
- consumed_branches = Set.new
45
+ consumed_branches = nil
46
46
 
47
47
  @assignments.reverse_each do |assignment|
48
- next if consumed_branches.include?(assignment.branch)
48
+ next if consumed_branches&.include?(assignment.branch)
49
49
 
50
50
  assignment.reference!(node) unless assignment.run_exclusively_with?(reference)
51
51
 
@@ -58,10 +58,12 @@ module RuboCop
58
58
 
59
59
  break if !assignment.branch || assignment.branch == reference.branch
60
60
 
61
- consumed_branches << assignment.branch unless assignment.branch.may_run_incompletely?
61
+ unless assignment.branch.may_run_incompletely?
62
+ (consumed_branches ||= Set.new) << assignment.branch
63
+ end
62
64
  end
63
65
  end
64
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
66
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
65
67
 
66
68
  def in_modifier_if?(assignment)
67
69
  parent = assignment.node.parent