rubocop 0.81.0 → 0.85.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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -17
  3. data/config/default.yml +141 -35
  4. data/lib/rubocop.rb +17 -61
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +13 -7
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  8. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  9. data/lib/rubocop/comment_config.rb +1 -1
  10. data/lib/rubocop/config.rb +14 -2
  11. data/lib/rubocop/config_loader.rb +37 -33
  12. data/lib/rubocop/config_loader_resolver.rb +45 -6
  13. data/lib/rubocop/config_obsoletion.rb +1 -0
  14. data/lib/rubocop/config_store.rb +12 -2
  15. data/lib/rubocop/config_validator.rb +18 -1
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  17. data/lib/rubocop/cop/badge.rb +5 -5
  18. data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
  19. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  20. data/lib/rubocop/cop/commissioner.rb +0 -21
  21. data/lib/rubocop/cop/cop.rb +36 -21
  22. data/lib/rubocop/cop/corrector.rb +48 -24
  23. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
  24. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  25. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  26. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  29. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  30. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  31. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  32. data/lib/rubocop/cop/generator.rb +4 -3
  33. data/lib/rubocop/cop/ignored_node.rb +1 -3
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  35. data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
  36. data/lib/rubocop/cop/layout/class_structure.rb +19 -16
  37. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  38. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  39. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  40. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  41. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  42. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -3
  43. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
  44. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  45. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  47. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  48. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -6
  49. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -9
  50. data/lib/rubocop/cop/layout/heredoc_indentation.rb +21 -104
  51. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  52. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  53. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  54. data/lib/rubocop/cop/layout/line_length.rb +23 -20
  55. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  56. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  57. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  58. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  59. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  60. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  61. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  62. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  63. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  64. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  65. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  66. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
  68. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  69. data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
  70. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  71. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  72. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  73. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  74. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  75. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  76. data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
  77. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
  78. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +33 -2
  79. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  80. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  81. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  82. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  83. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  84. data/lib/rubocop/cop/lint/loop.rb +1 -1
  85. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  86. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  87. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  88. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  89. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
  90. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  91. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
  92. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  93. data/lib/rubocop/cop/lint/raise_exception.rb +42 -6
  94. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
  95. data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
  96. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  97. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  98. data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
  99. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  100. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  101. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  102. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  103. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  104. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  105. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
  106. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  107. data/lib/rubocop/cop/migration/department_name.rb +7 -7
  108. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  109. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  110. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
  111. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  112. data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
  113. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  114. data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -2
  115. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  116. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
  117. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  118. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +16 -0
  119. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
  120. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  121. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  122. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +1 -1
  123. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
  124. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  125. data/lib/rubocop/cop/naming/file_name.rb +27 -14
  126. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  127. data/lib/rubocop/cop/naming/method_name.rb +1 -5
  128. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  129. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  130. data/lib/rubocop/cop/registry.rb +74 -14
  131. data/lib/rubocop/cop/severity.rb +1 -3
  132. data/lib/rubocop/cop/style/alias.rb +4 -4
  133. data/lib/rubocop/cop/style/and_or.rb +7 -8
  134. data/lib/rubocop/cop/style/array_join.rb +2 -2
  135. data/lib/rubocop/cop/style/attr.rb +1 -3
  136. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  137. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  138. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  139. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  140. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -11
  141. data/lib/rubocop/cop/style/copyright.rb +3 -3
  142. data/lib/rubocop/cop/style/dir.rb +1 -1
  143. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  144. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  145. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  146. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  147. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  148. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  149. data/lib/rubocop/cop/style/empty_method.rb +2 -6
  150. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  151. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  152. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  153. data/lib/rubocop/cop/style/format_string.rb +2 -2
  154. data/lib/rubocop/cop/style/format_string_token.rb +2 -3
  155. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
  156. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  157. data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
  158. data/lib/rubocop/cop/style/hash_syntax.rb +19 -12
  159. data/lib/rubocop/cop/style/hash_transform_values.rb +0 -3
  160. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  161. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  162. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  163. data/lib/rubocop/cop/style/lambda.rb +2 -2
  164. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  165. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  166. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  167. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  168. data/lib/rubocop/cop/style/module_function.rb +2 -2
  169. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  170. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  171. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  172. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  173. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  174. data/lib/rubocop/cop/style/negated_unless.rb +3 -3
  175. data/lib/rubocop/cop/style/next.rb +2 -2
  176. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  177. data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
  178. data/lib/rubocop/cop/style/not.rb +1 -1
  179. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  180. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  181. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  182. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -7
  183. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  184. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  185. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  186. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  187. data/lib/rubocop/cop/style/proc.rb +1 -1
  188. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  189. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  190. data/lib/rubocop/cop/style/redundant_condition.rb +3 -4
  191. data/lib/rubocop/cop/style/redundant_conditional.rb +5 -4
  192. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  193. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  194. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  195. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
  196. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  197. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +130 -0
  198. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  199. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  200. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  201. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  202. data/lib/rubocop/cop/style/safe_navigation.rb +3 -7
  203. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  204. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  205. data/lib/rubocop/cop/style/special_global_vars.rb +3 -7
  206. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  207. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  208. data/lib/rubocop/cop/style/symbol_array.rb +2 -2
  209. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  210. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
  211. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -3
  212. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
  213. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +16 -13
  214. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
  215. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
  216. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  217. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  218. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  219. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  220. data/lib/rubocop/cop/style/when_then.rb +1 -1
  221. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  222. data/lib/rubocop/cop/style/word_array.rb +1 -1
  223. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  224. data/lib/rubocop/cop/team.rb +69 -25
  225. data/lib/rubocop/cop/util.rb +25 -1
  226. data/lib/rubocop/cop/utils/format_string.rb +18 -0
  227. data/lib/rubocop/cop/variable_force.rb +3 -9
  228. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  229. data/lib/rubocop/cop/variable_force/branch.rb +1 -3
  230. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  231. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  232. data/lib/rubocop/ext/processed_source.rb +18 -0
  233. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  234. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  235. data/lib/rubocop/formatter/formatter_set.rb +1 -4
  236. data/lib/rubocop/formatter/junit_formatter.rb +14 -4
  237. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  238. data/lib/rubocop/magic_comment.rb +1 -1
  239. data/lib/rubocop/name_similarity.rb +12 -9
  240. data/lib/rubocop/options.rb +33 -12
  241. data/lib/rubocop/remote_config.rb +1 -3
  242. data/lib/rubocop/result_cache.rb +5 -7
  243. data/lib/rubocop/rspec/cop_helper.rb +3 -26
  244. data/lib/rubocop/rspec/expect_offense.rb +49 -16
  245. data/lib/rubocop/rspec/shared_contexts.rb +54 -20
  246. data/lib/rubocop/runner.rb +21 -14
  247. data/lib/rubocop/target_finder.rb +7 -7
  248. data/lib/rubocop/target_ruby.rb +5 -2
  249. data/lib/rubocop/version.rb +5 -3
  250. metadata +47 -77
  251. data/lib/rubocop/ast/builder.rb +0 -85
  252. data/lib/rubocop/ast/node.rb +0 -637
  253. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  254. data/lib/rubocop/ast/node/and_node.rb +0 -29
  255. data/lib/rubocop/ast/node/args_node.rb +0 -29
  256. data/lib/rubocop/ast/node/array_node.rb +0 -57
  257. data/lib/rubocop/ast/node/block_node.rb +0 -121
  258. data/lib/rubocop/ast/node/break_node.rb +0 -17
  259. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  260. data/lib/rubocop/ast/node/case_node.rb +0 -56
  261. data/lib/rubocop/ast/node/class_node.rb +0 -31
  262. data/lib/rubocop/ast/node/def_node.rb +0 -82
  263. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  264. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  265. data/lib/rubocop/ast/node/float_node.rb +0 -12
  266. data/lib/rubocop/ast/node/for_node.rb +0 -53
  267. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  268. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  269. data/lib/rubocop/ast/node/if_node.rb +0 -175
  270. data/lib/rubocop/ast/node/int_node.rb +0 -12
  271. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  272. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  273. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  274. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  275. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  276. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  277. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  278. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  279. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  280. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  281. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  282. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  283. data/lib/rubocop/ast/node/module_node.rb +0 -24
  284. data/lib/rubocop/ast/node/or_node.rb +0 -29
  285. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  286. data/lib/rubocop/ast/node/range_node.rb +0 -18
  287. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  288. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  289. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  290. data/lib/rubocop/ast/node/return_node.rb +0 -24
  291. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  292. data/lib/rubocop/ast/node/send_node.rb +0 -13
  293. data/lib/rubocop/ast/node/str_node.rb +0 -16
  294. data/lib/rubocop/ast/node/super_node.rb +0 -21
  295. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  296. data/lib/rubocop/ast/node/until_node.rb +0 -35
  297. data/lib/rubocop/ast/node/when_node.rb +0 -53
  298. data/lib/rubocop/ast/node/while_node.rb +0 -35
  299. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  300. data/lib/rubocop/ast/sexp.rb +0 -16
  301. data/lib/rubocop/ast/traversal.rb +0 -202
  302. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  303. data/lib/rubocop/node_pattern.rb +0 -887
  304. data/lib/rubocop/processed_source.rb +0 -216
  305. data/lib/rubocop/string_util.rb +0 -14
  306. data/lib/rubocop/token.rb +0 -114
