rubocop 1.69.2 → 1.75.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) 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 +230 -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 +3 -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/def_end_alignment.rb +1 -1
  49. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  50. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  52. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  53. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +28 -1
  54. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  55. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  56. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  57. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  58. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  59. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  60. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  61. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  62. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  63. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  64. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  65. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  66. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  67. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  68. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  69. data/lib/rubocop/cop/layout/line_length.rb +9 -4
  70. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  71. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  72. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  73. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  74. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  75. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  76. data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
  77. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
  78. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  79. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  80. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  81. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  82. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  83. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  84. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
  86. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  87. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  88. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  89. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  90. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  91. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  92. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  93. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  94. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  95. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  96. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  97. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  98. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  99. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  100. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  101. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -17
  102. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  103. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  104. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  105. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  106. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  107. data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
  108. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  109. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  110. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  113. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  114. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  115. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  116. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  117. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  118. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  119. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  120. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  121. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  122. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  123. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  124. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  125. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  126. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  127. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  128. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  129. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  130. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  131. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  132. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  133. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  134. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
  135. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  136. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  137. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  138. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  139. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  140. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  141. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  142. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  143. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  144. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  145. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -1
  146. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  147. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  148. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  149. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  150. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  151. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  152. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  153. data/lib/rubocop/cop/lint/void.rb +12 -9
  154. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  155. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  156. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  157. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  158. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  159. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  160. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  161. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  162. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  163. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  164. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  165. data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
  166. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  167. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  168. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  169. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  170. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  171. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  172. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  173. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +0 -1
  174. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  175. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  176. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  177. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  178. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  179. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  180. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  181. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  182. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  183. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  184. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  185. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  186. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  187. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  188. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  189. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  190. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  191. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  192. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  193. data/lib/rubocop/cop/registry.rb +9 -6
  194. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  195. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  196. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  197. data/lib/rubocop/cop/style/and_or.rb +1 -1
  198. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  199. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  200. data/lib/rubocop/cop/style/array_intersect.rb +39 -28
  201. data/lib/rubocop/cop/style/block_delimiters.rb +9 -21
  202. data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
  203. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  204. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  205. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  206. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  207. data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
  208. data/lib/rubocop/cop/style/comparable_between.rb +75 -0
  209. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  210. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -4
  211. data/lib/rubocop/cop/style/documentation.rb +1 -1
  212. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  213. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  214. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  215. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  216. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  217. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  218. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  219. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  220. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  221. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  222. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  223. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  224. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  225. data/lib/rubocop/cop/style/float_division.rb +8 -4
  226. data/lib/rubocop/cop/style/for.rb +1 -0
  227. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  228. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  229. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  230. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  231. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  232. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  233. data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
  234. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  235. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  236. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  237. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  238. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
  239. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  240. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  241. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  242. data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
  243. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  244. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  245. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  246. data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
  247. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  248. data/lib/rubocop/cop/style/lambda.rb +1 -0
  249. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  250. data/lib/rubocop/cop/style/map_into_array.rb +2 -1
  251. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  252. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  253. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +23 -16
  254. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  255. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  256. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  257. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  258. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  259. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  260. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  261. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  262. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  263. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  264. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  265. data/lib/rubocop/cop/style/next.rb +44 -0
  266. data/lib/rubocop/cop/style/object_then.rb +14 -15
  267. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  268. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  269. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  270. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  271. data/lib/rubocop/cop/style/proc.rb +2 -2
  272. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  273. data/lib/rubocop/cop/style/raise_args.rb +14 -12
  274. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  275. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  276. data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
  277. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  278. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  279. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  280. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  281. data/lib/rubocop/cop/style/redundant_format.rb +257 -0
  282. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  283. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  284. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  285. data/lib/rubocop/cop/style/redundant_parentheses.rb +30 -15
  286. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  287. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  288. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  289. data/lib/rubocop/cop/style/redundant_self.rb +1 -0
  290. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  291. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  292. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  293. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  294. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  295. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  296. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  297. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  298. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  299. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  300. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  301. data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
  302. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  303. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  304. data/lib/rubocop/cop/style/sole_nested_conditional.rb +41 -106
  305. data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
  306. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  307. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  308. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  309. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  310. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  311. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  312. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  313. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  314. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  315. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  316. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  317. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  318. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  319. data/lib/rubocop/cop/util.rb +12 -5
  320. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  321. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  322. data/lib/rubocop/cop/variable_force/variable.rb +10 -3
  323. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  324. data/lib/rubocop/cop/variable_force.rb +1 -1
  325. data/lib/rubocop/cops_documentation_generator.rb +25 -14
  326. data/lib/rubocop/directive_comment.rb +45 -11
  327. data/lib/rubocop/ext/regexp_node.rb +0 -1
  328. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  329. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  330. data/lib/rubocop/lsp/logger.rb +2 -2
  331. data/lib/rubocop/lsp/routes.rb +7 -23
  332. data/lib/rubocop/lsp/runtime.rb +18 -50
  333. data/lib/rubocop/lsp/server.rb +0 -2
  334. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  335. data/lib/rubocop/magic_comment.rb +8 -0
  336. data/lib/rubocop/options.rb +28 -12
  337. data/lib/rubocop/path_util.rb +15 -8
  338. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  339. data/lib/rubocop/plugin/load_error.rb +26 -0
  340. data/lib/rubocop/plugin/loader.rb +100 -0
  341. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  342. data/lib/rubocop/plugin.rb +46 -0
  343. data/lib/rubocop/rake_task.rb +4 -1
  344. data/lib/rubocop/result_cache.rb +13 -13
  345. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  346. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  347. data/lib/rubocop/rspec/shared_contexts.rb +39 -1
  348. data/lib/rubocop/rspec/support.rb +4 -2
  349. data/lib/rubocop/runner.rb +10 -7
  350. data/lib/rubocop/server/cache.rb +47 -11
  351. data/lib/rubocop/server/cli.rb +2 -2
  352. data/lib/rubocop/target_finder.rb +2 -1
  353. data/lib/rubocop/target_ruby.rb +16 -1
  354. data/lib/rubocop/version.rb +30 -8
  355. data/lib/rubocop.rb +16 -1
  356. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  357. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  358. metadata +59 -16
  359. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  360. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for logical comparison which can be replaced with `Comparable#between?`.
