rubocop 0.93.1 → 1.79.2

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 (881) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +133 -103
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +2 -161
  6. data/config/default.yml +1864 -271
  7. data/config/internal_affairs.yml +31 -0
  8. data/config/obsoletion.yml +243 -0
  9. data/exe/rubocop +16 -9
  10. data/lib/rubocop/arguments_env.rb +17 -0
  11. data/lib/rubocop/arguments_file.rb +17 -0
  12. data/lib/rubocop/cache_config.rb +29 -0
  13. data/lib/rubocop/cached_data.rb +22 -8
  14. data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +55 -29
  15. data/lib/rubocop/cli/command/execute_runner.rb +39 -19
  16. data/lib/rubocop/cli/command/init_dotfile.rb +2 -4
  17. data/lib/rubocop/cli/command/lsp.rb +19 -0
  18. data/lib/rubocop/cli/command/show_cops.rb +26 -7
  19. data/lib/rubocop/cli/command/show_docs_url.rb +48 -0
  20. data/lib/rubocop/cli/command/suggest_extensions.rb +132 -0
  21. data/lib/rubocop/cli/command/version.rb +2 -2
  22. data/lib/rubocop/cli.rb +108 -16
  23. data/lib/rubocop/comment_config.rb +107 -104
  24. data/lib/rubocop/config.rb +160 -58
  25. data/lib/rubocop/config_finder.rb +78 -0
  26. data/lib/rubocop/config_loader.rb +112 -102
  27. data/lib/rubocop/config_loader_resolver.rb +124 -47
  28. data/lib/rubocop/config_obsoletion/changed_enforced_styles.rb +33 -0
  29. data/lib/rubocop/config_obsoletion/changed_parameter.rb +26 -0
  30. data/lib/rubocop/config_obsoletion/cop_rule.rb +33 -0
  31. data/lib/rubocop/config_obsoletion/extracted_cop.rb +47 -0
  32. data/lib/rubocop/config_obsoletion/parameter_rule.rb +56 -0
  33. data/lib/rubocop/config_obsoletion/removed_cop.rb +41 -0
  34. data/lib/rubocop/config_obsoletion/renamed_cop.rb +49 -0
  35. data/lib/rubocop/config_obsoletion/rule.rb +41 -0
  36. data/lib/rubocop/config_obsoletion/split_cop.rb +27 -0
  37. data/lib/rubocop/config_obsoletion.rb +110 -238
  38. data/lib/rubocop/config_regeneration.rb +1 -1
  39. data/lib/rubocop/config_store.rb +13 -3
  40. data/lib/rubocop/config_validator.rb +110 -43
  41. data/lib/rubocop/cop/autocorrect_logic.rb +82 -18
  42. data/lib/rubocop/cop/badge.rb +21 -26
  43. data/lib/rubocop/cop/base.rb +235 -118
  44. data/lib/rubocop/cop/bundler/duplicated_gem.rb +33 -16
  45. data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
  46. data/lib/rubocop/cop/bundler/gem_comment.rb +46 -13
  47. data/lib/rubocop/cop/bundler/gem_filename.rb +102 -0
  48. data/lib/rubocop/cop/bundler/gem_version.rb +132 -0
  49. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +46 -22
  50. data/lib/rubocop/cop/bundler/ordered_gems.rb +17 -20
  51. data/lib/rubocop/cop/commissioner.rb +57 -36
  52. data/lib/rubocop/cop/cop.rb +86 -54
  53. data/lib/rubocop/cop/corrector.rb +41 -22
  54. data/lib/rubocop/cop/correctors/alignment_corrector.rb +10 -27
  55. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  56. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +8 -14
  57. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  58. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +11 -18
  59. data/lib/rubocop/cop/correctors/if_then_corrector.rb +55 -0
  60. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +10 -7
  61. data/lib/rubocop/cop/correctors/line_break_corrector.rb +13 -8
  62. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -12
  63. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +10 -16
  64. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +65 -4
  65. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +17 -13
  66. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  67. data/lib/rubocop/cop/correctors/require_library_corrector.rb +23 -0
  68. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -1
  69. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +7 -9
  70. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +2 -2
  71. data/lib/rubocop/cop/documentation.rb +47 -3
  72. data/lib/rubocop/cop/exclude_limit.rb +26 -0
  73. data/lib/rubocop/cop/force.rb +13 -1
  74. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  75. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  76. data/lib/rubocop/cop/gemspec/dependency_version.rb +152 -0
  77. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +91 -0
  78. data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
  79. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +47 -40
  80. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +16 -19
  81. data/lib/rubocop/cop/gemspec/require_mfa.rb +159 -0
  82. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +50 -32
  83. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +9 -14
  84. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -3
  85. data/lib/rubocop/cop/generator/require_file_injector.rb +5 -8
  86. data/lib/rubocop/cop/generator.rb +38 -39
  87. data/lib/rubocop/cop/internal_affairs/cop_description.rb +118 -0
  88. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  89. data/lib/rubocop/cop/internal_affairs/create_empty_file.rb +37 -0
  90. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +69 -0
  91. data/lib/rubocop/cop/internal_affairs/example_description.rb +118 -0
  92. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +111 -0
  93. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
  94. data/lib/rubocop/cop/internal_affairs/lambda_or_proc.rb +46 -0
  95. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  96. data/lib/rubocop/cop/internal_affairs/location_expression.rb +38 -0
  97. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +61 -0
  98. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +82 -0
  99. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -22
  100. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +3 -3
  101. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
  102. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +241 -0
  103. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  104. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  105. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
  106. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  107. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  108. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +5 -5
  109. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
  110. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +3 -2
  111. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  112. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  113. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  114. data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
  115. data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +46 -0
  116. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +63 -0
  117. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  118. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +73 -0
  119. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +2 -1
  120. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +9 -21
  121. data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +56 -0
  122. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +75 -0
  123. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +63 -0
  124. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +146 -0
  125. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +94 -0
  126. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +6 -9
  127. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
  128. data/lib/rubocop/cop/internal_affairs.rb +32 -1
  129. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +18 -12
  130. data/lib/rubocop/cop/layout/argument_alignment.rb +79 -21
  131. data/lib/rubocop/cop/layout/array_alignment.rb +11 -10
  132. data/lib/rubocop/cop/layout/assignment_indentation.rb +13 -11
  133. data/lib/rubocop/cop/layout/begin_end_alignment.rb +2 -6
  134. data/lib/rubocop/cop/layout/block_alignment.rb +64 -53
  135. data/lib/rubocop/cop/layout/block_end_newline.rb +34 -15
  136. data/lib/rubocop/cop/layout/case_indentation.rb +73 -11
  137. data/lib/rubocop/cop/layout/class_structure.rb +114 -38
  138. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
  139. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +26 -36
  140. data/lib/rubocop/cop/layout/comment_indentation.rb +55 -28
  141. data/lib/rubocop/cop/layout/condition_position.rb +1 -5
  142. data/lib/rubocop/cop/layout/def_end_alignment.rb +6 -10
  143. data/lib/rubocop/cop/layout/dot_position.rb +48 -15
  144. data/lib/rubocop/cop/layout/else_alignment.rb +27 -13
  145. data/lib/rubocop/cop/layout/empty_comment.rb +9 -14
  146. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +82 -28
  147. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  148. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +2 -2
  149. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +170 -27
  150. data/lib/rubocop/cop/layout/empty_lines.rb +4 -4
  151. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  152. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +48 -22
  153. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +13 -29
  154. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +26 -5
  155. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +6 -7
  156. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +8 -5
  157. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +11 -11
  158. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +24 -17
  159. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +24 -2
  160. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +10 -10
  161. data/lib/rubocop/cop/layout/end_alignment.rb +36 -10
  162. data/lib/rubocop/cop/layout/end_of_line.rb +11 -11
  163. data/lib/rubocop/cop/layout/extra_spacing.rb +19 -21
  164. data/lib/rubocop/cop/layout/first_argument_indentation.rb +70 -39
  165. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +49 -31
  166. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +37 -11
  167. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +79 -29
  168. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +39 -5
  169. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +67 -11
  170. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +54 -22
  171. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +12 -11
  172. data/lib/rubocop/cop/layout/hash_alignment.rb +73 -37
  173. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +41 -15
  174. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -27
  175. data/lib/rubocop/cop/layout/indentation_consistency.rb +10 -7
  176. data/lib/rubocop/cop/layout/indentation_style.rb +32 -32
  177. data/lib/rubocop/cop/layout/indentation_width.rb +64 -37
  178. data/lib/rubocop/cop/layout/initial_indentation.rb +3 -6
  179. data/lib/rubocop/cop/layout/leading_comment_space.rb +87 -5
  180. data/lib/rubocop/cop/layout/leading_empty_lines.rb +1 -1
  181. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +153 -0
  182. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +146 -0
  183. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +143 -0
  184. data/lib/rubocop/cop/layout/line_length.rb +200 -64
  185. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +7 -7
  186. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +33 -4
  187. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +31 -5
  188. data/lib/rubocop/cop/layout/multiline_block_layout.rb +15 -20
  189. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +7 -7
  190. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +32 -5
  191. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +68 -4
  192. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +9 -8
  193. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +69 -26
  194. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +8 -8
  195. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +78 -0
  196. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +21 -18
  197. data/lib/rubocop/cop/layout/parameter_alignment.rb +11 -11
  198. data/lib/rubocop/cop/layout/redundant_line_break.rb +134 -0
  199. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +38 -36
  200. data/lib/rubocop/cop/layout/single_line_block_chain.rb +69 -0
  201. data/lib/rubocop/cop/layout/space_after_colon.rb +4 -6
  202. data/lib/rubocop/cop/layout/space_after_comma.rb +10 -2
  203. data/lib/rubocop/cop/layout/space_after_method_name.rb +3 -5
  204. data/lib/rubocop/cop/layout/space_after_not.rb +3 -2
  205. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  206. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +32 -34
  207. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +3 -2
  208. data/lib/rubocop/cop/layout/space_around_keyword.rb +42 -11
  209. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
  210. data/lib/rubocop/cop/layout/space_around_operators.rb +101 -41
  211. data/lib/rubocop/cop/layout/space_before_block_braces.rb +29 -16
  212. data/lib/rubocop/cop/layout/space_before_brackets.rb +40 -0
  213. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  214. data/lib/rubocop/cop/layout/space_before_comment.rb +4 -6
  215. data/lib/rubocop/cop/layout/space_before_first_arg.rb +10 -12
  216. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  217. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +16 -12
  218. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +51 -39
  219. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +5 -7
  220. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +56 -33
  221. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +41 -8
  222. data/lib/rubocop/cop/layout/space_inside_parens.rb +93 -25
  223. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +34 -0
  224. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  225. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +12 -9
  226. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +7 -8
  227. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +15 -10
  228. data/lib/rubocop/cop/layout/trailing_whitespace.rb +72 -16
  229. data/lib/rubocop/cop/legacy/corrections_proxy.rb +3 -9
  230. data/lib/rubocop/cop/legacy/corrector.rb +13 -5
  231. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +54 -0
  232. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +50 -12
  233. data/lib/rubocop/cop/lint/ambiguous_operator.rb +11 -9
  234. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +111 -0
  235. data/lib/rubocop/cop/lint/ambiguous_range.rb +113 -0
  236. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +13 -7
  237. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  238. data/lib/rubocop/cop/lint/assignment_in_condition.rb +25 -15
  239. data/lib/rubocop/cop/lint/big_decimal_new.rb +5 -7
  240. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +30 -14
  241. data/lib/rubocop/cop/lint/boolean_symbol.rb +10 -7
  242. data/lib/rubocop/cop/lint/circular_argument_reference.rb +5 -15
  243. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +30 -4
  244. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
  245. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  246. data/lib/rubocop/cop/lint/constant_resolution.rb +7 -3
  247. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  248. data/lib/rubocop/cop/lint/debugger.rb +99 -35
  249. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +73 -63
  250. data/lib/rubocop/cop/lint/deprecated_constants.rb +88 -0
  251. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +25 -21
  252. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
  253. data/lib/rubocop/cop/lint/duplicate_branch.rb +188 -0
  254. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +4 -18
  255. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +1 -1
  256. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +4 -9
  257. data/lib/rubocop/cop/lint/duplicate_magic_comment.rb +73 -0
  258. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
  259. data/lib/rubocop/cop/lint/duplicate_methods.rb +168 -58
  260. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +121 -0
  261. data/lib/rubocop/cop/lint/duplicate_require.rb +14 -4
  262. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +1 -1
  263. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  264. data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -6
  265. data/lib/rubocop/cop/lint/else_layout.rb +32 -10
  266. data/lib/rubocop/cop/lint/empty_block.rb +94 -0
  267. data/lib/rubocop/cop/lint/empty_class.rb +95 -0
  268. data/lib/rubocop/cop/lint/empty_conditional_body.rb +85 -4
  269. data/lib/rubocop/cop/lint/empty_ensure.rb +3 -15
  270. data/lib/rubocop/cop/lint/empty_expression.rb +1 -3
  271. data/lib/rubocop/cop/lint/empty_file.rb +2 -6
  272. data/lib/rubocop/cop/lint/empty_in_pattern.rb +64 -0
  273. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -9
  274. data/lib/rubocop/cop/lint/empty_when.rb +5 -5
  275. data/lib/rubocop/cop/lint/ensure_return.rb +3 -13
  276. data/lib/rubocop/cop/lint/erb_new_arguments.rb +40 -43
  277. data/lib/rubocop/cop/lint/flip_flop.rb +8 -2
  278. data/lib/rubocop/cop/lint/float_comparison.rb +59 -16
  279. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -9
  280. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +17 -22
  281. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +15 -4
  282. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  283. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +18 -21
  284. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -16
  285. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +25 -15
  286. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +81 -0
  287. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +6 -16
  288. data/lib/rubocop/cop/lint/inherit_exception.rb +29 -29
  289. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -13
  290. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
  291. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +51 -0
  292. data/lib/rubocop/cop/lint/literal_as_condition.rb +145 -13
  293. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
  294. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +130 -18
  295. data/lib/rubocop/cop/lint/loop.rb +13 -19
  296. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +48 -22
  297. data/lib/rubocop/cop/lint/missing_super.rb +70 -10
  298. data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
  299. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -3
  300. data/lib/rubocop/cop/lint/multiple_comparison.rb +5 -4
  301. data/lib/rubocop/cop/lint/nested_method_definition.rb +64 -20
  302. data/lib/rubocop/cop/lint/nested_percent_literal.rb +17 -5
  303. data/lib/rubocop/cop/lint/next_without_accumulator.rb +11 -10
  304. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +53 -0
  305. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +174 -0
  306. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +41 -18
  307. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -4
  308. data/lib/rubocop/cop/lint/number_conversion.rb +142 -21
  309. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +46 -0
  310. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
  311. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +41 -0
  312. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +5 -8
  313. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +63 -13
  314. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +17 -15
  315. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -7
  316. data/lib/rubocop/cop/lint/percent_symbol_array.rb +4 -10
  317. data/lib/rubocop/cop/lint/raise_exception.rb +36 -12
  318. data/lib/rubocop/cop/lint/rand_one.rb +3 -7
  319. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +156 -97
  320. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +33 -23
  321. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +62 -0
  322. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
  323. data/lib/rubocop/cop/lint/redundant_require_statement.rb +36 -6
  324. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +196 -15
  325. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +67 -33
  326. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +37 -21
  327. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  328. data/lib/rubocop/cop/lint/redundant_with_index.rb +22 -14
  329. data/lib/rubocop/cop/lint/redundant_with_object.rb +17 -15
  330. data/lib/rubocop/cop/lint/refinement_import_methods.rb +52 -0
  331. data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -6
  332. data/lib/rubocop/cop/lint/require_parentheses.rb +6 -10
  333. data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
  334. data/lib/rubocop/cop/lint/require_relative_self_path.rb +50 -0
  335. data/lib/rubocop/cop/lint/rescue_exception.rb +2 -7
  336. data/lib/rubocop/cop/lint/rescue_type.rb +7 -18
  337. data/lib/rubocop/cop/lint/return_in_void_context.rb +13 -30
  338. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +73 -19
  339. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -47
  340. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +3 -3
  341. data/lib/rubocop/cop/lint/script_permission.rb +4 -4
  342. data/lib/rubocop/cop/lint/self_assignment.rb +72 -11
  343. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +8 -12
  344. data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -13
  345. data/lib/rubocop/cop/lint/shadowed_exception.rb +30 -43
  346. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +68 -5
  347. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  348. data/lib/rubocop/cop/lint/struct_new_override.rb +16 -16
  349. data/lib/rubocop/cop/lint/suppressed_exception.rb +48 -5
  350. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  351. data/lib/rubocop/cop/lint/symbol_conversion.rb +184 -0
  352. data/lib/rubocop/cop/lint/syntax.rb +17 -10
  353. data/lib/rubocop/cop/lint/to_enum_arguments.rb +99 -0
  354. data/lib/rubocop/cop/lint/to_json.rb +2 -3
  355. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +24 -10
  356. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +4 -6
  357. data/lib/rubocop/cop/lint/triple_quotes.rb +71 -0
  358. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +2 -4
  359. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  360. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +92 -0
  361. data/lib/rubocop/cop/lint/unified_integer.rb +4 -5
  362. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +205 -0
  363. data/lib/rubocop/cop/lint/unreachable_code.rb +59 -14
  364. data/lib/rubocop/cop/lint/unreachable_loop.rb +48 -11
  365. data/lib/rubocop/cop/lint/unused_block_argument.rb +11 -9
  366. data/lib/rubocop/cop/lint/unused_method_argument.rb +29 -9
  367. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -1
  368. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  369. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -24
  370. data/lib/rubocop/cop/lint/useless_assignment.rb +109 -25
  371. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  372. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  373. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  374. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -7
  375. data/lib/rubocop/cop/lint/useless_method_definition.rb +18 -11
  376. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
  377. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  378. data/lib/rubocop/cop/lint/useless_rescue.rb +89 -0
  379. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +127 -0
  380. data/lib/rubocop/cop/lint/useless_setter_call.rb +29 -37
  381. data/lib/rubocop/cop/lint/useless_times.rb +25 -17
  382. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  383. data/lib/rubocop/cop/lint/void.rb +156 -31
  384. data/lib/rubocop/cop/message_annotator.rb +12 -7
  385. data/lib/rubocop/cop/metrics/abc_size.rb +35 -3
  386. data/lib/rubocop/cop/metrics/block_length.rb +30 -16
  387. data/lib/rubocop/cop/metrics/block_nesting.rb +23 -16
  388. data/lib/rubocop/cop/metrics/class_length.rb +30 -20
  389. data/lib/rubocop/cop/metrics/collection_literal_length.rb +83 -0
  390. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +7 -14
  391. data/lib/rubocop/cop/metrics/method_length.rb +32 -11
  392. data/lib/rubocop/cop/metrics/module_length.rb +17 -14
  393. data/lib/rubocop/cop/metrics/parameter_lists.rb +104 -7
  394. data/lib/rubocop/cop/metrics/perceived_complexity.rb +3 -4
  395. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +28 -26
  396. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +69 -18
  397. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +143 -0
  398. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +6 -1
  399. data/lib/rubocop/cop/migration/department_name.rb +8 -10
  400. data/lib/rubocop/cop/mixin/alignment.rb +20 -11
  401. data/lib/rubocop/cop/mixin/allowed_identifiers.rb +18 -0
  402. data/lib/rubocop/cop/mixin/allowed_methods.rb +29 -2
  403. data/lib/rubocop/cop/mixin/allowed_pattern.rb +68 -0
  404. data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
  405. data/lib/rubocop/cop/mixin/annotation_comment.rb +56 -28
  406. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  407. data/lib/rubocop/cop/mixin/check_line_breakable.rb +53 -9
  408. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  409. data/lib/rubocop/cop/mixin/code_length.rb +17 -6
  410. data/lib/rubocop/cop/mixin/comments_help.rb +62 -15
  411. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +23 -11
  412. data/lib/rubocop/cop/mixin/configurable_formatting.rb +4 -8
  413. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -0
  414. data/lib/rubocop/cop/mixin/configurable_numbering.rb +4 -3
  415. data/lib/rubocop/cop/mixin/def_node.rb +5 -12
  416. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  417. data/lib/rubocop/cop/mixin/documentation_comment.rb +8 -8
  418. data/lib/rubocop/cop/mixin/duplication.rb +1 -1
  419. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -8
  420. data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -3
  421. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -6
  422. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  423. data/lib/rubocop/cop/mixin/enforce_superclass.rb +19 -7
  424. data/lib/rubocop/cop/mixin/first_element_line_break.rb +13 -11
  425. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  426. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  427. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +53 -16
  428. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  429. data/lib/rubocop/cop/mixin/gemspec_help.rb +52 -0
  430. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +34 -24
  431. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +236 -0
  432. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  433. data/lib/rubocop/cop/mixin/hash_transform_method.rb +83 -88
  434. data/lib/rubocop/cop/mixin/heredoc.rb +11 -2
  435. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  436. data/lib/rubocop/cop/mixin/line_length_help.rb +65 -20
  437. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  438. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -19
  439. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  440. data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
  441. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +39 -16
  442. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +6 -9
  443. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +26 -55
  444. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +2 -3
  445. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -2
  446. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +12 -7
  447. data/lib/rubocop/cop/mixin/percent_array.rb +75 -9
  448. data/lib/rubocop/cop/mixin/percent_literal.rb +2 -8
  449. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -41
  450. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +6 -9
  451. data/lib/rubocop/cop/mixin/range_help.rb +51 -22
  452. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  453. data/lib/rubocop/cop/mixin/require_library.rb +61 -0
  454. data/lib/rubocop/cop/mixin/rescue_node.rb +9 -7
  455. data/lib/rubocop/cop/mixin/safe_assignment.rb +7 -3
  456. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +3 -5
  457. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +3 -4
  458. data/lib/rubocop/cop/mixin/statement_modifier.rb +34 -10
  459. data/lib/rubocop/cop/mixin/string_help.rb +10 -5
  460. data/lib/rubocop/cop/mixin/string_literals_help.rb +15 -5
  461. data/lib/rubocop/cop/mixin/surrounding_space.rb +17 -13
  462. data/lib/rubocop/cop/mixin/symbol_help.rb +13 -0
  463. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  464. data/lib/rubocop/cop/mixin/trailing_body.rb +2 -3
  465. data/lib/rubocop/cop/mixin/trailing_comma.rb +26 -11
  466. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -14
  467. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  468. data/lib/rubocop/cop/mixin/visibility_help.rb +42 -8
  469. data/lib/rubocop/cop/naming/accessor_method_name.rb +23 -2
  470. data/lib/rubocop/cop/naming/ascii_identifiers.rb +4 -9
  471. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +15 -5
  472. data/lib/rubocop/cop/naming/block_forwarding.rb +156 -0
  473. data/lib/rubocop/cop/naming/block_parameter_name.rb +3 -3
  474. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +4 -2
  475. data/lib/rubocop/cop/naming/constant_name.rb +14 -14
  476. data/lib/rubocop/cop/naming/file_name.rb +48 -26
  477. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +12 -6
  478. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +4 -2
  479. data/lib/rubocop/cop/naming/inclusive_language.rb +297 -0
  480. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +155 -32
  481. data/lib/rubocop/cop/naming/method_name.rb +191 -19
  482. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  483. data/lib/rubocop/cop/naming/predicate_method.rb +306 -0
  484. data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
  485. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +72 -13
  486. data/lib/rubocop/cop/naming/variable_name.rb +65 -5
  487. data/lib/rubocop/cop/naming/variable_number.rb +107 -13
  488. data/lib/rubocop/cop/offense.rb +9 -15
  489. data/lib/rubocop/cop/registry.rb +95 -53
  490. data/lib/rubocop/cop/security/compound_hash.rb +108 -0
  491. data/lib/rubocop/cop/security/eval.rb +4 -2
  492. data/lib/rubocop/cop/security/io_methods.rb +49 -0
  493. data/lib/rubocop/cop/security/json_load.rb +10 -8
  494. data/lib/rubocop/cop/security/marshal_load.rb +2 -1
  495. data/lib/rubocop/cop/security/open.rb +28 -10
  496. data/lib/rubocop/cop/security/yaml_load.rb +16 -4
  497. data/lib/rubocop/cop/severity.rb +3 -3
  498. data/lib/rubocop/cop/style/access_modifier_declarations.rb +238 -8
  499. data/lib/rubocop/cop/style/accessor_grouping.rb +91 -29
  500. data/lib/rubocop/cop/style/alias.rb +26 -22
  501. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  502. data/lib/rubocop/cop/style/and_or.rb +29 -14
  503. data/lib/rubocop/cop/style/arguments_forwarding.rb +564 -0
  504. data/lib/rubocop/cop/style/array_coercion.rb +24 -4
  505. data/lib/rubocop/cop/style/array_first_last.rb +80 -0
  506. data/lib/rubocop/cop/style/array_intersect.rb +161 -0
  507. data/lib/rubocop/cop/style/array_join.rb +2 -1
  508. data/lib/rubocop/cop/style/ascii_comments.rb +4 -8
  509. data/lib/rubocop/cop/style/attr.rb +13 -4
  510. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +22 -18
  511. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  512. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  513. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  514. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +61 -77
  515. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  516. data/lib/rubocop/cop/style/block_comments.rb +4 -4
  517. data/lib/rubocop/cop/style/block_delimiters.rb +144 -23
  518. data/lib/rubocop/cop/style/case_equality.rb +49 -21
  519. data/lib/rubocop/cop/style/case_like_if.rb +56 -31
  520. data/lib/rubocop/cop/style/character_literal.rb +20 -16
  521. data/lib/rubocop/cop/style/class_and_module_children.rb +97 -26
  522. data/lib/rubocop/cop/style/class_check.rb +2 -1
  523. data/lib/rubocop/cop/style/class_equality_comparison.rb +83 -13
  524. data/lib/rubocop/cop/style/class_methods.rb +2 -4
  525. data/lib/rubocop/cop/style/class_methods_definitions.rb +3 -2
  526. data/lib/rubocop/cop/style/class_vars.rb +4 -4
  527. data/lib/rubocop/cop/style/collection_compact.rb +143 -0
  528. data/lib/rubocop/cop/style/collection_methods.rb +27 -7
  529. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  530. data/lib/rubocop/cop/style/colon_method_call.rb +4 -5
  531. data/lib/rubocop/cop/style/colon_method_definition.rb +1 -1
  532. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  533. data/lib/rubocop/cop/style/combinable_loops.rb +52 -12
  534. data/lib/rubocop/cop/style/command_literal.rb +6 -11
  535. data/lib/rubocop/cop/style/comment_annotation.rb +59 -32
  536. data/lib/rubocop/cop/style/commented_keyword.rb +65 -22
  537. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  538. data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
  539. data/lib/rubocop/cop/style/concat_array_literals.rb +95 -0
  540. data/lib/rubocop/cop/style/conditional_assignment.rb +88 -76
  541. data/lib/rubocop/cop/style/constant_visibility.rb +28 -9
  542. data/lib/rubocop/cop/style/copyright.rb +39 -29
  543. data/lib/rubocop/cop/style/data_inheritance.rb +82 -0
  544. data/lib/rubocop/cop/style/date_time.rb +16 -10
  545. data/lib/rubocop/cop/style/def_with_parentheses.rb +30 -15
  546. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  547. data/lib/rubocop/cop/style/dir.rb +5 -1
  548. data/lib/rubocop/cop/style/dir_empty.rb +54 -0
  549. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -9
  550. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +169 -0
  551. data/lib/rubocop/cop/style/documentation.rb +95 -30
  552. data/lib/rubocop/cop/style/documentation_method.rb +31 -4
  553. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -7
  554. data/lib/rubocop/cop/style/double_negation.rb +97 -11
  555. data/lib/rubocop/cop/style/each_for_simple_loop.rb +45 -14
  556. data/lib/rubocop/cop/style/each_with_object.rb +42 -11
  557. data/lib/rubocop/cop/style/empty_block_parameter.rb +3 -3
  558. data/lib/rubocop/cop/style/empty_case_condition.rb +21 -12
  559. data/lib/rubocop/cop/style/empty_else.rb +52 -18
  560. data/lib/rubocop/cop/style/empty_heredoc.rb +60 -0
  561. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +3 -3
  562. data/lib/rubocop/cop/style/empty_literal.rb +62 -33
  563. data/lib/rubocop/cop/style/empty_method.rb +19 -8
  564. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  565. data/lib/rubocop/cop/style/encoding.rb +27 -16
  566. data/lib/rubocop/cop/style/end_block.rb +2 -3
  567. data/lib/rubocop/cop/style/endless_method.rb +233 -0
  568. data/lib/rubocop/cop/style/env_home.rb +56 -0
  569. data/lib/rubocop/cop/style/eval_with_location.rb +144 -63
  570. data/lib/rubocop/cop/style/even_odd.rb +2 -1
  571. data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
  572. data/lib/rubocop/cop/style/expand_path_arguments.rb +7 -11
  573. data/lib/rubocop/cop/style/explicit_block_argument.rb +78 -18
  574. data/lib/rubocop/cop/style/exponential_notation.rb +12 -12
  575. data/lib/rubocop/cop/style/fetch_env_var.rb +159 -0
  576. data/lib/rubocop/cop/style/file_empty.rb +71 -0
  577. data/lib/rubocop/cop/style/file_null.rb +89 -0
  578. data/lib/rubocop/cop/style/file_read.rb +109 -0
  579. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  580. data/lib/rubocop/cop/style/file_write.rb +133 -0
  581. data/lib/rubocop/cop/style/float_division.rb +68 -6
  582. data/lib/rubocop/cop/style/for.rb +13 -3
  583. data/lib/rubocop/cop/style/format_string.rb +44 -16
  584. data/lib/rubocop/cop/style/format_string_token.rb +163 -26
  585. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +27 -18
  586. data/lib/rubocop/cop/style/global_std_stream.rb +16 -2
  587. data/lib/rubocop/cop/style/global_vars.rb +2 -4
  588. data/lib/rubocop/cop/style/guard_clause.rb +206 -32
  589. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +12 -0
  590. data/lib/rubocop/cop/style/hash_conversion.rb +151 -0
  591. data/lib/rubocop/cop/style/hash_each_methods.rb +147 -12
  592. data/lib/rubocop/cop/style/hash_except.rb +80 -0
  593. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  594. data/lib/rubocop/cop/style/hash_like_case.rb +6 -11
  595. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  596. data/lib/rubocop/cop/style/hash_syntax.rb +117 -33
  597. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -15
  598. data/lib/rubocop/cop/style/hash_transform_values.rb +19 -14
  599. data/lib/rubocop/cop/style/identical_conditional_branches.rb +153 -10
  600. data/lib/rubocop/cop/style/if_inside_else.rb +67 -2
  601. data/lib/rubocop/cop/style/if_unless_modifier.rb +188 -29
  602. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  603. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +163 -0
  604. data/lib/rubocop/cop/style/if_with_semicolon.rb +96 -7
  605. data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
  606. data/lib/rubocop/cop/style/in_pattern_then.rb +60 -0
  607. data/lib/rubocop/cop/style/infinite_loop.rb +9 -10
  608. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  609. data/lib/rubocop/cop/style/inverse_methods.rb +41 -28
  610. data/lib/rubocop/cop/style/invertible_unless_condition.rb +160 -0
  611. data/lib/rubocop/cop/style/ip_addresses.rb +5 -6
  612. data/lib/rubocop/cop/style/it_assignment.rb +93 -0
  613. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  614. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  615. data/lib/rubocop/cop/style/keyword_parameters_order.rb +34 -6
  616. data/lib/rubocop/cop/style/lambda.rb +8 -9
  617. data/lib/rubocop/cop/style/lambda_call.rb +27 -24
  618. data/lib/rubocop/cop/style/line_end_concatenation.rb +31 -16
  619. data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
  620. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +168 -0
  621. data/lib/rubocop/cop/style/map_into_array.rb +236 -0
  622. data/lib/rubocop/cop/style/map_to_hash.rb +90 -0
  623. data/lib/rubocop/cop/style/map_to_set.rb +63 -0
  624. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +138 -53
  625. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +11 -11
  626. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +109 -36
  627. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +62 -18
  628. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +7 -7
  629. data/lib/rubocop/cop/style/method_def_parentheses.rb +37 -14
  630. data/lib/rubocop/cop/style/min_max.rb +6 -6
  631. data/lib/rubocop/cop/style/min_max_comparison.rb +91 -0
  632. data/lib/rubocop/cop/style/missing_else.rb +48 -33
  633. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +37 -8
  634. data/lib/rubocop/cop/style/mixin_grouping.rb +10 -20
  635. data/lib/rubocop/cop/style/mixin_usage.rb +4 -3
  636. data/lib/rubocop/cop/style/module_function.rb +41 -18
  637. data/lib/rubocop/cop/style/multiline_block_chain.rb +7 -5
  638. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -6
  639. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  640. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +60 -0
  641. data/lib/rubocop/cop/style/multiline_memoization.rb +5 -5
  642. data/lib/rubocop/cop/style/multiline_method_signature.rb +37 -3
  643. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +54 -12
  644. data/lib/rubocop/cop/style/multiline_when_then.rb +8 -21
  645. data/lib/rubocop/cop/style/multiple_comparison.rb +104 -32
  646. data/lib/rubocop/cop/style/mutable_constant.rb +99 -28
  647. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  648. data/lib/rubocop/cop/style/negated_if_else_condition.rb +137 -0
  649. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  650. data/lib/rubocop/cop/style/nested_file_dirname.rb +66 -0
  651. data/lib/rubocop/cop/style/nested_modifier.rb +5 -9
  652. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +17 -4
  653. data/lib/rubocop/cop/style/nested_ternary_operator.rb +23 -19
  654. data/lib/rubocop/cop/style/next.rb +51 -14
  655. data/lib/rubocop/cop/style/nil_comparison.rb +9 -1
  656. data/lib/rubocop/cop/style/nil_lambda.rb +70 -0
  657. data/lib/rubocop/cop/style/non_nil_check.rb +32 -18
  658. data/lib/rubocop/cop/style/not.rb +5 -5
  659. data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
  660. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +58 -0
  661. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  662. data/lib/rubocop/cop/style/numeric_literals.rb +44 -29
  663. data/lib/rubocop/cop/style/numeric_predicate.rb +73 -20
  664. data/lib/rubocop/cop/style/object_then.rb +76 -0
  665. data/lib/rubocop/cop/style/one_line_conditional.rb +46 -46
  666. data/lib/rubocop/cop/style/open_struct_use.rb +69 -0
  667. data/lib/rubocop/cop/style/operator_method_call.rb +91 -0
  668. data/lib/rubocop/cop/style/option_hash.rb +3 -4
  669. data/lib/rubocop/cop/style/optional_arguments.rb +7 -6
  670. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +16 -5
  671. data/lib/rubocop/cop/style/or_assignment.rb +8 -13
  672. data/lib/rubocop/cop/style/parallel_assignment.rb +81 -66
  673. data/lib/rubocop/cop/style/parentheses_around_condition.rb +22 -3
  674. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +6 -9
  675. data/lib/rubocop/cop/style/percent_q_literals.rb +6 -7
  676. data/lib/rubocop/cop/style/perl_backrefs.rb +101 -10
  677. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -9
  678. data/lib/rubocop/cop/style/proc.rb +6 -3
  679. data/lib/rubocop/cop/style/quoted_symbols.rb +122 -0
  680. data/lib/rubocop/cop/style/raise_args.rb +57 -30
  681. data/lib/rubocop/cop/style/random_with_offset.rb +12 -12
  682. data/lib/rubocop/cop/style/redundant_argument.rb +129 -0
  683. data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
  684. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  685. data/lib/rubocop/cop/style/redundant_assignment.rb +14 -7
  686. data/lib/rubocop/cop/style/redundant_begin.rb +96 -8
  687. data/lib/rubocop/cop/style/redundant_capital_w.rb +3 -5
  688. data/lib/rubocop/cop/style/redundant_condition.rb +235 -32
  689. data/lib/rubocop/cop/style/redundant_conditional.rb +6 -19
  690. data/lib/rubocop/cop/style/redundant_constant_base.rb +85 -0
  691. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
  692. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +129 -0
  693. data/lib/rubocop/cop/style/redundant_each.rb +119 -0
  694. data/lib/rubocop/cop/style/redundant_exception.rb +36 -17
  695. data/lib/rubocop/cop/style/redundant_fetch_block.rb +17 -17
  696. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +15 -5
  697. data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
  698. data/lib/rubocop/cop/style/redundant_format.rb +262 -0
  699. data/lib/rubocop/cop/style/redundant_freeze.rb +12 -8
  700. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
  701. data/lib/rubocop/cop/style/redundant_initialize.rb +165 -0
  702. data/lib/rubocop/cop/style/redundant_interpolation.rb +42 -8
  703. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
  704. data/lib/rubocop/cop/style/redundant_line_continuation.rb +236 -0
  705. data/lib/rubocop/cop/style/redundant_parentheses.rb +184 -66
  706. data/lib/rubocop/cop/style/redundant_percent_q.rb +6 -8
  707. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
  708. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +27 -6
  709. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
  710. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +24 -9
  711. data/lib/rubocop/cop/style/redundant_return.rb +28 -8
  712. data/lib/rubocop/cop/style/redundant_self.rb +70 -21
  713. data/lib/rubocop/cop/style/redundant_self_assignment.rb +27 -37
  714. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +90 -0
  715. data/lib/rubocop/cop/style/redundant_sort.rb +81 -34
  716. data/lib/rubocop/cop/style/redundant_sort_by.rb +41 -8
  717. data/lib/rubocop/cop/style/redundant_string_escape.rb +185 -0
  718. data/lib/rubocop/cop/style/regexp_literal.rb +25 -11
  719. data/lib/rubocop/cop/style/require_order.rb +139 -0
  720. data/lib/rubocop/cop/style/rescue_modifier.rb +39 -20
  721. data/lib/rubocop/cop/style/rescue_standard_error.rb +19 -21
  722. data/lib/rubocop/cop/style/return_nil.rb +16 -6
  723. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
  724. data/lib/rubocop/cop/style/safe_navigation.rb +222 -89
  725. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  726. data/lib/rubocop/cop/style/sample.rb +10 -8
  727. data/lib/rubocop/cop/style/select_by_regexp.rb +169 -0
  728. data/lib/rubocop/cop/style/self_assignment.rb +15 -21
  729. data/lib/rubocop/cop/style/semicolon.rb +101 -27
  730. data/lib/rubocop/cop/style/send.rb +6 -7
  731. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
  732. data/lib/rubocop/cop/style/signal_exception.rb +17 -17
  733. data/lib/rubocop/cop/style/single_argument_dig.rb +26 -8
  734. data/lib/rubocop/cop/style/single_line_block_params.rb +38 -16
  735. data/lib/rubocop/cop/style/single_line_do_end_block.rb +78 -0
  736. data/lib/rubocop/cop/style/single_line_methods.rb +78 -15
  737. data/lib/rubocop/cop/style/slicing_with_range.rb +119 -10
  738. data/lib/rubocop/cop/style/sole_nested_conditional.rb +178 -7
  739. data/lib/rubocop/cop/style/special_global_vars.rb +97 -40
  740. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +2 -3
  741. data/lib/rubocop/cop/style/static_class.rb +128 -0
  742. data/lib/rubocop/cop/style/stderr_puts.rb +4 -7
  743. data/lib/rubocop/cop/style/string_chars.rb +42 -0
  744. data/lib/rubocop/cop/style/string_concatenation.rb +96 -24
  745. data/lib/rubocop/cop/style/string_hash_keys.rb +11 -2
  746. data/lib/rubocop/cop/style/string_literals.rb +21 -21
  747. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +35 -8
  748. data/lib/rubocop/cop/style/string_methods.rb +2 -2
  749. data/lib/rubocop/cop/style/strip.rb +9 -5
  750. data/lib/rubocop/cop/style/struct_inheritance.rb +27 -5
  751. data/lib/rubocop/cop/style/super_arguments.rb +221 -0
  752. data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
  753. data/lib/rubocop/cop/style/swap_values.rb +101 -0
  754. data/lib/rubocop/cop/style/symbol_array.rb +47 -22
  755. data/lib/rubocop/cop/style/symbol_literal.rb +2 -4
  756. data/lib/rubocop/cop/style/symbol_proc.rb +198 -22
  757. data/lib/rubocop/cop/style/ternary_parentheses.rb +49 -29
  758. data/lib/rubocop/cop/style/top_level_method_definition.rb +86 -0
  759. data/lib/rubocop/cop/style/trailing_body_on_class.rb +2 -1
  760. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +7 -3
  761. data/lib/rubocop/cop/style/trailing_body_on_module.rb +1 -1
  762. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +16 -7
  763. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +48 -7
  764. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +24 -9
  765. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +49 -7
  766. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +5 -11
  767. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +12 -16
  768. data/lib/rubocop/cop/style/trivial_accessors.rb +82 -16
  769. data/lib/rubocop/cop/style/unless_else.rb +6 -3
  770. data/lib/rubocop/cop/style/unless_logical_operators.rb +106 -0
  771. data/lib/rubocop/cop/style/unpack_first.rb +16 -15
  772. data/lib/rubocop/cop/style/variable_interpolation.rb +2 -3
  773. data/lib/rubocop/cop/style/when_then.rb +5 -3
  774. data/lib/rubocop/cop/style/while_until_do.rb +0 -2
  775. data/lib/rubocop/cop/style/while_until_modifier.rb +11 -7
  776. data/lib/rubocop/cop/style/word_array.rb +79 -8
  777. data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
  778. data/lib/rubocop/cop/style/yoda_condition.rb +52 -29
  779. data/lib/rubocop/cop/style/yoda_expression.rb +92 -0
  780. data/lib/rubocop/cop/style/zero_length_predicate.rb +77 -38
  781. data/lib/rubocop/cop/team.rb +94 -61
  782. data/lib/rubocop/cop/util.rb +100 -24
  783. data/lib/rubocop/cop/utils/format_string.rb +11 -8
  784. data/lib/rubocop/cop/variable_force/assignment.rb +66 -7
  785. data/lib/rubocop/cop/variable_force/branch.rb +19 -5
  786. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  787. data/lib/rubocop/cop/variable_force/scope.rb +8 -12
  788. data/lib/rubocop/cop/variable_force/variable.rb +20 -9
  789. data/lib/rubocop/cop/variable_force/variable_table.rb +9 -7
  790. data/lib/rubocop/cop/variable_force.rb +63 -66
  791. data/lib/rubocop/cops_documentation_generator.rb +197 -75
  792. data/lib/rubocop/core_ext/string.rb +2 -6
  793. data/lib/rubocop/directive_comment.rb +158 -10
  794. data/lib/rubocop/ext/comment.rb +18 -0
  795. data/lib/rubocop/ext/processed_source.rb +2 -0
  796. data/lib/rubocop/ext/range.rb +15 -0
  797. data/lib/rubocop/ext/regexp_node.rb +18 -11
  798. data/lib/rubocop/ext/regexp_parser.rb +78 -0
  799. data/lib/rubocop/feature_loader.rb +94 -0
  800. data/lib/rubocop/file_finder.rb +12 -12
  801. data/lib/rubocop/file_patterns.rb +43 -0
  802. data/lib/rubocop/formatter/clang_style_formatter.rb +8 -10
  803. data/lib/rubocop/formatter/disabled_config_formatter.rb +92 -32
  804. data/lib/rubocop/formatter/emacs_style_formatter.rb +2 -0
  805. data/lib/rubocop/formatter/formatter_set.rb +29 -20
  806. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  807. data/lib/rubocop/formatter/github_actions_formatter.rb +57 -0
  808. data/lib/rubocop/formatter/html_formatter.rb +50 -38
  809. data/lib/rubocop/formatter/json_formatter.rb +5 -7
  810. data/lib/rubocop/formatter/junit_formatter.rb +85 -26
  811. data/lib/rubocop/formatter/markdown_formatter.rb +79 -0
  812. data/lib/rubocop/formatter/offense_count_formatter.rb +28 -9
  813. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  814. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  815. data/lib/rubocop/formatter/simple_text_formatter.rb +13 -9
  816. data/lib/rubocop/formatter/tap_formatter.rb +10 -10
  817. data/lib/rubocop/formatter/worst_offenders_formatter.rb +8 -6
  818. data/lib/rubocop/formatter.rb +34 -0
  819. data/lib/rubocop/lockfile.rb +91 -0
  820. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  821. data/lib/rubocop/lsp/logger.rb +22 -0
  822. data/lib/rubocop/lsp/routes.rb +227 -0
  823. data/lib/rubocop/lsp/runtime.rb +69 -0
  824. data/lib/rubocop/lsp/server.rb +70 -0
  825. data/lib/rubocop/lsp/severity.rb +27 -0
  826. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  827. data/lib/rubocop/lsp.rb +36 -0
  828. data/lib/rubocop/magic_comment.rb +115 -21
  829. data/lib/rubocop/name_similarity.rb +1 -1
  830. data/lib/rubocop/options.rb +348 -197
  831. data/lib/rubocop/path_util.rb +62 -25
  832. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  833. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  834. data/lib/rubocop/plugin/load_error.rb +26 -0
  835. data/lib/rubocop/plugin/loader.rb +100 -0
  836. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  837. data/lib/rubocop/plugin.rb +46 -0
  838. data/lib/rubocop/rake_task.rb +42 -11
  839. data/lib/rubocop/remote_config.rb +20 -13
  840. data/lib/rubocop/result_cache.rb +60 -57
  841. data/lib/rubocop/rspec/cop_helper.rb +45 -8
  842. data/lib/rubocop/rspec/expect_offense.rb +80 -45
  843. data/lib/rubocop/rspec/parallel_formatter.rb +90 -0
  844. data/lib/rubocop/rspec/shared_contexts.rb +164 -33
  845. data/lib/rubocop/rspec/support.rb +24 -3
  846. data/lib/rubocop/runner.rb +168 -52
  847. data/lib/rubocop/server/cache.rb +208 -0
  848. data/lib/rubocop/server/cli.rb +147 -0
  849. data/lib/rubocop/server/client_command/base.rb +54 -0
  850. data/lib/rubocop/server/client_command/exec.rb +65 -0
  851. data/lib/rubocop/server/client_command/restart.rb +25 -0
  852. data/lib/rubocop/server/client_command/start.rb +58 -0
  853. data/lib/rubocop/server/client_command/status.rb +28 -0
  854. data/lib/rubocop/server/client_command/stop.rb +31 -0
  855. data/lib/rubocop/server/client_command.rb +26 -0
  856. data/lib/rubocop/server/core.rb +116 -0
  857. data/lib/rubocop/server/errors.rb +23 -0
  858. data/lib/rubocop/server/helper.rb +34 -0
  859. data/lib/rubocop/server/server_command/base.rb +50 -0
  860. data/lib/rubocop/server/server_command/exec.rb +33 -0
  861. data/lib/rubocop/server/server_command/stop.rb +24 -0
  862. data/lib/rubocop/server/server_command.rb +21 -0
  863. data/lib/rubocop/server/socket_reader.rb +69 -0
  864. data/lib/rubocop/server.rb +53 -0
  865. data/lib/rubocop/string_interpreter.rb +7 -7
  866. data/lib/rubocop/target_finder.rb +113 -93
  867. data/lib/rubocop/target_ruby.rb +156 -19
  868. data/lib/rubocop/util.rb +16 -0
  869. data/lib/rubocop/version.rb +139 -8
  870. data/lib/rubocop/yaml_duplication_checker.rb +20 -26
  871. data/lib/rubocop.rb +219 -39
  872. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  873. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  874. metadata +352 -66
  875. data/bin/console +0 -10
  876. data/bin/rubocop-profile +0 -32
  877. data/bin/setup +0 -7
  878. data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -19
  879. data/lib/rubocop/cop/mixin/ignored_pattern.rb +0 -29
  880. data/lib/rubocop/cop/naming/predicate_name.rb +0 -104
  881. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Checks that the backslash of a line continuation is separated from