@@ -24,10 +24,10 @@ module RuboCop
24
24
  backref, = *node
25
25
  parent_type = node.parent ? node.parent.type : nil
26
26
  if %i[dstr xstr regexp].include?(parent_type)
27
- corrector.replace(node.source_range,
27
+ corrector.replace(node,
28
28
  "{Regexp.last_match(#{backref})}")
29
29
  else
30
- corrector.replace(node.source_range,
30
+ corrector.replace(node,
31
31
  "Regexp.last_match(#{backref})")
32
32
  end
33
33
  end
@@ -26,7 +26,7 @@ module RuboCop
26
26
  end
27
27
 
28
28
  def autocorrect(node)
29
- ->(corrector) { corrector.replace(node.source_range, 'proc') }
29
+ ->(corrector) { corrector.replace(node, 'proc') }
30
30
  end
31
31
  end
32
32
  end
@@ -58,7 +58,7 @@ module RuboCop
58
58
  correction_compact_to_exploded(node)
59
59
  end
60
60
 
61
- ->(corrector) { corrector.replace(node.source_range, replacement) }
61
+ ->(corrector) { corrector.replace(node, replacement) }
62
62
  end
63
63
 
64
64
  private
@@ -66,13 +66,13 @@ module RuboCop
66
66
  def autocorrect(node)
67
67
  lambda do |corrector|
68
68
  if integer_op_rand?(node)
69
- corrector.replace(node.source_range,
69
+ corrector.replace(node,
70
70
  corrected_integer_op_rand(node))
71
71
  elsif rand_op_integer?(node)
72
- corrector.replace(node.source_range,
72
+ corrector.replace(node,
73
73
  corrected_rand_op_integer(node))
74
74
  elsif rand_modified?(node)
75
- corrector.replace(node.source_range,
75
+ corrector.replace(node,
76
76
  corrected_rand_modified(node))
77
77
  end
78
78
  end
@@ -48,11 +48,11 @@ module RuboCop
48
48
  if node.ternary?
49
49
  correct_ternary(corrector, node)
50
50
  elsif node.modifier_form? || !node.else_branch
51
- corrector.replace(node.source_range, node.if_branch.source)
51
+ corrector.replace(node, node.if_branch.source)
52
52
  else
53
53
  corrected = make_ternary_form(node)
54
54
 
55
- corrector.replace(node.source_range, corrected)
55
+ corrector.replace(node, corrected)
56
56
  end
57
57
  end
58
58
  end
@@ -116,8 +116,7 @@ module RuboCop
116
116
 
117
117
  return unless node.else_branch.range_type?
118
118
 
119
- corrector.insert_before(node.else_branch.loc.expression, '(')
120
- corrector.insert_after(node.else_branch.loc.expression, ')')
119
+ corrector.wrap(node.else_branch, '(', ')')
121
120
  end
122
121
  end
123
122
  end
@@ -27,7 +27,8 @@ module RuboCop
27
27
  class RedundantConditional < Cop
28
28
  include Alignment
29
29
 
30
- COMPARISON_OPERATORS = RuboCop::AST::Node::COMPARISON_OPERATORS
30
+ operators = RuboCop::AST::Node::COMPARISON_OPERATORS.to_a
31
+ COMPARISON_OPERATOR_MATCHER = "{:#{operators.join(' :')}}"
31
32
 
32
33
  MSG = 'This conditional expression can just be replaced ' \
33
34
  'by `%<msg>s`.'
@@ -40,7 +41,7 @@ module RuboCop
40
41
 
41
42
  def autocorrect(node)
42
43
  lambda do |corrector|
43
- corrector.replace(node.loc.expression, replacement_condition(node))
44
+ corrector.replace(node, replacement_condition(node))
44
45
  end
45
46
  end
46
47
 
@@ -54,11 +55,11 @@ module RuboCop
54
55
  end
55
56
 
56
57
  def_node_matcher :redundant_condition?, <<~RUBY
57
- (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) true false)
58
+ (if (send _ #{COMPARISON_OPERATOR_MATCHER} _) true false)
58
59
  RUBY
59
60
 
60
61
  def_node_matcher :redundant_condition_inverted?, <<~RUBY
61
- (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) false true)
62
+ (if (send _ #{COMPARISON_OPERATOR_MATCHER} _) false true)
62
63
  RUBY
63
64
 
64
65
  def offense?(node)
@@ -32,17 +32,17 @@ module RuboCop
32
32
  exploded?(node) do |command, message|
33
33
  return lambda do |corrector|
34
34
  if node.parenthesized?
35
- corrector.replace(node.source_range,
35
+ corrector.replace(node,
36
36
  "#{command}(#{message.source})")
37
37
  else
38
- corrector.replace(node.source_range,
38
+ corrector.replace(node,
39
39
  "#{command} #{message.source}")
40
40
  end
41
41
  end
42
42
  end
43
43
  compact?(node) do |new_call, message|
44
44
  lambda do |corrector|
45
- corrector.replace(new_call.source_range, message.source)
45
+ corrector.replace(new_call, message.source)
46
46
  end
47
47
  end
48
48
  end
@@ -72,13 +72,13 @@ module RuboCop
72
72
 
73
73
  def autocorrect_variable_interpolation(embedded_node, node)
74
74
  replacement = "#{embedded_node.loc.expression.source}.to_s"
75
- ->(corrector) { corrector.replace(node.loc.expression, replacement) }
75
+ ->(corrector) { corrector.replace(node, replacement) }
76
76
  end
77
77
 
78
78
  def autocorrect_single_variable_interpolation(embedded_node, node)
79
79
  variable_loc = embedded_node.children.first.loc
80
80
  replacement = "#{variable_loc.expression.source}.to_s"
81
- ->(corrector) { corrector.replace(node.loc.expression, replacement) }
81
+ ->(corrector) { corrector.replace(node, replacement) }
82
82
  end
83
83
 
84
84
  def autocorrect_other(embedded_node, node)
@@ -93,12 +93,8 @@ module RuboCop
93
93
 
94
94
  def check(begin_node)
95
95
  node = begin_node.children.first
96
- if keyword_with_redundant_parentheses?(node)
97
- return offense(begin_node, 'a keyword')
98
- end
99
- if disallowed_literal?(begin_node, node)
100
- return offense(begin_node, 'a literal')
101
- end
96
+ return offense(begin_node, 'a keyword') if keyword_with_redundant_parentheses?(node)
97
+ return offense(begin_node, 'a literal') if disallowed_literal?(begin_node, node)
102
98
  return offense(begin_node, 'a variable') if node.variable?
103
99
  return offense(begin_node, 'a constant') if node.const_type?
104
100
 
@@ -27,7 +27,7 @@ module RuboCop
27
27
  EMPTY = ''
28
28
  PERCENT_Q = '%q'
29
29
  PERCENT_CAPITAL_Q = '%Q'
30
- STRING_INTERPOLATION_REGEXP = /#\{.+}/.freeze
30
+ STRING_INTERPOLATION_REGEXP = /#\{.+\}/.freeze
31
31
  ESCAPED_NON_BACKSLASH = /\\[^\\]/.freeze
32
32
 
33
33
  def on_dstr(node)
@@ -47,7 +47,7 @@ module RuboCop
47
47
 
48
48
  def autocorrect(node)
49
49
  delimiter =
50
- node.source =~ /^%Q[^"]+$|'/ ? QUOTE : SINGLE_QUOTE
50
+ /^%Q[^"]+$|'/.match?(node.source) ? QUOTE : SINGLE_QUOTE
51
51
  lambda do |corrector|
52
52
  corrector.replace(node.loc.begin, delimiter)
53
53
  corrector.replace(node.loc.end, delimiter)
@@ -95,7 +95,7 @@ module RuboCop
95
95
  def acceptable_q?(node)
96
96
  src = node.source
97
97
 
98
- return true if src =~ STRING_INTERPOLATION_REGEXP
98
+ return true if STRING_INTERPOLATION_REGEXP.match?(src)
99
99
 
100
100
  src.scan(/\\./).any? { |s| s =~ ESCAPED_NON_BACKSLASH }
101
101
  end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for unnecessary single-element Regexp character classes.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # r = /[x]/
12
+ #
13
+ # # good
14
+ # r = /x/
15
+ #
16
+ # # bad
17
+ # r = /[\s]/
18
+ #
19
+ # # good
20
+ # r = /\s/
21
+ #
22
+ # # good
23
+ # r = /[ab]/
24
+ class RedundantRegexpCharacterClass < Cop
25
+ include MatchRange
26
+ include RegexpLiteralHelp
27
+
28
+ MSG_REDUNDANT_CHARACTER_CLASS = 'Redundant single-element character class, ' \
29
+ '`%<char_class>s` can be replaced with `%<element>s`.'
30
+
31
+ PATTERN = /
32
+ (
33
+ (?<!\\) # No \-prefix (i.e. not escaped)
34
+ \[ # Literal [
35
+ (?!\#\{) # Not (the start of) an interpolation
36
+ (?: # Either...
37
+ \\. | # Any escaped character
38
+ [^.*+?{}()|$] | # or one that doesn't require escaping outside the character class
39
+ \\[upP]\{[^}]+\} # or a unicode code-point or property
40
+ )
41
+ \] # Literal ]
42
+ )
43
+ /x.freeze
44
+
45
+ def on_regexp(node)
46
+ each_redundant_character_class(node) do |loc|
47
+ next if whitespace_in_free_space_mode?(node, loc)
48
+
49
+ add_offense(
50
+ node,
51
+ location: loc,
52
+ message: format(
53
+ MSG_REDUNDANT_CHARACTER_CLASS,
54
+ char_class: loc.source,
55
+ element: without_character_class(loc)
56
+ )
57
+ )
58
+ end
59
+ end
60
+
61
+ def autocorrect(node)
62
+ lambda do |corrector|
63
+ each_redundant_character_class(node) do |loc|
64
+ corrector.replace(loc, without_character_class(loc))
65
+ end
66
+ end
67
+ end
68
+
69
+ def each_redundant_character_class(node)
70
+ each_match_range(node.loc.expression, PATTERN) do |loc|
71
+ yield loc
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def without_character_class(loc)
78
+ loc.source[1..-2]
79
+ end
80
+
81
+ def whitespace_in_free_space_mode?(node, loc)
82
+ return false unless freespace_mode_regexp?(node)
83
+
84
+ /\[\s\]/.match?(loc.source)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for redundant escapes inside Regexp literals.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # %r{foo\/bar}
11
+ #
12
+ # # good
13
+ # %r{foo/bar}
14
+ #
15
+ # # good
16
+ # /foo\/bar/
17
+ #
18
+ # # good
19
+ # %r/foo\/bar/
20
+ #
21
+ # # bad
22
+ # /a\-b/
23
+ #
24
+ # # good
25
+ # /a-b/
26
+ #
27
+ # # bad
28
+ # /[\+\-]\d/
29
+ #
30
+ # # good
31
+ # /[+\-]\d/
32
+ class RedundantRegexpEscape < Cop
33
+ include RangeHelp
34
+ include RegexpLiteralHelp
35
+
36
+ MSG_REDUNDANT_ESCAPE = 'Redundant escape inside regexp literal'
37
+
38
+ ALLOWED_ALWAYS_ESCAPES = ' []^\\#'.chars.freeze
39
+ ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES = '-'.chars.freeze
40
+ ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES = '.*+?{}()|$'.chars.freeze
41
+
42
+ def on_regexp(node)
43
+ each_escape(node) do |char, index, within_character_class|
44
+ next if allowed_escape?(node, char, within_character_class)
45
+
46
+ add_offense(
47
+ node,
48
+ location: escape_range_at_index(node, index),
49
+ message: MSG_REDUNDANT_ESCAPE
50
+ )
51
+ end
52
+ end
53
+
54
+ def autocorrect(node)
55
+ lambda do |corrector|
56
+ each_escape(node) do |char, index, within_character_class|
57
+ next if allowed_escape?(node, char, within_character_class)
58
+
59
+ corrector.remove_leading(escape_range_at_index(node, index), 1)
60
+ end
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def slash_literal?(node)
67
+ ['/', '%r/'].include?(node.loc.begin.source)
68
+ end
69
+
70
+ def allowed_escape?(node, char, within_character_class)
71
+ # Strictly speaking a few single-letter metachars are currently
72
+ # unnecessary to "escape", e.g. g, i, E, F, but enumerating them is
73
+ # rather difficult, and their behaviour could change over time with
74
+ # different versions of Ruby so that e.g. /\g/ != /g/
75
+ return true if /[[:alnum:]]/.match?(char)
76
+ return true if ALLOWED_ALWAYS_ESCAPES.include?(char)
77
+
78
+ if char == '/'
79
+ slash_literal?(node)
80
+ elsif within_character_class
81
+ ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES.include?(char)
82
+ else
83
+ ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES.include?(char)
84
+ end
85
+ end
86
+
87
+ def each_escape(node)
88
+ pattern_source(node).each_char.with_index.reduce(
89
+ [nil, false]
90
+ ) do |(previous, within_character_class), (current, index)|
91
+ if previous == '\\'
92
+ yield [current, index - 1, within_character_class]
93
+
94
+ [nil, within_character_class]
95
+ elsif previous == '[' && current != ':'
96
+ [current, true]
97
+ elsif previous != ':' && current == ']'
98
+ [current, false]
99
+ else
100
+ [current, within_character_class]
101
+ end
102
+ end
103
+ end
104
+
105
+ def escape_range_at_index(node, index)
106
+ regexp_begin = node.loc.begin.end_pos
107
+
108
+ start = regexp_begin + index
109
+
110
+ range_between(start, start + 2)
111
+ end
112
+
113
+ def pattern_source(node)
114
+ freespace_mode = freespace_mode_regexp?(node)
115
+
116
+ node.children.reject(&:regopt_type?).map do |child|
117
+ source = child.source
118
+
119
+ if freespace_mode
120
+ # Remove comments to avoid misleading results
121
+ source.sub(/(?<!\\)#.*/, '')
122
+ else
123
+ source
124
+ end
125
+ end.join
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -71,7 +71,7 @@ module RuboCop
71
71
  private
72
72
 
73
73
  def correct_without_arguments(return_node, corrector)
74
- corrector.replace(return_node.source_range, 'nil')
74
+ corrector.replace(return_node, 'nil')
75
75
  end
76
76
 
77
77
  def correct_with_arguments(return_node, corrector)
@@ -91,15 +91,13 @@ module RuboCop
91
91
  end
92
92
 
93
93
  def add_brackets(corrector, node)
94
- kids = node.children.map(&:source_range)
95
- corrector.insert_before(kids.first, '[')
96
- corrector.insert_after(kids.last, ']')
94
+ corrector.insert_before(node.children.first, '[')
95
+ corrector.insert_after(node.children.last, ']')
97
96
  end
98
97
 
99
98
  def add_braces(corrector, node)
100
- kids = node.children.map(&:source_range)
101
- corrector.insert_before(kids.first, '{')
102
- corrector.insert_after(kids.last, '}')
99
+ corrector.insert_before(node.children.first, '{')
100
+ corrector.insert_after(node.children.last, '}')
103
101
  end
104
102
 
105
103
  # rubocop:disable Metrics/CyclomaticComplexity
@@ -110,7 +110,7 @@ module RuboCop
110
110
 
111
111
  def autocorrect(node)
112
112
  lambda do |corrector|
113
- corrector.remove(node.receiver.source_range)
113
+ corrector.remove(node.receiver)
114
114
  corrector.remove(node.loc.dot)
115
115
  end
116
116
  end