rubocop 0.49.1 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -9
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +264 -118
  5. data/config/disabled.yml +13 -9
  6. data/config/enabled.yml +1156 -918
  7. data/lib/rubocop.rb +555 -489
  8. data/lib/rubocop/ast/builder.rb +6 -1
  9. data/lib/rubocop/ast/node.rb +68 -52
  10. data/lib/rubocop/ast/node/args_node.rb +15 -10
  11. data/lib/rubocop/ast/node/array_node.rb +10 -1
  12. data/lib/rubocop/ast/node/block_node.rb +9 -0
  13. data/lib/rubocop/ast/node/def_node.rb +71 -0
  14. data/lib/rubocop/ast/node/for_node.rb +8 -0
  15. data/lib/rubocop/ast/node/if_node.rb +10 -2
  16. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  17. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  18. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  19. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  20. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  21. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  22. data/lib/rubocop/ast/node/send_node.rb +21 -150
  23. data/lib/rubocop/ast/node/str_node.rb +14 -0
  24. data/lib/rubocop/ast/node/super_node.rb +3 -24
  25. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  26. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  27. data/lib/rubocop/ast/traversal.rb +7 -7
  28. data/lib/rubocop/cached_data.rb +1 -6
  29. data/lib/rubocop/cli.rb +59 -13
  30. data/lib/rubocop/comment_config.rb +2 -5
  31. data/lib/rubocop/config.rb +136 -29
  32. data/lib/rubocop/config_loader.rb +61 -104
  33. data/lib/rubocop/config_loader_resolver.rb +102 -4
  34. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  35. data/lib/rubocop/cop/bundler/duplicated_gem.rb +13 -11
  36. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  37. data/lib/rubocop/cop/bundler/ordered_gems.rb +7 -58
  38. data/lib/rubocop/cop/commissioner.rb +6 -3
  39. data/lib/rubocop/cop/cop.rb +11 -6
  40. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  41. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +97 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  43. data/lib/rubocop/cop/generator.rb +122 -25
  44. data/lib/rubocop/cop/internal_affairs.rb +6 -2
  45. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  46. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +16 -5
  47. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  48. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  49. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  50. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  51. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -10
  52. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  53. data/lib/rubocop/cop/layout/align_hash.rb +18 -18
  54. data/lib/rubocop/cop/layout/align_parameters.rb +11 -23
  55. data/lib/rubocop/cop/layout/block_end_newline.rb +20 -6
  56. data/lib/rubocop/cop/layout/case_indentation.rb +15 -18
  57. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  58. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +7 -6
  59. data/lib/rubocop/cop/layout/comment_indentation.rb +42 -3
  60. data/lib/rubocop/cop/layout/dot_position.rb +31 -13
  61. data/lib/rubocop/cop/layout/else_alignment.rb +37 -17
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -1
  63. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +22 -18
  64. data/lib/rubocop/cop/layout/empty_lines.rb +16 -2
  65. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +23 -6
  66. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  67. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  68. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  69. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +10 -6
  71. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +5 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  73. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  74. data/lib/rubocop/cop/layout/extra_spacing.rb +23 -26
  75. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  76. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +9 -3
  77. data/lib/rubocop/cop/layout/indent_array.rb +68 -21
  78. data/lib/rubocop/cop/layout/indent_hash.rb +71 -26
  79. data/lib/rubocop/cop/layout/indent_heredoc.rb +70 -35
  80. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  81. data/lib/rubocop/cop/layout/indentation_width.rb +40 -27
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +10 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +32 -17
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  85. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +12 -11
  86. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  87. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  88. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +29 -27
  89. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +7 -3
  90. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  91. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +12 -4
  92. data/lib/rubocop/cop/layout/space_after_colon.rb +13 -6
  93. data/lib/rubocop/cop/layout/space_after_comma.rb +11 -1
  94. data/lib/rubocop/cop/layout/space_after_method_name.rb +8 -6
  95. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  96. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  97. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +32 -25
  98. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +28 -17
  99. data/lib/rubocop/cop/layout/space_around_keyword.rb +22 -16
  100. data/lib/rubocop/cop/layout/space_around_operators.rb +27 -14
  101. data/lib/rubocop/cop/layout/space_before_block_braces.rb +61 -12
  102. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  103. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -5
  104. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -4
  105. data/lib/rubocop/cop/layout/space_before_semicolon.rb +8 -1
  106. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +12 -14
  107. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  108. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +4 -4
  109. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +89 -18
  110. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +62 -36
  111. data/lib/rubocop/cop/layout/space_inside_parens.rb +40 -3
  112. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  113. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  114. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  115. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +32 -17
  116. data/lib/rubocop/cop/layout/tab.rb +7 -4
  117. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +11 -9
  118. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  119. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +12 -19
  120. data/lib/rubocop/cop/lint/assignment_in_condition.rb +16 -2
  121. data/lib/rubocop/cop/lint/block_alignment.rb +42 -30
  122. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  123. data/lib/rubocop/cop/lint/circular_argument_reference.rb +3 -14
  124. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  125. data/lib/rubocop/cop/lint/debugger.rb +18 -11
  126. data/lib/rubocop/cop/lint/def_end_alignment.rb +9 -14
  127. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  128. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  129. data/lib/rubocop/cop/lint/duplicate_methods.rb +75 -5
  130. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  131. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  132. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  133. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  134. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  135. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  136. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  137. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  138. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  139. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  140. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  141. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +36 -41
  142. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  143. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  144. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +25 -20
  145. data/lib/rubocop/cop/lint/inherit_exception.rb +16 -19
  146. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  147. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +21 -7
  148. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  149. data/lib/rubocop/cop/lint/loop.rb +1 -1
  150. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  151. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  152. data/lib/rubocop/cop/lint/nested_method_definition.rb +6 -8
  153. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  154. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  155. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
  156. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -3
  157. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -22
  158. data/lib/rubocop/cop/lint/percent_symbol_array.rb +12 -12
  159. data/lib/rubocop/cop/lint/rand_one.rb +8 -2
  160. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  161. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  162. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  163. data/lib/rubocop/cop/lint/require_parentheses.rb +5 -3
  164. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  165. data/lib/rubocop/cop/lint/rescue_type.rb +18 -9
  166. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  167. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  168. data/lib/rubocop/cop/lint/script_permission.rb +8 -1
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +37 -10
  171. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  172. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +7 -7
  173. data/lib/rubocop/cop/lint/syntax.rb +23 -20
  174. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  175. data/lib/rubocop/cop/lint/unified_integer.rb +5 -4
  176. data/lib/rubocop/cop/lint/unneeded_disable.rb +41 -16
  177. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  178. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +45 -19
  179. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  180. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  181. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  182. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  183. data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -16
  184. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  185. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  186. data/lib/rubocop/cop/lint/useless_setter_call.rb +15 -12
  187. data/lib/rubocop/cop/lint/void.rb +38 -27
  188. data/lib/rubocop/cop/message_annotator.rb +4 -2
  189. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  190. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  191. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  192. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  193. data/lib/rubocop/cop/metrics/line_length.rb +8 -5
  194. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  195. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  196. data/lib/rubocop/cop/metrics/parameter_lists.rb +14 -5
  197. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  198. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +3 -2
  199. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +2 -2
  200. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  202. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +14 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +8 -4
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -3
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  209. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  210. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -7
  211. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +74 -33
  212. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +34 -8
  213. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -1
  214. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +67 -0
  215. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  216. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -1
  217. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  218. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +9 -8
  219. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -10
  220. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  221. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  222. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  223. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  224. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  225. data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -17
  226. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -2
  227. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  228. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +35 -2
  229. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +7 -6
  230. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  231. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  232. data/lib/rubocop/cop/{style → naming}/file_name.rb +28 -13
  233. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  234. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  235. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  236. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  237. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  238. data/lib/rubocop/cop/{style → naming}/variable_number.rb +11 -28
  239. data/lib/rubocop/cop/offense.rb +6 -1
  240. data/lib/rubocop/cop/performance/caller.rb +39 -11
  241. data/lib/rubocop/cop/performance/case_when_splat.rb +3 -7
  242. data/lib/rubocop/cop/performance/casecmp.rb +9 -8
  243. data/lib/rubocop/cop/performance/compare_with_block.rb +23 -13
  244. data/lib/rubocop/cop/performance/count.rb +7 -4
  245. data/lib/rubocop/cop/performance/detect.rb +9 -6
  246. data/lib/rubocop/cop/performance/double_start_end_with.rb +12 -20
  247. data/lib/rubocop/cop/performance/end_with.rb +6 -6
  248. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  249. data/lib/rubocop/cop/performance/flat_map.rb +5 -2
  250. data/lib/rubocop/cop/performance/hash_each_methods.rb +85 -40
  251. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +9 -6
  252. data/lib/rubocop/cop/performance/range_include.rb +3 -3
  253. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -28
  254. data/lib/rubocop/cop/performance/redundant_match.rb +13 -12
  255. data/lib/rubocop/cop/performance/redundant_merge.rb +44 -26
  256. data/lib/rubocop/cop/performance/redundant_sort_by.rb +9 -6
  257. data/lib/rubocop/cop/performance/regexp_match.rb +19 -10
  258. data/lib/rubocop/cop/performance/reverse_each.rb +1 -1
  259. data/lib/rubocop/cop/performance/sample.rb +1 -1
  260. data/lib/rubocop/cop/performance/size.rb +3 -3
  261. data/lib/rubocop/cop/performance/start_with.rb +6 -6
  262. data/lib/rubocop/cop/performance/string_replacement.rb +6 -6
  263. data/lib/rubocop/cop/performance/times_map.rb +32 -22
  264. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  265. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  266. data/lib/rubocop/cop/rails/action_filter.rb +23 -1
  267. data/lib/rubocop/cop/rails/active_support_aliases.rb +4 -5
  268. data/lib/rubocop/cop/rails/application_job.rb +5 -3
  269. data/lib/rubocop/cop/rails/application_record.rb +5 -3
  270. data/lib/rubocop/cop/rails/blank.rb +20 -17
  271. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  272. data/lib/rubocop/cop/rails/date.rb +7 -6
  273. data/lib/rubocop/cop/rails/delegate.rb +53 -29
  274. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +4 -4
  275. data/lib/rubocop/cop/rails/dynamic_find_by.rb +2 -2
  276. data/lib/rubocop/cop/rails/enum_uniqueness.rb +4 -4
  277. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  278. data/lib/rubocop/cop/rails/exit.rb +8 -1
  279. data/lib/rubocop/cop/rails/file_path.rb +8 -11
  280. data/lib/rubocop/cop/rails/find_by.rb +2 -1
  281. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  282. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +8 -1
  283. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +76 -0
  284. data/lib/rubocop/cop/rails/http_positional_arguments.rb +40 -44
  285. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  286. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  287. data/lib/rubocop/cop/rails/not_null_column.rb +6 -6
  288. data/lib/rubocop/cop/rails/output.rb +11 -2
  289. data/lib/rubocop/cop/rails/output_safety.rb +16 -21
  290. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -10
  291. data/lib/rubocop/cop/rails/presence.rb +105 -0
  292. data/lib/rubocop/cop/rails/present.rb +14 -17
  293. data/lib/rubocop/cop/rails/read_write_attribute.rb +13 -13
  294. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  295. data/lib/rubocop/cop/rails/relative_date_constant.rb +11 -11
  296. data/lib/rubocop/cop/rails/request_referer.rb +3 -3
  297. data/lib/rubocop/cop/rails/reversible_migration.rb +36 -35
  298. data/lib/rubocop/cop/rails/safe_navigation.rb +7 -8
  299. data/lib/rubocop/cop/rails/save_bang.rb +19 -17
  300. data/lib/rubocop/cop/rails/scope_args.rb +2 -2
  301. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  302. data/lib/rubocop/cop/rails/time_zone.rb +3 -2
  303. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +4 -2
  304. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  305. data/lib/rubocop/cop/rails/validation.rb +8 -8
  306. data/lib/rubocop/cop/registry.rb +2 -1
  307. data/lib/rubocop/cop/security/eval.rb +4 -4
  308. data/lib/rubocop/cop/security/json_load.rb +7 -5
  309. data/lib/rubocop/cop/security/marshal_load.rb +8 -6
  310. data/lib/rubocop/cop/security/yaml_load.rb +4 -4
  311. data/lib/rubocop/cop/style/alias.rb +49 -27
  312. data/lib/rubocop/cop/style/and_or.rb +65 -45
  313. data/lib/rubocop/cop/style/array_join.rb +10 -1
  314. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  315. data/lib/rubocop/cop/style/attr.rb +15 -5
  316. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -5
  317. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  318. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  319. data/lib/rubocop/cop/style/block_comments.rb +17 -3
  320. data/lib/rubocop/cop/style/block_delimiters.rb +82 -16
  321. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +68 -32
  322. data/lib/rubocop/cop/style/case_equality.rb +13 -1
  323. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  324. data/lib/rubocop/cop/style/class_and_module_children.rb +8 -4
  325. data/lib/rubocop/cop/style/class_check.rb +29 -10
  326. data/lib/rubocop/cop/style/class_methods.rb +10 -9
  327. data/lib/rubocop/cop/style/class_vars.rb +5 -4
  328. data/lib/rubocop/cop/style/collection_methods.rb +5 -3
  329. data/lib/rubocop/cop/style/colon_method_call.rb +18 -2
  330. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  331. data/lib/rubocop/cop/style/command_literal.rb +90 -30
  332. data/lib/rubocop/cop/style/comment_annotation.rb +39 -11
  333. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  334. data/lib/rubocop/cop/style/conditional_assignment.rb +41 -41
  335. data/lib/rubocop/cop/style/copyright.rb +27 -28
  336. data/lib/rubocop/cop/style/date_time.rb +44 -0
  337. data/lib/rubocop/cop/style/def_with_parentheses.rb +31 -5
  338. data/lib/rubocop/cop/style/dir.rb +48 -0
  339. data/lib/rubocop/cop/style/documentation.rb +17 -2
  340. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  341. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  342. data/lib/rubocop/cop/style/each_for_simple_loop.rb +8 -8
  343. data/lib/rubocop/cop/style/each_with_object.rb +6 -5
  344. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  345. data/lib/rubocop/cop/style/empty_case_condition.rb +3 -3
  346. data/lib/rubocop/cop/style/empty_else.rb +55 -24
  347. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  348. data/lib/rubocop/cop/style/empty_literal.rb +25 -14
  349. data/lib/rubocop/cop/style/empty_method.rb +29 -25
  350. data/lib/rubocop/cop/style/encoding.rb +8 -51
  351. data/lib/rubocop/cop/style/end_block.rb +1 -1
  352. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  353. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  354. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  355. data/lib/rubocop/cop/style/flip_flop.rb +13 -2
  356. data/lib/rubocop/cop/style/for.rb +6 -2
  357. data/lib/rubocop/cop/style/format_string.rb +33 -5
  358. data/lib/rubocop/cop/style/format_string_token.rb +17 -15
  359. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -6
  360. data/lib/rubocop/cop/style/global_vars.rb +12 -2
  361. data/lib/rubocop/cop/style/guard_clause.rb +6 -4
  362. data/lib/rubocop/cop/style/hash_syntax.rb +56 -56
  363. data/lib/rubocop/cop/style/identical_conditional_branches.rb +12 -8
  364. data/lib/rubocop/cop/style/if_inside_else.rb +11 -11
  365. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -7
  366. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -2
  367. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -1
  368. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -6
  369. data/lib/rubocop/cop/style/infinite_loop.rb +4 -4
  370. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  371. data/lib/rubocop/cop/style/inverse_methods.rb +24 -14
  372. data/lib/rubocop/cop/style/lambda.rb +45 -43
  373. data/lib/rubocop/cop/style/lambda_call.rb +37 -10
  374. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -5
  375. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -19
  376. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  377. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -1
  378. data/lib/rubocop/cop/style/method_def_parentheses.rb +20 -25
  379. data/lib/rubocop/cop/style/method_missing.rb +13 -26
  380. data/lib/rubocop/cop/style/min_max.rb +68 -0
  381. data/lib/rubocop/cop/style/missing_else.rb +20 -6
  382. data/lib/rubocop/cop/style/mixin_grouping.rb +31 -21
  383. data/lib/rubocop/cop/style/mixin_usage.rb +71 -0
  384. data/lib/rubocop/cop/style/module_function.rb +27 -11
  385. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  386. data/lib/rubocop/cop/style/multiline_if_modifier.rb +8 -4
  387. data/lib/rubocop/cop/style/multiline_if_then.rb +15 -13
  388. data/lib/rubocop/cop/style/multiline_memoization.rb +33 -17
  389. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  390. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  391. data/lib/rubocop/cop/style/mutable_constant.rb +11 -15
  392. data/lib/rubocop/cop/style/negated_if.rb +27 -31
  393. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  394. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  395. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +26 -23
  396. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  397. data/lib/rubocop/cop/style/next.rb +41 -12
  398. data/lib/rubocop/cop/style/nil_comparison.rb +8 -8
  399. data/lib/rubocop/cop/style/non_nil_check.rb +41 -38
  400. data/lib/rubocop/cop/style/not.rb +15 -5
  401. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +8 -4
  402. data/lib/rubocop/cop/style/numeric_literals.rb +9 -9
  403. data/lib/rubocop/cop/style/numeric_predicate.rb +21 -21
  404. data/lib/rubocop/cop/style/one_line_conditional.rb +9 -4
  405. data/lib/rubocop/cop/style/option_hash.rb +11 -25
  406. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  407. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  408. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  409. data/lib/rubocop/cop/style/parentheses_around_condition.rb +30 -13
  410. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +25 -4
  411. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  412. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -1
  413. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -11
  414. data/lib/rubocop/cop/style/proc.rb +10 -2
  415. data/lib/rubocop/cop/style/raise_args.rb +22 -29
  416. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  417. data/lib/rubocop/cop/style/redundant_begin.rb +16 -5
  418. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  419. data/lib/rubocop/cop/style/redundant_exception.rb +4 -4
  420. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +14 -12
  422. data/lib/rubocop/cop/style/redundant_return.rb +28 -15
  423. data/lib/rubocop/cop/style/redundant_self.rb +35 -27
  424. data/lib/rubocop/cop/style/regexp_literal.rb +88 -27
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +12 -1
  426. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  427. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  428. data/lib/rubocop/cop/style/safe_navigation.rb +100 -48
  429. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  430. data/lib/rubocop/cop/style/semicolon.rb +19 -9
  431. data/lib/rubocop/cop/style/send.rb +10 -1
  432. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  433. data/lib/rubocop/cop/style/single_line_block_params.rb +16 -15
  434. data/lib/rubocop/cop/style/single_line_methods.rb +26 -18
  435. data/lib/rubocop/cop/style/special_global_vars.rb +19 -14
  436. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +23 -50
  437. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  438. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  439. data/lib/rubocop/cop/style/string_literals.rb +26 -3
  440. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +16 -1
  441. data/lib/rubocop/cop/style/string_methods.rb +19 -8
  442. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  443. data/lib/rubocop/cop/style/symbol_array.rb +7 -35
  444. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  445. data/lib/rubocop/cop/style/symbol_proc.rb +11 -25
  446. data/lib/rubocop/cop/style/ternary_parentheses.rb +46 -51
  447. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  448. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  449. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  450. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  451. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +70 -24
  452. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -65
  453. data/lib/rubocop/cop/style/unless_else.rb +16 -1
  454. data/lib/rubocop/cop/style/unneeded_capital_w.rb +18 -8
  455. data/lib/rubocop/cop/style/unneeded_interpolation.rb +15 -19
  456. data/lib/rubocop/cop/style/unneeded_percent_q.rb +14 -13
  457. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -9
  458. data/lib/rubocop/cop/style/when_then.rb +14 -1
  459. data/lib/rubocop/cop/style/while_until_do.rb +27 -4
  460. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -6
  461. data/lib/rubocop/cop/style/word_array.rb +9 -30
  462. data/lib/rubocop/cop/style/yoda_condition.rb +51 -22
  463. data/lib/rubocop/cop/style/zero_length_predicate.rb +44 -29
  464. data/lib/rubocop/cop/team.rb +16 -8
  465. data/lib/rubocop/cop/util.rb +43 -34
  466. data/lib/rubocop/cop/variable_force.rb +1 -1
  467. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  468. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  469. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  470. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -4
  471. data/lib/rubocop/formatter/formatter_set.rb +3 -1
  472. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  473. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  474. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  475. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  476. data/lib/rubocop/formatter/simple_text_formatter.rb +3 -3
  477. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  478. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  479. data/lib/rubocop/node_pattern.rb +46 -29
  480. data/lib/rubocop/options.rb +13 -8
  481. data/lib/rubocop/path_util.rb +15 -3
  482. data/lib/rubocop/processed_source.rb +8 -9
  483. data/lib/rubocop/rake_task.rb +16 -23
  484. data/lib/rubocop/remote_config.rb +13 -1
  485. data/lib/rubocop/result_cache.rb +1 -0
  486. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  487. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  488. data/lib/rubocop/rspec/shared_contexts.rb +4 -8
  489. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  490. data/lib/rubocop/rspec/support.rb +5 -5
  491. data/lib/rubocop/runner.rb +1 -1
  492. data/lib/rubocop/string_util.rb +2 -0
  493. data/lib/rubocop/token.rb +74 -0
  494. data/lib/rubocop/version.rb +1 -1
  495. metadata +118 -48
  496. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  497. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -41
  498. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  499. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
  500. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  501. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -45
  502. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -29
  503. data/lib/rubocop/cop/style/constant_name.rb +0 -29
  504. data/lib/rubocop/cop/style/method_name.rb +0 -34
  505. data/lib/rubocop/cop/style/predicate_name.rb +0 -67
  506. data/lib/rubocop/cop/style/variable_name.rb +0 -39