7
+ # preceding text by exactly one space (default) or zero spaces.
8
+ #
9
+ # @example EnforcedStyle: space (default)
10
+ # # bad
11
+ # 'a'\
12
+ # 'b' \
13
+ # 'c'
14
+ #
15
+ # # good
16
+ # 'a' \
17
+ # 'b' \
18
+ # 'c'
19
+ #
20
+ # @example EnforcedStyle: no_space
21
+ # # bad
22
+ # 'a' \
23
+ # 'b' \
24
+ # 'c'
25
+ #
26
+ # # good
27
+ # 'a'\
28
+ # 'b'\
29
+ # 'c'
30
+ class LineContinuationSpacing < Base
31
+ include RangeHelp
32
+ extend AutoCorrector
33
+
34
+ def on_new_investigation
35
+ return unless processed_source.raw_source.include?('\\')
36
+
37
+ last_line = last_line(processed_source)
38
+
39
+ processed_source.raw_source.lines.each_with_index do |line, index|
40
+ break if index >= last_line
41
+
42
+ line_number = index + 1
43
+ investigate(line, line_number)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def investigate(line, line_number)
50
+ offensive_spacing = find_offensive_spacing(line)
51
+ return unless offensive_spacing
52
+
53
+ range = source_range(
54
+ processed_source.buffer,
55
+ line_number,
56
+ line.length - offensive_spacing.length - 1,
57
+ offensive_spacing.length
58
+ )
59
+
60
+ return if ignore_range?(range)
61
+
62
+ add_offense(range) { |corrector| autocorrect(corrector, range) }
63
+ end
64
+
65
+ def find_offensive_spacing(line)
66
+ if no_space_style?
67
+ line[/\s+\\$/, 0]
68
+ elsif space_style?
69
+ line[/((?<!\s)|\s{2,})\\$/, 0]
70
+ end
71
+ end
72
+
73
+ def message(_range)
74
+ if no_space_style?
75
+ 'Use zero spaces in front of backslash.'
76
+ elsif space_style?
77
+ 'Use one space in front of backslash.'
78
+ end
79
+ end
80
+
81
+ def autocorrect(corrector, range)
82
+ correction = if no_space_style?
83
+ '\\'
84
+ elsif space_style?
85
+ ' \\'
86
+ end
87
+ corrector.replace(range, correction)
88
+ end
89
+
90
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
91
+ def ignored_literal_ranges(ast)
92
+ # which lines start inside a string literal?
93
+ return [] if ast.nil?
94
+
95
+ ast.each_node(:str, :dstr, :array).with_object(Set.new) do |literal, ranges|
96
+ loc = literal.location
97
+
98
+ if literal.array_type?
99
+ next unless literal.percent_literal?
100
+
101
+ ranges << loc.expression
102
+ elsif literal.heredoc?
103
+ ranges << loc.heredoc_body
104
+ elsif (loc.respond_to?(:begin) && loc.begin) || ignored_parent?(literal)
105
+ ranges << loc.expression
106
+ end
107
+ end
108
+ end
109
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
110
+
111
+ def comment_ranges(comments)
112
+ comments.map(&:source_range)
113
+ end
114
+
115
+ def last_line(processed_source)
116
+ last_token = processed_source.tokens.last
117
+
118
+ last_token ? last_token.line : processed_source.lines.length
119
+ end
120
+
121
+ def ignore_range?(backtick_range)
122
+ ignored_ranges.any? { |range| range.contains?(backtick_range) }
123
+ end
124
+
125
+ def ignored_ranges
126
+ @ignored_ranges ||= ignored_literal_ranges(processed_source.ast) +
127
+ comment_ranges(processed_source.comments)
128
+ end
129
+
130
+ def ignored_parent?(node)
131
+ return false unless node.parent
132
+
133
+ node.parent.type?(:regexp, :xstr)
134
+ end
135
+
136
+ def no_space_style?
137
+ cop_config['EnforcedStyle'] == 'no_space'
138
+ end
139
+
140
+ def space_style?
141
+ cop_config['EnforcedStyle'] == 'space'
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Checks the indentation of the next line after a line that ends with a string
7
+ # literal and a backslash.
8
+ #
9
+ # If `EnforcedStyle: aligned` is set, the concatenated string parts shall be aligned with the
10
+ # first part. There are some exceptions, such as implicit return values, where the
11
+ # concatenated string parts shall be indented regardless of `EnforcedStyle` configuration.
12
+ #
13
+ # If `EnforcedStyle: indented` is set, it's the second line that shall be indented one step
14
+ # more than the first line. Lines 3 and forward shall be aligned with line 2.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # def some_method
19
+ # 'x' \
20
+ # 'y' \
21
+ # 'z'
22
+ # end
23
+ #
24
+ # my_hash = {
25
+ # first: 'a message' \
26
+ # 'in two parts'
27
+ # }
28
+ #
29
+ # # good
30
+ # def some_method
31
+ # 'x' \
32
+ # 'y' \
33
+ # 'z'
34
+ # end
35
+ #
36
+ # @example EnforcedStyle: aligned (default)
37
+ # # bad
38
+ # puts 'x' \
39
+ # 'y'
40
+ #
41
+ # my_hash = {
42
+ # first: 'a message' \
43
+ # 'in two parts'
44
+ # }
45
+ #
46
+ # # good
47
+ # puts 'x' \
48
+ # 'y'
49
+ #
50
+ # my_hash = {
51
+ # first: 'a message' \
52
+ # 'in two parts'
53
+ # }
54
+ #
55
+ # @example EnforcedStyle: indented
56
+ # # bad
57
+ # result = 'x' \
58
+ # 'y'
59
+ #
60
+ # my_hash = {
61
+ # first: 'a message' \
62
+ # 'in two parts'
63
+ # }
64
+ #
65
+ # # good
66
+ # result = 'x' \
67
+ # 'y'
68
+ #
69
+ # my_hash = {
70
+ # first: 'a message' \
71
+ # 'in two parts'
72
+ # }
73
+ #
74
+ class LineEndStringConcatenationIndentation < Base
75
+ include ConfigurableEnforcedStyle
76
+ include Alignment
77
+ extend AutoCorrector
78
+
79
+ MSG_ALIGN = 'Align parts of a string concatenated with backslash.'
80
+ MSG_INDENT = 'Indent the first part of a string concatenated with backslash.'
81
+ PARENT_TYPES_FOR_INDENTED = [nil, :block, :begin, :def, :defs, :if].freeze
82
+
83
+ def on_dstr(node)
84
+ return unless strings_concatenated_with_backslash?(node)
85
+
86
+ children = node.children
87
+ return if children.empty?
88
+
89
+ if style == :aligned && !always_indented?(node)
90
+ check_aligned(children, 1)
91
+ else
92
+ check_indented(children)
93
+ check_aligned(children, 2)
94
+ end
95
+ end
96
+
97
+ def autocorrect(corrector, node)
98
+ AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
99
+ end
100
+
101
+ private
102
+
103
+ def strings_concatenated_with_backslash?(dstr_node)
104
+ dstr_node.multiline? &&
105
+ dstr_node.children.all? { |c| c.type?(:str, :dstr) } &&
106
+ dstr_node.children.none?(&:multiline?)
107
+ end
108
+
109
+ def always_indented?(dstr_node)
110
+ PARENT_TYPES_FOR_INDENTED.include?(dstr_node.parent&.type)
111
+ end
112
+
113
+ def check_aligned(children, start_index)
114
+ base_column = children[start_index - 1].loc.column
115
+ children[start_index..].each do |child|
116
+ @column_delta = base_column - child.loc.column
117
+ add_offense_and_correction(child, MSG_ALIGN) if @column_delta != 0
118
+ base_column = child.loc.column
119
+ end
120
+ end
121
+
122
+ def check_indented(children)
123
+ @column_delta = base_column(children[0]) + configured_indentation_width -
124
+ children[1].loc.column
125
+ add_offense_and_correction(children[1], MSG_INDENT) if @column_delta != 0
126
+ end
127
+
128
+ def base_column(child)
129
+ grandparent = child.parent.parent
130
+ if grandparent&.pair_type?
131
+ grandparent.loc.column
132
+ else
133
+ child.source_range.source_line =~ /\S/
134
+ end
135
+ end
136
+
137
+ def add_offense_and_correction(node, message)
138
+ add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -5,7 +5,7 @@ require 'uri'
5
5
  module RuboCop
