rubocop 1.69.2 → 1.75.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +154 -23
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +3 -1
  7. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  8. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  9. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  10. data/lib/rubocop/cli.rb +1 -1
  11. data/lib/rubocop/comment_config.rb +2 -2
  12. data/lib/rubocop/config.rb +52 -10
  13. data/lib/rubocop/config_loader.rb +52 -9
  14. data/lib/rubocop/config_loader_resolver.rb +36 -10
  15. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  16. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  17. data/lib/rubocop/config_obsoletion.rb +46 -2
  18. data/lib/rubocop/config_validator.rb +20 -9
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  20. data/lib/rubocop/cop/base.rb +6 -0
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  23. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  24. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
  25. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  26. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  27. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  28. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  29. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  30. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  31. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  33. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  34. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  35. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  36. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  37. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  38. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  39. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  40. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  41. data/lib/rubocop/cop/internal_affairs.rb +6 -16
  42. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  43. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  44. data/lib/rubocop/cop/layout/block_alignment.rb +4 -1
  45. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  46. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  47. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  48. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  49. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  50. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  51. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  52. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +28 -1
  53. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  54. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  55. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  56. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  57. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  58. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  59. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  60. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  61. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  62. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  63. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  64. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  65. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  66. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  67. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  68. data/lib/rubocop/cop/layout/line_length.rb +9 -4
  69. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  70. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  71. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  72. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  73. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  74. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  75. data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
  76. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
  77. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  78. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  79. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  80. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  81. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  82. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  83. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  84. data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
  85. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  86. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  87. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  88. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  89. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  90. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  91. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  92. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  93. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  94. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  95. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  96. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  97. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  98. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  99. data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
  100. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  101. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  102. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  103. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  104. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  105. data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
  106. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  107. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  108. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  109. data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
  110. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  111. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  112. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  113. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  114. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
  115. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  116. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  117. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  118. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  119. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  120. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  121. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  122. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  123. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  124. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  125. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +258 -0
  126. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  127. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  128. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  129. data/lib/rubocop/cop/lint/return_in_void_context.rb +4 -11
  130. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  131. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
  132. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  133. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  134. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  135. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  136. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  137. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  138. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  139. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  140. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -1
  141. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  142. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  143. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  144. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  145. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  146. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  147. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  148. data/lib/rubocop/cop/lint/void.rb +12 -9
  149. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  150. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  151. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  152. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  153. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  154. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  155. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  156. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  157. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  158. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  159. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  160. data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
  161. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +1 -1
  162. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  163. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  164. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  165. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  166. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  167. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  168. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  169. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  170. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  171. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  172. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  173. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  174. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  175. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  176. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  177. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  178. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  179. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  180. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  181. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  182. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  183. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  184. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  185. data/lib/rubocop/cop/registry.rb +9 -6
  186. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  187. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  188. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  189. data/lib/rubocop/cop/style/and_or.rb +1 -1
  190. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  191. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  192. data/lib/rubocop/cop/style/array_intersect.rb +39 -28
  193. data/lib/rubocop/cop/style/block_delimiters.rb +9 -21
  194. data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
  195. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  196. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  197. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  198. data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
  199. data/lib/rubocop/cop/style/comparable_between.rb +75 -0
  200. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  201. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
  202. data/lib/rubocop/cop/style/documentation.rb +1 -1
  203. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  204. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  205. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  206. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  207. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  208. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  209. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  210. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  211. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  212. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  213. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  214. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  215. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  216. data/lib/rubocop/cop/style/float_division.rb +8 -4
  217. data/lib/rubocop/cop/style/for.rb +1 -0
  218. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  219. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  220. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  221. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  222. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  223. data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
  224. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  225. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  226. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  227. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  228. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
  229. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  230. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  231. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  232. data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
  233. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  234. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  235. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  236. data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
  237. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  238. data/lib/rubocop/cop/style/lambda.rb +1 -0
  239. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  240. data/lib/rubocop/cop/style/map_into_array.rb +2 -1
  241. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  242. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  243. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +22 -15
  244. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  245. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  246. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  247. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  248. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  249. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  250. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  251. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  252. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  253. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  254. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  255. data/lib/rubocop/cop/style/next.rb +44 -0
  256. data/lib/rubocop/cop/style/object_then.rb +14 -15
  257. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  258. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  259. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  260. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  261. data/lib/rubocop/cop/style/proc.rb +2 -2
  262. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  263. data/lib/rubocop/cop/style/raise_args.rb +14 -12
  264. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  265. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  266. data/lib/rubocop/cop/style/redundant_condition.rb +47 -2
  267. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  268. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  269. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  270. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  271. data/lib/rubocop/cop/style/redundant_format.rb +257 -0
  272. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  273. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  274. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  275. data/lib/rubocop/cop/style/redundant_parentheses.rb +30 -15
  276. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  277. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  278. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  279. data/lib/rubocop/cop/style/redundant_self.rb +1 -0
  280. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  281. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  282. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  283. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  284. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  285. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  286. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  287. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  288. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  289. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  290. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  291. data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
  292. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  293. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  294. data/lib/rubocop/cop/style/sole_nested_conditional.rb +41 -106
  295. data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
  296. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  297. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  298. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  299. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  300. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  301. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  302. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  303. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  304. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  305. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  306. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  307. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  308. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  309. data/lib/rubocop/cop/util.rb +12 -5
  310. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  311. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  312. data/lib/rubocop/cop/variable_force/variable.rb +9 -2
  313. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  314. data/lib/rubocop/cop/variable_force.rb +1 -1
  315. data/lib/rubocop/cops_documentation_generator.rb +25 -14
  316. data/lib/rubocop/directive_comment.rb +45 -11
  317. data/lib/rubocop/ext/regexp_node.rb +0 -1
  318. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  319. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  320. data/lib/rubocop/lsp/logger.rb +2 -2
  321. data/lib/rubocop/lsp/routes.rb +7 -23
  322. data/lib/rubocop/lsp/runtime.rb +18 -50
  323. data/lib/rubocop/lsp/server.rb +0 -2
  324. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  325. data/lib/rubocop/options.rb +28 -12
  326. data/lib/rubocop/path_util.rb +15 -8
  327. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  328. data/lib/rubocop/plugin/load_error.rb +26 -0
  329. data/lib/rubocop/plugin/loader.rb +100 -0
  330. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  331. data/lib/rubocop/plugin.rb +46 -0
  332. data/lib/rubocop/rake_task.rb +4 -1
  333. data/lib/rubocop/result_cache.rb +13 -13
  334. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  335. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  336. data/lib/rubocop/rspec/shared_contexts.rb +39 -1
  337. data/lib/rubocop/rspec/support.rb +4 -2
  338. data/lib/rubocop/runner.rb +10 -7
  339. data/lib/rubocop/server/cache.rb +35 -2
  340. data/lib/rubocop/server/cli.rb +2 -2
  341. data/lib/rubocop/target_finder.rb +1 -0
  342. data/lib/rubocop/target_ruby.rb +16 -1
  343. data/lib/rubocop/version.rb +30 -8
  344. data/lib/rubocop.rb +16 -1
  345. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  346. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  347. metadata +59 -16
  348. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  349. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -101,14 +101,13 @@ module RuboCop
