rubocop 0.49.1 → 0.50.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 (292) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +160 -99
  5. data/config/disabled.yml +4 -5
  6. data/config/enabled.yml +149 -47
  7. data/lib/rubocop.rb +41 -14
  8. data/lib/rubocop/ast/builder.rb +4 -1
  9. data/lib/rubocop/ast/node.rb +36 -42
  10. data/lib/rubocop/ast/node/args_node.rb +1 -13
  11. data/lib/rubocop/ast/node/array_node.rb +9 -0
  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/collection_node.rb +15 -0
  17. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  18. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  19. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  20. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  21. data/lib/rubocop/ast/node/send_node.rb +1 -154
  22. data/lib/rubocop/ast/node/super_node.rb +3 -24
  23. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  24. data/lib/rubocop/ast/traversal.rb +6 -6
  25. data/lib/rubocop/cli.rb +7 -3
  26. data/lib/rubocop/config.rb +45 -8
  27. data/lib/rubocop/config_loader.rb +7 -5
  28. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +64 -0
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +12 -12
  31. data/lib/rubocop/cop/commissioner.rb +8 -2
  32. data/lib/rubocop/cop/cop.rb +3 -1
  33. data/lib/rubocop/cop/generator.rb +94 -21
  34. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  35. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +14 -3
  36. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +43 -0
  37. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +46 -0
  38. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +49 -0
  39. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
  40. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +2 -3
  41. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  42. data/lib/rubocop/cop/layout/align_hash.rb +2 -2
  43. data/lib/rubocop/cop/layout/align_parameters.rb +5 -11
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/dot_position.rb +9 -0
  47. data/lib/rubocop/cop/layout/else_alignment.rb +30 -13
  48. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +4 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +20 -4
  50. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -3
  51. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -3
  52. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +5 -2
  54. data/lib/rubocop/cop/layout/indent_heredoc.rb +19 -24
  55. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  56. data/lib/rubocop/cop/layout/indentation_width.rb +12 -8
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -18
  58. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -17
  59. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +3 -3
  60. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  61. data/lib/rubocop/cop/layout/space_after_colon.rb +7 -0
  62. data/lib/rubocop/cop/layout/space_after_comma.rb +10 -0
  63. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -3
  64. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +13 -4
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -5
  67. data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -5
  68. data/lib/rubocop/cop/layout/space_before_comment.rb +7 -0
  69. data/lib/rubocop/cop/layout/space_before_semicolon.rb +7 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
  71. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  73. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +8 -4
  74. data/lib/rubocop/cop/layout/tab.rb +1 -1
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +4 -2
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
  77. data/lib/rubocop/cop/lint/block_alignment.rb +15 -6
  78. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  79. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  80. data/lib/rubocop/cop/lint/debugger.rb +16 -9
  81. data/lib/rubocop/cop/lint/def_end_alignment.rb +4 -4
  82. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  83. data/lib/rubocop/cop/lint/duplicate_methods.rb +73 -5
  84. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  85. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  86. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  87. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  88. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  89. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  90. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  91. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  92. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +35 -40
  93. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  94. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +18 -13
  95. data/lib/rubocop/cop/lint/inherit_exception.rb +8 -7
  96. data/lib/rubocop/cop/lint/interpolation_check.rb +36 -0
  97. data/lib/rubocop/cop/lint/literal_in_condition.rb +3 -3
  98. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  99. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  100. data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -7
  101. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  102. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -12
  103. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  104. data/lib/rubocop/cop/lint/rand_one.rb +7 -1
  105. data/lib/rubocop/cop/lint/redundant_with_index.rb +77 -0
  106. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  107. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/rescue_type.rb +13 -6
  109. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +38 -0
  110. data/lib/rubocop/cop/lint/return_in_void_context.rb +63 -0
  111. data/lib/rubocop/cop/lint/script_permission.rb +6 -0
  112. data/lib/rubocop/cop/lint/syntax.rb +17 -20
  113. data/lib/rubocop/cop/lint/unified_integer.rb +3 -2
  114. data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
  115. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
  116. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  117. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  118. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  119. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -8
  120. data/lib/rubocop/cop/lint/useless_setter_call.rb +10 -11
  121. data/lib/rubocop/cop/lint/void.rb +29 -23
  122. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  123. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  124. data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
  125. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
  126. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -2
  127. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  128. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  129. data/lib/rubocop/cop/mixin/method_complexity.rb +9 -6
  130. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +68 -31
  131. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +18 -0
  132. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -1
  133. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  134. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  135. data/lib/rubocop/cop/{style → naming}/accessor_method_name.rb +11 -12
  136. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +1 -1
  137. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +2 -2
  138. data/lib/rubocop/cop/{style → naming}/class_and_module_camel_case.rb +1 -1
  139. data/lib/rubocop/cop/{style → naming}/constant_name.rb +1 -1
  140. data/lib/rubocop/cop/{style → naming}/file_name.rb +8 -4
  141. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +68 -0
  142. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +58 -0
  143. data/lib/rubocop/cop/{style → naming}/method_name.rb +1 -1
  144. data/lib/rubocop/cop/{style → naming}/predicate_name.rb +6 -7
  145. data/lib/rubocop/cop/{style → naming}/variable_name.rb +11 -15
  146. data/lib/rubocop/cop/{style → naming}/variable_number.rb +1 -1
  147. data/lib/rubocop/cop/performance/caller.rb +39 -11
  148. data/lib/rubocop/cop/performance/casecmp.rb +4 -4
  149. data/lib/rubocop/cop/performance/compare_with_block.rb +4 -4
  150. data/lib/rubocop/cop/performance/double_start_end_with.rb +4 -4
  151. data/lib/rubocop/cop/performance/end_with.rb +3 -3
  152. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  153. data/lib/rubocop/cop/performance/hash_each_methods.rb +66 -25
  154. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
  155. data/lib/rubocop/cop/performance/range_include.rb +2 -2
  156. data/lib/rubocop/cop/performance/redundant_block_call.rb +6 -6
  157. data/lib/rubocop/cop/performance/redundant_match.rb +5 -5
  158. data/lib/rubocop/cop/performance/redundant_merge.rb +39 -23
  159. data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -2
  160. data/lib/rubocop/cop/performance/regexp_match.rb +13 -5
  161. data/lib/rubocop/cop/performance/size.rb +1 -1
  162. data/lib/rubocop/cop/performance/start_with.rb +3 -3
  163. data/lib/rubocop/cop/performance/times_map.rb +23 -12
  164. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  165. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  166. data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
  167. data/lib/rubocop/cop/rails/delegate.rb +36 -7
  168. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
  169. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
  170. data/lib/rubocop/cop/rails/file_path.rb +3 -4
  171. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  172. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +48 -0
  173. data/lib/rubocop/cop/rails/http_positional_arguments.rb +5 -5
  174. data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
  175. data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
  176. data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
  177. data/lib/rubocop/cop/rails/request_referer.rb +2 -2
  178. data/lib/rubocop/cop/rails/reversible_migration.rb +12 -12
  179. data/lib/rubocop/cop/rails/save_bang.rb +8 -6
  180. data/lib/rubocop/cop/rails/scope_args.rb +1 -1
  181. data/lib/rubocop/cop/security/eval.rb +2 -2
  182. data/lib/rubocop/cop/security/json_load.rb +2 -2
  183. data/lib/rubocop/cop/security/marshal_load.rb +2 -2
  184. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  185. data/lib/rubocop/cop/style/alias.rb +44 -20
  186. data/lib/rubocop/cop/style/and_or.rb +48 -34
  187. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
  188. data/lib/rubocop/cop/style/block_comments.rb +3 -1
  189. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  190. data/lib/rubocop/cop/style/command_literal.rb +20 -9
  191. data/lib/rubocop/cop/style/conditional_assignment.rb +30 -28
  192. data/lib/rubocop/cop/style/copyright.rb +10 -10
  193. data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -5
  194. data/lib/rubocop/cop/style/dir.rb +52 -0
  195. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  196. data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
  197. data/lib/rubocop/cop/style/empty_else.rb +3 -2
  198. data/lib/rubocop/cop/style/empty_literal.rb +1 -2
  199. data/lib/rubocop/cop/style/empty_method.rb +27 -17
  200. data/lib/rubocop/cop/style/flip_flop.rb +2 -2
  201. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  202. data/lib/rubocop/cop/style/guard_clause.rb +4 -2
  203. data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
  204. data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -1
  205. data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -1
  206. data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
  207. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  208. data/lib/rubocop/cop/style/inverse_methods.rb +20 -8
  209. data/lib/rubocop/cop/style/lambda.rb +19 -9
  210. data/lib/rubocop/cop/style/lambda_call.rb +22 -1
  211. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -20
  212. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  213. data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -26
  214. data/lib/rubocop/cop/style/method_missing.rb +5 -18
  215. data/lib/rubocop/cop/style/min_max.rb +67 -0
  216. data/lib/rubocop/cop/style/missing_else.rb +16 -3
  217. data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
  218. data/lib/rubocop/cop/style/module_function.rb +8 -4
  219. data/lib/rubocop/cop/style/multiline_if_modifier.rb +5 -1
  220. data/lib/rubocop/cop/style/multiline_memoization.rb +25 -3
  221. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  222. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  223. data/lib/rubocop/cop/style/mutable_constant.rb +2 -6
  224. data/lib/rubocop/cop/style/negated_if.rb +8 -4
  225. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +8 -8
  226. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  227. data/lib/rubocop/cop/style/non_nil_check.rb +14 -14
  228. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -2
  229. data/lib/rubocop/cop/style/numeric_literals.rb +2 -2
  230. data/lib/rubocop/cop/style/numeric_predicate.rb +8 -4
  231. data/lib/rubocop/cop/style/one_line_conditional.rb +8 -3
  232. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  233. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  234. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  235. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  236. data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -11
  237. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  238. data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
  239. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  240. data/lib/rubocop/cop/style/proc.rb +1 -1
  241. data/lib/rubocop/cop/style/raise_args.rb +16 -17
  242. data/lib/rubocop/cop/style/redundant_begin.rb +6 -5
  243. data/lib/rubocop/cop/style/redundant_conditional.rb +95 -0
  244. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  245. data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -11
  246. data/lib/rubocop/cop/style/redundant_return.rb +23 -11
  247. data/lib/rubocop/cop/style/redundant_self.rb +18 -9
  248. data/lib/rubocop/cop/style/regexp_literal.rb +12 -4
  249. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  250. data/lib/rubocop/cop/style/return_nil.rb +98 -0
  251. data/lib/rubocop/cop/style/safe_navigation.rb +80 -43
  252. data/lib/rubocop/cop/style/single_line_block_params.rb +14 -13
  253. data/lib/rubocop/cop/style/single_line_methods.rb +9 -13
  254. data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
  255. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -39
  256. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +22 -1
  257. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  258. data/lib/rubocop/cop/style/symbol_array.rb +5 -25
  259. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  260. data/lib/rubocop/cop/style/symbol_proc.rb +3 -18
  261. data/lib/rubocop/cop/style/ternary_parentheses.rb +14 -10
  262. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +28 -9
  263. data/lib/rubocop/cop/style/trivial_accessors.rb +39 -56
  264. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  265. data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -1
  266. data/lib/rubocop/cop/style/unneeded_interpolation.rb +1 -1
  267. data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
  268. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -3
  269. data/lib/rubocop/cop/style/word_array.rb +7 -24
  270. data/lib/rubocop/cop/style/yoda_condition.rb +49 -14
  271. data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -18
  272. data/lib/rubocop/cop/team.rb +16 -8
  273. data/lib/rubocop/cop/util.rb +11 -0
  274. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  275. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  276. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  277. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  278. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  279. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  280. data/lib/rubocop/node_pattern.rb +44 -26
  281. data/lib/rubocop/options.rb +1 -0
  282. data/lib/rubocop/processed_source.rb +3 -1
  283. data/lib/rubocop/remote_config.rb +5 -1
  284. data/lib/rubocop/result_cache.rb +1 -0
  285. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  286. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  287. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  288. data/lib/rubocop/string_util.rb +2 -0
  289. data/lib/rubocop/version.rb +1 -1
  290. metadata +51 -18
  291. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  292. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