6
6
  module Cop
7
7
  module Layout
8
- # This cop checks the length of lines in the source code.
8
+ # Checks the length of lines in the source code.
9
9
  # The maximum length is configurable.
10
10
  # The tab size is configured in the `IndentationWidth`
11
11
  # of the `Layout/IndentationStyle` cop.
@@ -17,27 +17,29 @@ module RuboCop
17
17
  # split across lines. These include arrays, hashes, and
18
18
  # method calls with argument lists.
19
19
  #
20
- # If autocorrection is enabled, the following Layout cops
20
+ # If autocorrection is enabled, the following cops
21
21
  # are recommended to further format the broken lines.
22
22
  # (Many of these are enabled by default.)
23
23
  #
24
- # * ArgumentAlignment
25
- # * BlockAlignment
26
- # * BlockDelimiters
27
- # * BlockEndNewline
28
- # * ClosingParenthesisIndentation
29
- # * FirstArgumentIndentation
30
- # * FirstArrayElementIndentation
31
- # * FirstHashElementIndentation
32
- # * FirstParameterIndentation
33
- # * HashAlignment
34
- # * IndentationWidth
35
- # * MultilineArrayLineBreaks
36
- # * MultilineBlockLayout
37
- # * MultilineHashBraceLayout
38
- # * MultilineHashKeyLineBreaks
39
- # * MultilineMethodArgumentLineBreaks
40
- # * ParameterAlignment
24
+ # * `Layout/ArgumentAlignment`
25
+ # * `Layout/ArrayAlignment`
26
+ # * `Layout/BlockAlignment`
27
+ # * `Layout/BlockEndNewline`
28
+ # * `Layout/ClosingParenthesisIndentation`
29
+ # * `Layout/FirstArgumentIndentation`
30
+ # * `Layout/FirstArrayElementIndentation`
31
+ # * `Layout/FirstHashElementIndentation`
32
+ # * `Layout/FirstParameterIndentation`
33
+ # * `Layout/HashAlignment`
34
+ # * `Layout/IndentationWidth`
35
+ # * `Layout/MultilineArrayLineBreaks`
36
+ # * `Layout/MultilineBlockLayout`
37
+ # * `Layout/MultilineHashBraceLayout`
38
+ # * `Layout/MultilineHashKeyLineBreaks`
39
+ # * `Layout/MultilineMethodArgumentLineBreaks`
40
+ # * `Layout/MultilineMethodParameterLineBreaks`
41
+ # * `Layout/ParameterAlignment`
42
+ # * `Style/BlockDelimiters`
41
43
  #
