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
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Checks for redundant message arguments to `#add_offense`. This method
7
+ # will automatically use `#message` or `MSG` (in that order of priority)
8
+ # if they are defined.
9
+ #
10
+ # @example
11
+ #
12
+ # # bad
13
+ # add_offense(node, :expression, MSG)
14
+ # add_offense(node, :expression, message)
15
+ # add_offense(node, :expression, message(node))
16
+ #
17
+ # # good
18
+ # add_offense(node, :expression)
19
+ # add_offense(node, :expression, CUSTOM_MSG)
20
+ # add_offense(node, :expression, message(other_node))
21
+ #
22
+ class RedundantMessageArgument < Cop
23
+ MSG = 'Redundant message argument to `#add_offense`.'.freeze
24
+
25
+ def_node_matcher :node_type_check, <<-PATTERN
26
+ (send nil :add_offense _offender _
27
+ {(const nil :MSG) (send nil :message) (send nil :message _offender)})
28
+ PATTERN
29
+
30
+ def on_send(node)
31
+ node_type_check(node) do
32
+ add_offense(node.last_argument)
33
+ end
34
+ end
35
+
36
+ def autocorrect(node)
37
+ parent = node.parent
38
+ arguments = parent.arguments
39
+ range =
40
+ Parser::Source::Range.new(parent.source_range.source_buffer,
41
+ arguments[-2].loc.expression.end_pos,
42
+ arguments.last.loc.expression.end_pos)
43
+
44
+ ->(corrector) { corrector.remove(range) }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -26,7 +26,7 @@ module RuboCop
26
26
 
27
27
  def investigate(_processed_source)
28
28
  assertions_using_described_class_msg.each do |node|
29
- add_offense(node, :expression)
29
+ add_offense(node)
30
30
  end
31
31
  end
32
32
 
@@ -37,7 +37,6 @@ module RuboCop
37
37
  class AccessModifierIndentation < Cop
38
38
  include AutocorrectAlignment
39
39
  include ConfigurableEnforcedStyle
40
- include AccessModifierNode
41
40
 
42
41
  MSG = '%s access modifiers like `%s`.'.freeze
43
42
 
@@ -67,7 +66,7 @@ module RuboCop
67
66
  def check_body(body, node)
68
67
  return if body.nil? # Empty class etc.
69
68
 
70
- modifiers = body.each_child_node.select { |c| modifier_node?(c) }
69
+ modifiers = body.each_child_node(:send).select(&:access_modifier?)
71
70
  class_column = node.source_range.column
72
71
 
73
72
  modifiers.each { |modifier| check_modifier(modifier, class_column) }
@@ -81,7 +80,7 @@ module RuboCop
81
80
  if @column_delta.zero?
82
81
  correct_style_detected
83
82
  else
84
- add_offense(send_node, :expression) do
83
+ add_offense(send_node) do
85
84
  if offset == unexpected_indent_offset
86
85
  opposite_style_detected
87
86
  else
@@ -8,14 +8,14 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  # # bad
11
- # a = [1, 2, 3
11
+ # a = [1, 2, 3,
12
12
  # 4, 5, 6]
13
13
  # array = ['run',
14
14
  # 'forrest',
15
15
  # 'run']
16
16
  #
17
17
  # # good
18
- # a = [1, 2, 3
18
+ # a = [1, 2, 3,
19
19
  # 4, 5, 6]
20
20
  # a = ['run',
21
21
  # 'forrest',
@@ -136,12 +136,12 @@ module RuboCop
136
136
  first_pair = node.pairs.first
137
137
  self.column_deltas = alignment_for(first_pair)
138
138
  .deltas_for_first_pair(first_pair, node)
139
- add_offense(first_pair, :expression) unless good_alignment?
139
+ add_offense(first_pair) unless good_alignment?
140
140
 
141
141
  node.children.each do |current|
142
142
  self.column_deltas = alignment_for(current)
143
143
  .deltas(first_pair, current)
144
- add_offense(current, :expression) unless good_alignment?
144
+ add_offense(current) unless good_alignment?
145
145
  end
146
146
  end
147
147
 
@@ -35,7 +35,6 @@ module RuboCop
35
35
  # :baz
36
36
  class AlignParameters < Cop
37
37
  include AutocorrectAlignment
38
- include OnMethodDef
39
38
 