@@ -25,14 +25,17 @@ module RuboCop
25
25
  # something
26
26
  # end
27
27
  class RedundantBegin < Cop
28
- include OnMethodDef
29
-
30
28
  MSG = 'Redundant `begin` block detected.'.freeze
31
29
 
32
- def on_method_def(_node, _method_name, _args, body)
33
- return unless body && body.kwbegin_type?
30
+ def on_def(node)
31
+ check(node)
32
+ end
33
+ alias on_defs on_def
34
34
 
35
- add_offense(body, :begin)
35
+ def on_block(node)
36
+ return if target_ruby_version < 2.5
37
+ return if node.braces?
38
+ check(node)
36
39
  end
37
40
 
38
41
  def autocorrect(node)
@@ -41,6 +44,14 @@ module RuboCop
41
44
  corrector.remove(node.loc.end)
42
45
  end
43
46
  end
47
+
48
+ private
49
+
50
+ def check(node)
51
+ return unless node.body && node.body.kwbegin_type?
52
+
53
+ add_offense(node.body, location: :begin)
54
+ end
44
55
  end
45
56
  end
46
57
  end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for redundant returning of true/false in conditionals.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # x == y ? true : false
11
+ #
12
+ # # bad
13
+ # if x == y
14
+ # true
15
+ # else
16
+ # false
17
+ # end
18
+ #
19
+ # # good
20
+ # x == y
21
+ #
22
+ # # bad
23
+ # x == y ? false : true
24
+ #
25
+ # # good
26
+ # x != y
27
+ class RedundantConditional < Cop
28
+ include AutocorrectAlignment
29
+
30
+ COMPARISON_OPERATORS = RuboCop::AST::Node::COMPARISON_OPERATORS
31
+
32
+ MSG = 'This conditional expression can just be replaced ' \
33
+ 'by `%<msg>s`.'.freeze
34
+
35
+ def on_if(node)
36
+ return unless offense?(node)
37
+
38
+ add_offense(node)
39
+ end
40
+
41
+ def autocorrect(node)
42
+ lambda do |corrector|
43
+ corrector.replace(node.loc.expression, replacement_condition(node))
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def message(node)
50
+ replacement = replacement_condition(node)
51
+ msg = node.elsif? ? "\n#{replacement}" : replacement
52
+
53
+ format(MSG, msg: msg)
54
+ end
55
+
56
+ def_node_matcher :redundant_condition?, <<-RUBY
57
+ (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) true false)
58
+ RUBY
59
+
60
+ def_node_matcher :redundant_condition_inverted?, <<-RUBY
61
+ (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) false true)
62
+ RUBY
63
+
64
+ def offense?(node)
65
+ return if node.modifier_form?
66
+ redundant_condition?(node) || redundant_condition_inverted?(node)
67
+ end
68
+
69
+ def replacement_condition(node)
70
+ condition = node.condition.source
71
+ expression = invert_expression?(node) ? "!(#{condition})" : condition
72
+
73
+ node.elsif? ? indented_else_node(expression, node) : expression
74
+ end
75
+
76
+ def invert_expression?(node)
77
+ (
78
+ (node.if? || node.elsif? || node.ternary?) &&
79
+ redundant_condition_inverted?(node)
80
+ ) || (
81
+ node.unless? &&
82
+ redundant_condition?(node)
83
+ )
84
+ end
85
+
86
+ def indented_else_node(expression, node)
87
+ "else\n#{indentation(node)}#{expression}"
88
+ end
89
+
90
+ def configured_indentation_width
91
+ super || 2
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -22,8 +22,8 @@ module RuboCop
22
22
  'just the message.'.freeze
