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
@@ -49,7 +49,6 @@ module RuboCop
49
49
  # end
50
50
  class DocumentationMethod < Cop
51
51
  include DocumentationComment
52
- include OnMethodDef
53
52
  include DefNode
54
53
 
55
54
  MSG = 'Missing method documentation comment.'.freeze
@@ -57,10 +56,7 @@ module RuboCop
57
56
  def on_def(node)
58
57
  check(node)
59
58
  end
60
-
61
- def on_method_def(node, *)
62
- check(node)
63
- end
59
+ alias on_defs on_def
64
60
 
65
61
  private
66
62
 
@@ -68,7 +64,7 @@ module RuboCop
68
64
  return if non_public?(node) && !require_for_non_public_methods?
69
65
  return if documentation_comment?(node)
70
66
 
71
- add_offense(node, :expression, MSG)
67
+ add_offense(node)
72
68
  end
73
69
 
74
70
  def require_for_non_public_methods?
@@ -42,7 +42,7 @@ module RuboCop
42
42
  def on_case(case_node)
43
43
  return if case_node.condition
44
44
 
45
- add_offense(case_node, :keyword, MSG)
45
+ add_offense(case_node, :keyword)
46
46
  end
47
47
 
48
48
  private
@@ -101,13 +101,13 @@ module RuboCop
101
101
  def empty_check(node)
102
102
  return unless node.else? && !node.else_branch
103
103
 
104
- add_offense(node, :else, MSG)
104
+ add_offense(node, :else)
105
105
  end
106
106
 
107
107
  def nil_check(node)
108
108
  return unless node.else_branch && node.else_branch.nil_type?
109
109
 
110
- add_offense(node, :else, MSG)
110
+ add_offense(node, :else)
111
111
  end
112
112
 
113
113
  def autocorrect(node)
@@ -121,6 +121,7 @@ module RuboCop
121
121
  end
122
122
 
123
123
  def base_if_node(node)
124
+ return node unless node.case_type? || node.elsif?
124
125
  node.each_ancestor(:if).find { |parent| parent.loc.end } || node
125
126
  end
126
127
 
@@ -21,8 +21,7 @@ module RuboCop
21
21
  '(block (send (const nil :Hash) :new) args _)'
22
22
 
23
23
  def on_send(node)
24
- add_offense(node, :expression, ARR_MSG) if offense_array_node?(node)
25
-
24
+ add_offense(node, :expression, ARR_MSG) if offense_array_node?(node)
26
25
  add_offense(node, :expression, HASH_MSG) if offense_hash_node?(node)
27
26
 
28
27
  str_node(node) do
@@ -15,14 +15,14 @@ module RuboCop
15
15
  #
16
16
  # # EnforcedStyle: compact (default)
17
17
  #
18
- # @bad
18
+ # # bad
19
19
  # def foo(bar)
20
20
  # end
21
21
  #
22
22
  # def self.foo(bar)
23
23
  # end
24
24
  #
25
- # @good
25
+ # # good
26
26
  # def foo(bar); end
27
27
  #
28
28
  # def foo(bar)
@@ -31,34 +31,35 @@ module RuboCop
31
31
  #
32
32
  # def self.foo(bar); end
33
33
  #
34
+ # @example
35
+ #
34
36
  # # EnforcedStyle: expanded
35
37
  #
36
- # @bad
38
+ # # bad
37
39
  # def foo(bar); end
38
40
  #
39
41
  # def self.foo(bar); end
40
42
  #
41
- # @good
43
+ # # good
42
44
  # def foo(bar)
43
45
  # end
44
46
  #
45
47
  # def self.foo(bar)
46
48
  # end
47
49
  class EmptyMethod < Cop
48
- include OnMethodDef
49
50
  include ConfigurableEnforcedStyle
50
51
 
51
52
  MSG_COMPACT = 'Put empty method definitions on a single line.'.freeze
52
53
  MSG_EXPANDED = 'Put the `end` of empty method definitions on the ' \
53
54
  'next line.'.freeze
54
55
 
55
- def on_method_def(node, _method_name, _args, body)
56
- return if body || comment_lines?(node)
57
- return if compact_style? && compact?(node)
58
- return if expanded_style? && expanded?(node)
56
+ def on_def(node)
57
+ return if node.body || comment_lines?(node)
58
+ return if correct_style?(node)
59
59
 
60
- add_offense(node, node.source_range, message)
60
+ add_offense(node)
61
61
  end
62
+ alias on_defs on_def
62
63
 
63
64
  private
64
65
 
@@ -68,19 +69,28 @@ module RuboCop
68
69
  end
69
70
  end