42
44
  # Together, these cops will pretty print hashes, arrays,
43
45
  # method calls, etc. For example, let's say the max columns
@@ -58,18 +60,30 @@ module RuboCop
58
60
  # bar: "0000000000",
59
61
  # baz: "0000000000",
60
62
  # }
61
- class LineLength < Cop
63
+ class LineLength < Base # rubocop:disable Metrics/ClassLength
62
64
  include CheckLineBreakable
63
- include ConfigurableMax
64
- include IgnoredPattern
65
+ include AllowedPattern
65
66
  include RangeHelp
66
67
  include LineLengthHelp
68
+ extend AutoCorrector
69
+
70
+ exclude_limit 'Max'
67
71
 
68
72
  MSG = 'Line is too long. [%<length>d/%<max>d]'
69
73
 
70
74
  def on_block(node)
71
75
  check_for_breakable_block(node)
72
76
  end
77
+ alias on_numblock on_block
78
+ alias on_itblock on_block
79
+
80
+ def on_str(node)
81
+ check_for_breakable_str(node)
82
+ end
83
+
84
+ def on_dstr(node)
85
+ check_for_breakable_dstr(node)
86
+ end
73
87
 
74
88
  def on_potential_breakable_node(node)
75
89
  check_for_breakable_node(node)