7
+ #
8
+ # NOTE: `Comparable#between?` is on average slightly slower than logical comparison,
9
+ # although the difference generally isn't observable. If you require maximum
10
+ # performance, consider using logical comparison.
11
+ #
12
+ # @example
13
+ #
14
+ # # bad
15
+ # x >= min && x <= max
16
+ #
17
+ # # bad
18
+ # x <= max && x >= min
19
+ #
20
+ # # good
21
+ # x.between?(min, max)
22
+ #
23
+ class ComparableBetween < Base
24
+ extend AutoCorrector
25
+
26
+ MSG = 'Prefer `%<prefer>s` over logical comparison.'
27
+
28
+ # @!method logical_comparison_between_by_min_first?(node)
29
+ def_node_matcher :logical_comparison_between_by_min_first?, <<~PATTERN
30
+ (and
31
+ (send
32
+ {$_value :>= $_min | $_min :<= $_value})
33
+ (send
34
+ {$_value :<= $_max | $_max :>= $_value}))
35
+ PATTERN
36
+
37
+ # @!method logical_comparison_between_by_max_first?(node)
38
+ def_node_matcher :logical_comparison_between_by_max_first?, <<~PATTERN
39
+ (and
40
+ (send
41
+ {$_value :<= $_max | $_max :>= $_value})
42
+ (send
43
+ {$_value :>= $_min | $_min :<= $_value}))
44
+ PATTERN
45
+
46
+ def on_and(node)
47
+ logical_comparison_between_by_min_first?(node) do |*args|
48
+ min_and_value, max_and_value = args.each_slice(2).to_a
49
+
50
+ register_offense(node, min_and_value, max_and_value)
51
+ end
52
+
53
+ logical_comparison_between_by_max_first?(node) do |*args|
54
+ max_and_value, min_and_value = args.each_slice(2).to_a
55
+
56
+ register_offense(node, min_and_value, max_and_value)
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def register_offense(node, min_and_value, max_and_value)
63
+ value = (min_and_value & max_and_value).first
64
+ min = min_and_value.find { _1 != value }
65
+ max = max_and_value.find { _1 != value }
66
+
67
+ prefer = "#{value.source}.between?(#{min.source}, #{max.source})"
68
+ add_offense(node, message: format(MSG, prefer: prefer)) do |corrector|
69
+ corrector.replace(node, prefer)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -86,7 +86,7 @@ module RuboCop
86
86
 