@@ -9,7 +9,7 @@ module RuboCop
9
9
  MSG = 'Avoid the use of Perl-style backrefs.'.freeze
10
10
 
11
11
  def on_nth_ref(node)
12
- add_offense(node, :expression)
12
+ add_offense(node)
13
13
  end
14
14
 
15
15
  def autocorrect(node)
@@ -13,7 +13,7 @@ module RuboCop
13
13
 
14
14
  def on_block(node)
15
15
  proc_new?(node) do |block_method|
16
- add_offense(block_method, :expression)
16
+ add_offense(block_method)
17
17
  end
18
18
  end
19
19
 
@@ -60,38 +60,37 @@ module RuboCop
60
60
  private
61
61
 
62
62
  def autocorrect(node)
63
- new_exception = if style == :compact
64
- correction_exploded_to_compact(node.arguments)
65
- else
66
- correction_compact_to_exploded(node.first_argument)
67
- end
68
- replacement = "#{node.method_name} #{new_exception}"
63
+ replacement = if style == :compact
64
+ correction_exploded_to_compact(node)
65
+ else
66
+ correction_compact_to_exploded(node)
67
+ end
69
68
 
70
69
  ->(corrector) { corrector.replace(node.source_range, replacement) }
71
70
  end
72
71
 
73
72
  def correction_compact_to_exploded(node)
