rubocop 0.87.0 → 0.90.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 (508) 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 +232 -33
  5. data/lib/rubocop.rb +36 -4
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli.rb +2 -2
  8. data/lib/rubocop/cli/command.rb +1 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
  10. data/lib/rubocop/cli/command/base.rb +2 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +2 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  14. data/lib/rubocop/cli/command/version.rb +3 -2
  15. data/lib/rubocop/cli/environment.rb +1 -0
  16. data/lib/rubocop/comment_config.rb +10 -7
  17. data/lib/rubocop/config.rb +20 -3
  18. data/lib/rubocop/config_loader.rb +39 -16
  19. data/lib/rubocop/config_loader_resolver.rb +4 -3
  20. data/lib/rubocop/config_obsoletion.rb +7 -1
  21. data/lib/rubocop/config_store.rb +4 -0
  22. data/lib/rubocop/config_validator.rb +5 -4
  23. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  24. data/lib/rubocop/cop/badge.rb +1 -1
  25. data/lib/rubocop/cop/base.rb +37 -6
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
  27. data/lib/rubocop/cop/commissioner.rb +47 -8
  28. data/lib/rubocop/cop/cop.rb +1 -1
  29. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  30. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  31. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +6 -6
  33. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
  34. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  36. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  37. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  38. data/lib/rubocop/cop/documentation.rb +22 -0
  39. data/lib/rubocop/cop/force.rb +1 -0
  40. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  41. data/lib/rubocop/cop/generator.rb +1 -0
  42. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  43. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  44. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  45. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  46. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  47. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  48. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  49. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  50. data/lib/rubocop/cop/layout/class_structure.rb +15 -53
  51. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  52. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  53. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  54. data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
  55. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  56. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  57. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  58. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  59. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
  60. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  61. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  62. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
  63. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  64. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  65. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  68. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  69. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/end_alignment.rb +9 -9
  72. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  74. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  75. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  76. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  77. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  78. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  79. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  80. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  81. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  82. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  83. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  86. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  87. data/lib/rubocop/cop/layout/multiline_block_layout.rb +37 -24
  88. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  89. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  91. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  92. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -23
  94. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  95. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  96. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  97. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  98. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  99. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  103. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  104. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  105. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  106. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  107. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  108. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  109. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  110. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +16 -18
  111. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  112. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  113. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
  114. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  115. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  116. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  117. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
  118. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  119. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  120. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  121. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  122. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  123. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  124. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  125. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  126. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  127. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  128. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  129. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  130. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  131. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  132. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  133. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  134. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  135. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  136. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  137. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  138. data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
  139. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
  140. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  141. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  142. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  143. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  144. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  145. data/lib/rubocop/cop/lint/empty_file.rb +53 -0
  146. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  147. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  148. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  149. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  150. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  151. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  152. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  153. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  154. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  156. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  157. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  158. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  159. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  160. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  161. data/lib/rubocop/cop/lint/loop.rb +23 -2
  162. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  163. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  164. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  165. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  166. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  167. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  168. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  169. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  171. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  172. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  173. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +80 -0
  174. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  175. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  176. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  177. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  178. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  179. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  180. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  181. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  182. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  183. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  184. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  185. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  186. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  187. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  188. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  189. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  190. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  191. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  192. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  193. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  194. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  195. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  196. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  197. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  198. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  199. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  200. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  201. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  202. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  203. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  204. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  205. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  206. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  207. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  208. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  209. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  210. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  211. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  212. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  213. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  214. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  215. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  216. data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
  217. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  218. data/lib/rubocop/cop/lint/void.rb +3 -7
  219. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  220. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  221. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  222. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  223. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  224. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  225. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  226. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  227. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  228. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +50 -5
  229. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  230. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  231. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  232. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  233. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  234. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  235. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  236. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  237. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  238. data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
  239. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  240. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  241. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
  242. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  243. data/lib/rubocop/cop/mixin/hash_transform_method.rb +22 -11
  244. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  245. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  246. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  247. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  248. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  249. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  250. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  251. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  252. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  253. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  254. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  255. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  256. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  257. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  258. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  259. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  260. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  261. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  262. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  263. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  264. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  265. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  266. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  267. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  268. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  269. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  270. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  272. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  273. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  274. data/lib/rubocop/cop/offense.rb +1 -0
  275. data/lib/rubocop/cop/registry.rb +3 -3
  276. data/lib/rubocop/cop/security/eval.rb +2 -2
  277. data/lib/rubocop/cop/security/json_load.rb +6 -8
  278. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  279. data/lib/rubocop/cop/security/open.rb +2 -2
  280. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  281. data/lib/rubocop/cop/severity.rb +0 -8
  282. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  283. data/lib/rubocop/cop/style/accessor_grouping.rb +33 -20
  284. data/lib/rubocop/cop/style/alias.rb +41 -36
  285. data/lib/rubocop/cop/style/and_or.rb +9 -11
  286. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  287. data/lib/rubocop/cop/style/array_join.rb +6 -8
  288. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  289. data/lib/rubocop/cop/style/attr.rb +11 -9
  290. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  291. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  292. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  293. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +58 -38
  294. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  295. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  296. data/lib/rubocop/cop/style/case_equality.rb +29 -5
  297. data/lib/rubocop/cop/style/case_like_if.rb +236 -0
  298. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  299. data/lib/rubocop/cop/style/class_check.rb +7 -9
  300. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  301. data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
  302. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  303. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  304. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  305. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  306. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  307. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  308. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  309. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  310. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  311. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  312. data/lib/rubocop/cop/style/copyright.rb +12 -12
  313. data/lib/rubocop/cop/style/date_time.rb +1 -1
  314. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  315. data/lib/rubocop/cop/style/dir.rb +7 -10
  316. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  317. data/lib/rubocop/cop/style/documentation.rb +6 -8
  318. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  319. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  320. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  321. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  322. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  323. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  324. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  325. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  326. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  327. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  328. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  329. data/lib/rubocop/cop/style/encoding.rb +5 -9
  330. data/lib/rubocop/cop/style/end_block.rb +4 -6
  331. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  332. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  333. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  334. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  335. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  336. data/lib/rubocop/cop/style/float_division.rb +8 -11
  337. data/lib/rubocop/cop/style/for.rb +11 -15
  338. data/lib/rubocop/cop/style/format_string.rb +21 -19
  339. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  340. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  341. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  342. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  343. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  344. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  345. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  346. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  347. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  348. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -3
  349. data/lib/rubocop/cop/style/hash_transform_values.rb +16 -2
  350. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  351. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  352. data/lib/rubocop/cop/style/if_unless_modifier.rb +19 -41
  353. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  354. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  355. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  356. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  357. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  358. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  359. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  360. data/lib/rubocop/cop/style/lambda.rb +7 -12
  361. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  362. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  363. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  365. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  366. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  367. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  368. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  369. data/lib/rubocop/cop/style/min_max.rb +8 -12
  370. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  371. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  372. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  373. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  374. data/lib/rubocop/cop/style/module_function.rb +10 -13
  375. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  376. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  377. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  378. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  379. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  380. data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
  381. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  382. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  383. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  384. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  385. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  386. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  387. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  388. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  389. data/lib/rubocop/cop/style/next.rb +10 -14
  390. data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
  391. data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
  392. data/lib/rubocop/cop/style/not.rb +19 -26
  393. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  394. data/lib/rubocop/cop/style/numeric_predicate.rb +11 -15
  395. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  396. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  397. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  398. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  399. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  400. data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
  401. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  402. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
  403. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  404. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  405. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
  406. data/lib/rubocop/cop/style/proc.rb +6 -6
  407. data/lib/rubocop/cop/style/raise_args.rb +13 -24
  408. data/lib/rubocop/cop/style/random_with_offset.rb +16 -16
  409. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  410. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  411. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  412. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  413. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  414. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  415. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  416. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
  417. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  418. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
  419. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  420. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -25
  421. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  422. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  423. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  424. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  426. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  427. data/lib/rubocop/cop/style/safe_navigation.rb +17 -16
  428. data/lib/rubocop/cop/style/sample.rb +10 -13
  429. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  430. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  431. data/lib/rubocop/cop/style/send.rb +2 -2
  432. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  433. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  434. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  435. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  436. data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
  437. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  438. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  439. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -20
  440. data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
  441. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  442. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  443. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  444. data/lib/rubocop/cop/style/strip.rb +8 -14
  445. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  446. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  447. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  448. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  449. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  450. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  451. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  452. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  453. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  454. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  455. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  456. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  457. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  458. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  459. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  460. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  461. data/lib/rubocop/cop/style/unpack_first.rb +4 -8
  462. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  463. data/lib/rubocop/cop/style/when_then.rb +4 -6
  464. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  465. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  466. data/lib/rubocop/cop/style/word_array.rb +5 -23
  467. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  468. data/lib/rubocop/cop/style/zero_length_predicate.rb +19 -17
  469. data/lib/rubocop/cop/team.rb +2 -1
  470. data/lib/rubocop/cop/tokens_util.rb +84 -0
  471. data/lib/rubocop/cop/util.rb +3 -13
  472. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  473. data/lib/rubocop/cop/variable_force.rb +2 -2
  474. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  475. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  476. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  477. data/lib/rubocop/core_ext/string.rb +1 -1
  478. data/lib/rubocop/error.rb +1 -0
  479. data/lib/rubocop/ext/regexp_node.rb +46 -0
  480. data/lib/rubocop/file_finder.rb +13 -12
  481. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  482. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  483. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  484. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  485. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  486. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  487. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  488. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  489. data/lib/rubocop/name_similarity.rb +1 -0
  490. data/lib/rubocop/options.rb +9 -6
  491. data/lib/rubocop/path_util.rb +17 -17
  492. data/lib/rubocop/rake_task.rb +1 -0
  493. data/lib/rubocop/remote_config.rb +1 -0
  494. data/lib/rubocop/result_cache.rb +13 -8
  495. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  496. data/lib/rubocop/rspec/expect_offense.rb +49 -7
  497. data/lib/rubocop/rspec/shared_contexts.rb +25 -14
  498. data/lib/rubocop/runner.rb +7 -7
  499. data/lib/rubocop/string_interpreter.rb +3 -0
  500. data/lib/rubocop/target_finder.rb +14 -10
  501. data/lib/rubocop/target_ruby.rb +6 -0
  502. data/lib/rubocop/version.rb +3 -2
  503. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  504. metadata +42 -8
  505. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  506. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  507. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  508. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Sometimes using dig method ends up with just a single