87
87
  def percent_literals_includes_only_basic_literals?(node)
88
88
  node.arguments.select(&:percent_literal?).all? do |arg|
89
- arg.children.all? { |child| child.str_type? || child.sym_type? }
89
+ arg.children.all? { |child| child.type?(:str, :sym) }
90
90
  end
91
91
  end
92
92
  end
@@ -107,7 +107,7 @@ module RuboCop
107
107
  parent = node.parent
108
108
  return true unless parent
109
109
 
110
- !(parent.mlhs_type? || parent.resbody_type?)
110
+ !parent.type?(:mlhs, :resbody)
111
111
  end
112
112
  end
113
113
 
@@ -309,7 +309,7 @@ module RuboCop
309
309
  end
310
310
 
311
311
  def allowed_single_line?(branches)
312
- single_line_conditions_only? && branches.any?(&:begin_type?)
312
+ single_line_conditions_only? && branches.compact.any?(&:begin_type?)
313
313
  end
314
314
 
315
315
  def assignment_node(node)
@@ -326,7 +326,7 @@ module RuboCop
326
326
  end
327
327
 
328
328
  def move_assignment_outside_condition(corrector, node)
329
- if node.case_type? || node.case_match_type?
329
+ if node.type?(:case, :case_match)
330
330
  CaseCorrector.correct(corrector, self, node)
331
331
  elsif node.ternary?
332
332
  TernaryCorrector.correct(corrector, node)
@@ -340,7 +340,7 @@ module RuboCop
340
340
 
341
341
  if ternary_condition?(condition)
342
342
  TernaryCorrector.move_assignment_inside_condition(corrector, node)
343
- elsif condition.case_type? || condition.case_match_type?
343
+ elsif condition.type?(:case, :case_match)
344
344
  CaseCorrector.move_assignment_inside_condition(corrector, node)
345
345
  elsif condition.if_type?
346
346
  IfCorrector.move_assignment_inside_condition(corrector, node)
@@ -436,18 +436,23 @@ module RuboCop
436
436
  # Helper module to provide common methods to ConditionalAssignment
437
437
  # correctors
438
438
  module ConditionalCorrectorHelper
439
+ # rubocop:disable Metrics/AbcSize
439
440
  def remove_whitespace_in_branches(corrector, branch, condition, column)
440
441
  branch.each_node do |child|
441
442
  next if child.source_range.nil?
443
+ next if child.parent.dstr_type?
442
444
 
443
445
  white_space = white_space_range(child, column)
444
446
  corrector.remove(white_space) if white_space.source.strip.empty?
445
447
  end
446
448
 
447
449
  [condition.loc.else, condition.loc.end].each do |loc|
450
+ next unless loc
451
+
448
452
  corrector.remove_preceding(loc, loc.column - column)
449
453
  end
450
454
  end
455
+ # rubocop:enable Metrics/AbcSize
451
456
 
452
457
  def white_space_range(node, column)
453
458
  expression = node.source_range
@@ -186,7 +186,7 @@ module RuboCop
186
186
  def qualify_const(node)
187
187
  return if node.nil?
