rubocop 0.47.1 → 0.48.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.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +28 -16
  3. data/config/default.yml +203 -115
  4. data/config/disabled.yml +0 -5
  5. data/config/enabled.yml +92 -8
  6. data/lib/rubocop.rb +24 -1
  7. data/lib/rubocop/ast/builder.rb +7 -2
  8. data/lib/rubocop/ast/node.rb +23 -20
  9. data/lib/rubocop/ast/node/and_node.rb +37 -0
  10. data/lib/rubocop/ast/node/array_node.rb +4 -1
  11. data/lib/rubocop/ast/node/case_node.rb +1 -0
  12. data/lib/rubocop/ast/node/ensure_node.rb +25 -0
  13. data/lib/rubocop/ast/node/hash_node.rb +10 -3
  14. data/lib/rubocop/ast/node/if_node.rb +2 -0
  15. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +23 -0
  16. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
  17. data/lib/rubocop/ast/node/or_node.rb +37 -0
  18. data/lib/rubocop/ast/node/resbody_node.rb +25 -0
  19. data/lib/rubocop/ast/node/send_node.rb +190 -0
  20. data/lib/rubocop/ast/node/when_node.rb +1 -1
  21. data/lib/rubocop/ast/traversal.rb +15 -15
  22. data/lib/rubocop/comment_config.rb +1 -1
  23. data/lib/rubocop/config.rb +39 -15
  24. data/lib/rubocop/config_loader.rb +34 -13
  25. data/lib/rubocop/cop/bundler/ordered_gems.rb +23 -4
  26. data/lib/rubocop/cop/commissioner.rb +4 -0
  27. data/lib/rubocop/cop/cop.rb +5 -0
  28. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +53 -0
  29. data/lib/rubocop/cop/lint/debugger.rb +8 -1
  30. data/lib/rubocop/cop/lint/def_end_alignment.rb +2 -1
  31. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -4
  32. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  33. data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -1
  34. data/lib/rubocop/cop/lint/empty_ensure.rb +6 -2
  35. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  36. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +20 -18
  37. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -3
  38. data/lib/rubocop/cop/lint/literal_in_condition.rb +1 -1
  39. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  40. data/lib/rubocop/cop/lint/multiple_compare.rb +5 -3
  41. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +26 -18
  42. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +7 -8
  43. data/lib/rubocop/cop/lint/require_parentheses.rb +7 -13
  44. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +7 -3
  45. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -6
  46. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +7 -8
  47. data/lib/rubocop/cop/lint/unneeded_disable.rb +35 -11
  48. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
  49. data/lib/rubocop/cop/lint/unreachable_code.rb +5 -2
  50. data/lib/rubocop/cop/lint/unused_block_argument.rb +6 -6
  51. data/lib/rubocop/cop/lint/useless_assignment.rb +2 -1
  52. data/lib/rubocop/cop/lint/useless_comparison.rb +5 -4
  53. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  54. data/lib/rubocop/cop/message_annotator.rb +7 -3
  55. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  56. data/lib/rubocop/cop/metrics/block_nesting.rb +4 -4
  57. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -2
  58. data/lib/rubocop/cop/metrics/line_length.rb +2 -9
  59. data/lib/rubocop/cop/metrics/parameter_lists.rb +4 -3
  60. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -2
  61. data/lib/rubocop/cop/mixin/access_modifier_node.rb +1 -1
  62. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +2 -2
  63. data/lib/rubocop/cop/mixin/check_assignment.rb +6 -6
  64. data/lib/rubocop/cop/mixin/duplication.rb +1 -1
  65. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  66. data/lib/rubocop/cop/mixin/ignored_pattern.rb +27 -0
  67. data/lib/rubocop/cop/mixin/method_preference.rb +2 -0
  68. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +17 -29
  69. data/lib/rubocop/cop/mixin/on_method_def.rb +3 -3
  70. data/lib/rubocop/cop/mixin/percent_literal.rb +27 -0
  71. data/lib/rubocop/cop/mixin/rescue_node.rb +21 -0
  72. data/lib/rubocop/cop/mixin/safe_mode.rb +1 -1
  73. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  74. data/lib/rubocop/cop/mixin/statement_modifier.rb +2 -1
  75. data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
  76. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -1
  77. data/lib/rubocop/cop/offense.rb +3 -3
  78. data/lib/rubocop/cop/performance/casecmp.rb +1 -1
  79. data/lib/rubocop/cop/performance/detect.rb +2 -1
  80. data/lib/rubocop/cop/performance/double_start_end_with.rb +35 -1
  81. data/lib/rubocop/cop/performance/end_with.rb +3 -1
  82. data/lib/rubocop/cop/performance/flat_map.rb +6 -6
  83. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
  84. data/lib/rubocop/cop/performance/range_include.rb +3 -1
  85. data/lib/rubocop/cop/performance/redundant_match.rb +6 -5
  86. data/lib/rubocop/cop/performance/regexp_match.rb +10 -3
  87. data/lib/rubocop/cop/performance/reverse_each.rb +2 -1
  88. data/lib/rubocop/cop/performance/size.rb +6 -11
  89. data/lib/rubocop/cop/performance/start_with.rb +3 -1
  90. data/lib/rubocop/cop/performance/string_replacement.rb +13 -18
  91. data/lib/rubocop/cop/performance/times_map.rb +4 -4
  92. data/lib/rubocop/cop/rails/action_filter.rb +42 -42
  93. data/lib/rubocop/cop/rails/active_support_aliases.rb +68 -0
  94. data/lib/rubocop/cop/rails/blank.rb +131 -0
  95. data/lib/rubocop/cop/rails/date.rb +25 -28
  96. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +5 -7
  97. data/lib/rubocop/cop/rails/dynamic_find_by.rb +7 -3
  98. data/lib/rubocop/cop/rails/exit.rb +9 -9
  99. data/lib/rubocop/cop/rails/file_path.rb +5 -14
  100. data/lib/rubocop/cop/rails/find_by.rb +8 -10
  101. data/lib/rubocop/cop/rails/find_each.rb +6 -9
  102. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -0
  103. data/lib/rubocop/cop/rails/http_positional_arguments.rb +15 -7
  104. data/lib/rubocop/cop/rails/output.rb +3 -5
  105. data/lib/rubocop/cop/rails/output_safety.rb +4 -8
  106. data/lib/rubocop/cop/rails/pluralization_grammar.rb +25 -24
  107. data/lib/rubocop/cop/rails/present.rb +137 -0
  108. data/lib/rubocop/cop/rails/read_write_attribute.rb +9 -18
  109. data/lib/rubocop/cop/rails/relative_date_constant.rb +53 -0
  110. data/lib/rubocop/cop/rails/request_referer.rb +7 -4
  111. data/lib/rubocop/cop/rails/reversible_migration.rb +1 -2
  112. data/lib/rubocop/cop/rails/safe_navigation.rb +2 -1
  113. data/lib/rubocop/cop/rails/save_bang.rb +10 -10
  114. data/lib/rubocop/cop/rails/skips_model_validations.rb +23 -6
  115. data/lib/rubocop/cop/rails/time_zone.rb +20 -18
  116. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +3 -2
  117. data/lib/rubocop/cop/rails/validation.rb +8 -11
  118. data/lib/rubocop/cop/registry.rb +3 -3
  119. data/lib/rubocop/cop/security/json_load.rb +1 -1
  120. data/lib/rubocop/cop/security/marshal_load.rb +5 -1
  121. data/lib/rubocop/cop/security/yaml_load.rb +3 -3
  122. data/lib/rubocop/cop/severity.rb +1 -1
  123. data/lib/rubocop/cop/style/alias.rb +5 -5
  124. data/lib/rubocop/cop/style/align_hash.rb +1 -1
  125. data/lib/rubocop/cop/style/align_parameters.rb +5 -5
  126. data/lib/rubocop/cop/style/and_or.rb +16 -31
  127. data/lib/rubocop/cop/style/attr.rb +14 -8
  128. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +8 -11
  129. data/lib/rubocop/cop/style/block_delimiters.rb +11 -13
  130. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +19 -23
  131. data/lib/rubocop/cop/style/case_indentation.rb +2 -0
  132. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  133. data/lib/rubocop/cop/style/class_check.rb +5 -7
  134. data/lib/rubocop/cop/style/closing_parenthesis_indentation.rb +5 -4
  135. data/lib/rubocop/cop/style/collection_methods.rb +8 -8
  136. data/lib/rubocop/cop/style/colon_method_call.rb +2 -9
  137. data/lib/rubocop/cop/style/conditional_assignment.rb +38 -45
  138. data/lib/rubocop/cop/style/constant_name.rb +1 -1
  139. data/lib/rubocop/cop/style/documentation_method.rb +1 -0
  140. data/lib/rubocop/cop/style/dot_position.rb +3 -7
  141. data/lib/rubocop/cop/style/double_negation.rb +2 -1
  142. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  143. data/lib/rubocop/cop/style/empty_else.rb +2 -2
  144. data/lib/rubocop/cop/style/empty_line_after_magic_comment.rb +63 -0
  145. data/lib/rubocop/cop/style/empty_line_between_defs.rb +74 -4
  146. data/lib/rubocop/cop/style/empty_lines_around_begin_body.rb +42 -0
  147. data/lib/rubocop/cop/style/empty_lines_around_exception_handling_keywords.rb +127 -0
  148. data/lib/rubocop/cop/style/empty_literal.rb +17 -9
  149. data/lib/rubocop/cop/style/end_of_line.rb +25 -3
  150. data/lib/rubocop/cop/style/file_name.rb +1 -1
  151. data/lib/rubocop/cop/style/first_method_argument_line_break.rb +1 -1
  152. data/lib/rubocop/cop/style/first_parameter_indentation.rb +17 -19
  153. data/lib/rubocop/cop/style/for.rb +2 -4
  154. data/lib/rubocop/cop/style/format_string.rb +5 -4
  155. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  156. data/lib/rubocop/cop/style/identical_conditional_branches.rb +27 -1
  157. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
  158. data/lib/rubocop/cop/style/indent_assignment.rb +2 -2
  159. data/lib/rubocop/cop/style/indent_hash.rb +2 -1
  160. data/lib/rubocop/cop/style/indent_heredoc.rb +173 -0
  161. data/lib/rubocop/cop/style/indentation_width.rb +61 -29
  162. data/lib/rubocop/cop/style/inverse_methods.rb +130 -0
  163. data/lib/rubocop/cop/style/lambda_call.rb +15 -11
  164. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
  165. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +26 -14
  166. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -16
  167. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +4 -1
  168. data/lib/rubocop/cop/style/missing_else.rb +4 -3
  169. data/lib/rubocop/cop/style/mixin_grouping.rb +97 -0
  170. data/lib/rubocop/cop/style/multiline_memoization.rb +38 -5
  171. data/lib/rubocop/cop/style/multiline_method_call_brace_layout.rb +2 -3
  172. data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +38 -19
  173. data/lib/rubocop/cop/style/mutable_constant.rb +5 -1
  174. data/lib/rubocop/cop/style/negated_if.rb +73 -1
  175. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +21 -19
  176. data/lib/rubocop/cop/style/next.rb +5 -5
  177. data/lib/rubocop/cop/style/non_nil_check.rb +7 -10
  178. data/lib/rubocop/cop/style/not.rb +3 -4
  179. data/lib/rubocop/cop/style/numeric_literals.rb +25 -3
  180. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  181. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
  182. data/lib/rubocop/cop/style/op_method.rb +2 -2
  183. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -3
  184. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +52 -6
  185. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  186. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -9
  187. data/lib/rubocop/cop/style/raise_args.rb +28 -24
  188. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  189. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -3
  190. data/lib/rubocop/cop/style/redundant_self.rb +17 -35
  191. data/lib/rubocop/cop/style/rescue_modifier.rb +2 -14
  192. data/lib/rubocop/cop/style/self_assignment.rb +3 -3
  193. data/lib/rubocop/cop/style/send.rb +4 -5
  194. data/lib/rubocop/cop/style/space_after_not.rb +7 -8
  195. data/lib/rubocop/cop/style/space_around_keyword.rb +8 -9
  196. data/lib/rubocop/cop/style/space_around_operators.rb +19 -15
  197. data/lib/rubocop/cop/style/space_before_first_arg.rb +17 -14
  198. data/lib/rubocop/cop/style/space_inside_brackets.rb +1 -1
  199. data/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb +3 -3
  200. data/lib/rubocop/cop/style/space_inside_parens.rb +1 -1
  201. data/lib/rubocop/cop/style/special_global_vars.rb +14 -14
  202. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +2 -1
  203. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  204. data/lib/rubocop/cop/style/string_methods.rb +10 -5
  205. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -15
  206. data/lib/rubocop/cop/style/symbol_array.rb +31 -35
  207. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  208. data/lib/rubocop/cop/style/ternary_parentheses.rb +41 -13
  209. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +6 -9
  210. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -1
  211. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  212. data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -2
  213. data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
  214. data/lib/rubocop/cop/style/word_array.rb +12 -34
  215. data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -4
  216. data/lib/rubocop/cop/team.rb +4 -1
  217. data/lib/rubocop/cop/util.rb +33 -26
  218. data/lib/rubocop/cop/variable_force.rb +13 -13
  219. data/lib/rubocop/cop/variable_force/assignment.rb +1 -8
  220. data/lib/rubocop/cop/variable_force/branch.rb +318 -0
  221. data/lib/rubocop/cop/variable_force/branchable.rb +21 -0
  222. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  223. data/lib/rubocop/cop/variable_force/scope.rb +36 -20
  224. data/lib/rubocop/cop/variable_force/variable.rb +9 -8
  225. data/lib/rubocop/formatter/colorizable.rb +10 -10
  226. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  227. data/lib/rubocop/formatter/html_formatter.rb +2 -1
  228. data/lib/rubocop/formatter/simple_text_formatter.rb +4 -2
  229. data/lib/rubocop/magic_comment.rb +20 -6
  230. data/lib/rubocop/options.rb +1 -1
  231. data/lib/rubocop/platform.rb +11 -0
  232. data/lib/rubocop/processed_source.rb +1 -1
  233. data/lib/rubocop/remote_config.rb +18 -6
  234. data/lib/rubocop/result_cache.rb +8 -8
  235. data/lib/rubocop/rspec/cop_helper.rb +2 -0
  236. data/lib/rubocop/rspec/shared_contexts.rb +20 -0
  237. data/lib/rubocop/rspec/shared_examples.rb +1 -1
  238. data/lib/rubocop/runner.rb +2 -2
  239. data/lib/rubocop/target_finder.rb +64 -6
  240. data/lib/rubocop/version.rb +2 -4
  241. metadata +27 -4
  242. data/lib/rubocop/cop/variable_force/locatable.rb +0 -200