7
+ # argument. In such cases, dig should be replaced with [].
8
+ #
9
+ # @example
10
+ # # bad
11
+ # { key: 'value' }.dig(:key)
12
+ # [1, 2, 3].dig(0)
13
+ #
14
+ # # good
15
+ # { key: 'value' }[:key]
16
+ # [1, 2, 3][0]
17
+ #
18
+ # # good
19
+ # { key1: { key2: 'value' } }.dig(:key1, :key2)
20
+ # [1, [2, [3]]].dig(1, 1)
21
+ #
22
+ # # good
23
+ # keys = %i[key1 key2]
24
+ # { key1: { key2: 'value' } }.dig(*keys)
25
+ #
26
+ class SingleArgumentDig < Base
27
+ extend AutoCorrector
28
+
29
+ MSG = 'Use `%<receiver>s[%<argument>s]` instead of `%<original>s`.'
30
+
31
+ def_node_matcher :single_argument_dig?, <<~PATTERN
32
+ (send _ :dig $!splat)
33
+ PATTERN
34
+
35
+ def on_send(node)
36
+ return unless node.receiver
37
+
38
+ expression = single_argument_dig?(node)
39
+ return unless expression
40
+
41
+ receiver = node.receiver.source
42
+ argument = expression.source
43
+
44
+ message = format(MSG, receiver: receiver, argument: argument,
45
+ original: node.source)
46
+ add_offense(node, message: message) do |corrector|
47
+ correct_access = "#{receiver}[#{argument}]"
48
+ corrector.replace(node, correct_access)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -28,7 +28,7 @@ module RuboCop
28
28
  # foo.reduce do |c, d|
