rubocop 0.49.1 → 0.50.0

Sign up to get free protection for your applications and to get access to all the features.
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