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
@@ -39,14 +39,14 @@ module RuboCop
39
39
  return if FROZEN_STRING_LITERAL_TYPES.include?(value.type) &&
40
40
  frozen_string_literals_enabled?
41
41
 
42
- add_offense(value, :expression)
42
+ add_offense(value)
43
43
  end
44
44
 
45
45
  def autocorrect(node)
46
46
  expr = node.source_range
47
47
 
48
48
  lambda do |corrector|
49
- if unbracketed_array?(node)
49
+ if node.array_type? && !node.bracketed?
50
50
  corrector.insert_before(expr, '[')
51
51
  corrector.insert_after(expr, '].freeze')
52
52
  else
@@ -55,10 +55,6 @@ module RuboCop
55
55
  end
56
56
  end
57
57
 
58
- def unbracketed_array?(node)
59
- node.array_type? && !node.square_brackets? && !node.percent_literal?
60
- end
61
-
62
58
  def_node_matcher :splat_value, <<-PATTERN
63
59
  (array (splat $_))
64
60
  PATTERN
@@ -82,21 +82,25 @@ module RuboCop
82
82
 
83
83
  def on_if(node)
84
84
  return if node.elsif? || node.ternary?
85
- return if style == :prefix && node.modifier_form?
86
- return if style == :postfix && !node.modifier_form?
85
+ return if correct_style?(node)
87
86
 
88
87
  check_negative_conditional(node)
89
88
  end
90
89
 
90
+ private
91
+
91
92
  def message(node)
92
93
  format(MSG, node.inverse_keyword, node.keyword)
93
94
  end
94
95
 
95
- private
96
-
97
96
  def autocorrect(node)
98
97
  negative_conditional_corrector(node)
99
98
  end
99
+
100
+ def correct_style?(node)
101
+ style == :prefix && node.modifier_form? ||
102
+ style == :postfix && !node.modifier_form?
103
+ end
100
104
  end
101
105
  end
102
106
  end
@@ -14,9 +14,6 @@ module RuboCop
14
14
  # method1(method2 arg, method3, arg)
15
15
  class NestedParenthesizedCalls < Cop
16
16
  MSG = 'Add parentheses to nested method call `%s`.'.freeze
17
- RSPEC_MATCHERS = %i[be eq eql equal be_kind_of be_instance_of
18
- respond_to be_between match be_within
19
- start_with end_with include raise_error].freeze
20
17
 
21
18
  def on_send(node)
22
19
  return unless node.parenthesized?
@@ -33,13 +30,12 @@ module RuboCop
33
30
  def allowed_omission?(send_node)
34
31
  !send_node.arguments? || send_node.parenthesized? ||
35
32
  send_node.setter_method? || send_node.operator_method? ||
36
- rspec_matcher?(send_node)
33
+ whitelisted?(send_node)
37
34
  end
38
35
 
39
- # TODO: Relegate this from RuboCop core
40
- def rspec_matcher?(send_node)
41
- send_node.parent.arguments.one? && # .to, .not_to, etc
42
- RSPEC_MATCHERS.include?(send_node.method_name) &&
36
+ def whitelisted?(send_node)
37
+ send_node.parent.arguments.one? &&
38
+ whitelisted_methods.include?(send_node.method_name.to_s) &&
43
39
  send_node.arguments.one?
44
40
  end
45
41
 
@@ -55,6 +51,10 @@ module RuboCop
55
51
  corrector.insert_after(last_arg, ')')
56
52
  end
57
53
  end
54
+
55
+ def whitelisted_methods
56
+ cop_config['Whitelist'] || []
57
+ end
58
58
  end
59
59
  end
60
60
  end
@@ -12,7 +12,7 @@ module RuboCop
12
12
  return unless node.ternary?
13
13
 
14
14
  node.each_descendant(:if).select(&:ternary?).each do |nested_ternary|
15
- add_offense(nested_ternary, :expression)
15
+ add_offense(nested_ternary)
16
16
  end
17
17
  end
18
18
  end
@@ -24,8 +24,6 @@ module RuboCop
24
24
  # !current_user.nil?