@@ -16,7 +16,7 @@ module RuboCop
16
16
  lambda do |corrector|
17
17
  backref, = *node
18
18
  parent_type = node.parent ? node.parent.type : nil
19
- if [:dstr, :xstr, :regexp].include?(parent_type)
19
+ if %i(dstr xstr regexp).include?(parent_type)
20
20
  corrector.replace(node.source_range,
21
21
  "{Regexp.last_match(#{backref})}")
22
22
  else
@@ -37,19 +37,15 @@ module RuboCop
37
37
  MSG = 'Use `Hash#%s` instead of `Hash#%s`.'.freeze
38
38
 
39
39
  OFFENDING_SELECTORS = {
40
- short: [:has_key?, :has_value?],
41
- verbose: [:key?, :value?]
40
+ short: %i(has_key? has_value?),
41
+ verbose: %i(key? value?)
42
42
  }.freeze
43
43
 
44
44
  def on_send(node)
45
- _receiver, method_name, *args = *node
46
- return unless args.size == 1 &&
47
- offending_selector?(method_name)
45
+ return unless node.arguments.one? &&
46
+ offending_selector?(node.method_name)
48
47
 
49
- add_offense(node, :selector,
50
- format(MSG,
51
- proper_method_name(method_name),
52
- method_name))
48
+ add_offense(node, :selector)
53
49
  end