101
101
  check(node) if loop_method?(node)
102
102
  end
103
103
 
104
- def on_numblock(node)
105
- check(node) if loop_method?(node)
106
- end
104
+ alias on_numblock on_block
105
+ alias on_itblock on_block
107
106
 
108
107
  private
109
108
 
110
109
  def loop_method?(node)
111
- return false unless node.block_type? || node.numblock_type?
110
+ return false unless node.any_block_type?
112
111
 
113
112
  send_node = node.send_node
114
113
  loopable = send_node.enumerable_method? || send_node.enumerator_method? ||
@@ -189,8 +188,9 @@ module RuboCop
189
188
 
190
189
  def preceded_by_continue_statement?(break_statement)
191
190
  break_statement.left_siblings.any? do |sibling|
192
- # Numblocks have the arguments count as a number in the AST.
193
- next if sibling.is_a?(Integer)
191
+ # Numblocks have the arguments count as a number or,
192
+ # itblocks have `:it` symbol in the AST.
193
+ next if sibling.is_a?(Integer) || sibling.is_a?(Symbol)
194
194
  next if sibling.loop_keyword? || loop_method?(sibling)
195
195
 
196
196
  sibling.each_descendant(*CONTINUE_KEYWORDS).any?
@@ -143,6 +143,7 @@ module RuboCop
143
143
  end