25
25
  # end
26
26
  class NonNilCheck < Cop
27
- include OnMethodDef
28
-
29
27
  def_node_matcher :not_equal_to_nil?, '(send _ :!= (:nil))'
30
28
  def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
31
29
  def_node_matcher :nil_check?, '(send _ :nil?)'
@@ -38,9 +36,22 @@ module RuboCop
38
36
  add_offense(node, :selector)
39
37
  elsif include_semantic_changes? &&
40
38
  (not_and_nil_check?(node) || unless_and_nil_check?(node))
41
- add_offense(node, :expression)
39
+ add_offense(node)
40
+ end
41
+ end
42
+
43
+ def on_def(node)
44
+ body = node.body
45
+
46
+ return unless node.predicate_method? && body
47
+
48
+ if body.begin_type?
49
+ ignore_node(body.children.last)
50
+ else
51
+ ignore_node(body)
42
52
  end
43
53
  end
54
+ alias on_defs on_def
44
55
 
45
56
  private
46
57
 
@@ -63,17 +74,6 @@ module RuboCop
63
74
  cop_config['IncludeSemanticChanges']
64
75
  end
65
76
 
66
- def on_method_def(_node, name, _args, body)
67
- # only predicate methods are handled differently
68
- return unless name.to_s.end_with?('?') && body
69
-
70
- if body.begin_type?
71
- ignore_node(body.children.last)
72
- else
73
- ignore_node(body)
74
- end
75
- end
76
-
77
77
  def autocorrect(node)
78
78
  case node.method_name
79
79
  when :!=
@@ -27,14 +27,18 @@ module RuboCop
27
27
 
28
28
  def on_int(node)
29
29
  type = literal_type(node)
30
+
30
31
  return unless type
31
32
 
32
- msg = self.class.const_get("#{type.upcase}_MSG")
33
- add_offense(node, :expression, msg)
33
+ add_offense(node)
34
34
  end
35
35
 
36
36
  private
37
37
 
38
+ def message(node)
39
+ self.class.const_get("#{literal_type(node).upcase}_MSG")
40
+ end
41
+
38
42
  def autocorrect(node)
39
43
  lambda do |corrector|
40
44
  type = literal_type(node)
@@ -56,9 +56,9 @@ module RuboCop
56
56
 
57
57
  case int
58
58
  when /^\d+$/
59
- add_offense(node, :expression) { self.max = int.size + 1 }
59
+ add_offense(node) { self.max = int.size + 1 }
60
60
  when /\d{4}/, short_group_regex
61
- add_offense(node, :expression) do
61
+ add_offense(node) do
62
62
  self.config_to_allow_offenses = { 'Enabled' => false }
63
63
  end
64
64
  end
@@ -8,10 +8,14 @@ module RuboCop
8
8
  # These can be replaced by their respective predicate methods.
9
9
  # The cop can also be configured to do the reverse.
10
10
  #
11
- # The cop disregards `nonzero?` as it its value is truthy or falsey,
11
+ # The cop disregards `#nonzero?` as it its value is truthy or falsey,
12
12
  # but not `true` and `false`, and thus not always interchangeable with
13
13
  # `!= 0`.
14
14
  #
15
+ # The cop ignores comparisons to global variables, since they are often
16
+ # populated with objects which can be compared with integers, but are
17
+ # not themselves `Interger` polymorphic.
18
+ #
15
19
  # @example
16
20
  #
17
21
  # # EnforcedStyle: predicate (default)
@@ -59,7 +63,7 @@ module RuboCop
59
63
 
60
64
  return unless numeric
61
65
 