188
188
 
189
- if node.cbase_type? || node.self_type? || node.call_type? || node.variable?
189
+ if node.type?(:cbase, :self, :call) || node.variable?
190
190
  node.source
191
191
  else
192
192
  [qualify_const(node.namespace), node.short_name].compact
@@ -93,7 +93,7 @@ module RuboCop
93
93
 
94
94
  if conditional_node
95
95
  double_negative_condition_return_value?(node, last_child, conditional_node)
96
- elsif last_child.pair_type? || last_child.hash_type? || last_child.parent.array_type?
96
+ elsif last_child.type?(:pair, :hash) || last_child.parent.array_type?
97
97
  false
98
98
  else
99
99
  last_child.last_line <= node.last_line
@@ -102,14 +102,14 @@ module RuboCop
102
102
 
103
103
  def find_def_node_from_ascendant(node)
104
104
  return unless (parent = node.parent)
105
- return parent if parent.def_type? || parent.defs_type?
105
+ return parent if parent.any_def_type?
106
106
  return node.parent.child_nodes.first if define_method?(parent)
107
107
 
108
108
  find_def_node_from_ascendant(node.parent)
109
109
  end
110
110
 
111
111
  def define_method?(node)
112
- return false unless node.block_type?
112
+ return false unless node.any_block_type?
113
113
 
114
114
  child = node.child_nodes.first
115
115
  return false unless child.send_type?
@@ -147,7 +147,7 @@ module RuboCop
147
147
  def find_parent_not_enumerable(node)
148
148
  return unless (parent = node.parent)
149
149
 
150
- if parent.pair_type? || parent.hash_type? || parent.array_type?
150
+ if parent.type?(:pair, :hash, :array)
151
151
  find_parent_not_enumerable(parent)
152
152
  else
153
153
  parent
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # Checks for loops which iterate a constant number of times,
7
- # using a Range literal and `#each`. This can be done more readably using
7
+ # using a `Range` literal and `#each`. This can be done more readably using
8
8
  # `Integer#times`.
9
9
  #
10
10
  # This check only applies if the block takes no parameters.
@@ -53,8 +53,7 @@ module RuboCop
53
53
  (block
54
54
  (call
55
55
  (begin
56
- (${irange erange}
57
- (int $_) (int $_)))
56
+ ($range (int $_) (int $_)))
58
57
  :each)
59
58
  (args ...)
60
59
  ...)
@@ -65,8 +64,7 @@ module RuboCop
65
64
  (block
66
65
  (call
67
66
  (begin
68
- ({irange erange}
69
- (int 0) (int _)))
67
+ (range (int 0) (int _)))
70
68
  :each)
71
69
  (args ...)
72
70
  ...)
@@ -77,8 +75,7 @@ module RuboCop
77
75
  (block
78
76
  (call
79
77
  (begin
80
- ({irange erange}
81
- (int _) (int _)))
78
+ (range (int _) (int _)))
82
79
  :each)
83
80
  (args)
84
81
  ...)
@@ -58,7 +58,7 @@ module RuboCop
58
58
 
59
59
  # @!method each_with_object_block_candidate?(node)
60
60
  def_node_matcher :each_with_object_block_candidate?, <<~PATTERN
61
- (block $(call _ {:inject :reduce} _) $_ $_)
61
+ (block $(call _ {:inject :reduce} _) $(args _ _) $_)
62
62
  PATTERN
63
63
 
64
64
  # @!method each_with_object_numblock_candidate?(node)
@@ -71,8 +71,7 @@ module RuboCop
71
71
 
72
72
  first_arg, second_arg = *node.arguments
73
73
 
74
- corrector.replace(first_arg, second_arg.source)
75
- corrector.replace(second_arg, first_arg.source)
74
+ corrector.swap(first_arg, second_arg)
76
75
 
77
76
  if return_value_occupies_whole_line?(return_value)
78
77
  corrector.remove(whole_line_expression(return_value))