23
23
 
24
24
  def on_send(node)
25
- exploded?(node) { return add_offense(node, :expression, MSG_1) }
26
- compact?(node) { add_offense(node, :expression, MSG_2) }
25
+ exploded?(node) { return add_offense(node, message: MSG_1) }
26
+ compact?(node) { add_offense(node, message: MSG_2) }
27
27
  end
28
28
 
29
29
  # Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
@@ -43,11 +43,11 @@ module RuboCop
43
43
  end
44
44
 
45
45
  def_node_matcher :exploded?, <<-PATTERN
46
- (send nil ${:raise :fail} (const nil :RuntimeError) $_)
46
+ (send nil? ${:raise :fail} (const nil? :RuntimeError) $_)
47
47
  PATTERN
48
48
 
49
49
  def_node_matcher :compact?, <<-PATTERN
50
- (send nil {:raise :fail} $(send (const nil :RuntimeError) :new $_))
50
+ (send nil? {:raise :fail} $(send (const nil? :RuntimeError) :new $_))
51
51
  PATTERN
52
52
  end
53
53
  end
@@ -21,7 +21,7 @@ module RuboCop
21
21
  return unless node.receiver && node.method?(:freeze) &&
22
22
  immutable_literal?(node.receiver)
23
23
 
24
- add_offense(node, :expression)
24
+ add_offense(node)
25
25
  end