62
- add_offense(node, node.loc.expression,
66
+ add_offense(node, :expression,
63
67
  format(MSG, replacement, node.source))
64
68
  end
65
69
 
@@ -128,11 +132,11 @@ module RuboCop
128
132
  PATTERN
129
133
 
130
134
  def_node_matcher :comparison, <<-PATTERN
131
- (send $(...) ${:== :> :<} (int 0))
135
+ (send [$(...) !gvar_type?] ${:== :> :<} (int 0))
132
136
  PATTERN
133
137
 
134
138
  def_node_matcher :inverted_comparison, <<-PATTERN
135
- (send (int 0) ${:== :> :<} $(...))
139
+ (send (int 0) ${:== :> :<} [$(...) !gvar_type?])
136
140
  PATTERN
137
141
  end
138
142
  end
@@ -14,15 +14,21 @@ module RuboCop
14
14
  def on_normal_if_unless(node)
15
15
  return unless node.single_line? && node.else_branch
16
16
 
17
- add_offense(node, :expression, format(MSG, node.keyword))
17
+ add_offense(node)
18
18
  end
19
19
 
20
+ private
21
+
20
22
  def autocorrect(node)
21
23
  lambda do |corrector|
22
24
  corrector.replace(node.source_range, replacement(node))
23
25
  end
24
26
  end
25
27
 
28
+ def message(node)
29
+ format(MSG, node.keyword)
30
+ end
31
+
26
32
  def replacement(node)
27
33
  return to_ternary(node) unless node.parent
28
34
 
@@ -56,8 +62,7 @@ module RuboCop
56
62
  end
57
63
 
58
64
  def method_call_with_changed_precedence?(node)
59
- return false unless node.send_type?
60
- return false if node.method_args.empty?
65
+ return false unless node.send_type? && node.arguments?
61
66
  return false if parenthesized_call?(node)
62
67
 
63
68
  !operator?(node.method_name)
@@ -32,7 +32,7 @@ module RuboCop
32
32
  return unless default_value.hash_type? && default_value.pairs.empty?
33
33
  return unless suspicious_name?(arg)
34
34
 
35
- add_offense(last_arg, :expression, MSG)
35
+ add_offense(last_arg)
36
36
  end
37
37
 
38
38
  def validate_config
@@ -26,8 +26,7 @@ module RuboCop
26
26
  arguments = *arguments
27
27
 
28
28
  each_misplaced_optional_arg(arguments) do |argument|
29
- arg, = *argument
30
- add_offense(argument, :expression, format(MSG, arg))
29
+ add_offense(argument)
31
30
  end
32
31
  end
33
32
 
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for potential usage of the `||=` operator.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # name = name ? name : 'Bozhidar'
11
+ #
12
+ # # bad
13
+ # name = if name
14
+ # name
15
+ # else
16
+ # 'Bozhidar'
17
+ # end
18
+ #
19
+ # # bad
20
+ # unless name
21
+ # name = 'Bozhidar'
22
+ # end
23
+ #
24
+ # # bad
25
+ # name = 'Bozhidar' unless name
26
+ #
27
+ # # good - set name to 'Bozhidar', only if it's nil or false
28
+ # name ||= 'Bozhidar'
29
+ class OrAssignment < Cop
30
+ MSG = 'Use the double pipe equals operator `||=` instead.'.freeze
31
+
32
+ def_node_matcher :ternary_assignment?, <<-PATTERN
33
+ ({lvasgn ivasgn cvasgn gvasgn} _var
34
+ (if
35
+ ({lvar ivar cvar gvar} _var)
36
+ ({lvar ivar cvar gvar} _var)
37
+ _))
38
+ PATTERN
39
+
40
+ def_node_matcher :unless_assignment?, <<-PATTERN
41
+ (if
42
+ ({lvar ivar cvar gvar} _var) nil
43
+ ({lvasgn ivasgn cvasgn gvasgn} _var
44
+ _))
45
+ PATTERN
46
+
47
+ def on_if(node)
48
+ return unless unless_assignment?(node)
49
+ add_offense(node)
50
+ end
51
+
52
+ def on_lvasgn(node)
53
+ return unless ternary_assignment?(node)
54
+ add_offense(node)
55
+ end
56
+
57
+ alias on_ivasgn on_lvasgn
58
+ alias on_cvasgn on_lvasgn
59
+ alias on_gvasgn on_lvasgn
60
+
61
+ private
62
+
63
+ def autocorrect(node)
64
+ if ternary_assignment?(node)
65
+ variable, default = take_variable_and_default_from_ternary(node)
66
+ else
67
+ variable, default = take_variable_and_default_from_unless(node)
68
+ end
69
+
70
+ lambda do |corrector|
71
+ corrector.replace(node.source_range,
72
+ "#{variable} ||= #{default.source}")
73
+ end
74
+ end
75
+
76
+ def take_variable_and_default_from_ternary(node)
77
+ variable, if_statement = *node
78
+ [variable, if_statement.else_branch]
79
+ end
80
+
81
+ def take_variable_and_default_from_unless(node)
82
+ variable, default = *node.if_branch
83
+ [variable, default]
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -35,7 +35,7 @@ module RuboCop
35
35
  return if allowed_lhs?(lhs) || allowed_rhs?(rhs) ||
36
36
  allowed_masign?(lhs_elements, rhs_elements)
37
37
 
38
- add_offense(node, :expression)
38
+ add_offense(node)
39
39
  end
40
40
 
41
41
  private
@@ -159,7 +159,7 @@ module RuboCop
159
159
  def accesses?(rhs, lhs)
160
160
  if lhs.method?(:[]=)
161
161
  matching_calls(rhs, lhs.receiver, :[]).any? do |args|
162
- args == lhs.method_args
162
+ args == lhs.arguments
163
163
  end
164
164
  else
165
165
  access_method = lhs.method_name.to_s.chop.to_sym
@@ -18,23 +18,24 @@ module RuboCop
18
18
  def on_while(node)
19
19
  process_control_op(node)
20
20
  end
21
-
22
- def on_until(node)
23
- process_control_op(node)
24
- end
21
+ alias on_until on_while
25
22
 
26
23
  private
27
24
 
25
+ def_node_matcher :control_op_condition, <<-PATTERN
26
+ (begin $_ ...)
27
+ PATTERN
28
+
28
29
  def process_control_op(node)
29
30
  cond = node.condition
30
31
 
31
- return unless cond.begin_type?
32
- return if cond.children.empty?
33
- return if modifier_op?(cond.children.first)
34
- return if parens_required?(node.children.first)
35
- return if safe_assignment?(cond) && safe_assignment_allowed?
32
+ control_op_condition(cond) do |first_child|
33
+ return if modifier_op?(first_child)
34
+ return if parens_required?(node.children.first)
35
+ return if safe_assignment?(cond) && safe_assignment_allowed?
36
36
 
37
- add_offense(cond, :expression, message(node))
37
+ add_offense(cond)
38
+ end
38
39
  end
39
40
 
40
41
  def modifier_op?(node)
@@ -46,7 +47,7 @@ module RuboCop
46
47
  end
47
48
 
48
49
  def message(node)
49
- kw = node.keyword
50
+ kw = node.parent.keyword
50
51
  article = kw == 'while' ? 'a' : 'an'
51
52
  "Don't use parentheses around the condition of #{article} `#{kw}`."
52
53
  end
@@ -73,7 +73,7 @@ module RuboCop
73
73
  return if uses_preferred_delimiter?(node, type) ||
74
74
  contains_preferred_delimiter?(node, type)
75
75
 
76
- add_offense(node, :expression)
76
+ add_offense(node)
77
77
  end
78
78
 
79
79
  def uses_preferred_delimiter?(node, type)
@@ -25,7 +25,7 @@ module RuboCop
25
25
  # i.e., if the string would become dynamic or has special characters.
26
26
  return if node.children != parse(corrected(node.source)).ast.children
27
27
 
28
- add_offense(node, :begin, message)
28
+ add_offense(node, :begin)
29
29
  end
30
30
 
31
31
  def correct_literal_style?(node)
@@ -33,7 +33,7 @@ module RuboCop
33
33
  style == :upper_case_q && type(node) == '%Q'
34
34
  end
35
35
 
36
- def message
36
+ def message(_node)
37
37
  style == :lower_case_q ? LOWER_CASE_Q_MSG : UPPER_CASE_Q_MSG
38
38
  end
39
39