@@ -131,6 +131,8 @@ module RuboCop
131
131
  extend AutoCorrector
132
132
 
133
133
  MSG = 'Redundant `else`-clause.'
134
+ NIL_STYLES = %i[nil both].freeze
135
+ EMPTY_STYLES = %i[empty both].freeze
134
136
 
135
137
  def on_normal_if_unless(node)
136
138
  check(node)
@@ -150,11 +152,11 @@ module RuboCop
150
152
  end
151
153
 
152
154
  def nil_style?
153
- style == :nil || style == :both
155
+ NIL_STYLES.include?(style)
154
156
  end
155
157
 
156
158
  def empty_style?
157
- style == :empty || style == :both
159
+ EMPTY_STYLES.include?(style)
158
160
  end
159
161
 
160
162
  def empty_check(node)
@@ -6,6 +6,10 @@ module RuboCop
6
6
  # Checks for the use of a method, the result of which
7
7
  # would be a literal, like an empty array, hash, or string.
8
8
  #
9
+ # NOTE: When frozen string literals are enabled, `String.new`
10
+ # isn't corrected to an empty string since the former is
11
+ # mutable and the latter would be frozen.
12
+ #
9
13
  # @example
10
14
  # # bad
11
15
  # a = Array.new
@@ -136,7 +140,7 @@ module RuboCop
136
140
  def frozen_strings?
137
141
  return true if frozen_string_literals_enabled?
138
142
 
139
- frozen_string_cop_enabled = config.for_cop('Style/FrozenStringLiteralComment')['Enabled']
143
+ frozen_string_cop_enabled = config.cop_enabled?('Style/FrozenStringLiteralComment')
140
144
  frozen_string_cop_enabled &&
141
145
  !frozen_string_literals_disabled? &&
142
146
  string_literals_frozen_by_default?.nil?
@@ -109,7 +109,7 @@ module RuboCop
109
109
  end
110
110
 
111
111
  def max_line_length
112
- return unless config.for_cop('Layout/LineLength')['Enabled']
112
+ return unless config.cop_enabled?('Layout/LineLength')
113
113
 
114
114
  config.for_cop('Layout/LineLength')['Max']
115
115
  end
@@ -5,8 +5,11 @@ module RuboCop
5
5
  module Style
6
6
  # Checks for endless methods.
7
7
  #
8
- # It can enforce either the use of endless methods definitions
9
- # for single-lined method bodies, or disallow endless methods.
8
+ # It can enforce endless method definitions whenever possible or with single line methods.
9
+ # It can also disallow multiline endless method definitions or all endless definitions.
10
+ #
11
+ # `require_single_line` style enforces endless method definitions for single line methods.
12
+ # `require_always` style enforces endless method definitions for single statement methods.
10
13
  #
11
14
  # Other method definition types are not considered by this cop.
12
15
  #
@@ -15,36 +18,116 @@ module RuboCop
15
18
  # * allow_single_line (default) - only single line endless method definitions are allowed.
16
19
  # * allow_always - all endless method definitions are allowed.
17
20
  # * disallow - all endless method definitions are disallowed.
21
+ # * require_single_line - endless method definitions are required for single line methods.
22
+ # * require_always - all endless method definitions are required.
18
23
  #
19
24
  # NOTE: Incorrect endless method definitions will always be
20
25
  # corrected to a multi-line definition.
21
26
  #
22
27
  # @example EnforcedStyle: allow_single_line (default)
28
+ # # bad, multi-line endless method
29
+ # def my_method = x.foo
30
+ # .bar
31
+ # .baz
32
+ #
23
33
  # # good
24
- # def my_method() = x
34
+ # def my_method
35
+ # x
36
+ # end
25
37
  #
26
- # # bad, multi-line endless method
27
- # def my_method() = x.foo
28
- # .bar
29
- # .baz
38
+ # # good
39
+ # def my_method = x
40
+ #
41
+ # # good
42
+ # def my_method
43
+ # x.foo
44
+ # .bar
45
+ # .baz
46
+ # end
30
47
  #