26
26
 
27
27
  def autocorrect(node)
@@ -31,11 +31,17 @@ module RuboCop
31
31
  check(node)
32
32
  end
33
33
 
34
+ private
35
+
34
36
  def parens_allowed?(node)
35
37
  empty_parentheses?(node) ||
36
- allowed_ancestor?(node) ||
37
38
  hash_literal_as_first_arg?(node) ||
38
39
  rescue?(node) ||
40
+ allowed_expression?(node)
41
+ end
42
+
43
+ def allowed_expression?(node)
44
+ allowed_ancestor?(node) ||
39
45
  allowed_method_call?(node) ||
40
46
  allowed_array_or_hash_element?(node) ||
41
47
  allowed_multiple_expression?(node)
@@ -52,7 +58,7 @@ module RuboCop
52
58
  end
53
59
 
54
60
  def allowed_multiple_expression?(node)
55
- return false if node.children.size == 1
61
+ return false if node.children.one?
56
62
  ancestor = node.ancestors.first
57
63
  return false unless ancestor
58
64
  !ancestor.begin_type? && !ancestor.def_type? && !ancestor.block_type?
@@ -65,7 +71,7 @@ module RuboCop
65
71
 
66
72
  def hash_literal_as_first_arg?(node)
67
73
  # Don't flag `method ({key: value})`