144
144
 
145
145
  alias on_numblock on_block
146
+ alias on_itblock on_block
146
147
 
147
148
  private
148
149
 
@@ -159,12 +160,12 @@ module RuboCop
159
160
 
160
161
  # @!method dynamic_method_definition?(node)
161
162
  def_node_matcher :dynamic_method_definition?, <<~PATTERN
162
- {(send nil? :define_method ...) ({block numblock} (send nil? :define_method ...) ...)}
163
+ {(send nil? :define_method ...) (any_block (send nil? :define_method ...) ...)}
163
164
  PATTERN
164
165
 
165
166
  # @!method class_or_instance_eval?(node)
166
167
  def_node_matcher :class_or_instance_eval?, <<~PATTERN
167
- ({block numblock} (send _ {:class_eval :instance_eval}) ...)
168
+ (any_block (send _ {:class_eval :instance_eval}) ...)
168
169
  PATTERN
169
170
 
170
171
  def check_node(node)
@@ -268,7 +269,7 @@ module RuboCop
268
269
  end
269
270
 
270
271
  def start_of_new_scope?(child)
271
- child.module_type? || child.class_type? || child.sclass_type? || eval_call?(child)
272
+ child.type?(:module, :class, :sclass) || eval_call?(child)
272
273
  end
273
274
 
274
275
  def eval_call?(child)
@@ -282,7 +283,7 @@ module RuboCop
282
283
  matcher_name = :"#{m}_block?"
283
284
  unless respond_to?(matcher_name)
284
285
  self.class.def_node_matcher matcher_name, <<~PATTERN