70
71
 
71
- def message
72
+ def message(_node)
72
73
  compact_style? ? MSG_COMPACT : MSG_EXPANDED
73
74
  end
74
75
 
76
+ def correct_style?(node)
77
+ compact_style? && compact?(node) ||
78
+ expanded_style? && expanded?(node)
79
+ end
80
+
75
81
  def corrected(node)
76
- method_name, args, _body, scope = method_def_node_parts(node)
82
+ arguments = node.arguments? ? node.arguments.source : ''
83
+ scope = node.receiver ? "#{node.receiver.source}." : ''
84
+
85
+ signature = [scope, node.method_name, arguments].join
86
+
87
+ ["def #{signature}", 'end'].join(joint(node))
88
+ end
77
89
 
78
- arguments = !args.children.empty? ? args.source : ''
79
- indent = ' ' * node.loc.column
80
- joint = compact_style? ? '; ' : "\n#{indent}"
81
- scope = scope ? 'self.' : ''
90
+ def joint(node)
91
+ indent = ' ' * node.loc.column
82
92
 
83
- ["def #{scope}#{method_name}#{arguments}", 'end'].join(joint)
93
+ compact_style? ? '; ' : "\n#{indent}"
84
94
  end
85
95
 
86
96
  def comment_lines?(node)
@@ -8,11 +8,11 @@ module RuboCop
8
8
  MSG = 'Avoid the use of flip flop operators.'.freeze
9
9
 
10
10
  def on_iflipflop(node)
11
- add_offense(node, :expression)
11
+ add_offense(node)
12
12
  end
13
13
 
14
14
  def on_eflipflop(node)
15
- add_offense(node, :expression)
15
+ add_offense(node)
16
16
  end
17
17
  end
18
18
  end
@@ -79,7 +79,7 @@ module RuboCop
79
79
  last_special_comment = last_special_comment(processed_source)
80
80
  range = source_range(processed_source.buffer, 0, 0)
81
81
 
82
- add_offense(last_special_comment, range, MSG)
82
+ add_offense(last_special_comment, range)
83
83
  end
84
84
 
85
85
  def unnecessary_comment_offense(processed_source)
@@ -37,12 +37,13 @@ module RuboCop
37
37
  # ok
38
38
  class GuardClause < Cop
39
39
  include MinBodyLength
40
- include OnMethodDef
41
40
 
42
41
  MSG = 'Use a guard clause instead of wrapping the code inside a ' \
43
42
  'conditional expression.'.freeze
44
43
 
45
- def on_method_def(_node, _method_name, _args, body)
44
+ def on_def(node)
45
+ body = node.body
46
+
46
47
  return unless body
47
48
 
48
49
  if body.if_type?
@@ -51,6 +52,7 @@ module RuboCop
51
52
  check_ending_if(body.children.last)
52
53
  end
53
54
  end
55
+ alias on_defs on_def
54
56
 
55
57
  def on_if(node)
56
58
  return if accepted_form?(node) || !contains_guard_clause?(node)
@@ -70,18 +70,18 @@ module RuboCop
70
70
  MSG_HASH_ROCKETS = 'Use hash rockets syntax.'.freeze
71
71
 
72
72
  def on_hash(node)
73
- return if node.pairs.empty?
73
+ pairs = node.pairs
74
74
 
75
- @force_hash_rockets = force_hash_rockets?(node.pairs)
75
+ return if pairs.empty?
76
76
 
77
- if style == :hash_rockets || @force_hash_rockets
78
- hash_rockets_check(node.pairs)
77
+ if style == :hash_rockets || force_hash_rockets?(pairs)
78
+ hash_rockets_check(pairs)
79
79
  elsif style == :ruby19_no_mixed_keys
80
- ruby19_no_mixed_keys_check(node.pairs)
80
+ ruby19_no_mixed_keys_check(pairs)
81
81
  elsif style == :no_mixed_keys
82
- no_mixed_keys_check(node.pairs)
82
+ no_mixed_keys_check(pairs)
83
83
  else
84
- ruby19_check(node.pairs)
84
+ ruby19_check(pairs)
85
85
  end
86
86
  end
87
87
 
@@ -94,7 +94,7 @@ module RuboCop
94
94
  end
95
95
 
96
96
  def ruby19_no_mixed_keys_check(pairs)
97
- if @force_hash_rockets
97
+ if force_hash_rockets?
98
98
  check(pairs, ':', MSG_HASH_ROCKETS)
99
99
  elsif sym_indices?(pairs)
100
100
  check(pairs, '=>', MSG_19)
@@ -113,7 +113,7 @@ module RuboCop
113
113
 