68
- node.children.first.hash_type? && first_arg?(node) &&
74
+ node.children.first.hash_type? && first_argument?(node) &&
69
75
  !parentheses?(node.parent)
70
76
  end
71
77
 
@@ -104,7 +110,7 @@ module RuboCop
104
110
  end
105
111
 
106
112
  def offense(node, msg)
107
- add_offense(node, :expression, "Don't use parentheses around #{msg}.")
113
+ add_offense(node, message: "Don't use parentheses around #{msg}.")
108
114
  end
109
115
 
110
116
  def keyword_ancestor?(node)
@@ -177,16 +183,12 @@ module RuboCop
177
183
  end
178
184
 
179
185
  def only_begin_arg?(args)
180
- args.size == 1 && args.first && args.first.begin_type?
186
+ args.one? && args.first.begin_type?
181
187
  end
182
188
 
183
- def first_arg?(node)
184
- send_node = node.parent
185
- return false unless send_node && send_node.send_type?
186
-
187
- _receiver, _method_name, *args = *send_node
188
- node.equal?(args.first)
189
- end
189
+ def_node_matcher :first_argument?, <<-PATTERN
190
+ ^(send _ _ equal?(%0) ...)
191
+ PATTERN
190
192
 
191
193
  def call_chain_starts_with_int?(begin_node, send_node)