29
29
  # c + d
30
30
  # end
31
- class SingleLineBlockParams < Cop
31
+ class SingleLineBlockParams < Base
32
32
  MSG = 'Name `%<method>s` block params `|%<params>s|`.'
33
33
 
34
34
  def on_block(node)
@@ -39,7 +39,9 @@ module RuboCop
39
39
 
40
40
  return if args_match?(node.send_node.method_name, node.arguments)
41
41
 
42
- add_offense(node.arguments)
42
+ message = message(node.arguments)
43
+
44
+ add_offense(node.arguments, message: message)
43
45
  end
44
46
 
45
47
  private
@@ -24,8 +24,9 @@ module RuboCop
24
24
  # # bad
25
25
  # def no_op; end
26
26
  #
27
- class SingleLineMethods < Cop
27
+ class SingleLineMethods < Base
28
28
  include Alignment
29
+ extend AutoCorrector
29
30
 
30
31
  MSG = 'Avoid single-line method definitions.'
31
32
 
@@ -33,29 +34,29 @@ module RuboCop
33
34
  return unless node.single_line?
34
35
  return if allow_empty? && !node.body
35
36
 
36
- add_offense(node)
37
+ add_offense(node) do |corrector|
38
+ autocorrect(corrector, node)
39
+ end
37
40
  end
38
41
  alias on_defs on_def
39
42
 