74
- exception_node, _new, message_node = *node
73
+ exception_node, _new, message_node = *node.first_argument
75
74
 
76
75
  message = message_node && message_node.source
77
76
 
78
77
  correction = exception_node.const_name.to_s
79
78
  correction = "#{correction}, #{message}" if message
80
79
 
81
- correction
80
+ "#{node.method_name} #{correction}"
82
81
  end
83
82
 
84
83
  def correction_exploded_to_compact(node)
85
- exception_node, *message_nodes = *node
84
+ exception_node, *message_nodes = *node.arguments
85
+ return node.source if message_nodes.size > 1
86
86
 
87
- messages = message_nodes.map(&:source).join(', ')
88
-
89
- "#{exception_node.const_name}.new(#{messages})"
87
+ argument = message_nodes.first.source
88
+ "#{node.method_name} #{exception_node.const_name}.new(#{argument})"
90
89
  end
91
90
 
92
91
  def check_compact(node)
93
92
  if node.arguments.size > 1
94
- add_offense(node, :expression, message(node.method_name)) do
93
+ add_offense(node) do
95
94
  opposite_style_detected
96
95
  end
97
96
  else
@@ -108,7 +107,7 @@ module RuboCop
108
107
 
109
108
  return if acceptable_exploded_args?(first_arg.arguments)