@@ -77,27 +91,26 @@ module RuboCop
77
91
  alias on_array on_potential_breakable_node
78
92
  alias on_hash on_potential_breakable_node
79
93
  alias on_send on_potential_breakable_node
94
+ alias on_csend on_potential_breakable_node
95
+ alias on_def on_potential_breakable_node
96
+ alias on_defs on_potential_breakable_node
97
+
98
+ def on_new_investigation
99
+ return unless processed_source.raw_source.include?(';')
80
100
 
81
- def investigate(processed_source)
82
101
  check_for_breakable_semicolons(processed_source)
83
102
  end
84
103
 
85
- def investigate_post_walk(processed_source)
104
+ def on_investigation_end
86
105
  processed_source.lines.each_with_index do |line, line_index|
87
106
  check_line(line, line_index)
88
107
  end
89
108
  end
90
109
 
91
- def autocorrect(range)
92
- return if range.nil?
93
-
94
- lambda do |corrector|
95
- corrector.insert_before(range, "\n")
96
- end
97
- end
98
-
99
110
  private
100
111
 
112
+ attr_accessor :breakable_range
113
+
101
114
  def check_for_breakable_node(node)
102
115
  breakable_node = extract_breakable_node(node, max)
103
116
  return if breakable_node.nil?
@@ -126,15 +139,50 @@ module RuboCop
126
139
  range = breakable_block_range(block_node)