40
39
  ALIGN_PARAMS_MSG = 'Align the parameters of a method %s if they span ' \
41
40
  'more than one line.'.freeze
@@ -44,18 +43,15 @@ module RuboCop
44
43
  'following the first line of a multi-line method %s.'.freeze
45
44
 
46
45
  def on_send(node)
47
- return if node.arguments.size < 2 || node.method?(:[]=)
46
+ return if node.arguments.size < 2 ||
47
+ node.send_type? && node.method?(:[]=)
48
48
 
49
49
  check_alignment(node.arguments, base_column(node, node.arguments))
50
50
  end
51
+ alias on_def on_send
52
+ alias on_defs on_send
51
53
 
52
- def on_method_def(node, _method_name, args, _body)
53
- args = args.children
54
-
55
- return if args.size < 2
56
-
57
- check_alignment(args, base_column(node, args))
58
- end
54
+ private
59
55
 
60
56
  def message(node)
61
57
  type = node && node.parent.send_type? ? 'call' : 'definition'
@@ -64,8 +60,6 @@ module RuboCop
64
60
  format(msg, type)
65
61
  end
66
62
 
67
- private
68
-
69
63
  def fixed_indentation?
70
64
  cop_config['EnforcedStyle'] == 'with_fixed_indentation'
71
65
  end
@@ -27,7 +27,6 @@ module RuboCop
27
27
  # )
28
28
  class ClosingParenthesisIndentation < Cop
29
29
  include AutocorrectAlignment
30
- include OnMethodDef
31
30
 
32
31
  MSG_INDENT =
33
32
  'Indent `)` the same as the start of the line where `(` is.'.freeze
@@ -41,11 +40,12 @@ module RuboCop
41
40
  check(node, node.children)
42
41
  end
43
42
 
44
- private
45
-
46
- def on_method_def(_node, _method_name, args, _body)
47
- check(args, args.children)
43
+ def on_def(node)
44
+ check(node.arguments, node.arguments)
48
45
  end
46
+ alias on_defs on_def
47
+
48
+ private
49
49
 
50
50
  def check(node, elements)
51
51
  right_paren = node.loc.end
@@ -33,7 +33,7 @@ module RuboCop
33
33
  return if column == correct_comment_indentation
34
34
  end
35
35
 