114
114
  def autocorrect(node)
115
115
  lambda do |corrector|
116
- if style == :hash_rockets || @force_hash_rockets
116
+ if style == :hash_rockets || force_hash_rockets?
117
117
  autocorrect_hash_rockets(corrector, node)
118
118
  elsif style == :ruby19_no_mixed_keys || style == :no_mixed_keys
119
119
  autocorrect_no_mixed_keys(corrector, node)
@@ -202,7 +202,7 @@ module RuboCop
202
202
  end
203
203
  end
204
204
 
205
- def force_hash_rockets?(pairs)
205
+ def force_hash_rockets?(pairs = [])
206
206
  @force_hash_rockets ||= begin
207
207
  cop_config['UseHashRocketsWithSymbolValues'] &&
208
208
  pairs.map(&:value).any?(&:sym_type?)
@@ -100,10 +100,14 @@ module RuboCop
100
100
  return unless expressions.size > 1 && expressions.uniq.one?
101
101
 
102
102
  expressions.each do |expression|
103
- add_offense(expression, :expression, format(MSG, expression.source))
103
+ add_offense(expression)
104
104
  end
105
105
  end
106
106
 
107
+ def message(node)
108
+ format(MSG, node.source)
109
+ end
110
+
107
111
  # `elsif` branches show up in the if node as nested `else` branches. We
108
112
  # need to recursively iterate over all `else` branches.
109
113
  def expand_elses(branch)
@@ -12,7 +12,7 @@ module RuboCop
12
12
  def on_normal_if_unless(node)
13
13
  beginning = node.loc.begin
14
14
  return unless beginning && beginning.is?(';')
15
- add_offense(node, :expression, MSG)
15
+ add_offense(node)
16
16
  end
17
17
  end
18
18
  end
@@ -15,14 +15,15 @@ module RuboCop
15
15
  # @good
16
16
  # raise ArgumentError, 'Error message here'
17
17
  class ImplicitRuntimeError < Cop
18
+ MSG = 'Use `%s` with an explicit exception class and message, ' \
19
+ 'rather than just a message.'.freeze
20
+
18
21
  def_node_matcher :implicit_runtime_error_raise_or_fail,
19
22
  '(send nil ${:raise :fail} {str dstr})'
20
23
 
21
24
  def on_send(node)
22
25
  implicit_runtime_error_raise_or_fail(node) do |method|
23
- add_offense(node, :expression, "Use `#{method}` with an explicit " \
24
- 'exception class and message, ' \
25
- 'rather than just a message.')
26
+ add_offense(node, :expression, format(MSG, method))
26
27
  end
27
28
  end
28
29
  end
@@ -23,7 +23,7 @@ module RuboCop
23
23
  def investigate(processed_source)
24
24
  processed_source.comments.each do |comment|
25
25
  next if comment_line?(processed_source[comment.loc.line - 1])
26
- add_offense(comment, :expression)
26
+ add_offense(comment)
27
27
  end
28
28
  end
29
29
  end
@@ -28,8 +28,11 @@ module RuboCop
28
28
  # foo == bar
29
29
  # !!('foo' =~ /^\w+$/)
30
30
  class InverseMethods < Cop
31
+ include IgnoredNode
32
+
31
33
  MSG = 'Use `%<inverse>s` instead of inverting `%<method>s`.'.freeze
32
34
  EQUALITY_METHODS = %i[== != =~ !~ <= >= < >].freeze
35
+ NEGATED_EQUALITY_METHODS = %i[!= !~].freeze
33
36
 
34
37
  def_node_matcher :inverse_candidate?, <<-PATTERN