31
48
  # @example EnforcedStyle: allow_always
32
49
  # # good
33
- # def my_method() = x
50
+ # def my_method
51
+ # x
52
+ # end
34
53
  #
35
54
  # # good
36
- # def my_method() = x.foo
37
- # .bar
38
- # .baz
55
+ # def my_method = x
56
+ #
57
+ # # good
58
+ # def my_method = x.foo
59
+ # .bar
60
+ # .baz
61
+ #
62
+ # # good
63
+ # def my_method
64
+ # x.foo
65
+ # .bar
66
+ # .baz
67
+ # end
39
68
  #
40
69
  # @example EnforcedStyle: disallow
41
70
  # # bad
42
- # def my_method() = x
71
+ # def my_method = x
72
+ #
73
+ # # bad
74
+ # def my_method = x.foo
75
+ # .bar
76
+ # .baz
77
+ #
78
+ # # good
79
+ # def my_method
80
+ # x
81
+ # end
82
+ #
83
+ # # good
84
+ # def my_method
85
+ # x.foo
86
+ # .bar
87
+ # .baz
88
+ # end
89
+ #
90
+ # @example EnforcedStyle: require_single_line
91
+ # # bad
92
+ # def my_method
93
+ # x
94
+ # end
95
+ #
96
+ # # bad
97
+ # def my_method = x.foo
98
+ # .bar
99
+ # .baz
100
+ #
101
+ # # good
102
+ # def my_method = x
103
+ #
104
+ # # good
105
+ # def my_method
106
+ # x.foo
107
+ # .bar
108
+ # .baz
109
+ # end
110
+ #
111
+ # @example EnforcedStyle: require_always
112
+ # # bad
113
+ # def my_method
114
+ # x
115
+ # end
43
116
  #
44
117
  # # bad
45
- # def my_method() = x.foo
46
- # .bar
47
- # .baz
118
+ # def my_method
119
+ # x.foo
120
+ # .bar
121
+ # .baz
122
+ # end
123
+ #
124
+ # # good
125
+ # def my_method = x
126
+ #
127
+ # # good
128
+ # def my_method = x.foo
129
+ # .bar
130
+ # .baz
48
131
  #
49
132
  class EndlessMethod < Base
50
133
  include ConfigurableEnforcedStyle
@@ -57,12 +140,21 @@ module RuboCop
57
140
  CORRECTION_STYLES = %w[multiline single_line].freeze
58
141
  MSG = 'Avoid endless method definitions.'
59
142
  MSG_MULTI_LINE = 'Avoid endless method definitions with multiple lines.'
143
+ MSG_REQUIRE_SINGLE = 'Use endless method definitions for single line methods.'
144
+ MSG_REQUIRE_ALWAYS = 'Use endless method definitions.'
60
145
 
61
146
  def on_def(node)
62
- if style == :disallow
63
- handle_disallow_style(node)
64
- else
147
+ return if node.assignment_method?
148
+
149
+ case style
150
+ when :allow_single_line, :allow_always
65
151
  handle_allow_style(node)
152
+ when :disallow
153
+ handle_disallow_style(node)
154
+ when :require_single_line
155
+ handle_require_single_line_style(node)
156
+ when :require_always
157
+ handle_require_always_style(node)
66
158
  end
67
159
  end
68
160
 
@@ -77,11 +169,64 @@ module RuboCop
77
169
  end
78
170
  end
79
171
 