36
- add_offense(comment, comment.loc.expression,
36
+ add_offense(comment, :expression,
37
37
  format(MSG, column, correct_comment_indentation))
38
38
  end
39
39
 
@@ -4,6 +4,15 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # This cop checks the . position in multi-line method calls.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # something.
11
+ # mehod
12
+ #
13
+ # # good
14
+ # something
15
+ # .method
7
16
  class DotPosition < Cop
8
17
  include ConfigurableEnforcedStyle
9
18
 
@@ -7,6 +7,28 @@ module RuboCop
7
7
  # be aligned with an if/unless/while/until/begin/def keyword, but there
8
8
  # are special cases when they should follow the same rules as the
9
9
  # alignment of end.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # if something
14
+ # code
15
+ # else
16
+ # code
17
+ # end
18
+ #
19
+ # # bad
20
+ # if something
21
+ # code
22
+ # elsif something
23
+ # code
24
+ # end
25
+ #
26
+ # # good
27
+ # if something
28
+ # code
29
+ # else
30
+ # code
31
+ # end
10
32
  class ElseAlignment < Cop
11
33
  include EndKeywordAlignment
12
34
  include AutocorrectAlignment
@@ -20,18 +42,9 @@ module RuboCop
20
42
 
21
43
  check_alignment(base_range(node, base), node.loc.else)
22
44
 
23
- else_branch = node.else_branch
45
+ return unless node.elsif_conditional?
24
46
 
25
- return unless else_branch && else_branch.if_type? &&
26
- else_branch.elsif?
27
-
28
- # If the `else` part is actually an `elsif`, we check the `elsif`
29
- # node in case it contains an `else` within, because that `else`
30
- # should have the same alignment (base).
31
- on_if(else_branch, base)
32
- # The `elsif` node will get an `on_if` call from the framework later,
33
- # but we're done here, so we set it to ignored.
34
- ignore_node(else_branch)
47
+ check_nested(node.else_branch, base)
35
48
  end
36
49
 
37
50
  def on_rescue(node)
@@ -55,6 +68,11 @@ module RuboCop
55
68
 
56
69
  private
57
70
 
71
+ def check_nested(node, base)
72
+ on_if(node, base)
73
+ ignore_node(node)
74
+ end
75
+
58
76
  def base_range(node, base)
59
77
  if base
60
78
  base.source_range
@@ -86,8 +104,7 @@ module RuboCop
86
104
 
87
105
  return unless rhs.if_type?
88
106
 
89
- on_if(rhs, base)
90
- ignore_node(rhs)
107
+ check_nested(rhs, base)
91
108
  end
92
109
 
93
110
  def check_alignment(base_range, else_range)
@@ -32,6 +32,10 @@ module RuboCop
32
32
  class EmptyLineBetweenDefs < Cop
33
33
  MSG = 'Use empty lines between method definitions.'.freeze
34
34
 
35
+ def self.autocorrect_incompatible_with
36
+ [Layout::EmptyLines]
37
+ end
38
+
35
39
  # We operate on `begin` nodes, instead of using `OnMethodDef`,
36
40
  # so that we can walk over pairs of consecutive nodes and
37
41
  # efficiently access a node's predecessor; #prev_node ends up
@@ -4,18 +4,34 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # Access modifiers should be surrounded by blank lines.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # class Foo
12
+ # def bar; end
13
+ # private
14
+ # def baz; end
15
+ # end
16
+ #
17
+ # # good
18
+ # class Foo
19
+ # def bar; end
20
+ #
21
+ # private
22
+ #
23
+ # def baz; end
24
+ # end
7
25
  class EmptyLinesAroundAccessModifier < Cop
8
- include AccessModifierNode
9
-
10
26
  MSG_AFTER = 'Keep a blank line after `%s`.'.freeze
11
27
  MSG_BEFORE_AND_AFTER = 'Keep a blank line before and after `%s`.'.freeze
12
28
 
13
29
  def on_send(node)
14
- return unless modifier_node?(node)
30
+ return unless node.access_modifier?
15
31
 
16
32
  return if empty_lines_around?(node)
17
33
 
18
- add_offense(node, :expression)
34
+ add_offense(node)
19
35
  end
20
36
 
21
37
  def autocorrect(node)
@@ -60,13 +60,13 @@ module RuboCop
60
60
  # end
61
61
  class EmptyLinesAroundExceptionHandlingKeywords < Cop
62
62
  include EmptyLinesAroundBody
63
- include OnMethodDef
64
63
 
65
64
  MSG = 'Extra empty line detected %s the `%s`.'.freeze
66
65
 
67
- def on_method_def(_node, _method_name, _args, body)
68
- check_body(body)
66
+ def on_def(node)
67
+ check_body(node.body)
69
68
  end
69
+ alias on_defs on_def
70
70
 
71
71
  def on_kwbegin(node)
72
72
  body, = *node
@@ -22,13 +22,13 @@ module RuboCop
22
22
  # end
23
23
  class EmptyLinesAroundMethodBody < Cop
24
24
  include EmptyLinesAroundBody
25
- include OnMethodDef
26
25
 
27
26
  KIND = 'method'.freeze
28
27
 
29
- def on_method_def(node, _method_name, _args, body)
30
- check(node, body)
28
+ def on_def(node)
29
+ check(node, node.body)
31
30
  end
31
+ alias on_defs on_def
32
32
 
33
33
  private
34
34
 
@@ -27,15 +27,15 @@ module RuboCop
27
27
  # do_something
28
28
  # end
29
29
  class FirstMethodParameterLineBreak < Cop
30
- include OnMethodDef
31
30
  include FirstElementLineBreak
32
31
 
33
32
  MSG = 'Add a line break before the first parameter of a ' \
34
33
  'multi-line method parameter list.'.freeze
35
34
 
36
- def on_method_def(node, _method_name, args, _body)
37
- check_method_line_break(node, args.to_a)
35
+ def on_def(node)
36
+ check_method_line_break(node, node.arguments)
38
37
  end
38
+ alias on_defs on_def
39
39
  end
40
40
  end
41
41
  end
@@ -60,8 +60,7 @@ module RuboCop
60
60
 
61
61
  parent = node.parent
62
62
 
63
- return false unless parent && parent.send_type? &&
64
- !parent.method?(:[]=)
63
+ return false unless eligible_method_call?(parent)
65
64
  return false if !parent.parenthesized? &&
66
65
  style == :special_for_inner_method_call_in_parentheses
67
66
 
@@ -70,6 +69,10 @@ module RuboCop
70
69
  node.source_range.begin_pos > parent.source_range.begin_pos
71
70
  end
72
71
 
72
+ def_node_matcher :eligible_method_call?, <<-PATTERN
73
+ (send _ !:[]= ...)
74
+ PATTERN
75
+
73
76
  def base_range(send_node, arg_node)
74
77
  range_between(send_node.source_range.begin_pos,
75
78
  arg_node.source_range.begin_pos)
@@ -12,24 +12,25 @@ module RuboCop
12
12
  # @example
13
13
  #
14
14
  # # bad
15
- # <<-END
15
+ # <<-RUBY
16
16
  # something
17
- # END
17
+ # RUBY
18
18
  #
19
19
  # # good
20
20
  # # When EnforcedStyle is squiggly, bad code is auto-corrected to the
21
21
  # # following code.
22
- # <<~END
22
+ # <<~RUBY
23
23
  # something
24
- # END
24
+ # RUBY
25
25
  #
26
26
  # # good
27
27
  # # When EnforcedStyle is active_support, bad code is auto-corrected to
28
28
  # # the following code.
29
- # <<-END.strip_heredoc
29
+ # <<-RUBY.strip_heredoc
30
30
  # something
31
- # END
31
+ # RUBY
32
32
  class IndentHeredoc < Cop
33
+ include Heredoc
33
34
  include ConfigurableEnforcedStyle
34
35
  include SafeMode
35
36
 
@@ -43,10 +44,11 @@ module RuboCop
43
44
  powerpack: 'strip_indent'
44
45
  }.freeze