54
50
 
55
51
  def autocorrect(node)
@@ -61,6 +57,10 @@ module RuboCop
61
57
 
62
58
  private
63
59
 
60
+ def message(node)
61
+ format(MSG, proper_method_name(node.method_name), node.method_name)
62
+ end
63
+
64
64
  def proper_method_name(method_name)
65
65
  if style == :verbose
66
66
  "has_#{method_name}"
@@ -23,7 +23,8 @@ module RuboCop
23
23
  # # good
24
24
  # raise StandardError, "message"
25
25
  # fail "message"
26
- # raise RuntimeError.new(arg1, arg2, arg3)
26
+ # raise MyCustomError.new(arg1, arg2, arg3)
27
+ # raise MyKwArgError.new(key1: val1, key2: val2)
27
28
  #
28
29
  # @example
29
30
  #
@@ -35,7 +36,7 @@ module RuboCop
35
36
  #
36
37
  # # good
37
38
  # raise StandardError.new("message")
38
- # raise RuntimeError.new(arg1, arg2, arg3)
39
+ # raise MyCustomError.new(arg1, arg2, arg3)
39
40
  # fail "message"
40
41
  class RaiseArgs < Cop
41
42
  include ConfigurableEnforcedStyle
@@ -59,20 +60,18 @@ module RuboCop
59
60
  private