192
194
  recv = first_part_of_call_chain(send_node)
@@ -21,13 +21,17 @@ module RuboCop
21
21
  # It should be extended to handle methods whose body is if/else
22
22
  # or a case expression with a default branch.
23
23
  class RedundantReturn < Cop
24
- include OnMethodDef
25
-
26
24
  MSG = 'Redundant `return` detected.'.freeze
25
+ MULTI_RETURN_MSG = 'To return multiple values, use an array.'.freeze
27
26
 
28
- private
27
+ def on_def(node)
28
+ return unless node.body
29
+
30
+ check_branch(node.body)
31
+ end
32
+ alias on_defs on_def
29
33
 
30
- def autocorrect(node)
34
+ def autocorrect(node) # rubocop:disable Metrics/MethodLength
31
35
  lambda do |corrector|
32
36
  unless arguments?(node.children)
33
37
  corrector.replace(node.source_range, 'nil')
@@ -40,11 +44,14 @@ module RuboCop
40
44
  elsif return_value.hash_type?
41
45
  add_braces(corrector, return_value) unless return_value.braces?
42
46
  end
43
- return_kw = range_with_surrounding_space(node.loc.keyword, :right)
47
+ return_kw = range_with_surrounding_space(range: node.loc.keyword,
48
+ side: :right)
44
49
  corrector.remove(return_kw)
45
50
  end
46
51
  end
47
52
 
53
+ private
54
+
48
55
  def add_brackets(corrector, node)
49
56
  kids = node.children.map(&:source_range)
50
57
  corrector.insert_before(kids.first, '[')
@@ -64,18 +71,12 @@ module RuboCop
64
71
  !args.first.begin_type? || !args.first.children.empty?
65
72
  end
66
73
 
67
- def on_method_def(_node, _method_name, _args, body)
68
- return unless body
69
-
70
- check_branch(body)
71
- end
72
-
73
74
  def check_branch(node)
74
75
  case node.type
75
76
  when :return then check_return_node(node)
76
- when :case then check_case_node(node)
77
- when :if then check_if_node(node)
78
- when :begin then check_begin_node(node)
77
+ when :case then check_case_node(node)
78
+ when :if then check_if_node(node)
79
+ when :begin then check_begin_node(node)
79
80
  end
80
81
  end
81
82
 
@@ -83,7 +84,7 @@ module RuboCop
83
84
  return if cop_config['AllowMultipleReturnValues'] &&