40
- def autocorrect(node)
41
- lambda do |corrector|
42
- each_part(node.body) do |part|
43
- LineBreakCorrector.break_line_before(
44
- range: part, node: node, corrector: corrector,
45
- configured_width: configured_indentation_width
46
- )
47
- end
43
+ private
48
44
 
45
+ def autocorrect(corrector, node)
46
+ each_part(node.body) do |part|
49
47
  LineBreakCorrector.break_line_before(
50
- range: node.loc.end, node: node, corrector: corrector,
51
- indent_steps: 0, configured_width: configured_indentation_width
48
+ range: part, node: node, corrector: corrector,
49
+ configured_width: configured_indentation_width
52
50
  )
53
-
54
- move_comment(node, corrector)
55
51
  end
56
- end
57
52
 
58
- private
53
+ LineBreakCorrector.break_line_before(
54
+ range: node.loc.end, node: node, corrector: corrector,
55
+ indent_steps: 0, configured_width: configured_indentation_width
56
+ )
57
+
58
+ move_comment(node, corrector)
59
+ end
59
60
 
60
61
  def allow_empty?
61
62
  cop_config['AllowIfMethodIsEmpty']
@@ -73,7 +74,7 @@ module RuboCop
73
74
 
74
75
  def move_comment(node, corrector)
75
76
  LineBreakCorrector.move_comment(
76
- eol_comment: end_of_line_comment(node.source_range.line),
77
+ eol_comment: processed_source.comment_at_line(node.source_range.line),
77
78
  node: node, corrector: corrector
78
79
  )
79
80
  end
@@ -12,7 +12,8 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # items[1..]
15
- class SlicingWithRange < Cop
15
+ class SlicingWithRange < Base
16
+ extend AutoCorrector
16
17
  extend TargetRubyVersion
17
18
 
18
19
  minimum_target_ruby_version 2.6
@@ -25,12 +26,8 @@ module RuboCop
25
26
  return unless node.method?(:[]) && node.arguments.count == 1
26
27
  return unless range_till_minus_one?(node.arguments.first)
27
28
 
28
- add_offense(node.arguments.first)
29
- end
30
-
31
- def autocorrect(node)
32
- lambda do |corrector|
33
- corrector.remove(node.end)
29
+ add_offense(node.first_argument) do |corrector|
30
+ corrector.remove(node.first_argument.end)
34
31
  end
35
32
  end
36
33
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # If the branch of a conditional consists solely of a conditional node,
7
+ # its conditions can be combined with the conditions of the outer branch.
8
+ # This helps to keep the nesting level from getting too deep.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # if condition_a
13
+ # if condition_b
14
+ # do_something
15
+ # end
16
+ # end
17
+ #
18
+ # # good
19
+ # if condition_a && condition_b
20
+ # do_something
21
+ # end
22
+ #
23
+ # @example AllowModifier: false (default)
24
+ # # bad
25
+ # if condition_a
26
+ # do_something if condition_b
27
+ # end
28
+ #
29
+ # @example AllowModifier: true
30
+ # # good
31
+ # if condition_a
32
+ # do_something if condition_b
33
+ # end
34
+ #
35
+ class SoleNestedConditional < Base
36
+ MSG = 'Consider merging nested conditions into '\
37
+ 'outer `%<conditional_type>s` conditions.'
38
+
39
+ def on_if(node)
40
+ return if node.ternary? || node.else? || node.elsif?
41
+
42
+ branch = node.if_branch
43
+ return unless offending_branch?(branch)
44
+
45
+ message = format(MSG, conditional_type: node.keyword)
46
+ add_offense(branch.loc.keyword, message: message)
47
+ end
48
+
49
+ private
50
+
51
+ def offending_branch?(branch)
52
+ return false unless branch
53
+
54
+ branch.if_type? &&
55
+ !branch.else? &&
56
+ !branch.ternary? &&
57
+ !(branch.modifier_form? && allow_modifier?)
58
+ end
59
+
60
+ def allow_modifier?
61
+ cop_config['AllowModifier']
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -56,8 +56,9 @@ module RuboCop
56
56
  # puts $'
57
57
  # puts $+
58
58
  #
59
- class SpecialGlobalVars < Cop
59
+ class SpecialGlobalVars < Base
60
60
  include ConfigurableEnforcedStyle
61
+ extend AutoCorrector
61
62
 
62
63
  MSG_BOTH = 'Prefer `%<prefer>s` from the stdlib \'English\' ' \
63
64
  'module (don\'t forget to require it) or `%<regular>s` over ' \
@@ -120,13 +121,14 @@ module RuboCop
120
121
  correct_style_detected
121
122
  else