127
140
  pos = range.begin_pos + 1
128
141
 
129
- breakable_range_by_line_index[line_index] =
130
- range_between(pos, pos + 1)
142
+ breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
143
+ end
144
+
145
+ def check_for_breakable_str(node)
146
+ line_index = node.loc.line - 1
147
+ return if breakable_range_by_line_index[line_index]
148
+
149
+ return unless breakable_string?(node)
150
+ return unless (delimiter = string_delimiter(node))
151
+ return unless (pos = breakable_string_position(node))
152
+
153
+ breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
154
+ breakable_string_delimiters[line_index] = delimiter
155
+ end
156
+
157
+ def check_for_breakable_dstr(node) # rubocop:disable Metrics/AbcSize
158
+ line_index = node.loc.line - 1
159
+ return if breakable_range_by_line_index[line_index]
160
+
161
+ return unless breakable_dstr?(node)
162
+ return unless (delimiter = string_delimiter(node))
163
+
164
+ node.each_child_node(:begin).detect do |begin_node|
165
+ next unless (pos = breakable_dstr_begin_position(begin_node))
166
+
167
+ breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
168
+ breakable_string_delimiters[line_index] = delimiter
169
+ end
170
+ end
171
+
172
+ def breakable_string?(node)
173
+ allow_string_split? &&
174
+ node.single_line? &&
175
+ !node.heredoc? &&
176
+ # TODO: strings inside hashes, kwargs and arrays are currently ignored,
177
+ # but could be considered in the future
178
+ !node.parent&.type?(:pair, :kwoptarg, :array)
131
179
  end