60
61
 
61
62
  def autocorrect(node)
62
- _scope, method, *args = *node
63
-
64
63
  new_exception = if style == :compact
65
- correction_exploded_to_compact(args)
64
+ correction_exploded_to_compact(node.arguments)
66
65
  else
67
- correction_compact_to_exploded(args)
66
+ correction_compact_to_exploded(node.first_argument)
68
67
  end
69
- replacement = "#{method} #{new_exception}"
68
+ replacement = "#{node.method_name} #{new_exception}"
70
69
 
71
70
  ->(corrector) { corrector.replace(node.source_range, replacement) }
72
71
  end
73
72
 
74
73
  def correction_compact_to_exploded(node)
75
- exception_node, _new, message_node = *node.first
74
+ exception_node, _new, message_node = *node
76
75
 
77
76
  message = message_node && message_node.source
78
77
 
@@ -91,10 +90,8 @@ module RuboCop
91
90
  end
92
91
 
93
92
  def check_compact(node)
94
- _receiver, selector, *args = *node
95
-
96
- if args.size > 1
97
- add_offense(node, :expression, message(selector)) do
93
+ if node.arguments.size > 1
94
+ add_offense(node, :expression, message(node.method_name)) do
98
95
  opposite_style_detected
99
96
  end
100
97
  else
