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
@@ -46,22 +46,12 @@ module RuboCop
46
46
  return if ignored_method?(node)
47
47
  return unless node.arguments? && !node.parenthesized?
48
48
 
49
- add_offense(node, :selector)
49
+ add_offense(node)
50
50
  end
51
+ alias on_super on_send
52
+ alias on_yield on_send
51
53
 
52
- def on_super(node)
53
- return if node.parenthesized?
54
-
55
- add_offense(node, :keyword)
56
- end
57
-
58
- def on_yield(node)
59
- args = node.children
60
- return if args.empty?
61
- return if parentheses?(node)
62
-
63
- add_offense(node, :keyword)
64
- end
54
+ private
65
55
 
66
56
  def autocorrect(node)
67
57
  lambda do |corrector|
@@ -70,8 +60,6 @@ module RuboCop
70
60
  end
71
61
  end
72
62
 
73
- private
74
-
75
63
  def ignored_method?(node)
76
64
  node.operator_method? || node.setter_method? ||
77
65
  ignore_macros? && node.macro? ||
@@ -86,10 +74,6 @@ module RuboCop
86
74
  cop_config['IgnoreMacros']
87
75
  end
88
76
 
89
- def parentheses?(node)
90
- node.loc.begin
91
- end
92
-
93
77
  def args_begin(node)
94
78
  loc = node.loc
95
79
  selector =
@@ -18,15 +18,15 @@ module RuboCop
18
18
  ASGN_NODES = %i[lvasgn masgn] + SHORTHAND_ASGN_NODES
19
19
 
20
20
  def on_send(node)
21
- return if node.camel_case_method?
21
+ return if ineligible_node?(node)
22
22
  return unless !node.arguments? && node.parenthesized?
23
23
  return if same_name_assignment?(node)
24
- return if node.implicit_call?
25
- return if node.keyword_not?
26
24
 
27
25
  add_offense(node, :begin)
28
26
  end
29
27
 
28
+ private
29
+
30
30
  def autocorrect(node)
31
31
  lambda do |corrector|
32
32
  corrector.remove(node.loc.begin)
@@ -34,7 +34,9 @@ module RuboCop
34
34
  end
35
35
  end
36
36
 
37
- private
37
+ def ineligible_node?(node)
38
+ node.camel_case_method? || node.implicit_call? || node.keyword_not?
39
+ end
38
40
 
39
41
  def same_name_assignment?(node)
40
42
  any_assignment?(node) do |asgn_node|
@@ -6,13 +6,18 @@ module RuboCop
6
6
  # This cops checks for parentheses around the arguments in method
7
7
  # definitions. Both instance and class/singleton methods are checked.
8
8
  class MethodDefParentheses < Cop
9
- include OnMethodDef
10
9
  include ConfigurableEnforcedStyle
11
10
 
12
- def on_method_def(node, _method_name, args, _body)
11
+ MSG_PRESENT = 'Use def without parentheses.'.freeze
12
+ MSG_MISSING = 'Use def with parentheses when there are ' \
13
+ 'parameters.'.freeze
14
+
15
+ def on_def(node)
16
+ args = node.arguments
17
+
13
18
  if require_parentheses?(args)
14
- if arguments_without_parentheses?(args)
15
- missing_parentheses(node, args)
19
+ if arguments_without_parentheses?(node)
20
+ missing_parentheses(node)
16
21
  else
17
22
  correct_style_detected
18
23
  end
@@ -22,6 +27,9 @@ module RuboCop
22
27
  correct_style_detected
23
28
  end
24
29
  end
30
+ alias on_defs on_def
31
+
32
+ private
25
33
 
26
34
  def autocorrect(node)
27
35
  lambda do |corrector|
@@ -30,7 +38,7 @@ module RuboCop
30
38
  corrector.replace(node.loc.begin, ' ')
31
39
  corrector.remove(node.loc.end)
32
40
  else
33
- args_expr = args_node(node).source_range
41
+ args_expr = node.arguments.source_range
34
42
  args_with_space = range_with_surrounding_space(args_expr, :left)
35
43
  just_space = range_between(args_with_space.begin_pos,
36
44
  args_expr.begin_pos)
@@ -40,43 +48,27 @@ module RuboCop
40
48
  end
41
49
  end
42
50
 
43
- private
44
-
45
51
  def require_parentheses?(args)
46
52
  style == :require_parentheses ||
47
53
  (style == :require_no_parentheses_except_multiline &&
48
54
  args.multiline?)
49
55
  end
50
56
 
51
- def arguments_without_parentheses?(args)
52
- arguments?(args) && !parentheses?(args)
57
+ def arguments_without_parentheses?(node)
58
+ node.arguments? && !parentheses?(node.arguments)
53
59
  end
54
60
 
55
- def missing_parentheses(node, args)
56
- add_offense(node, args.source_range,
57
- 'Use def with parentheses when there are parameters.') do
61
+ def missing_parentheses(node)
62
+ add_offense(node, node.arguments.source_range, MSG_MISSING) do
58
63
  unexpected_style_detected(:require_no_parentheses)
