rubocop 1.67.0 → 1.77.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 (499) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +23 -17
  4. data/config/default.yml +337 -53
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +8 -3
  7. data/lib/rubocop/cached_data.rb +12 -4
  8. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  9. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  10. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/cli.rb +1 -1
  13. data/lib/rubocop/comment_config.rb +2 -2
  14. data/lib/rubocop/config.rb +52 -10
  15. data/lib/rubocop/config_loader.rb +52 -9
  16. data/lib/rubocop/config_loader_resolver.rb +36 -10
  17. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  18. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  19. data/lib/rubocop/config_obsoletion.rb +46 -2
  20. data/lib/rubocop/config_validator.rb +25 -14
  21. data/lib/rubocop/cop/autocorrect_logic.rb +51 -26
  22. data/lib/rubocop/cop/base.rb +7 -1
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  25. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  26. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  27. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  28. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
  29. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
  31. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  32. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  33. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  34. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
  35. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  36. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  37. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  38. data/lib/rubocop/cop/generator.rb +6 -0
  39. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  40. data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
  41. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  42. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  43. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  44. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  45. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
  46. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  47. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  48. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
  49. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  50. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  51. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  52. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  53. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  54. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  55. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  56. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  57. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  58. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  59. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  60. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  61. data/lib/rubocop/cop/internal_affairs.rb +7 -16
  62. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  63. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  64. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  65. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  66. data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
  67. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  68. data/lib/rubocop/cop/layout/class_structure.rb +44 -9
  69. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  70. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  71. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  72. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  73. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
  74. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  75. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
  76. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  77. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  78. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  79. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  80. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  81. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  82. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
  83. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  84. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  85. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  86. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  87. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  88. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  89. data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
  90. data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
  91. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  92. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  93. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  94. data/lib/rubocop/cop/layout/line_length.rb +149 -9
  95. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  96. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  97. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  98. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  99. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  100. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  101. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  102. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
  103. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  104. data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
  105. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -7
  106. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  107. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  108. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  109. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  110. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  111. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  112. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  113. data/lib/rubocop/cop/layout/space_around_operators.rb +23 -21
  114. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  115. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  116. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  117. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  118. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
  119. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  120. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
  121. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  122. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  123. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  124. data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
  125. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  126. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  127. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  128. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  129. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
  130. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  131. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  132. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  133. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  134. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  135. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -2
  136. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  137. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  138. data/lib/rubocop/cop/lint/duplicate_methods.rb +86 -19
  139. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  140. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  141. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  142. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  143. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  144. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  145. data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -1
  146. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  147. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  148. data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
  149. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  150. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  151. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  152. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  153. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  154. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  155. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  156. data/lib/rubocop/cop/lint/literal_as_condition.rb +110 -9
  157. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  158. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  159. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  160. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  161. data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
  162. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  163. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
  164. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  165. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  166. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  167. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  168. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  169. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  170. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  171. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  172. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  173. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  174. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  175. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  176. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  177. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
  178. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  179. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
  180. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  181. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  182. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  183. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  184. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  185. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  186. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  187. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  188. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  189. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  190. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  191. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
  192. data/lib/rubocop/cop/lint/self_assignment.rb +33 -10
  193. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  194. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
  195. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  196. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  197. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  198. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  199. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  200. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  201. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  202. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  203. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  204. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  205. data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
  206. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  207. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  208. data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
  209. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
  210. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  211. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  212. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  213. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  214. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  215. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  216. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  217. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  218. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  219. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  220. data/lib/rubocop/cop/lint/void.rb +16 -12
  221. data/lib/rubocop/cop/message_annotator.rb +7 -3
  222. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  223. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  224. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  225. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  226. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  227. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  228. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  229. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  230. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  231. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  232. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
  233. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  234. data/lib/rubocop/cop/mixin/alignment.rb +3 -3
  235. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  236. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  237. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  238. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  239. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  240. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  241. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  242. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  243. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  244. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  245. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  246. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
  247. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  248. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  249. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  250. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  251. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  252. data/lib/rubocop/cop/mixin/line_length_help.rb +27 -10
  253. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  254. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
  255. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  256. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  257. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  258. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  259. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  260. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  261. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  262. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  263. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  264. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  265. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  266. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  267. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  268. data/lib/rubocop/cop/naming/file_name.rb +2 -4
  269. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
  270. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  271. data/lib/rubocop/cop/naming/predicate_method.rb +281 -0
  272. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
  273. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  274. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  275. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  276. data/lib/rubocop/cop/offense.rb +2 -3
  277. data/lib/rubocop/cop/registry.rb +9 -6
  278. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  279. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  280. data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
  281. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  282. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  283. data/lib/rubocop/cop/style/and_or.rb +1 -1
  284. data/lib/rubocop/cop/style/arguments_forwarding.rb +47 -28
  285. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  286. data/lib/rubocop/cop/style/array_intersect.rb +42 -30
  287. data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
  288. data/lib/rubocop/cop/style/block_delimiters.rb +43 -25
  289. data/lib/rubocop/cop/style/case_like_if.rb +9 -12
  290. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  291. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  292. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  293. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  294. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  295. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  296. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  297. data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
  298. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  299. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  300. data/lib/rubocop/cop/style/conditional_assignment.rb +41 -27
  301. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  302. data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
  303. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
  304. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  305. data/lib/rubocop/cop/style/documentation.rb +1 -1
  306. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  307. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  308. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  309. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  310. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  311. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  312. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  313. data/lib/rubocop/cop/style/endless_method.rb +150 -18
  314. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  315. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  316. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  317. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  318. data/lib/rubocop/cop/style/exponential_notation.rb +5 -5
  319. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  320. data/lib/rubocop/cop/style/file_null.rb +89 -0
  321. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  322. data/lib/rubocop/cop/style/float_division.rb +8 -4
  323. data/lib/rubocop/cop/style/for.rb +1 -1
  324. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  325. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  326. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  327. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  328. data/lib/rubocop/cop/style/guard_clause.rb +17 -3
  329. data/lib/rubocop/cop/style/hash_conversion.rb +12 -4
  330. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  331. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  332. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  333. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  334. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  335. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  336. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  337. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
  338. data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
  339. data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
  340. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  341. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
  342. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  343. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  344. data/lib/rubocop/cop/style/inverse_methods.rb +15 -12
  345. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  346. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  347. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  348. data/lib/rubocop/cop/style/it_block_parameter.rb +119 -0
  349. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  350. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  351. data/lib/rubocop/cop/style/lambda.rb +1 -0
  352. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  353. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  354. data/lib/rubocop/cop/style/map_into_array.rb +11 -3
  355. data/lib/rubocop/cop/style/map_to_hash.rb +12 -1
  356. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  357. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -18
  358. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  359. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  360. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  361. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  362. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  363. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  364. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  365. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  366. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  367. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  368. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  369. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  370. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  371. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  372. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  373. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  374. data/lib/rubocop/cop/style/next.rb +44 -0
  375. data/lib/rubocop/cop/style/not.rb +1 -1
  376. data/lib/rubocop/cop/style/object_then.rb +15 -15
  377. data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
  378. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  379. data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
  380. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  381. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  382. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  383. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  384. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  385. data/lib/rubocop/cop/style/proc.rb +2 -2
  386. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  387. data/lib/rubocop/cop/style/raise_args.rb +15 -13
  388. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  389. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  390. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  391. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  392. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  393. data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
  394. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  395. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  396. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  397. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  398. data/lib/rubocop/cop/style/redundant_format.rb +262 -0
  399. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  400. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  401. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
  402. data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -18
  403. data/lib/rubocop/cop/style/redundant_parentheses.rb +77 -26
  404. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  405. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  406. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  407. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  408. data/lib/rubocop/cop/style/redundant_self.rb +15 -18
  409. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  410. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  411. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  412. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  413. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  414. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  415. data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
  416. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  417. data/lib/rubocop/cop/style/safe_navigation.rb +56 -16
  418. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  419. data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
  420. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  421. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  422. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  423. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  424. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  425. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  426. data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
  427. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  428. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  429. data/lib/rubocop/cop/style/sole_nested_conditional.rb +43 -106
  430. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  431. data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
  432. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  433. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  434. data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
  435. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  436. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  437. data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
  438. data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
  439. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  440. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  441. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  442. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  443. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  444. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  445. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  446. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  447. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  448. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  449. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  450. data/lib/rubocop/cop/team.rb +1 -1
  451. data/lib/rubocop/cop/util.rb +12 -5
  452. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  453. data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
  454. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  455. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  456. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  457. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  458. data/lib/rubocop/cop/variable_force.rb +5 -11
  459. data/lib/rubocop/cops_documentation_generator.rb +50 -25
  460. data/lib/rubocop/directive_comment.rb +45 -11
  461. data/lib/rubocop/ext/regexp_node.rb +0 -1
  462. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -2
  463. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  464. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  465. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  466. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  467. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  468. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  469. data/lib/rubocop/lsp/logger.rb +2 -2
  470. data/lib/rubocop/lsp/routes.rb +7 -23
  471. data/lib/rubocop/lsp/runtime.rb +18 -50
  472. data/lib/rubocop/lsp/server.rb +0 -2
  473. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  474. data/lib/rubocop/magic_comment.rb +11 -3
  475. data/lib/rubocop/options.rb +28 -12
  476. data/lib/rubocop/path_util.rb +15 -8
  477. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  478. data/lib/rubocop/plugin/load_error.rb +26 -0
  479. data/lib/rubocop/plugin/loader.rb +100 -0
  480. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  481. data/lib/rubocop/plugin.rb +46 -0
  482. data/lib/rubocop/rake_task.rb +4 -1
  483. data/lib/rubocop/result_cache.rb +13 -13
  484. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  485. data/lib/rubocop/rspec/expect_offense.rb +15 -5
  486. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  487. data/lib/rubocop/rspec/support.rb +4 -2
  488. data/lib/rubocop/runner.rb +26 -15
  489. data/lib/rubocop/server/cache.rb +47 -11
  490. data/lib/rubocop/server/cli.rb +2 -2
  491. data/lib/rubocop/target_finder.rb +7 -2
  492. data/lib/rubocop/target_ruby.rb +17 -2
  493. data/lib/rubocop/version.rb +53 -12
  494. data/lib/rubocop.rb +40 -2
  495. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  496. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  497. metadata +87 -21
  498. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  499. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -47,7 +47,7 @@ module RuboCop