285
- ({block numblock} (send {nil? const} {:#{m}} ...) ...)
286
+ (any_block (send {nil? const} {:#{m}} ...) ...)
286
287
  PATTERN
287
288
  end
288
289
 
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # rescue, ensure, etc.
18
18
  #
19
19
  # This cop's autocorrection avoids cases like `a ||= 1` because removing assignment from
20
- # operator assignment can cause NameError if this assignment has been used to declare
20
+ # operator assignment can cause `NameError` if this assignment has been used to declare
21
21
  # a local variable. For example, replacing `a ||= 1` with `a || 1` may cause
22
22
  # "undefined local variable or method `a' for main:Object (NameError)".
23
23
  #
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Checks for useless constant scoping. Private constants must be defined using
7
+ # `private_constant`. Even if `private` access modifier is used, it is public scope despite
8
+ # its appearance.
9
+ #
10
+ # It does not support autocorrection due to behavior change and multiple ways to fix it.
11
+ # Or a public constant may be intended.
12
+ #
13
+ # @example
14
+ #
15
+ # # bad
16
+ # class Foo
17
+ # private
18
+ # PRIVATE_CONST = 42
19
+ # end
20
+ #
21
+ # # good
22
+ # class Foo
23
+ # PRIVATE_CONST = 42
24
+ # private_constant :PRIVATE_CONST
25
+ # end
26
+ #
27
+ # # good
28
+ # class Foo
29
+ # PUBLIC_CONST = 42 # If private scope is not intended.
30
+ # end
31
+ #
32
+ class UselessConstantScoping < Base
33
+ MSG = 'Useless `private` access modifier for constant scope.'
34
+
35
+ # @!method private_constants(node)
36
+ def_node_matcher :private_constants, <<~PATTERN
37
+ (send nil? :private_constant $...)
38
+ PATTERN
39
+
40
+ def on_casgn(node)
41
+ return unless after_private_modifier?(node.left_siblings)
42
+ return if private_constantize?(node.right_siblings, node.name)
43
+
44
+ add_offense(node)
45
+ end
46
+
47
+ private
48
+
49
+ def after_private_modifier?(left_siblings)
50
+ access_modifier_candidates = left_siblings.compact.select do |left_sibling|
51
+ left_sibling.respond_to?(:send_type?) && left_sibling.send_type?
52
+ end
53
+
54
+ access_modifier_candidates.any? do |candidate|
55
+ candidate.command?(:private) && candidate.arguments.none?
56
+ end
57
+ end
58
+
59
+ def private_constantize?(right_siblings, const_value)
60
+ private_constant_arguments = right_siblings.map { |node| private_constants(node) }
61
+
62
+ private_constant_values = private_constant_arguments.flatten.filter_map do |constant|
63
+ constant.value.to_sym if constant.respond_to?(:value)
64
+ end
65
+
66
+ private_constant_values.include?(const_value)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -59,7 +59,7 @@ module RuboCop
59
59
  end
60
60
 
61
61
  def use_rest_or_optional_args?(node)
62
- node.arguments.any? { |arg| arg.restarg_type? || arg.optarg_type? || arg.kwoptarg_type? }
62
+ node.arguments.any? { |arg| arg.type?(:restarg, :optarg, :kwoptarg) }
63
63
  end
64
64
 
65
65
  def delegating?(node, def_node)
@@ -35,7 +35,7 @@ module RuboCop
35
35
  RESTRICT_ON_SEND = %i[+ - * / **].freeze
36
36
 
37
37
  # @!method useless_operation?(node)
38
- def_node_matcher :useless_operation?, '(send (send nil? $_) $_ (int $_))'
38
+ def_node_matcher :useless_operation?, '(call (call nil? $_) $_ (int $_))'
39
39
 
40
40
  # @!method useless_abbreviated_assignment?(node)
41
41
  def_node_matcher :useless_abbreviated_assignment?, '(op-asgn (lvasgn $_) $_ (int $_))'
@@ -50,6 +50,7 @@ module RuboCop
50
50
  corrector.replace(node, variable)
51
51
  end
52
52
  end
53
+ alias on_csend on_send
53
54
 
54
55
  def on_op_asgn(node)
55
56
  return unless useless_abbreviated_assignment?(node)
@@ -72,7 +72,7 @@ module RuboCop
72
72
  def_node_matcher :method_definition, <<~PATTERN
73
73
  {
74
74
  (def %1 ...)
75
- ({block numblock} (send _ :define_method (sym %1)) ...)
75
+ (any_block (send _ :define_method (sym %1)) ...)
76
76
  }
77
77
  PATTERN
78
78
 
@@ -108,7 +108,7 @@ module RuboCop
108
108
 
109
109
  def find_method_definition(node, method_name)
110
110
  node.each_ancestor.lazy.map do |ancestor|
111
- ancestor.each_child_node(:def, :block, :numblock).find do |child|
111
+ ancestor.each_child_node(:def, :any_block).find do |child|
112
112
  method_definition(child, method_name)
113
113
  end
114
114
  end.find(&:itself)
@@ -86,6 +86,7 @@ module RuboCop
86
86
  check_expression(node.body)
87
87
  end
88
88
  alias on_numblock on_block
89
+ alias on_itblock on_block
89
90
 
90
91
  def on_begin(node)
91
92
  check_begin(node)
@@ -103,7 +104,7 @@ module RuboCop
103
104
  expressions.pop unless in_void_context?(node)
104
105
  expressions.each do |expr|
105
106
  check_void_op(expr) do
106
- block_node = node.each_ancestor(:block).first
107
+ block_node = node.each_ancestor(:any_block).first
107
108
 
108
109
  block_node&.method?(:each)
109
110
  end
@@ -113,7 +114,8 @@ module RuboCop
113
114
  end
114
115
 
115
116
  def check_expression(expr)
116
- expr = expr.body if expr.if_type? && expr.modifier_form?
117
+ expr = expr.body if expr.if_type?
118
+ return unless expr
117
119
 
118
120
  check_literal(expr)
119
121
  check_var(expr)
@@ -124,9 +126,14 @@ module RuboCop
124
126
  check_nonmutating(expr)
125
127
  end
126
128
 
129
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
127
130
  def check_void_op(node, &block)
128
131
  node = node.children.first while node.begin_type?
129
132
  return unless node.call_type? && OPERATORS.include?(node.method_name)
133
+ if !UNARY_OPERATORS.include?(node.method_name) && node.loc.dot && node.arguments.none?
134
+ return
135
+ end
136
+
130
137
  return if block && yield(node)
131
138
 
132
139
  add_offense(node.loc.selector,
@@ -134,6 +141,7 @@ module RuboCop
134
141
  autocorrect_void_op(corrector, node)
135
142
  end
136
143
  end
144
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
137
145
 
138
146
  def check_var(node)
139
147
  return unless node.variable? || node.const_type?
@@ -178,7 +186,7 @@ module RuboCop
178
186
  end
179
187
 
180
188
  def check_nonmutating(node)
181
- return if !node.send_type? && !node.block_type? && !node.numblock_type?
189
+ return unless node.type?(:send, :any_block)
182
190
 
183
191
  method_name = node.method_name
184
192
  return unless NONMUTATING_METHODS.include?(method_name)
@@ -200,11 +208,6 @@ module RuboCop
200
208
  # NOTE: the `begin` node case is already handled via `on_begin`
201
209
  return if body.begin_type?
202
210
 
203
- check_void_op(body) do
204
- block_node = node.each_ancestor(:block).first
205
- block_node&.method?(:each)
206
- end
207
-
208
211
  check_expression(body)
209
212
  end
210
213
 
@@ -229,7 +232,7 @@ module RuboCop
229
232
  end
230
233
 
231
234
  def autocorrect_void_expression(corrector, node)
232
- return if node.parent.if_type? && node.parent.modifier_form?
235
+ return if node.parent.if_type?
233
236
 
234
237
  corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
235
238
  end
@@ -57,6 +57,7 @@ module RuboCop
57
57
  check_code_length(node)
58
58
  end
59
59
  alias on_numblock on_block
60
+ alias on_itblock on_block
60
61
 
61
62
  private
62
63
 
@@ -52,7 +52,7 @@ module RuboCop
52
52
  def consider_node?(node)
53
53
  return true if NESTING_BLOCKS.include?(node.type)
54
54
 
55
- count_blocks? && (node.block_type? || node.numblock_type?)
55
+ count_blocks? && node.any_block_type?
56
56
  end
57
57
 
58
58
  def message(max)
@@ -52,12 +52,19 @@ module RuboCop
52
52
  'Prefer reading the data from an external source.'
53
53
  RESTRICT_ON_SEND = [:[]].freeze
54
54
 
55
+ # @!method set_const?(node)
56
+ def_node_matcher :set_const?, <<~PATTERN
57
+ (const {cbase nil?} :Set)
58
+ PATTERN
59
+
55
60
  def on_array(node)
56
61
  add_offense(node) if node.children.length >= collection_threshold
57
62
  end
58
63
  alias on_hash on_array
59
64
 
60
65
  def on_index(node)
66
+ return unless set_const?(node.receiver)
67
+
61
68
  add_offense(node) if node.arguments.length >= collection_threshold
62
69
  end
63
70
 
@@ -36,7 +36,7 @@ module RuboCop
36
36
  include MethodComplexity
37
37
  include Utils::IteratingBlock
38
38
 
39
- MSG = 'Cyclomatic complexity for %<method>s is too high. [%<complexity>d/%<max>d]'
39
+ MSG = 'Cyclomatic complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
40
40
  COUNTED_NODES = %i[if while until for csend block block_pass
41
41
  rescue when in_pattern and or or_asgn and_asgn].freeze
42
42
 
@@ -48,7 +48,7 @@ module RuboCop
48
48
  LABEL = 'Method'
49
49
 
50
50
  def on_def(node)
51
- return if allowed_method?(node.method_name) || matches_allowed_pattern?(node.method_name)
51
+ return if allowed?(node.method_name)
52
52
 
53
53
  check_code_length(node)
54
54
  end
@@ -57,15 +57,23 @@ module RuboCop
57
57
  def on_block(node)
58
58
  return unless node.method?(:define_method)
59
59
 
60
+ method_name = node.send_node.first_argument
61
+ return if method_name.basic_literal? && allowed?(method_name.value)
62
+
60
63
  check_code_length(node)
61
64
  end
62
65
  alias on_numblock on_block
66
+ alias on_itblock on_block
63
67
 
64
68
  private
65
69
 
66
70
  def cop_label
67
71
  LABEL
68
72
  end
73
+
74
+ def allowed?(method_name)
75
+ allowed_method?(method_name) || matches_allowed_pattern?(method_name)
76
+ end
69
77
  end
70
78
  end
71
79
  end
@@ -50,7 +50,7 @@ module RuboCop
50
50
 
51
51
  # @!method module_definition?(node)
52
52
  def_node_matcher :module_definition?, <<~PATTERN
53
- (casgn nil? _ ({block numblock} (send (const {nil? cbase} :Module) :new) ...))
53
+ (casgn nil? _ (any_block (send (const {nil? cbase} :Module) :new) ...))
54
54
  PATTERN
55
55
 
56
56
  def message(length, max_length)
@@ -27,7 +27,7 @@ module RuboCop
27
27
  # end # ===
28
28
  # end # 7 complexity points
29
29
  class PerceivedComplexity < CyclomaticComplexity
30
- MSG = 'Perceived complexity for %<method>s is too high. [%<complexity>d/%<max>d]'
30
+ MSG = 'Perceived complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
31
31
 
32
32
  COUNTED_NODES = (CyclomaticComplexity::COUNTED_NODES - [:when] + [:case]).freeze
33
33
 
@@ -145,7 +145,7 @@ module RuboCop
145
145
 
146
146
  def extract_body(node)
147
147
  case node.type
148
- when :class, :module, :sclass, :block, :numblock, :def, :defs
148
+ when :class, :module, :sclass, :block, :numblock, :itblock, :def, :defs
149
149
  node.body
150
150
  when :casgn
151
151
  extract_body(node.expression)
@@ -26,6 +26,13 @@ module RuboCop
26
26
  extend NodePattern::Macros
27
27
  include RuboCop::AST::Sexp
28
28
 
29
+ VAR_SETTER_TO_GETTER = {
30
+ lvasgn: :lvar,
31
+ ivasgn: :ivar,
32
+ cvasgn: :cvar,
33
+ gvasgn: :gvar
34
+ }.freeze
35
+
29
36
  # Plug into the calculator
30
37
  def initialize(node, discount_repeated_attributes: false)
31
38
  super(node)
@@ -114,13 +121,6 @@ module RuboCop
114
121
  calls.fetch(value) { yield [calls, value] }
115
122
  end
116
123
 
117
- VAR_SETTER_TO_GETTER = {
118
- lvasgn: :lvar,
119
- ivasgn: :ivar,
120
- cvasgn: :cvar,
121
- gvasgn: :gvar
122
- }.freeze
123
-
124
124
  # @returns `[receiver, method | nil]` for the given setter `node`
125
125
  # or `nil` if it is not a setter.
126
126
  def setter_to_getter(node)
@@ -5,10 +5,10 @@ module RuboCop
5
5
  # This module checks for nodes that should be aligned to the left or right.
6
6
  # This amount is determined by the instance variable @column_delta.
7
7
  module Alignment
8
- private
9
-
10
8
  SPACE = ' '
11
9
 
10
+ private
11
+
12
12
  attr_reader :column_delta
13
13
 
14
14
  def configured_indentation_width
@@ -18,12 +18,12 @@ module RuboCop
18
18
  end
19
19
 
20
20
  # @deprecated Use allowed_line? instead
21
- def ignored_line?
21
+ def ignored_line?(line)
22
22
  warn Rainbow(<<~WARNING).yellow, uplevel: 1
23
23
  `ignored_line?` is deprecated. Use `allowed_line?` instead.
24
24
  WARNING
25
25
 
26
- allowed_line?
26
+ allowed_line?(line)
27
27
  end
28
28
 
29
29
  def matches_allowed_pattern?(line)
@@ -31,12 +31,12 @@ module RuboCop
31
31
  end
32
32
 
33
33
  # @deprecated Use matches_allowed_pattern? instead
34
- def matches_ignored_pattern?
34
+ def matches_ignored_pattern?(line)
35
35
  warn Rainbow(<<~WARNING).yellow, uplevel: 1
36
36
  `matches_ignored_pattern?` is deprecated. Use `matches_allowed_pattern?` instead.
37
37
  WARNING
38
38
 
39
- matches_allowed_pattern?
39
+ matches_allowed_pattern?(line)
40
40
  end
41
41
 
42
42
  def allowed_patterns
@@ -43,14 +43,14 @@ module RuboCop
43
43
  # (Note: Passes may not happen exactly in this sequence.)
44
44
  module CheckLineBreakable
45
45
  def extract_breakable_node(node, max)
46
- if node.send_type?
46
+ if node.call_type?
47
47
  return if chained_to_heredoc?(node)
48
48
 
49
49
  args = process_args(node.arguments)
50
50
  return extract_breakable_node_from_elements(node, args, max)
51
- elsif node.def_type?
51
+ elsif node.type?(:def, :defs)
52
52
  return extract_breakable_node_from_elements(node, node.arguments, max)
53
- elsif node.array_type? || node.hash_type?
53
+ elsif node.type?(:array, :hash)
54
54
  return extract_breakable_node_from_elements(node, node.children, max)
55
55
  end
56
56
  nil
@@ -74,9 +74,9 @@ module RuboCop
74
74
  def extract_first_element_over_column_limit(node, elements, max)
75
75
  line = node.first_line
76
76
 
77
- # If a `send` node is not parenthesized, don't move the first element, because it
77
+ # If a `send` or `csend` node is not parenthesized, don't move the first element, because it
78
78
  # can result in changed behavior or a syntax error.
79
- if node.send_type? && !node.parenthesized? && !first_argument_is_heredoc?(node)
79
+ if node.call_type? && !node.parenthesized? && !first_argument_is_heredoc?(node)
80
80
  elements = elements.drop(1)
81
81
  end
82
82
 
@@ -98,10 +98,10 @@ module RuboCop
98
98
  end
99
99
 
100
100
  # @api private
101
- # If a send node contains a heredoc argument, splitting cannot happen
101
+ # If a `send` or `csend` node contains a heredoc argument, splitting cannot happen
102
102
  # after the heredoc or else it will cause a syntax error.
103
103
  def shift_elements_for_heredoc_arg(node, elements, index)
104
- return index unless node.send_type? || node.array_type?
104
+ return index unless node.type?(:call, :array)
105
105
 
106
106
  heredoc_index = elements.index { |arg| arg.respond_to?(:heredoc?) && arg.heredoc? }
107
107
  return index unless heredoc_index
@@ -154,9 +154,9 @@ module RuboCop
154
154
  # Ignore ancestors on different lines.
155
155
  break if ancestor.first_line != node.first_line
156
156
 
157
- if ancestor.hash_type? || ancestor.array_type?
157
+ if ancestor.type?(:hash, :array)
158
158
  elements = ancestor.children
159
- elsif ancestor.send_type?
159
+ elsif ancestor.call_type?
160
160
  elements = process_args(ancestor.arguments)
161
161
  else
162
162
  next
@@ -171,12 +171,12 @@ module RuboCop
171
171
  # @api private
172
172
  def contained_by_multiline_collection_that_could_be_broken_up?(node)
173
173
  node.each_ancestor.find do |ancestor|
174
- if (ancestor.hash_type? || ancestor.array_type?) &&
174
+ if ancestor.type?(:hash, :array) &&
175
175
  breakable_collection?(ancestor, ancestor.children)
176
176
  return children_could_be_broken_up?(ancestor.children)
177
177
  end
178
178
 
179
- next unless ancestor.send_type?
179
+ next unless ancestor.call_type?
180
180
 
181
181
  args = process_args(ancestor.arguments)
182
182
  return children_could_be_broken_up?(args) if breakable_collection?(ancestor, args)
@@ -220,14 +220,14 @@ module RuboCop
220
220
 
221
221
  # @api private
222
222
  def already_on_multiple_lines?(node)
223
- return node.first_line != node.last_argument.last_line if node.def_type?
223
+ return node.first_line != node.last_argument.last_line if node.type?(:def, :defs)
224
224
 
225
225
  !node.single_line?
226
226
  end
227
227
 
228
228
  def chained_to_heredoc?(node)
229
229
  while (node = node.receiver)
230
- return true if (node.str_type? || node.dstr_type? || node.xstr_type?) && node.heredoc?
230
+ return true if node.type?(:str, :dstr, :xstr) && node.heredoc?
231
231
  end
232
232
 
233
233
  false
@@ -35,7 +35,7 @@ module RuboCop
35
35
  comment_line_numbers = processed_source.comments.map { |comment| comment.loc.line }
36
36
 
37
37
  comment_line_numbers.any? do |comment_line_number|
38
- comment_line_number >= node.first_line && comment_line_number <= node.last_line
38
+ comment_line_number.between?(node.first_line, node.last_line)
39
39
  end
40
40
  end
41
41
 
@@ -73,14 +73,16 @@ module RuboCop
73
73
  node.else_branch.loc.line
74
74
  elsif node.elsif?
75
75
  node.each_ancestor(:if).find(&:if?).loc.end.line
76
+ elsif node.if? && node.parent && parentheses?(node.parent)
77
+ node.parent.loc.end.line
76
78
  end
77
- elsif node.block_type? || node.numblock_type?
79
+ elsif node.any_block_type?
78
80
  node.loc.end.line
79
81
  elsif (next_sibling = node.right_sibling) && next_sibling.is_a?(AST::Node) &&
80
82
  next_sibling.source_range
81
83
  next_sibling.loc.line
82
84
  elsif (parent = node.parent)
83
- if parent.loc.respond_to?(:end) && parent.loc.end
85
+ if parent.loc?(:end)
84
86
  parent.loc.end.line
85
87
  else
86
88
  parent.loc.line
@@ -20,7 +20,7 @@ module RuboCop
20
20
  private
21
21
 
22
22
  def dig_chain_enabled?
23
- @config.for_cop('Style/DigChain')['Enabled']
23
+ @config.cop_enabled?('Style/DigChain')
24
24
  end
25
25
  end
26
26
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # This module encapsulates the ability to forbid certain identifiers in a cop.
6
+ module ForbiddenIdentifiers
7
+ SIGILS = '@$' # if a variable starts with a sigil it will be removed
8
+
9
+ def forbidden_identifier?(name)
10
+ name = name.to_s.delete(SIGILS)
11
+
12
+ forbidden_identifiers.any? && forbidden_identifiers.include?(name)
13
+ end
14
+
15
+ def forbidden_identifiers
16
+ cop_config.fetch('ForbiddenIdentifiers', [])
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # This module encapsulates the ability to forbid certain patterns in a cop.
6
+ module ForbiddenPattern
7
+ def forbidden_pattern?(name)
8
+ forbidden_patterns.any? { |pattern| Regexp.new(pattern).match?(name) }
9
+ end
10
+
11
+ def forbidden_patterns
12
+ cop_config.fetch('ForbiddenPatterns', [])
13
+ end
14
+ end
15
+ end
16
+ end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  module FrozenStringLiteral
7
7
  module_function
8
8
 
9
- FROZEN_STRING_LITERAL = '# frozen_string_literal:'
9
+ FROZEN_STRING_LITERAL_REGEXP = /#\s*frozen[-_]?string[-_]?literal:/i.freeze
10
10
  FROZEN_STRING_LITERAL_ENABLED = '# frozen_string_literal: true'
11
11
  FROZEN_STRING_LITERAL_TYPES_RUBY27 = %i[str dstr].freeze
12
12