59
64
  end
60
65
  end
61
66
 
62
67
  def unwanted_parentheses(args)
63
- add_offense(args, :expression, 'Use def without parentheses.') do
68
+ add_offense(args, :expression, MSG_PRESENT) do
64
69
  unexpected_style_detected(:require_parentheses)
65
70
  end
66
71
  end
67
-
68
- def args_node(def_node)
69
- if def_node.def_type?
70
- _method_name, args, _body = *def_node
71
- else
72
- _scope, _method_name, args, _body = *def_node
73
- end
74
- args
75
- end
76
-
77
- def arguments?(args)
78
- !args.children.empty?
79
- end
80
72
  end
81
73
  end
82
74
  end
@@ -22,22 +22,21 @@ module RuboCop
22
22
  # super
23
23
  # end
24
24
  class MethodMissing < Cop
25
- include OnMethodDef
26
-
27
25
  MSG = 'When using `method_missing`, %s.'.freeze
28
26
 
29
- def on_method_def(node, method_name, _args, _body)
30
- return unless method_name == :method_missing
27
+ def on_def(node)
28
+ return unless node.method?(:method_missing)
31
29
 
32
30
  check(node)
33
31
  end
32
+ alias on_defs on_def
34
33
 
35
34
  private
36
35
 
37
36
  def check(node)
38
37
  return if calls_super?(node) && implements_respond_to_missing?(node)
39
38
 
40
- add_offense(node, :expression)
39
+ add_offense(node)
41
40
  end
42
41
 
43
42
  def message(node)
@@ -60,21 +59,9 @@ module RuboCop
60
59
 
61
60
  def implements_respond_to_missing?(node)
62
61
  node.parent.each_child_node(node.type).any? do |sibling|
63
- if node.def_type?
64
- respond_to_missing_def?(sibling)
65
- elsif node.defs_type?
66
- respond_to_missing_defs?(sibling)
67
- end
62
+ sibling.method?(:respond_to_missing?)
68
63
  end
69
64
  end
70
-
71
- def_node_matcher :respond_to_missing_def?, <<-PATTERN
72
- (def :respond_to_missing? (...) ...)
73
- PATTERN
74
-
75
- def_node_matcher :respond_to_missing_defs?, <<-PATTERN
76
- (defs (self) :respond_to_missing? (...) ...)
77
- PATTERN
78
65
  end
79
66
  end
80
67
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for potential uses of `Enumerable#minmax`.
7
+ #
8
+ # @example
9
+ #
10
+ # @bad
11
+ # bar = [foo.min, foo.max]
12
+ # return foo.min, foo.max
13
+ #
14
+ # @good
15
+ # bar = foo.minmax
16
+ # return foo.minmax
17
+ class MinMax < Cop
18
+ MSG = 'Use `%<receiver>s.minmax` instead of `%<offender>s`.'.freeze
19
+
20
+ def on_array(node)
21
+ min_max_candidate(node) do |receiver|
22
+ offender = offending_range(node)
23
+
24
+ add_offense(node, offender, message(offender, receiver))
25
+ end
26
+ end
27
+ alias on_return on_array
28
+
29
+ private
30
+
31
+ def_node_matcher :min_max_candidate, <<-PATTERN
32
+ ({array return} (send $_receiver :min) (send $_receiver :max))
33
+ PATTERN
34
+
35
+ def message(offender, receiver)
36
+ format(MSG, offender: offender.source,
37
+ receiver: receiver.source)
38
+ end
39
+
40
+ def autocorrect(node)
41
+ receiver = node.children.first.receiver
42
+
43
+ lambda do |corrector|
44
+ corrector.replace(offending_range(node),
45
+ "#{receiver.source}.minmax")
46
+ end
47
+ end
48
+
49
+ def offending_range(node)
50
+ case node.type
51
+ when :return
52
+ argument_range(node)
53
+ else
54
+ node.loc.expression
55
+ end
56
+ end
57
+
58
+ def argument_range(node)
59
+ first_argument_range = node.children.first.loc.expression
60
+ last_argument_range = node.children.last.loc.expression
61
+
62
+ first_argument_range.join(last_argument_range)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -57,13 +57,26 @@ module RuboCop
57
57
 
58
58
  if empty_else_cop_enabled?
59
59
  if empty_else_style == :empty
60
- add_offense(node, :expression, format(MSG_NIL, node.type))
60
+ add_offense(node)
61
61
  elsif empty_else_style == :nil
62
- add_offense(node, :expression, format(MSG_EMPTY, node.type))
62
+ add_offense(node)
63
63
  end
64
64
  end
65
65
 
66
- add_offense(node, :expression, format(MSG, node.type))
66
+ add_offense(node)
67
+ end
68
+
69
+ def message(node)
70
+ template = case empty_else_style
71
+ when :empty
72
+ MSG_NIL
73
+ when :nil
74
+ MSG_EMPTY
75
+ else
76
+ MSG
77
+ end
78
+
79
+ format(template, node.type)
67
80
  end