110
109
 
111
- add_offense(node, :expression, message(node.method_name)) do
110
+ add_offense(node) do
112
111
  opposite_style_detected
113
112
  end
114
113
  end
@@ -127,11 +126,11 @@ module RuboCop
127
126
  arg.hash_type? || arg.splat_type?
128
127
  end
129
128
 
130
- def message(method)
129
+ def message(node)
131
130
  if style == :compact
132
- format(COMPACT_MSG, method)
131
+ format(COMPACT_MSG, node.method_name)
133
132
  else
134
- format(EXPLODED_MSG, method)
133
+ format(EXPLODED_MSG, node.method_name)
135
134
  end
136
135
  end
137
136
  end
@@ -25,15 +25,16 @@ 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
+ return unless node.body && node.body.kwbegin_type?
34
32
 
35
- add_offense(body, :begin)
33
+ add_offense(node.body, :begin)
36
34
  end
35
+ alias on_defs on_def
36
+
37
+ private
37
38
 
38
39
  def autocorrect(node)
39
40
  lambda do |corrector|
@@ -0,0 +1,95 @@
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 by `%s`.'.freeze
33
+
34
+ def on_if(node)
35
+ return unless offense?(node)
36
+
37
+ add_offense(node)
38
+ end
39
+
40
+ private
41
+
42
+ def message(node)
43
+ replacement = replacement_condition(node)
44
+ msg = node.elsif? ? "\n#{replacement}" : replacement
45
+
46
+ format(MSG, msg)
47
+ end
48
+
49
+ def_node_matcher :redundant_condition?, <<-RUBY
50
+ (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) true false)
51
+ RUBY
52
+
53
+ def_node_matcher :redundant_condition_inverted?, <<-RUBY
54
+ (if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) false true)
55
+ RUBY
56
+
57
+ def offense?(node)
58
+ return if node.modifier_form?
59
+ redundant_condition?(node) || redundant_condition_inverted?(node)
60
+ end
61
+
62
+ def autocorrect(node)
63
+ lambda do |corrector|
64
+ corrector.replace(node.loc.expression, replacement_condition(node))
65
+ end
66
+ end
67
+
68
+ def replacement_condition(node)
69
+ condition = node.condition.source
70
+ expression = invert_expression?(node) ? "!(#{condition})" : condition
71
+
72
+ node.elsif? ? indented_else_node(expression, node) : expression
73
+ end
74
+
75
+ def invert_expression?(node)
76
+ (
77
+ (node.if? || node.elsif? || node.ternary?) &&
78
+ redundant_condition_inverted?(node)
79
+ ) || (
80
+ node.unless? &&
81
+ redundant_condition?(node)
82
+ )
83
+ end
84
+
85
+ def indented_else_node(expression, node)
86
+ "else\n#{indentation(node)}#{expression}"
87
+ end
88
+
89
+ def configured_indentation_width
90
+ super || 2
91
+ end
92
+ end
93
+ end
94
+ end
95
+ 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
 