132
180
 
133
181
  def breakable_block_range(block_node)
134
182
  if block_node.arguments? && !block_node.lambda?
135
183
  block_node.arguments.loc.end
136
184
  else
137
- block_node.loc.begin
185
+ block_node.braces? ? block_node.loc.begin : block_node.loc.begin.adjust(begin_pos: 1)
138
186
  end
139
187
  end
140
188
 
@@ -142,7 +190,7 @@ module RuboCop
142
190
  range = semicolon_token.pos
143
191
  end_pos = range.end_pos
144
192
  next_range = range_between(end_pos, end_pos + 1)
145
- return nil unless next_range.line == range.line
193
+ return nil unless same_line?(next_range, range)
146
194
 
147
195
  next_char = next_range.source
148
196
  return nil if /[\r\n]/.match?(next_char)
@@ -151,10 +199,47 @@ module RuboCop
151
199
  next_range
152
200
  end
153
201
 
202
+ def breakable_string_position(node)
203
+ source_range = node.source_range
204
+ return if source_range.last_column < max
205
+ return unless (pos = breakable_string_range(node))
206
+
207
+ pos.end_pos unless pos.end_pos == source_range.begin_pos
208
+ end
209
+
210
+ # Locate where to break a string that is too long, ensuring that escape characters
211
+ # are not bisected.
212
+ # If the string contains spaces, use them to determine a place for a clean break;
213
+ # otherwise, the string will be broken at the line length limit.
214
+ def breakable_string_range(node)
215
+ source_range = node.source_range
216
+ relevant_substr = largest_possible_string(node)
217
+
218
+ if (space_pos = relevant_substr.rindex(/\s/))
219
+ source_range.resize(space_pos + 1)
220
+ elsif (escape_pos = relevant_substr.rindex(/\\(u[\da-f]{0,4}|x[\da-f]{0,2})?\z/))
221
+ source_range.resize(escape_pos)
222
+ else
223
+ adjustment = max - source_range.last_column - 3
224
+ return if adjustment.abs > source_range.size
225
+
226
+ source_range.adjust(end_pos: adjustment)
227
+ end
228
+ end
229
+
230
+ def breakable_dstr_begin_position(node)
231
+ source_range = node.source_range
232
+ source_range.begin_pos if source_range.column < max && source_range.last_column >= max
233
+ end
234
+
154
235
  def breakable_range_by_line_index