172
+ def handle_require_single_line_style(node)
173
+ if node.endless? && !node.single_line?
174
+ add_offense(node, message: MSG_MULTI_LINE) do |corrector|
175
+ correct_to_multiline(corrector, node)
176
+ end
177
+ elsif !node.endless? && can_be_made_endless?(node) && node.body.single_line?
178
+ return if too_long_when_made_endless?(node)
179
+
180
+ add_offense(node, message: MSG_REQUIRE_SINGLE) do |corrector|
181
+ corrector.replace(node, endless_replacement(node))
182
+ end
183
+ end
184
+ end
185
+
186
+ def handle_require_always_style(node)
187
+ return if node.endless? || !can_be_made_endless?(node)
188
+ return if too_long_when_made_endless?(node)
189
+
190
+ add_offense(node, message: MSG_REQUIRE_ALWAYS) do |corrector|
191
+ corrector.replace(node, endless_replacement(node))
192
+ end
193
+ end
194
+
80
195
  def handle_disallow_style(node)
81
196
  return unless node.endless?
82
197
 
83
198
  add_offense(node) { |corrector| correct_to_multiline(corrector, node) }
84
199
  end
200
+
201
+ def correct_to_multiline(corrector, node)
202
+ replacement = <<~RUBY.strip
203
+ def #{node.method_name}#{arguments(node)}
204
+ #{node.body.source}
205
+ end
206
+ RUBY
207
+
208
+ corrector.replace(node, replacement)
209
+ end
210
+
211
+ def endless_replacement(node)
212
+ <<~RUBY.strip
213
+ def #{node.method_name}#{arguments(node)} = #{node.body.source}
214
+ RUBY
215
+ end
216
+
217
+ def arguments(node, missing = '')
218
+ node.arguments.any? ? node.arguments.source : missing
219
+ end
220
+
221
+ def can_be_made_endless?(node)
222
+ node.body && !node.body.begin_type? && !node.body.kwbegin_type?
223
+ end
224
+
225
+ def too_long_when_made_endless?(node)
226
+ return false unless config.cop_enabled?('Layout/LineLength')
227
+
228
+ endless_replacement(node).length > config.for_cop('Layout/LineLength')['Max']
229
+ end
85
230
  end
86
231
  end
87
232
  end
@@ -86,7 +86,7 @@ module RuboCop
86
86
  return if node.method?(:eval) && !valid_eval_receiver?(node.receiver)
87
87
 
88
88
  code = node.first_argument
89
- return unless code && (code.str_type? || code.dstr_type?)
89
+ return unless code&.type?(:str, :dstr)
90
90
 
91
91
  check_location(node, code)
92
92
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Checks for exact regexp match inside Regexp literals.
6
+ # Checks for exact regexp match inside `Regexp` literals.
7
7
  #
8
8
  # @example
9
9
  #
@@ -40,15 +40,8 @@ module RuboCop
40
40
  def on_send(node)
41
41
  return unless (receiver = node.receiver)
42
42
  return unless (regexp = exact_regexp_match(node))
43
-
44
- parsed_regexp = begin
45
- Regexp::Parser.parse(regexp)
46
- rescue Regexp::Parser::Error
47
- # Upon encountering an invalid regular expression,
48
- # we aim to proceed and identify any remaining potential offenses.
49
- end
50
-
51
- return unless parsed_regexp && exact_match_pattern?(parsed_regexp)
43
+ return unless (parsed_regexp = parse_regexp(regexp))
44
+ return unless exact_match_pattern?(parsed_regexp)
52
45
 
53
46
  prefer = "#{receiver.source} #{new_method(node)} '#{parsed_regexp[1].text}'"
54
47
 
@@ -137,11 +137,11 @@ module RuboCop
137
137
 
138
138
  case depth(stripped_current_path)
139
139
  when 0
140
- range = arguments_range(current_path)
140
+ range = arguments_range(current_path.parent)
141
141
 
142
142
  corrector.replace(range, '__FILE__')
143
143
  when 1
144
- range = arguments_range(current_path)
144
+ range = arguments_range(current_path.parent)
145
145
 
146
146
  corrector.replace(range, '__dir__')
147
147
  else
@@ -185,11 +185,6 @@ module RuboCop
185
185
  corrector.remove(node.loc.dot)
186
186
  corrector.remove(node.loc.selector)
187
187
  end