45
46
 
46
- def on_str(node)
47
- return unless heredoc?(node)
47
+ def on_heredoc(node)
48
+ body = heredoc_body(node)
49
+ return if body =~ /\A\s*\z/
48
50
 
49
- body_indent_level = body_indent_level(node)
51
+ body_indent_level = indent_level(body)
50
52
 
51
53
  if heredoc_indent_type(node) == '~'
52
54
  expected_indent_level = base_indent_level(node) + indentation_width
@@ -58,9 +60,6 @@ module RuboCop
58
60
  add_offense(node, :heredoc_body)
59
61
  end
60
62
 
61
- alias on_dstr on_str
62
- alias on_xstr on_str
63
-
64
63
  def autocorrect(node)
65
64
  check_style!
66
65
 
@@ -133,22 +132,13 @@ module RuboCop
133
132
  end
134
133
  end
135
134
 
136
- def heredoc?(node)
137
- node.loc.is_a?(Parser::Source::Map::Heredoc)
138
- end
139
-
140
135
  def indented_body(node)
141
- body = node.loc.heredoc_body.source
142
- body_indent_level = body_indent_level(node)
136
+ body = heredoc_body(node)
137
+ body_indent_level = indent_level(body)
143
138
  correct_indent_level = base_indent_level(node) + indentation_width
144
139
  body.gsub(/^\s{#{body_indent_level}}/, ' ' * correct_indent_level)
145
140
  end
146
141
 
147
- def body_indent_level(node)
148
- body = node.loc.heredoc_body.source
149
- indent_level(body)
150
- end
151
-
152
142
  def base_indent_level(node)
153
143
  base_line_num = node.loc.expression.line
154
144
  base_line = processed_source.lines[base_line_num - 1]
@@ -156,7 +146,8 @@ module RuboCop
156
146
  end
157
147
 
158
148
  def indent_level(str)
159
- str.scan(/^\s*/).reject { |line| line == "\n" }.min_by(&:size).size
149
+ indentations = str.scan(/^\s*/).reject { |line| line == "\n" }
150
+ indentations.empty? ? 0 : indentations.min_by(&:size).size
160
151
  end
161
152
 
162
153
  # Returns '~', '-' or nil
@@ -167,6 +158,10 @@ module RuboCop
167
158
  def indentation_width
168
159
  @config.for_cop('IndentationWidth')['Width'] || 2
169
160
  end
161
+
162
+ def heredoc_body(node)
163
+ scrub_string(node.loc.heredoc_body.source)
164
+ end
170
165
  end
171
166
  end
172
167
  end