@@ -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,9 +21,15 @@ 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
26
+
27
+ def on_def(node)
28
+ return unless node.body
29
+
30
+ check_branch(node.body)
31
+ end
32
+ alias on_defs on_def
27
33
 
28
34
  private
29
35
 
@@ -64,18 +70,12 @@ module RuboCop
64
70
  !args.first.begin_type? || !args.first.children.empty?
65
71
  end
66
72
 
67
- def on_method_def(_node, _method_name, _args, body)
68
- return unless body
69
-
70
- check_branch(body)
71
- end
72
-
73
73
  def check_branch(node)
74
74
  case node.type
75
75
  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)
76
+ when :case then check_case_node(node)
77
+ when :if then check_if_node(node)
78
+ when :begin then check_begin_node(node)
79
79
  end
80
80
  end
81
81
 
@@ -115,6 +115,18 @@ module RuboCop
115
115
 
116
116
  check_return_node(last_expr)
117
117
  end
118
+
119
+ def allow_multiple_return_values?
120
+ cop_config['AllowMultipleReturnValues'] || false
121
+ end
122
+
123
+ def message(node)
124
+ if !allow_multiple_return_values? && node.children.size > 1
125
+ "#{MSG} #{MULTI_RETURN_MSG}"
126
+ else
127
+ MSG
128
+ end
129
+ end
118
130
  end
119
131
  end
120
132
  end
@@ -30,6 +30,10 @@ module RuboCop
30
30
  # self.bar # resolves name clash with local variable
31
31
  # end
32
32
  #
33
+ # %w[x y z].select do |bar|
34
+ # self.bar == bar # resolves name clash with argument of a block
35
+ # end
36
+ #
33
37
  # * Calling an attribute writer to prevent an local variable assignment
34
38
  #
35
39
  # attr_writer :bar
@@ -57,7 +61,6 @@ module RuboCop
57
61
  lhs, _rhs = *node
58
62
  allow_self(lhs)
59
63
  end
60
-
61
64
  alias on_and_asgn on_or_asgn
62
65
 
63
66
  def on_op_asgn(node)
@@ -70,7 +73,6 @@ module RuboCop
70
73
  def on_def(node)
71
74
  add_scope(node)
72
75
  end
73
-
74
76
  alias on_defs on_def
75
77
 
76
78
  def on_args(node)
@@ -90,12 +92,17 @@ module RuboCop
90
92
  return unless node.self_receiver? && regular_method_call?(node)
91
93
  return if node.parent && node.parent.mlhs_type?
92
94
 
93
- return if @allowed_send_nodes.include?(node) ||
94
- @local_variables_scopes[node].include?(node.method_name)
95
+ return if allowed_send_node?(node)
96
+
97
+ add_offense(node)
98
+ end
95
99
 
96
- add_offense(node, :expression)
100
+ def on_block(node)
101
+ add_scope(node, @local_variables_scopes[node])
97
102
  end
98
103
 
104
+ private
105
+
99
106
  def autocorrect(node)
100
107
  lambda do |corrector|
101
108
  corrector.remove(node.receiver.source_range)
@@ -103,15 +110,17 @@ module RuboCop
103
110
  end
104
111
  end
105
112
 
106
- private
107
-
108
- def add_scope(node)
109
- local_variables = []
113
+ def add_scope(node, local_variables = [])
110
114
  node.descendants.each do |child_node|
111
115
  @local_variables_scopes[child_node] = local_variables
112
116
  end
113
117
  end
114
118
 
119
+ def allowed_send_node?(node)
120
+ @allowed_send_nodes.include?(node) ||
121
+ @local_variables_scopes[node].include?(node.method_name)
122
+ end
123
+
115
124
  def regular_method_call?(node)