@@ -103,26 +100,33 @@ module RuboCop
103
100
  end
104
101
 
105
102
  def check_exploded(node)
106
- _receiver, selector, *args = *node
103
+ return correct_style_detected unless node.arguments.one?
107
104
 
108
- return correct_style_detected unless args.one?
109
- arg, = *args
105
+ first_arg = node.first_argument
110
106
 
111
- return unless arg.send_type? && arg.loc.selector.is?('new')
112
- _receiver, _selector, *constructor_args = *arg
107
+ return unless first_arg.send_type? && first_arg.method?(:new)
113
108
 
114
- # Allow code like `raise Ex.new(arg1, arg2)`.
115
- return unless constructor_args.size <= 1
109
+ return if acceptable_exploded_args?(first_arg.arguments)
116
110
 
117
- # Allow code like `raise Ex.new(*args)`
118
- first_arg = constructor_args.first
119
- return if first_arg && first_arg.splat_type?
120
-
121
- add_offense(node, :expression, message(selector)) do
111
+ add_offense(node, :expression, message(node.method_name)) do
122
112
  opposite_style_detected
123
113
  end
124
114
  end
125
115
 
116
+ def acceptable_exploded_args?(args)
117
+ # Allow code like `raise Ex.new(arg1, arg2)`.
118
+ return true if args.size > 1
119
+
120
+ # Disallow zero arguments.
121
+ return false if args.empty?
122
+
123
+ arg = args.first
124
+
125
+ # Allow code like `raise Ex.new(kw: arg)`.
126
+ # Allow code like `raise Ex.new(*args)`.
127
+ arg.hash_type? || arg.splat_type?
128
+ end
129
+
126
130
  def message(method)