188
-
189
- def arguments_range(node)
190
- range_between(node.parent.first_argument.source_range.begin_pos,
191
- node.parent.last_argument.source_range.end_pos)
192
- end
193
188
  end
194
189
  end
195
190
  end
@@ -65,7 +65,7 @@ module RuboCop
65
65
  yielding_block?(block_node) do |send_node, block_args, yield_args|
66
66
  return unless yielding_arguments?(block_args, yield_args)
67
67
 
68
- def_node = block_node.each_ancestor(:def, :defs).first
68
+ def_node = block_node.each_ancestor(:any_def).first
69
69
  # if `yield` is being called outside of a method context, ignore
70
70
  # this is not a valid ruby pattern, but can happen in haml or erb,
71
71
  # so this can cause crashes in haml_lint
@@ -123,7 +123,7 @@ module RuboCop
123
123
  end
124
124
 
125
125
  def call_like?(node)
126
- node.call_type? || node.zsuper_type? || node.super_type?
126
+ node.type?(:call, :zsuper, :super)
127
127
  end
128
128
 
129
129
  def insert_argument(node, corrector, block_name)
@@ -135,7 +135,13 @@ module RuboCop
135
135
  end
136
136
 
137
137
  def correct_call_node(node, corrector, block_name)
138
- corrector.insert_after(node, "(&#{block_name})")
138
+ new_arguments = if node.zsuper_type?
139
+ args = build_new_arguments_for_zsuper(node) << "&#{block_name}"
140
+ args.join(', ')
141
+ else
142
+ "&#{block_name}"
143
+ end
144
+ corrector.insert_after(node, "(#{new_arguments})")
139
145
  return unless node.parenthesized?
140
146
 
141
147
  args_begin = Util.args_begin(node)
@@ -144,6 +150,13 @@ module RuboCop
144
150
  corrector.remove(range)
145
151
  end
146
152
 
153
+ def build_new_arguments_for_zsuper(node)
154
+ def_node = node.each_ancestor(:any_def).first
155
+ def_node.arguments.map do |arg|
156
+ arg.optarg_type? ? arg.node_parts[0] : arg.source
157
+ end
158
+ end
159
+
147
160
  def block_body_range(block_node, send_node)
148
161
  range_between(send_node.source_range.end_pos, block_node.loc.end.end_pos)
149
162
  end
@@ -8,7 +8,7 @@ module RuboCop
8
8
  #
9
9
  # * `scientific` which enforces a mantissa between 1 (inclusive) and 10 (exclusive).
10
10
  # * `engineering` which enforces the exponent to be a multiple of 3 and the mantissa
11
- # to be between 0.1 (inclusive) and 10 (exclusive).
11
+ # to be between 0.1 (inclusive) and 1000 (exclusive).
12
12
  # * `integral` which enforces the mantissa to always be a whole number without
13
13
  # trailing zeroes.
14
14
  #
@@ -60,8 +60,8 @@ module RuboCop
60
60
  class ExponentialNotation < Base
61
61
  include ConfigurableEnforcedStyle
62
62
  MESSAGES = {
63
- scientific: 'Use a mantissa in [1, 10[.',
64
- engineering: 'Use an exponent divisible by 3 and a mantissa in [0.1, 1000[.',
63
+ scientific: 'Use a mantissa >= 1 and < 10.',
64
+ engineering: 'Use an exponent divisible by 3 and a mantissa >= 0.1 and < 1000.',
65
65
  integral: 'Use an integer as mantissa, without trailing zero.'
66
66
  }.freeze
67
67
 
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Suggests `ENV.fetch` for the replacement of `ENV[]`.
7
7
  # `ENV[]` silently fails and returns `nil` when the environment variable is unset,
8
8
  # which may cause unexpected behaviors when the developer forgets to set it.
9
- # On the other hand, `ENV.fetch` raises KeyError or returns the explicitly
9
+ # On the other hand, `ENV.fetch` raises `KeyError` or returns the explicitly
10
10
  # specified default value.
11
11
  #
12
12
  # @example