35
38
  {
@@ -48,6 +51,7 @@ module RuboCop
48
51
  PATTERN
49
52
 
50
53
  def on_send(node)
54
+ return if part_of_ignored_node?(node)
51
55
  inverse_candidate?(node) do |_method_call, method|
52
56
  return unless inverse_methods.key?(method)
53
57
  return if negated?(node)
@@ -60,10 +64,14 @@ module RuboCop
60
64
  end
61
65
 
62
66
  def on_block(node)
63
- inverse_block?(node) do |_method_call, method, _block|
67
+ inverse_block?(node) do |_method_call, method, block|
64
68
  return unless inverse_blocks.key?(method)
65
69
  return if negated?(node) && negated?(node.parent)
66
70
 
71
+ # Inverse method offenses inside of the block of an inverse method
72
+ # offense, such as `y.reject { |key, _value| !(key =~ /c\d/) }`,
73
+ # can cause auto-correction to apply improper corrections.
74
+ ignore_node(block)
67
75
  add_offense(node,
68
76
  :expression,
69
77
  format(MSG, method: method,
@@ -91,18 +99,22 @@ module RuboCop
91
99
 
92
100
  def correct_inverse_block(node)
93
101
  method_call, method, block = inverse_block?(node)
94
- selector = block.loc.selector.source
95
102
 
96
103
  lambda do |corrector|
97
104
  corrector.replace(method_call.loc.selector,
98
105
  inverse_blocks[method].to_s)
106
+ correct_inverse_selector(block, corrector)
107
+ end
108
+ end
99
109
 
100
- if ['!=', '!~'].include?(selector)
101
- selector[0] = '='
102
- corrector.replace(block.loc.selector, selector)
103
- else
104
- corrector.remove(block.loc.selector)
105
- end
110
+ def correct_inverse_selector(block, corrector)
111
+ selector = block.loc.selector.source
112
+
113
+ if NEGATED_EQUALITY_METHODS.include?(selector.to_sym)
114
+ selector[0] = '='
115
+ corrector.replace(block.loc.selector, selector)
116
+ else
117
+ corrector.remove(block.loc.selector)
106
118
  end
107
119
  end
108
120
 
@@ -127,7 +127,7 @@ module RuboCop
127
127
  block_method, args = *node
128
128
 
129
129
  # Check for unparenthesized args' preceding and trailing whitespaces.
130
- remove_unparenthesized_whitespaces(corrector, node)
130
+ remove_unparenthesized_whitespace(corrector, node)
131
131
 
132
132
  # Avoid correcting to `lambdado` by inserting whitespace
133
133
  # if none exists before or after the lambda arguments.
@@ -186,18 +186,28 @@ module RuboCop
186
186
  arg_node.sibling_index > 1
187
187
  end
188
188
 
189
- def remove_unparenthesized_whitespaces(corrector, node)
190
- block_method, args = *node
189
+ def remove_unparenthesized_whitespace(corrector, node)
190
+ args = node.arguments
191
+
191
192
  return unless unparenthesized_literal_args?(args)
192
- # First, remove leading whitespaces (between arrow and args)
193
+
194
+ remove_leading_whitespace(node, corrector)
195
+ remove_trailing_whitespace(node, corrector)
196
+ end
197
+
198
+ def remove_leading_whitespace(node, corrector)
193
199
  corrector.remove_preceding(
194
- args.source_range,
195
- args.source_range.begin_pos - block_method.source_range.end_pos
200
+ node.arguments.source_range,
201
+ node.arguments.source_range.begin_pos -
202
+ node.send_node.source_range.end_pos
196
203
  )
204
+ end
197
205
 
198
- # Then, remove trailing whitespaces (between args and 'do')
199
- delta = node.loc.begin.begin_pos - args.source_range.end_pos - 1
200
- corrector.remove_preceding(node.loc.begin, delta)
206
+ def remove_trailing_whitespace(node, corrector)
207
+ corrector.remove_preceding(
208
+ node.loc.begin,
209
+ node.loc.begin.begin_pos - node.arguments.source_range.end_pos - 1
210
+ )
201
211
  end
202
212
 
203
213
  def unparenthesized_literal_args?(args)
@@ -19,7 +19,7 @@ module RuboCop
19
19
  return unless node.receiver && node.method?(:call)
20
20
 
21
21
  if offense?(node)
22
- add_offense(node, :expression) { opposite_style_detected }
22
+ add_offense(node) { opposite_style_detected }
23
23
  else
24
24
  correct_style_detected
25
25
  end
@@ -40,11 +40,32 @@ module RuboCop
40
40
 
41
41
  corrector.replace(node.source_range, replacement)
42
42
  else
43
+ add_parentheses(node, corrector) unless node.parenthesized?
43
44
  corrector.remove(node.loc.selector)
44
45
  end
45
46
  end
46
47
  end
47
48
 
49
+ def add_parentheses(node, corrector)
50
+ if node.arguments.empty?
51
+ corrector.insert_after(node.source_range, '()')
52
+ else
53
+ corrector.replace(args_begin(node), '(')
54
+ corrector.insert_after(args_end(node), ')')
55
+ end
56
+ end
57
+
58
+ def args_begin(node)
59
+ loc = node.loc
60
+ selector =
61
+ node.super_type? || node.yield_type? ? loc.keyword : loc.selector
62
+ selector.end.resize(1)
63
+ end
64
+
65
+ def args_end(node)
66
+ node.loc.expression.end
67
+ end
68
+
48
69
  def message(_node)
49
70
  if explicit_style?
50
71
  'Prefer the use of `lambda.call(...)` over `lambda.(...)`.'