127
131
  if style == :compact
128
132
  format(COMPACT_MSG, method)
@@ -17,13 +17,11 @@ module RuboCop
17
17
  MSG = 'Do not freeze immutable objects, as freezing them has no ' \
18
18
  'effect.'.freeze
19
19
 
20
- def_node_matcher :freezing?, '(send $_ :freeze)'
21
-
22
20
  def on_send(node)
23
- freezing?(node) do |receiver|
24
- return unless immutable_literal?(receiver)
25
- add_offense(node, :expression)
26
- end
21
+ return unless node.receiver && node.method?(:freeze) &&
22
+ immutable_literal?(node.receiver)
23
+
24
+ add_offense(node, :expression)
27
25
  end
28
26
 
29
27
  def autocorrect(node)
@@ -36,8 +34,8 @@ module RuboCop
36
34
  private
37
35
 
38
36
  def immutable_literal?(node)
39
- return false unless node
40
37
  return true if node.immutable_literal?
38
+
41
39
  FROZEN_STRING_LITERAL_TYPES.include?(node.type) &&
42
40
  frozen_string_literals_enabled?
43
41
  end
@@ -16,7 +16,7 @@ module RuboCop
16
16
  class RedundantParentheses < Cop
17
17
  include Parentheses
18
18
 
19
- ALLOWED_LITERALS = [:irange, :erange].freeze
19
+ ALLOWED_LITERALS = %i(irange erange).freeze
20
20
 
21
21
  def_node_matcher :square_brackets?,
22
22
  '(send {(send _recv _msg) str array hash} :[] ...)'
@@ -191,8 +191,7 @@ module RuboCop
191
191
  def call_chain_starts_with_int?(begin_node, send_node)
192
192
  recv = first_part_of_call_chain(send_node)
193
193
  recv && recv.int_type? && (parent = begin_node.parent) &&
194
- parent.send_type? &&
195
- (parent.method_name == :-@ || parent.method_name == :+@)
194
+ parent.send_type? && (parent.method?(:-@) || parent.method?(:+@))
196
195
  end
197
196
  end
198
197
  end
@@ -84,26 +84,22 @@ module RuboCop
84
84
  end
85
85
 
86
86
  def on_lvasgn(node)
87
- lhs, _rhs = *node
88
- @local_variables_scopes[node] << lhs
87
+ lhs, rhs = *node
88
+ @local_variables_scopes[rhs] << lhs
89
89
  end
90
90
 
91
- # Detect offenses
92
-
93
91
  def on_send(node)
94
- receiver, method_name, *_args = *node
95
- return unless receiver && receiver.self_type?
96
- return unless regular_method_call?(node)
92
+ return unless node.self_receiver? && regular_method_call?(node)
97
93
 
98
94
  return if @allowed_send_nodes.include?(node) ||
99
- @local_variables_scopes[node].include?(method_name)
95
+ @local_variables_scopes[node].include?(node.method_name)
96
+
100
97
  add_offense(node, :expression)
101
98
  end
102
99
 
103
100
  def autocorrect(node)
104
- receiver, _method_name, *_args = *node
105
101
  lambda do |corrector|
106
- corrector.remove(receiver.source_range)
102
+ corrector.remove(node.receiver.source_range)
107
103
  corrector.remove(node.loc.dot)
108
104
  end
109
105
  end
@@ -118,13 +114,11 @@ module RuboCop
118
114
  end
119
115
 
120
116
  def regular_method_call?(node)
121
- _receiver, method_name, *_args = *node
122
-
123
- !(operator?(method_name) ||
124
- keyword?(method_name) ||
125
- constant_name?(method_name) ||
126
- node.asgn_method_call? ||
127
- braces_style_call?(node))
117
+ !(operator?(node.method_name) ||
118
+ keyword?(node.method_name) ||
119
+ node.camel_case_method? ||
120
+ node.setter_method? ||
121
+ node.implicit_call?)
128
122
  end