122
123
  opposite_style_detected
123
- add_offense(node)
124
+
125
+ add_offense(node, message: message(global_var)) do |corrector|
126
+ autocorrect(corrector, node, global_var)
127
+ end
124
128
  end
125
129
  end
126
130
 
127
- def message(node)
128
- global_var, = *node
129
-
131
+ def message(global_var)
130
132
  if style == :use_english_names
131
133
  format_english_message(global_var)
132
134
  else
@@ -136,17 +138,10 @@ module RuboCop
136
138
  end
137
139
  end
138
140
 
139
- def autocorrect(node)
140
- lambda do |corrector|
141
- global_var, = *node
141
+ def autocorrect(corrector, node, global_var)
142
+ node = node.parent while node.parent&.begin_type? && node.parent.children.one?
142
143
 
143
- while node.parent&.begin_type? &&
144
- node.parent.children.one?
145
- node = node.parent
146
- end
147
-
148
- corrector.replace(node, replacement(node, global_var))
149
- end
144
+ corrector.replace(node, replacement(node, global_var))
150
145
  end
151
146
 
152
147
  private
@@ -19,25 +19,26 @@ module RuboCop
19
19
  #
20
20
  # # good
21
21
  # ->a,b,c { a + b + c}
22
- class StabbyLambdaParentheses < Cop
22
+ class StabbyLambdaParentheses < Base
23
23
  include ConfigurableEnforcedStyle
24
+ extend AutoCorrector
24
25
 
25
26
  MSG_REQUIRE = 'Wrap stabby lambda arguments with parentheses.'
26
27
  MSG_NO_REQUIRE = 'Do not wrap stabby lambda arguments ' \
27
28
  'with parentheses.'
28
29
  def on_send(node)
29
30
  return unless stabby_lambda_with_args?(node)
30
- return unless redundant_parentheses?(node) ||
31
- missing_parentheses?(node)
31
+ return unless redundant_parentheses?(node) || missing_parentheses?(node)
32
32
 
33
- add_offense(node.block_node.arguments)
34
- end
33
+ arguments = node.block_node.arguments
35
34
 
36
- def autocorrect(node)
37
- if style == :require_parentheses
38
- missing_parentheses_corrector(node)
39
- elsif style == :require_no_parentheses
40
- unwanted_parentheses_corrector(node)
35
+ add_offense(arguments) do |corrector|
36
+ case style
37
+ when :require_parentheses
38
+ missing_parentheses_corrector(corrector, arguments)
39
+ when :require_no_parentheses
40
+ unwanted_parentheses_corrector(corrector, arguments)
41
+ end
41
42
  end
42
43
  end
43
44
 
@@ -55,19 +56,15 @@ module RuboCop
55
56
  style == :require_parentheses ? MSG_REQUIRE : MSG_NO_REQUIRE
56
57
  end
57
58
 
58
- def missing_parentheses_corrector(node)
59
- lambda do |corrector|
60
- corrector.wrap(node, '(', ')')
61
- end
59
+ def missing_parentheses_corrector(corrector, node)
60
+ corrector.wrap(node, '(', ')')
62
61
  end
63
62
 
64
- def unwanted_parentheses_corrector(node)
65
- lambda do |corrector|
66
- args_loc = node.loc
63
+ def unwanted_parentheses_corrector(corrector, node)
64
+ args_loc = node.loc
67
65
 
68
- corrector.replace(args_loc.begin, '')
69
- corrector.remove(args_loc.end)
70
- end
66
+ corrector.replace(args_loc.begin, '')
67
+ corrector.remove(args_loc.end)
71
68
  end
72
69
 
73
70
  def stabby_lambda_with_args?(node)
@@ -14,8 +14,9 @@ module RuboCop
14
14
  # # good
15
15
  # warn('hello')
16
16
  #
17
- class StderrPuts < Cop
17
+ class StderrPuts < Base
18
18
  include RangeHelp
19
+ extend AutoCorrector
19
20
 
20
21
  MSG =
21
22
  'Use `warn` instead of `%<bad>s` to allow such output to be disabled.'
@@ -30,11 +31,8 @@ module RuboCop
30
31
  def on_send(node)
31
32
  return unless stderr_puts?(node)
32
33
 
33
- add_offense(node, location: stderr_puts_range(node))
34
- end
35
-
36
- def autocorrect(node)
37
- lambda do |corrector|
34
+ message = message(node)
35
+ add_offense(stderr_puts_range(node), message: message) do |corrector|
38
36
  corrector.replace(stderr_puts_range(node), 'warn')
39
37
  end
40
38
  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