84
85
  node.children.size > 1
85
86
 
86
- add_offense(node, :keyword)
87
+ add_offense(node, location: :keyword)
87
88
  end
88
89
 
89
90
  def check_case_node(node)
@@ -115,6 +116,18 @@ module RuboCop
115
116
 
116
117
  check_return_node(last_expr)
117
118
  end
119
+
120
+ def allow_multiple_return_values?
121
+ cop_config['AllowMultipleReturnValues'] || false
122
+ end
123
+
124
+ def message(node)
125
+ if !allow_multiple_return_values? && node.children.size > 1
126
+ "#{MSG} #{MULTI_RETURN_MSG}"
127
+ else
128
+ MSG
129
+ end
130
+ end
118
131
  end
119
132
  end
120
133
  end
@@ -5,46 +5,49 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for redundant uses of `self`.
7
7
  #
8
- # `self` is only needed when:
8
+ # The usage of `self` is only needed when:
9
9
  #
10
10
  # * Sending a message to same object with zero arguments in
11
11
  # presence of a method name clash with an argument or a local
12
12
  # variable.
13
13
  #
14
- # Note, with using explicit self you can only send messages
15
- # with public or protected scope, you cannot send private
16
- # messages this way.
14
+ # * Calling an attribute writer to prevent an local variable assignment.
17
15
  #
18
- # Example:
16
+ # Note, with using explicit self you can only send messages with public or
17
+ # protected scope, you cannot send private messages this way.
19
18
  #
20
- # def bar
21
- # :baz
19
+ # Note we allow uses of `self` with operators because it would be awkward
20
+ # otherwise.
21
+ #
22
+ # @example
23
+ #
24
+ # # bad
25
+ # def foo(bar)
26
+ # self.baz
22
27
  # end
23
28
  #
29
+ # # good
24
30
  # def foo(bar)
25
- # self.bar # resolves name clash with argument
31
+ # self.bar # Resolves name clash with the argument.
26
32
  # end
27
33
  #
28
- # def foo2
34
+ # def foo
29
35
  # bar = 1
30
- # self.bar # resolves name clash with local variable
36
+ # self.bar # Resolves name clash with the local variable.
31
37
  # end
32
38
  #
33
- # * Calling an attribute writer to prevent an local variable assignment
34
- #
35
- # attr_writer :bar
36
- #
37
39
  # def foo
38
- # self.bar= 1 # Make sure above attr writer is called
40
+ # %w[x y z].select do |bar|
41
+ # self.bar == bar # Resolves name clash with argument of the block.
42
+ # end
39
43
  # end
40
- #
41
- # Special cases:
42
- #
43
- # We allow uses of `self` with operators because it would be awkward
44
- # otherwise.
45
44
  class RedundantSelf < Cop
46
45
  MSG = 'Redundant `self` detected.'.freeze
47
46
 
47
+ def self.autocorrect_incompatible_with
48
+ [ColonMethodCall]
49
+ end
50
+
48
51
  def initialize(config = nil, options = nil)
49
52
  super
50
53
  @allowed_send_nodes = []
@@ -57,7 +60,6 @@ module RuboCop
57
60
  lhs, _rhs = *node
58
61
  allow_self(lhs)
59
62
  end
60
-
61
63
  alias on_and_asgn on_or_asgn
62
64
 
63
65
  def on_op_asgn(node)
@@ -70,7 +72,6 @@ module RuboCop
70
72
  def on_def(node)
71
73
  add_scope(node)
72
74
  end
73
-
74
75
  alias on_defs on_def
75
76
 
76
77
  def on_args(node)
@@ -90,10 +91,13 @@ module RuboCop
90
91
  return unless node.self_receiver? && regular_method_call?(node)
91
92
  return if node.parent && node.parent.mlhs_type?
92
93
 
93
- return if @allowed_send_nodes.include?(node) ||
94
- @local_variables_scopes[node].include?(node.method_name)
94
+ return if allowed_send_node?(node)
95
95
 
96
- add_offense(node, :expression)
96
+ add_offense(node)
97
+ end
98
+
99
+ def on_block(node)
100
+ add_scope(node, @local_variables_scopes[node])
97
101
  end
98
102
 
99
103
  def autocorrect(node)
@@ -105,13 +109,17 @@ module RuboCop
105
109
 
106
110
  private
107
111
 
108
- def add_scope(node)
109
- local_variables = []
112
+ def add_scope(node, local_variables = [])
110
113
  node.descendants.each do |child_node|
111
114
  @local_variables_scopes[child_node] = local_variables
112
115
  end
113
116
  end
114
117
 
118
+ def allowed_send_node?(node)
119
+ @allowed_send_nodes.include?(node) ||
120
+ @local_variables_scopes[node].include?(node.method_name)
121
+ end
122
+
115
123
  def regular_method_call?(node)