129
123
 
130
124
  def on_argument(node)
@@ -133,27 +127,15 @@ module RuboCop
133
127
  end
134
128
 
135
129
  def keyword?(method_name)
136
- [:alias, :and, :begin, :break, :case, :class, :def, :defined?, :do,
137
- :else, :elsif, :end, :ensure, :false, :for, :if, :in, :module,
138
- :next, :nil, :not, :or, :redo, :rescue, :retry, :return, :self,
139
- :super, :then, :true, :undef, :unless, :until, :when, :while,
140
- :yield].include?(method_name)
141
- end
142
-
143
- def constant_name?(method_name)
144
- method_name.match(/^[A-Z]/)
145
- end
146
-
147
- def braces_style_call?(node)
148
- node.loc.selector.nil?
130
+ %i(alias and begin break case class def defined? do
131
+ else elsif end ensure false for if in module
132
+ next nil not or redo rescue retry return self
133
+ super then true undef unless until when while
134
+ yield).include?(method_name)
149
135
  end
150
136
 
151
137
  def allow_self(node)
152
- return unless node.send_type?
153
-
154
- receiver, _method_name, *_args = *node
155
-
156
- return unless receiver && receiver.self_type?
138
+ return unless node.send_type? && node.self_receiver?
157
139
 
158
140
  @allowed_send_nodes << node
159
141
  end
@@ -6,18 +6,12 @@ module RuboCop
6
6
  # This cop checks for uses of rescue in its modifier form.
7
7
  class RescueModifier < Cop
8
8
  include AutocorrectAlignment
9
+ include RescueNode
9
10
 
10
11
  MSG = 'Avoid using `rescue` in its modifier form.'.freeze
11
12
 
12
- def investigate(processed_source)
13
- @modifier_locations = processed_source
14
- .tokens
15
- .select { |t| t.type == :kRESCUE_MOD }
16
- .map(&:pos)
17
- end
18
-
19
13
  def on_resbody(node)
20
- return unless modifier?(node)
14
+ return unless rescue_modifier?(node)
21
15
  add_offense(node.parent, :expression)
22
16
  end
23
17
 
@@ -37,12 +31,6 @@ module RuboCop
37
31
  corrector.replace(node.source_range, correction)
38
32
  end
39
33
  end
40
-
41
- private
42
-
43
- def modifier?(node)
44
- @modifier_locations.include?(node.loc.keyword)
45
- end
46
34
  end
47
35
  end
48
36
  end
@@ -14,7 +14,7 @@ module RuboCop
14
14
  # x += 1
15
15
  class SelfAssignment < Cop
16
16
  MSG = 'Use self-assignment shorthand `%s=`.'.freeze
17
- OPS = [:+, :-, :*, :**, :/, :|, :&].freeze
17
+ OPS = %i(+ - * ** / | &).freeze
18
18
 
19
19
  def on_lvasgn(node)
20
20
  check(node, :lvar)
@@ -36,7 +36,7 @@ module RuboCop
36
36
 
37
37
  if rhs.send_type?
38
38
  check_send_node(node, rhs, var_name, var_type)
39
- elsif [:and, :or].include?(rhs.type)
39
+ elsif %i(and or).include?(rhs.type)
40
40
  check_boolean_node(node, rhs, var_name, var_type)
41
41
  end
42
42
  end
@@ -66,7 +66,7 @@ module RuboCop
66
66
 
67
67
  if rhs.send_type?
68
68
  autocorrect_send_node(node, rhs)
69
- elsif [:and, :or].include?(rhs.type)
69
+ elsif %i(and or).include?(rhs.type)
70
70
  autocorrect_boolean_node(node, rhs)
71
71
  end
72
72
  end
@@ -8,13 +8,12 @@ module RuboCop
8
8
  MSG = 'Prefer `Object#__send__` or `Object#public_send` to ' \
9
9
  '`send`.'.freeze
10
10
 