68
81
 
69
82
  def if_style?
@@ -74,13 +74,13 @@ module RuboCop
74
74
  def check_grouped_style(send_node)
75
75
  return if sibling_mixins(send_node).empty?
76
76
 
77
- add_offense(send_node, :expression)
77
+ add_offense(send_node)
78
78
  end
79
79
 
80
80
  def check_separated_style(send_node)
81
81
  return if send_node.arguments.one?
82
82
 
83
- add_offense(send_node, :expression)
83
+ add_offense(send_node)
84
84
  end
85
85
 
86
86
  def sibling_mixins(send_node)
@@ -39,8 +39,8 @@ module RuboCop
39
39
  _name, body = *node
40
40
  return unless body && body.begin_type?
41
41
 
42
- each_wrong_style(body.children) do |child_node, msg|
43
- add_offense(child_node, :expression, msg)
42
+ each_wrong_style(body.children) do |child_node|
43
+ add_offense(child_node)
44
44
  end
45
45
  end
46
46
 
@@ -50,14 +50,18 @@ module RuboCop
50
50
  case style
51
51
  when :module_function
52
52
  nodes.each do |node|
53
- yield node, MODULE_FUNCTION_MSG if extend_self_node?(node)
53
+ yield node if extend_self_node?(node)
54
54
  end
55
55
  when :extend_self
56
56
  nodes.each do |node|
57
- yield node, EXTEND_SELF_MSG if module_function_node?(node)
57
+ yield node if module_function_node?(node)
58
58
  end
59
59
  end
60
60
  end
61
+
62
+ def message(_node)
63
+ style == :module_function ? MODULE_FUNCTION_MSG : EXTEND_SELF_MSG
64
+ end
61
65
  end
62
66
  end
63
67
  end
@@ -24,7 +24,7 @@ module RuboCop
24
24
  def on_if(node)
25
25
  return unless node.modifier_form? && node.body.multiline?
26
26
 
27
- add_offense(node, :expression, format(MSG, node.keyword))
27
+ add_offense(node)
28
28
  end
29
29
 
30
30
  private
@@ -35,6 +35,10 @@ module RuboCop
35
35
  end
36
36
  end
37
37
 
38
+ def message(node)
39
+ format(MSG, node.keyword)
40
+ end
41
+
38
42
  def to_normal_if(node)
39
43
  indented_body = indented_body(node.body, node)
40
44
  condition = "#{node.keyword} #{node.condition.source}"
@@ -46,7 +46,7 @@ module RuboCop
46
46
 
47
47
  return unless bad_rhs?(rhs)
48
48
 
49
- add_offense(rhs, node.source_range, MSG)
49
+ add_offense(rhs, node.source_range)
50
50
  end
51
51
 
52
52
  private
@@ -54,8 +54,7 @@ module RuboCop
54
54
  def autocorrect(node)
55
55
  lambda do |corrector|
56
56
  if style == :keyword
57
- corrector.replace(node.loc.begin, 'begin')
58
- corrector.replace(node.loc.end, 'end')
57
+ keyword_autocorrect(node, corrector)
59
58
  else
60
59
  corrector.replace(node.loc.begin, '(')
61
60
  corrector.replace(node.loc.end, ')')
@@ -71,6 +70,29 @@ module RuboCop
71
70
  rhs.kwbegin_type?
72
71
  end
73
72
  end
73
+
74
+ def keyword_autocorrect(node, corrector)
75
+ node_buf = node.source_range.source_buffer
76
+ corrector.replace(node.loc.begin, keyword_begin_str(node, node_buf))
77
+ corrector.replace(node.loc.end, keyword_end_str(node, node_buf))
78
+ end
79
+
80
+ def keyword_begin_str(node, node_buf)
81
+ indent = config.for_cop('IndentationWidth')['Width'] || 2
82
+ if node_buf.source[node.loc.begin.end_pos] == "\n"
83
+ 'begin'
84
+ else
85
+ "begin\n" + (' ' * (node.loc.column + indent))
86
+ end
87
+ end
88
+
89
+ def keyword_end_str(node, node_buf)
90
+ if node_buf.source_line(node.loc.end.line) =~ /[^\s\)]/
91
+ "\n" + (' ' * node.loc.column) + 'end'
92
+ else
93
+ 'end'
94
+ end
95
+ end
74
96
  end
75
97
  end
76
98
  end
@@ -11,7 +11,7 @@ module RuboCop
11
11
  def on_if(node)
12
12
  return unless node.ternary? && node.multiline?
13
13
 
14
- add_offense(node, :expression)
14
+ add_offense(node)
15
15
  end
16
16
  end
17
17
  end
@@ -20,7 +20,7 @@ module RuboCop
20
20
 
21
21
  def on_if(node)
22
22
  return unless nested_variable_comparison?(node.condition)
23
- add_offense(node, :expression)
23
+ add_offense(node)
24
24
  end
25
25
 
26
26
  private