116
125
  !(operator?(node.method_name) ||
117
126
  keyword?(node.method_name) ||
@@ -58,15 +58,23 @@ module RuboCop
58
58
 
59
59
  def allowed_slash_literal?(node)
60
60
  style == :slashes && !contains_disallowed_slash?(node) ||
61
- style == :mixed && node.single_line? &&
62
- !contains_disallowed_slash?(node)
61
+ allowed_mixed_slash?(node)
62
+ end
63
+
64
+ def allowed_mixed_slash?(node)
65
+ style == :mixed && node.single_line? &&
66
+ !contains_disallowed_slash?(node)
63
67
  end
64
68
 
65
69
  def allowed_percent_r_literal?(node)
66
70
  style == :slashes && contains_disallowed_slash?(node) ||
67
71
  style == :percent_r ||
68
- style == :mixed && node.multiline? ||
69
- style == :mixed && contains_disallowed_slash?(node)
72
+ allowed_mixed_percent_r?(node)
73
+ end
74
+
75
+ def allowed_mixed_percent_r?(node)
76
+ style == :mixed && node.multiline? ||
77
+ contains_disallowed_slash?(node)
70
78
  end
71
79
 
72
80
  def contains_disallowed_slash?(node)
@@ -12,7 +12,7 @@ module RuboCop
12
12
 
13
13
  def on_resbody(node)
14
14
  return unless rescue_modifier?(node)
15
- add_offense(node.parent, :expression)
15
+ add_offense(node.parent)
16
16
  end
17
17
 
18
18
  def autocorrect(node)
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop enforces consistency between 'return nil' and 'return'.
7
+ #
8
+ # Supported styles are: return, return_nil.
9
+ #
10
+ # @example
11
+ #
12
+ # # EnforcedStyle: return (default)
13
+ #
14
+ # # bad
15
+ # def foo(arg)
16
+ # return nil if arg
17
+ # end
18
+ #
19
+ # # good
20
+ # def foo(arg)
21
+ # return if arg
22
+ # end
23
+ #
24
+ # # EnforcedStyle: return_nil
25
+ #
26
+ # # bad
27
+ # def foo(arg)
28
+ # return if arg
29
+ # end
30
+ #
31
+ # # good
32
+ # def foo(arg)
33
+ # return nil if arg
34
+ # end
35
+ class ReturnNil < Cop
36
+ include ConfigurableEnforcedStyle
37
+
38
+ RETURN_MSG = 'Use `return` instead of `return nil`.'.freeze
39
+ RETURN_NIL_MSG = 'Use `return nil` instead of `return`.'.freeze
40
+
41
+ def_node_matcher :return_node?, '(return)'
42
+ # TODO: fix (return nil) on the NodePattern class
43
+ # def_node_matcher :return_nil_node?, '(return nil)'
44
+
45
+ def on_return(node)
46
+ # Check Lint/NonLocalExitFromIterator first before this cop
47
+ node.each_ancestor(:block, :def, :defs) do |n|
48
+ break if scoped_node?(n)
49
+
50
+ send_node, args_node, _body_node = *n
51
+
52
+ # if a proc is passed to `Module#define_method` or
53
+ # `Object#define_singleton_method`, `return` will not cause a
54
+ # non-local exit error
55
+ break if define_method?(send_node)
56
+
57
+ next if args_node.children.empty?
58
+
59
+ return nil if chained_send?(send_node)
60
+ end
61
+
62
+ add_offense(node) unless correct_style?(node)
63
+ end
64
+
65
+ private
66
+
67
+ def autocorrect(node)
68
+ lambda do |corrector|
69
+ corrected = style == :return ? 'return' : 'return nil'
70
+ corrector.replace(node.source_range, corrected)
71
+ end
72
+ end
73
+
74
+ def message(_node)
75
+ style == :return ? RETURN_MSG : RETURN_NIL_MSG
76
+ end
77
+
78
+ def correct_style?(node)
79
+ style == :return && !return_nil_node?(node) ||
80
+ style == :return_nil && !return_node?(node)
81
+ end
82
+
83
+ def return_nil_node?(node)
84
+ !node.children.empty? && node.children.first.nil_type?
85
+ end
86
+
87
+ def scoped_node?(node)
88
+ node.def_type? || node.defs_type? || node.lambda?
89
+ end
90
+
91
+ def_node_matcher :chained_send?, '(send !nil ...)'
92
+ def_node_matcher :define_method?, <<-PATTERN
93
+ (send _ {:define_method :define_singleton_method} _)
94
+ PATTERN
95
+ end
96
+ end
97
+ end
98
+ end