116
124
  !(operator?(node.method_name) ||
117
125
  keyword?(node.method_name) ||
@@ -5,28 +5,81 @@ module RuboCop
5
5
  module Style
6
6
  # This cop enforces using // or %r around regular expressions.
7
7
  #
8
- # @example
9
- # # Good if EnforcedStyle is slashes or mixed, bad if percent_r.
8
+ # @example EnforcedStyle: slashes (default)
9
+ # # bad
10
+ # snake_case = %r{^[\dA-Z_]+$}
11
+ #
12
+ # # bad
13
+ # regex = %r{
14
+ # foo
15
+ # (bar)
16
+ # (baz)
17
+ # }x
18
+ #
19
+ # # good
20
+ # snake_case = /^[\dA-Z_]+$/
21
+ #
22
+ # # good
23
+ # regex = /
24
+ # foo
25
+ # (bar)
26
+ # (baz)
27
+ # /x
28
+ #
29
+ # @example EnforcedStyle: percent_r
30
+ # # bad
10
31
  # snake_case = /^[\dA-Z_]+$/
11
32
  #
12
- # # Good if EnforcedStyle is percent_r, bad if slashes or mixed.
33
+ # # bad
34
+ # regex = /
35
+ # foo
36
+ # (bar)
37
+ # (baz)
38
+ # /x
39
+ #
40
+ # # good
13
41
  # snake_case = %r{^[\dA-Z_]+$}
14
42
  #
15
- # # Good if EnforcedStyle is slashes, bad if percent_r or mixed.
43
+ # # good
44
+ # regex = %r{
45
+ # foo
46
+ # (bar)
47
+ # (baz)
48
+ # }x
49
+ #
50
+ # @example EnforcedStyle: mixed
51
+ # # bad
52
+ # snake_case = %r{^[\dA-Z_]+$}
53
+ #
54
+ # # bad
16
55
  # regex = /
17
56
  # foo
18
57
  # (bar)
19
58
  # (baz)
20
59
  # /x
21
60
  #
22
- # # Good if EnforcedStyle is percent_r or mixed, bad if slashes.
61
+ # # good
62
+ # snake_case = /^[\dA-Z_]+$/
63
+ #
64
+ # # good
23
65
  # regex = %r{
24
66
  # foo
25
67
  # (bar)
26
68
  # (baz)
27
69
  # }x
28
70
  #
29
- # # Bad unless AllowInnerSlashes is true.
71
+ # @example AllowInnerSlashes: false (default)
72
+ # # If `false`, the cop will always recommend using `%r` if one or more
73
+ # # slashes are found in the regexp string.
74
+ #
75
+ # # bad
76
+ # x =~ /home\//
77
+ #
78
+ # # good
79
+ # x =~ %r{home/}
80
+ #
81
+ # @example AllowInnerSlashes: true
82
+ # # good
30
83
  # x =~ /home\//
31
84
  class RegexpLiteral < Cop
32
85
  include ConfigurableEnforcedStyle
@@ -42,31 +95,54 @@ module RuboCop
42
95
  end
43
96
  end
44
97
 
98
+ def autocorrect(node)
99
+ return if contains_slash?(node)
100
+
101
+ replacement = if slash_literal?(node)
102
+ ['%r', ''].zip(preferred_delimiters).map(&:join)
103
+ else
104
+ %w[/ /]
105
+ end
106
+
107
+ lambda do |corrector|
108
+ corrector.replace(node.loc.begin, replacement.first)
109
+ corrector.replace(node.loc.end, replacement.last)
110
+ end
111
+ end
112
+
45
113
  private
46
114
 
47
115
  def check_slash_literal(node)
48
116
  return if allowed_slash_literal?(node)
49
117
 
50
- add_offense(node, :expression, MSG_USE_PERCENT_R)
118
+ add_offense(node, message: MSG_USE_PERCENT_R)
51
119
  end
52
120
 
53
121
  def check_percent_r_literal(node)
54
122
  return if allowed_percent_r_literal?(node)
55
123
 
56
- add_offense(node, :expression, MSG_USE_SLASHES)
124
+ add_offense(node, message: MSG_USE_SLASHES)
57
125
  end
58
126
 
59
127
  def allowed_slash_literal?(node)
60
128
  style == :slashes && !contains_disallowed_slash?(node) ||
61
- style == :mixed && node.single_line? &&
62
- !contains_disallowed_slash?(node)
129
+ allowed_mixed_slash?(node)
130
+ end
131
+
132
+ def allowed_mixed_slash?(node)
133
+ style == :mixed && node.single_line? &&
134
+ !contains_disallowed_slash?(node)
63
135
  end
64
136
 
65
137
  def allowed_percent_r_literal?(node)
66
138
  style == :slashes && contains_disallowed_slash?(node) ||
67
139
  style == :percent_r ||
68
- style == :mixed && node.multiline? ||
69
- style == :mixed && contains_disallowed_slash?(node)
140
+ allowed_mixed_percent_r?(node)
141
+ end
142
+
143
+ def allowed_mixed_percent_r?(node)
144
+ style == :mixed && node.multiline? ||
145
+ contains_disallowed_slash?(node)
70
146
  end
71
147
 
72
148
  def contains_disallowed_slash?(node)
@@ -93,21 +169,6 @@ module RuboCop
93
169
  config.for_cop('Style/PercentLiteralDelimiters') \
94
170
  ['PreferredDelimiters']['%r'].split(//)
95
171
  end
96
-
97
- def autocorrect(node)
98
- return if contains_slash?(node)
99
-
100
- replacement = if slash_literal?(node)
101
- ['%r', ''].zip(preferred_delimiters).map(&:join)
102
- else
103
- %w[/ /]
104
- end
105
-
106
- lambda do |corrector|
107
- corrector.replace(node.loc.begin, replacement.first)
108
- corrector.replace(node.loc.end, replacement.last)
109
- end
110
- end
111
172
  end
112
173
  end
113
174
  end