11
- def_node_matcher :sending?, '(send _ :send $...)'
11
+ def_node_matcher :sending?, '(send _ :send ...)'
12
12
 
13
13
  def on_send(node)
14
- sending?(node) do |args|
15
- return if args.empty?
16
- add_offense(node, :selector)
17
- end
14
+ return unless sending?(node) && node.arguments?
15
+
16
+ add_offense(node, :selector)
18
17
  end
19
18
  end
20
19
  end
@@ -15,22 +15,21 @@ module RuboCop
15
15
  MSG = 'Do not leave space between `!` and its argument.'.freeze
16
16
 
17
17
  def on_send(node)
18
- return unless node.keyword_bang? && whitespace_after_bang_op?(node)
18
+ return unless node.keyword_bang? && whitespace_after_operator?(node)
19
19
 
20
20
  add_offense(node, :expression)
21
21
  end
22
22
 
23
- def whitespace_after_bang_op?(node)
24
- receiver, _method_name, *_args = *node
25
- receiver.loc.column - node.loc.column > 1
23
+ def whitespace_after_operator?(node)
24
+ node.receiver.loc.column - node.loc.column > 1
26
25
  end
27
26
 
28
27
  def autocorrect(node)
29
28
  lambda do |corrector|
30
- receiver, _method_name, *_args = *node
31
- space_range = range_between(node.loc.selector.end_pos,
32
- receiver.source_range.begin_pos)
33
- corrector.remove(space_range)
29
+ corrector.remove(
30
+ range_between(node.loc.selector.end_pos,
31
+ node.receiver.source_range.begin_pos)
32
+ )
34
33
  end
35
34
  end
36
35
  end
@@ -40,7 +40,7 @@ module RuboCop
40
40
  end
41
41
 
42
42
  def on_block(node)
43
- check(node, [:begin, :end].freeze)
43
+ check(node, %i(begin end).freeze)
44
44
  end
45
45
 
46
46
  def on_break(node)
@@ -48,7 +48,7 @@ module RuboCop
48
48
  end
49
49
 
50
50
  def on_case(node)
51
- check(node, [:keyword, :else].freeze)
51
+ check(node, %i(keyword else).freeze)
52
52
  end
53
53
 
54
54
  def on_ensure(node)
@@ -56,15 +56,15 @@ module RuboCop
56
56
  end
57
57
 
58
58
  def on_for(node)
59
- check(node, [:begin, :end].freeze)
59
+ check(node, %i(begin end).freeze)
60
60
  end
61
61
 
62
62
  def on_if(node)
63
- check(node, [:keyword, :else, :begin, :end].freeze, 'then'.freeze)
63
+ check(node, %i(keyword else begin end).freeze, 'then'.freeze)
64
64
  end
65
65
 
66
66
  def on_kwbegin(node)
67
- check(node, [:begin, :end].freeze, nil)
67
+ check(node, %i(begin end).freeze, nil)
68
68
  end
69
69
 
70
70
  def on_next(node)
@@ -108,7 +108,7 @@ module RuboCop
108
108
  end
109
109
 
110
110
  def on_until(node)
111
- check(node, [:begin, :end, :keyword].freeze)
111
+ check(node, %i(begin end keyword).freeze)
112
112
  end
113
113
 
114
114
  def on_when(node)
@@ -116,7 +116,7 @@ module RuboCop
116
116
  end
117
117
 
118
118
  def on_while(node)
119
- check(node, [:begin, :end, :keyword].freeze)
119
+ check(node, %i(begin end keyword).freeze)
120
120
  end
121
121
 
122
122
  def on_yield(node)
@@ -203,11 +203,10 @@ module RuboCop
203
203
  def preceded_by_operator?(node, _range)
204
204
  # regular dotted method calls bind more tightly than operators
205
205
  # so we need to climb up the AST past them
206
- while (ancestor = node.parent)
206
+ node.each_ancestor do |ancestor|
207
207
  return true if ancestor.and_type? || ancestor.or_type?
208
208
  return false unless ancestor.send_type?
209
209
  return true if operator?(ancestor.method_name)
210
- node = ancestor
211
210
  end
212
211
  false
213
212
  end