155
236
  @breakable_range_by_line_index ||= {}
156
237
  end
157
238
 
239
+ def breakable_string_delimiters
240
+ @breakable_string_delimiters ||= {}
241
+ end
242
+
158
243
  def heredocs
159
244
  @heredocs ||= extract_heredocs(processed_source.ast)
160
245
  end
@@ -168,36 +253,41 @@ module RuboCop
168
253
 
169
254
  def check_line(line, line_index)
170
255
  return if line_length(line) <= max
171
- return if ignored_line?(line, line_index)
256
+ return if allowed_line?(line, line_index)
172
257
 
173
258
  if ignore_cop_directives? && directive_on_source_line?(line_index)
174
259
  return check_directive_line(line, line_index)
175
260
  end
176
- return check_uri_line(line, line_index) if allow_uri?
261
+ return check_line_for_exemptions(line, line_index) if allow_uri? || allow_qualified_name?
177
262
 
178
- register_offense(
179
- excess_range(nil, line, line_index),
180
- line,
181
- line_index
182
- )
263
+ register_offense(excess_range(nil, line, line_index), line, line_index)
183
264
  end
184
265
 
185
- def ignored_line?(line, line_index)
186
- matches_ignored_pattern?(line) ||
266
+ def allowed_line?(line, line_index)
267
+ matches_allowed_pattern?(line) ||
187
268
  shebang?(line, line_index) ||
188
- heredocs && line_in_permitted_heredoc?(line_index.succ)
269
+ (heredocs && line_in_permitted_heredoc?(line_index.succ))
189
270
  end
190
271
 
191
272
  def shebang?(line, line_index)
192
273
  line_index.zero? && line.start_with?('#!')
193
274
  end
194
275
 
195
- def register_offense(loc, line, line_index)
196
- message = format(MSG, length: line_length(line), max: max)
276
+ def register_offense(loc, line, line_index, length: line_length(line))
277
+ message = format(MSG, length: length, max: max)
197
278
 
198
- breakable_range = breakable_range_by_line_index[line_index]
199
- add_offense(breakable_range, location: loc, message: message) do
279
+ self.breakable_range = breakable_range_by_line_index[line_index]
280
+
281
+ add_offense(loc, message: message) do |corrector|
200
282
  self.max = line_length(line)
283
+
284
+ insertion = if (delimiter = breakable_string_delimiters[line_index])
285
+ [delimiter, " \\\n", delimiter].join
286
+ else
287
+ "\n"
288
+ end
289
+
290
+ corrector.insert_before(breakable_range, insertion) unless breakable_range.nil?
201
291
  end
202
292
  end
203
293
 
@@ -224,6 +314,10 @@ module RuboCop
224
314
  cop_config['AllowHeredoc']
225
315
  end
226
316
 
317
+ def allow_string_split?
318
+ cop_config['SplitStrings']
319
+ end
320
+
227
321
  def extract_heredocs(ast)
228
322
  return [] unless ast
229
323
 
@@ -244,15 +338,14 @@ module RuboCop
244
338
  end
245
339
 
246
340
  def line_in_heredoc?(line_number)
247
- heredocs.any? do |range, _delimiter|
248
- range.cover?(line_number)
249
- end
341
+ heredocs.any? { |range, _delimiter| range.cover?(line_number) }
250
342
  end
251
343
 
252
344
  def check_directive_line(line, line_index)
253
- return if line_length_without_directive(line) <= max
345
+ length_without_directive = line_length_without_directive(line)
346
+ return if length_without_directive <= max
254
347
 
255
- range = max..(line_length_without_directive(line) - 1)
348
+ range = max..(length_without_directive - 1)
256
349
  register_offense(
257
350
  source_range(
258
351
  processed_source.buffer,
@@ -260,19 +353,62 @@ module RuboCop
260
353
  range
261
354
  ),
262
355
  line,
263
- line_index
356
+ line_index,
357
+ length: length_without_directive
264
358
  )
265
359
  end
266
360
 
267
- def check_uri_line(line, line_index)
268
- uri_range = find_excessive_uri_range(line)
269
- return if uri_range && allowed_uri_position?(line, uri_range)
361
+ def check_line_for_exemptions(line, line_index)
362
+ uri_range = range_if_applicable(line, :uri)
363
+ qualified_name_range = range_if_applicable(line, :qualified_name)
270
364
 
271
- register_offense(
272
- excess_range(uri_range, line, line_index),
273
- line,
274
- line_index
275
- )
365
+ return if allowed_combination?(line, uri_range, qualified_name_range)
366
+
367
+ range = uri_range || qualified_name_range
368
+ register_offense(excess_range(range, line, line_index), line, line_index)
369
+ end
370
+
371
+ def range_if_applicable(line, type)
372
+ return unless type == :uri ? allow_uri? : allow_qualified_name?
373
+
374
+ find_excessive_range(line, type)
375
+ end
376
+
377
+ def allowed_combination?(line, uri_range, qualified_name_range)
378
+ if uri_range && qualified_name_range
379
+ allowed_position?(line, uri_range) && allowed_position?(line, qualified_name_range)
380
+ elsif uri_range
381
+ allowed_position?(line, uri_range)
382
+ elsif qualified_name_range
383
+ allowed_position?(line, qualified_name_range)
384
+ else
385
+ false
386
+ end
387
+ end
388
+
389
+ def breakable_dstr?(node)
390
+ # If the `dstr` only contains one child, it cannot be broken
391
+ breakable_string?(node) && !node.child_nodes.one?
392
+ end
393
+
394
+ def string_delimiter(node)
395
+ delimiter = node.loc.begin
396
+ if node.parent&.dstr_type? && node.parent.loc.respond_to?(:begin)
397
+ delimiter ||= node.parent.loc.begin
398
+ end
399
+ delimiter = delimiter&.source
400
+
401
+ delimiter if %w[' "].include?(delimiter)
402
+ end
403
+
404
+ # Find the largest possible substring of a string node to retain before a break
405
+ def largest_possible_string(node)
406
+ # The maximum allowed length of a string value is:
407
+ # `Max` - end delimiter (quote) - continuation characters (space and slash)
408
+ max_length = max - 3
409
+ # If the string doesn't start at the beginning of the line, the max length is offset
410
+ max_length -= column_offset_between(node.loc, node.parent.loc) if node.parent
411
+ node.source[0...(max_length)]
276
412
  end
277
413
  end
278
414
  end