47
47
  # @!method redundant_source_range(node)
48
48
  def_node_matcher :redundant_source_range, <<~PATTERN
49
49
  {
50
- (send $(send _ :source_range) :source)
50
+ (call $(call _ :source_range) :source)
51
51
  (send nil? :add_offense $(send _ :source_range) ...)
52
52
  (send _ {
53
53
  :replace :insert_before :insert_before_multi :insert_after :insert_after_multi
@@ -59,6 +59,7 @@ module RuboCop
59
59
 
60
60
  def on_send(node)
61
61
  return unless (source_range = redundant_source_range(node))
62
+ return unless source_range.receiver
62
63
  return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
63
64
 
64
65
  selector = source_range.loc.selector
@@ -67,6 +68,7 @@ module RuboCop
67
68
  corrector.remove(source_range.loc.dot.join(selector))
68
69
  end
69
70
  end
71
+ alias on_csend on_send
70
72
  end
71
73
  end
72
74
  end
@@ -34,8 +34,8 @@ module RuboCop
34
34
  # @!method single_line_comparison(node)
35
35
  def_node_matcher :single_line_comparison, <<~PATTERN
36
36
  {
37
- (send (send $_receiver {:line :first_line}) {:== :!=} (send _receiver :last_line))
38
- (send (send $_receiver :last_line) {:== :!=} (send _receiver {:line :first_line}))
37
+ (send (call $_receiver {:line :first_line}) {:== :!=} (call _receiver :last_line))
38
+ (send (call $_receiver :last_line) {:== :!=} (call _receiver {:line :first_line}))
39
39
  }
40
40
  PATTERN
41
41
 
@@ -43,7 +43,8 @@ module RuboCop
43
43
  return unless (receiver = single_line_comparison(node))
44
44
 
45
45
  bang = node.method?(:!=) ? '!' : ''
46
- preferred = "#{bang}#{extract_receiver(receiver)}.single_line?"
46
+ dot = receiver.parent.loc.dot.source
47
+ preferred = "#{bang}#{extract_receiver(receiver)}#{dot}single_line?"
47
48
 
48
49
  add_offense(node, message: format(MSG, preferred: preferred)) do |corrector|
49
50
  corrector.replace(node, preferred)
@@ -53,7 +54,7 @@ module RuboCop
53
54
  private
54
55
 
55
56
  def extract_receiver(node)
56
- node = node.receiver if node.send_type? && %i[loc source_range].include?(node.method_name)
57
+ node = node.receiver if node.call_type? && %i[loc source_range].include?(node.method_name)
57
58
  node.source
58
59
  end
59
60
  end
@@ -50,8 +50,6 @@ module RuboCop
50
50
  # end
51
51
  #
52
52
  class StyleDetectedApiUse < Base
53
- include RangeHelp
54
-
55
53
  MSG_FOR_POSITIVE_WITHOUT_NEGATIVE =
56
54
  '`correct_style_detected` method called without ' \
57
55
  'calling a negative `*_style_detected` method.'
@@ -10,14 +10,25 @@ module RuboCop
10
10
  extend FileFinder
11
11
 
12
12
  ALLOWED_CONFIGURATIONS = %w[
13
- Safe SafeAutoCorrect AutoCorrect Severity StyleGuide Details Reference Include Exclude
13
+ Safe SafeAutoCorrect AutoCorrect
14
+ Severity
15
+ StyleGuide
16
+ Details
17
+ Reference References
18
+ Include Exclude
14
19
  ].freeze
15
20
  RESTRICT_ON_SEND = %i[[] fetch].freeze
16
21
  MSG = '`%<name>s` is not defined in the configuration for `%<cop>s` ' \
17
22
  'in `config/default.yml`.'
18
23
  CONFIG_PATH = find_file_upwards('config/default.yml', Dir.pwd)
19
24
  CONFIG = if CONFIG_PATH
20
- ConfigLoader.load_yaml_configuration(CONFIG_PATH)
25
+ begin
26
+ original_debug = ConfigLoader.debug
27
+ ConfigLoader.debug = false
28
+ ConfigLoader.load_yaml_configuration(CONFIG_PATH)
29
+ ensure
30
+ ConfigLoader.debug = original_debug
31
+ end
21
32
  else
22
33
  {}
23
34
  end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'internal_affairs/cop_description'
4
+ require_relative 'internal_affairs/cop_enabled'
4
5
  require_relative 'internal_affairs/create_empty_file'
5
6
  require_relative 'internal_affairs/empty_line_between_expect_offense_and_correction'
6
7
  require_relative 'internal_affairs/example_description'
7
8
  require_relative 'internal_affairs/example_heredoc_delimiter'
8
9
  require_relative 'internal_affairs/inherit_deprecated_cop_class'
9
10
  require_relative 'internal_affairs/lambda_or_proc'
11
+ require_relative 'internal_affairs/location_exists'
10
12
  require_relative 'internal_affairs/location_expression'
11
13
  require_relative 'internal_affairs/location_line_equality_comparison'
12
14
  require_relative 'internal_affairs/method_name_end_with'
@@ -14,9 +16,14 @@ require_relative 'internal_affairs/method_name_equal'
14
16
  require_relative 'internal_affairs/node_destructuring'
15
17
  require_relative 'internal_affairs/node_first_or_last_argument'
16
18
  require_relative 'internal_affairs/node_matcher_directive'
19
+ require_relative 'internal_affairs/node_pattern_groups'
20
+ require_relative 'internal_affairs/node_type_group'
21
+ require_relative 'internal_affairs/node_type_multiple_predicates'
17
22
  require_relative 'internal_affairs/node_type_predicate'
18
23
  require_relative 'internal_affairs/numblock_handler'
19
24
  require_relative 'internal_affairs/offense_location_keyword'
25
+ require_relative 'internal_affairs/on_send_without_on_csend'
26
+ require_relative 'internal_affairs/operator_keyword'
20
27
  require_relative 'internal_affairs/processed_source_buffer_name'
21
28
  require_relative 'internal_affairs/redundant_context_config_parameter'
22
29
  require_relative 'internal_affairs/redundant_described_class_as_subject'
@@ -31,19 +38,3 @@ require_relative 'internal_affairs/style_detected_api_use'
31
38
  require_relative 'internal_affairs/undefined_config'
32
39
  require_relative 'internal_affairs/useless_message_assertion'
33
40
  require_relative 'internal_affairs/useless_restrict_on_send'
34
-
35
- module RuboCop
36
- # Patch in the InternalAffairs specific config values
37
- module InternalAffairs
38
- def self.inject!
39
- path = File.join(ConfigLoader::RUBOCOP_HOME, 'config', 'internal_affairs.yml')
40
- hash = ConfigLoader.load_yaml_configuration(path)
41
- config = Config.new(hash, path)
42
- puts "configuration from #{path}" if ConfigLoader.debug?
43
- config = ConfigLoader.merge_with_default(config, path)
44
- ConfigLoader.instance_variable_set(:@default_configuration, config)
45
- end
46
- end
47
- end
48
-
49
- RuboCop::InternalAffairs.inject!
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # Bare access modifiers (those not applying to specific methods) should be
7
- # indented as deep as method definitions, or as deep as the class/module
7
+ # indented as deep as method definitions, or as deep as the `class`/`module`
8
8
  # keyword, depending on configuration.
9
9
  #
10
10
  # @example EnforcedStyle: indent (default)
@@ -3,8 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Here we check if the arguments on a multi-line method
7
- # definition are aligned.
6
+ # Check that the arguments on a multi-line method call are aligned.
8
7
  #
9
8
  # @example EnforcedStyle: with_first_argument (default)
10
9
  # # good
@@ -142,16 +141,10 @@ module RuboCop
142
141
  end
143
142
 
144
143
  def enforce_hash_argument_with_separator?
145
- return false unless hash_argument_config['Enabled']
146
-
147
144
  RuboCop::Cop::Layout::HashAlignment::SEPARATOR_ALIGNMENT_STYLES.any? do |style|
148
- hash_argument_config[style]&.include?('separator')
145
+ config.for_enabled_cop('Layout/HashAlignment')[style]&.include?('separator')
149
146
  end
150
147
  end
151
-
152
- def hash_argument_config
153
- config.for_cop('Layout/HashAlignment')
154
- end
155
148
  end
156
149
  end
157
150
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Here we check if the elements of a multi-line array literal are
6
+ # Check that the elements of a multi-line array literal are
7
7
  # aligned.
8
8
  #
9
9
  # @example EnforcedStyle: with_first_element (default)
@@ -40,7 +40,6 @@ module RuboCop
40
40
  #
41
41
  class BeginEndAlignment < Base
42
42
  include EndKeywordAlignment
43
- include RangeHelp
44
43
  extend AutoCorrector
45
44
 
46
45
  MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'
@@ -73,6 +73,7 @@ module RuboCop
73
73
  # @!method block_end_align_target?(node, child)
74
74
  def_node_matcher :block_end_align_target?, <<~PATTERN
75
75
  {assignment?
76
+ any_def
76
77
  splat
77
78
  and
78
79
  or
@@ -85,6 +86,7 @@ module RuboCop
85
86
  end
86
87
 
87
88
  alias on_numblock on_block
89
+ alias on_itblock on_block
88
90
 
89
91
  def style_parameter_name
90
92
  'EnforcedStyleAlignWith'
@@ -127,7 +129,6 @@ module RuboCop
127
129
  start_loc,
128
130
  end_loc,
129
131
  do_source_line_column)
130
-
131
132
  error_source_line_column = if style == :start_of_block
132
133
  do_source_line_column
133
134
  else
@@ -189,7 +190,7 @@ module RuboCop
189
190
  # In offense message, we want to show the assignment LHS rather than
190
191
  # the entire assignment.
191
192
  def find_lhs_node(node)
192
- node, = *node while node.op_asgn_type? || node.masgn_type?
193
+ node = node.lhs while node.type?(:op_asgn, :masgn)
193
194
  node
194
195
  end
195
196
 
@@ -43,6 +43,7 @@ module RuboCop
43
43
  end
44
44
 
45
45
  alias on_numblock on_block
46
+ alias on_itblock on_block
46
47
 
47
48
  private
48
49
 
@@ -3,25 +3,30 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Checks if the code style follows the ExpectedOrder configuration:
6
+ # Checks if the code style follows the `ExpectedOrder` configuration:
7
7
  #
8
8
  # `Categories` allows us to map macro names into a category.
9
9
  #
10
10
  # Consider an example of code style that covers the following order:
11
11
  #
12
- # * Module inclusion (include, prepend, extend)
12
+ # * Module inclusion (`include`, `prepend`, `extend`)
13
13
  # * Constants
14
- # * Associations (has_one, has_many)
15
- # * Public attribute macros (attr_accessor, attr_writer, attr_reader)
16
- # * Other macros (validates, validate)
14
+ # * Associations (`has_one`, `has_many`)
15
+ # * Public attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
16
+ # * Other macros (`validates`, `validate`)
17
17
  # * Public class methods
18
18
  # * Initializer
19
19
  # * Public instance methods
20
- # * Protected attribute macros (attr_accessor, attr_writer, attr_reader)
20
+ # * Protected attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
21
21
  # * Protected instance methods
22
- # * Private attribute macros (attr_accessor, attr_writer, attr_reader)
22
+ # * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
23
23
  # * Private instance methods
24
24
  #
25
+ # NOTE: Simply enabling the cop with `Enabled: true` will not use
26
+ # the example order shown below.
27
+ # To enforce the order of macros like `attr_reader`,
28
+ # you must define both `ExpectedOrder` *and* `Categories`.
29
+ #
25
30
  # You can configure the following order:
26
31
  #
27
32
  # [source,yaml]
@@ -68,6 +73,36 @@ module RuboCop
68
73
  # - extend
69
74
  # ----
70
75
  #
76
+ # If you only set `ExpectedOrder`
77
+ # without defining `Categories`,
78
+ # macros such as `attr_reader` or `has_many`
79
+ # will not be recognized as part of a category, and their order will not be validated.
80
+ # For example, the following will NOT raise any offenses, even if the order is incorrect:
81
+ #
82
+ # [source,yaml]
83
+ # ----
84
+ # Layout/ClassStructure:
85
+ # Enabled: true
86
+ # ExpectedOrder:
87
+ # - public_attribute_macros
88
+ # - initializer
89
+ # ----
90
+ #
91
+ # To make it work as expected, you must also specify `Categories` like this:
92
+ #
93
+ # [source,yaml]
94
+ # ----
95
+ # Layout/ClassStructure:
96
+ # ExpectedOrder:
97
+ # - public_attribute_macros
98
+ # - initializer
99
+ # Categories:
100
+ # attribute_macros:
101
+ # - attr_reader
102
+ # - attr_writer
103
+ # - attr_accessor
104
+ # ----
105
+ #
71
106
  # @safety
72
107
  # Autocorrection is unsafe because class methods and module inclusion
73
108
  # can behave differently, based on which methods or constants have
@@ -236,7 +271,7 @@ module RuboCop
236
271
 
237
272
  return [] unless class_def
238
273
 
239
- if class_def.def_type? || class_def.send_type?
274
+ if class_def.type?(:def, :send)
240
275
  [class_def]
241
276
  else
242
277
  class_def.children.compact
@@ -289,7 +324,7 @@ module RuboCop
289
324
  def marked_as_private_constant?(node, name)
290
325
  return false unless node.method?(:private_constant)
291
326
 
292
- node.arguments.any? { |arg| (arg.sym_type? || arg.str_type?) && arg.value == name }
327
+ node.arguments.any? { |arg| arg.type?(:sym, :str) && arg.value == name }
293
328
  end
294
329
 
295
330
  def end_position_for(node)
@@ -155,13 +155,13 @@ module RuboCop
155
155
  end
156
156
 
157
157
  def all_elements_aligned?(elements)
158
- elements.flat_map do |e|
159
- if e.hash_type?
160
- e.each_child_node.map { |child| child.loc.column }
161
- else
158
+ if elements.first.hash_type?
159
+ elements.first.each_child_node.map { |child| child.loc.column }
160
+ else
161
+ elements.flat_map do |e|
162
162
  e.loc.column
163
163
  end
164
- end.uniq.count == 1
164
+ end.uniq.one?
165
165
  end
166
166
 
167
167
  def first_argument_line(elements)
@@ -48,7 +48,7 @@ module RuboCop
48
48
  def on_send(node)
49
49
  return unless node.def_modifier?
50
50
 
51
- method_def = node.each_descendant(:def, :defs).first
51
+ method_def = node.each_descendant(:any_def).first
52
52
  expr = node.source_range
53
53
 
54
54
  line_start = range_between(expr.begin_pos, method_def.loc.keyword.end_pos)
@@ -120,7 +120,7 @@ module RuboCop
120
120
  end
121
121
 
122
122
  def heredoc?(node)
123
- (node.str_type? || node.dstr_type?) && node.heredoc?
123
+ node.type?(:str, :dstr) && node.heredoc?
124
124
  end
125
125
 
126
126
  def end_range(node)
@@ -49,7 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def on_rescue(node)
52
- return unless node.loc.respond_to?(:else) && node.loc.else
52
+ return unless node.loc?(:else)
53
53
 
54
54
  check_alignment(base_range_of_rescue(node), node.loc.else)
55
55
  end
@@ -92,7 +92,7 @@ module RuboCop
92
92
  case parent.type
93
93
  when :def, :defs then base_for_method_definition(parent)
94
94
  when :kwbegin then parent.loc.begin
95
- when :block
95
+ when :block, :numblock, :itblock
96
96
  assignment_node = assignment_node(parent)
97
97
  if same_line?(parent, assignment_node)
98
98
  assignment_node.source_range
@@ -131,7 +131,7 @@ module RuboCop
131
131
 
132
132
  def next_sibling_parent_empty_or_else?(node)
133
133
  next_sibling = node.right_sibling
134
- return true if next_sibling.nil?
134
+ return true unless next_sibling.is_a?(AST::Node)
135
135
 
136
136
  parent = next_sibling.parent
137
137
 
@@ -189,7 +189,7 @@ module RuboCop
189
189
  end
190
190
 
191
191
  def offense_location(node)
192
- if node.loc.respond_to?(:end) && node.loc.end
192
+ if node.loc?(:end)
193
193
  node.loc.end
194
194
  else
195
195
  node
@@ -200,7 +200,7 @@ module RuboCop
200
200
  parent = node.parent
201
201
  return false unless parent
202
202
 
203
- parent.begin_type? && parent.single_line?
203
+ parent.begin_type? && same_line?(node, node.right_sibling)
204
204
  end
205
205
 
206
206
  # SimpleCov excludes code from the coverage report by wrapping it in `# :nocov:`:
@@ -22,8 +22,6 @@ module RuboCop
22
22
  # def b
23
23
  # end
24
24
  #
25
- # @example
26
- #
27
25
  # # good
28
26
  # def a
29
27
  # end
@@ -42,8 +40,6 @@ module RuboCop
42
40
  # def b
43
41
  # end
44
42
  #
45
- # @example
46
- #
47
43
  # # good
48
44
  # class A
49
45
  # end
@@ -65,8 +61,6 @@ module RuboCop
65
61
  # def b
66
62
  # end
67
63
  #
68
- # @example
69
- #
70
64
  # # good
71
65
  # module A
72
66
  # end
@@ -162,7 +156,7 @@ module RuboCop
162
156
  private
163
157
 
164
158
  def def_location(correction_node)
165
- if correction_node.block_type?
159
+ if correction_node.any_block_type?
166
160
  correction_node.source_range.join(correction_node.children.first.source_range)
167
161
  else
168
162
  correction_node.loc.keyword.join(correction_node.loc.name)
@@ -181,12 +175,12 @@ module RuboCop
181
175
  end
182
176
 
183
177
  def macro_candidate?(node)
184
- node.block_type? && node.children.first.macro? &&
178
+ node.any_block_type? && node.children.first.macro? &&
185
179
  empty_line_between_macros.include?(node.children.first.method_name)
186
180
  end
187
181
 
188
182
  def method_candidate?(node)
189
- cop_config['EmptyLineBetweenMethodDefs'] && (node.def_type? || node.defs_type?)
183
+ cop_config['EmptyLineBetweenMethodDefs'] && node.any_def_type?
190
184
  end
191
185
 
192
186
  def class_candidate?(node)
@@ -246,7 +240,7 @@ module RuboCop
246
240
  end
247
241
 
248
242
  def def_start(node)
249
- if node.block_type? && node.children.first.send_type?
243
+ if node.any_block_type? && node.children.first.send_type?
250
244
  node.source_range.line
251
245
  else
252
246
  node.loc.keyword.line
@@ -258,7 +252,7 @@ module RuboCop
258
252
  end
259
253
 
260
254
  def end_loc(node)
261
- if (node.def_type? || node.defs_type?) && node.endless?
255
+ if node.any_def_type? && node.endless?
262
256
  node.source_range.end
263
257
  else
264
258
  node.loc.end
@@ -283,6 +277,8 @@ module RuboCop
283
277
  case node.type
284
278
  when :def, :defs
285
279
  :method
280
+ when :numblock, :itblock
281
+ :block
286
282
  else
287
283
  node.type
288
284
  end
@@ -83,17 +83,18 @@ module RuboCop
83
83
  end
84
84
 
85
85
  alias on_numblock on_block
86
+ alias on_itblock on_block
86
87
 
87
- def on_send(node) # rubocop:disable Metrics/CyclomaticComplexity
88
- return unless node.bare_access_modifier? &&
89
- !(node.parent&.block_type? || node.parent&.numblock_type?)
88
+ def on_send(node)
89
+ return unless node.bare_access_modifier? && !node.block_literal?
90
+ return if same_line?(node, node.right_sibling)
90
91
  return if expected_empty_lines?(node)
91
92
 
92
93
  message = message(node)
93
94
  add_offense(node, message: message) do |corrector|
94
95
  line = range_by_whole_lines(node.source_range)
95
96
 
96
- corrector.insert_before(line, "\n") unless previous_line_empty?(node.first_line)
97
+ corrector.insert_before(line, "\n") if should_insert_line_before?(node)
97
98
 
98
99
  correct_next_line_if_denied_style(corrector, node, line)
99
100
  end
@@ -115,18 +116,20 @@ module RuboCop
115
116
  def allowed_only_before_style?(node)
116
117
  if node.special_modifier?
117
118
  return true if processed_source[node.last_line] == 'end'
118
- return false if next_line_empty?(node.last_line)
119
+ return false if next_line_empty_and_exists?(node.last_line)
119
120
  end
120
121
 
121
122
  previous_line_empty?(node.first_line)
122
123
  end
123
124
 
124
125
  def correct_next_line_if_denied_style(corrector, node, line)
126
+ return unless should_insert_line_after?(node)
127
+
125
128
  case style
126
129
  when :around
127
130
  corrector.insert_after(line, "\n") unless next_line_empty?(node.last_line)
128
131
  when :only_before
129
- if next_line_empty?(node.last_line)
132
+ if next_line_empty_and_exists?(node.last_line)
130
133
  range = next_empty_line_range(node)
131
134
 
132
135
  corrector.remove(range)
@@ -135,7 +138,7 @@ module RuboCop
135
138
  end
136
139
 
137
140
  def previous_line_ignoring_comments(processed_source, send_line)
138
- processed_source[0..send_line - 2].reverse.find { |line| !comment_line?(line) }
141
+ processed_source[0..(send_line - 2)].reverse.find { |line| !comment_line?(line) }
139
142
  end
140
143
 
141
144
  def previous_line_empty?(send_line)
@@ -151,6 +154,10 @@ module RuboCop
151
154
  body_end?(last_send_line) || next_line.blank?
152
155
  end
153
156
 
157
+ def next_line_empty_and_exists?(last_send_line)
158
+ next_line_empty?(last_send_line) && last_send_line.next != processed_source.lines.size
159
+ end
160
+
154
161
  def empty_lines_around?(node)
155
162
  previous_line_empty?(node.first_line) && next_line_empty?(node.last_line)
156
163
  end
@@ -205,6 +212,29 @@ module RuboCop
205
212
  format(MSG_BEFORE_FOR_ONLY_BEFORE, modifier: modifier)
206
213
  end
207
214
  end
215
+
216
+ def should_insert_line_before?(node)
217
+ return false if previous_line_empty?(node.first_line)
218
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
219
+ return true unless node.parent.begin_type?
220
+
221
+ node.parent.children.first != node
222
+ end
223
+
224
+ def should_insert_line_after?(node)
225
+ return true unless inside_block?(node) && no_empty_lines_around_block_body?
226
+
227
+ node.parent.children.last != node
228
+ end
229
+
230
+ def inside_block?(node)
231
+ node.parent.block_type? || (node.parent.begin_type? && node.parent.parent&.block_type?)
232
+ end
233
+
234
+ def no_empty_lines_around_block_body?
235
+ config.for_enabled_cop('Layout/EmptyLinesAroundBlockBody')['EnforcedStyle'] ==
236
+ 'no_empty_lines'
237
+ end
208
238
  end
209
239
  end
210
240
  end
@@ -8,19 +8,18 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  #
11
- # # good
12
- #
11
+ # # bad
13
12
  # begin
13
+ #
14
14
  # # ...
15
- # end
16
15
  #
17
- # # bad
16
+ # end
18
17
  #
18
+ # # good
19
19
  # begin
20
- #
21
20
  # # ...
22
- #
23
21
  # end
22
+ #
24
23
  class EmptyLinesAroundBeginBody < Base
25
24
  include EmptyLinesAroundBody
26
25
  extend AutoCorrector
@@ -34,6 +34,7 @@ module RuboCop
34
34
  end
35
35
 
36
36
  alias on_numblock on_block
37
+ alias on_itblock on_block
37
38
  end
38
39
  end
39
40
  end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks if empty lines exist around the bodies of `begin`
7
7
  # sections. This cop doesn't check empty lines at `begin` body
8
8
  # beginning/end and around method definition body.
9
- # `Style/EmptyLinesAroundBeginBody` or `Style/EmptyLinesAroundMethodBody`
9
+ # `Layout/EmptyLinesAroundBeginBody` or `Layout/EmptyLinesAroundMethodBody`
10
10
  # can be used for this purpose.
11
11
  #
12
12
  # @example
@@ -72,8 +72,7 @@ module RuboCop
72
72
  alias on_numblock on_def
73
73
 
74
74
  def on_kwbegin(node)
75
- body, = *node
76
- check_body(body, node.loc.line)
75
+ check_body(node.children.first, node.loc.line)
77
76
  end
78
77
 
79
78
  private
@@ -128,10 +127,10 @@ module RuboCop
128
127
  end
129
128
 
130
129
  def keyword_locations_in_ensure(node)
131
- ensure_body, = *node
130
+ rescue_body_without_ensure = node.children.first
132
131
  [
133
132
  node.loc.keyword,
134
- *keyword_locations(ensure_body)
133
+ *keyword_locations(rescue_body_without_ensure)
135
134
  ]
136
135
  end
137
136
  end