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
@@ -18,7 +18,7 @@ module RuboCop
18
18
  def on_sym(node)
19
19
  return unless node.source =~ /\A:["'][A-Za-z_]\w*["']\z/
20
20
 
21
- add_offense(node, :expression)
21
+ add_offense(node)
22
22
  end
23
23
 
24
24
  def autocorrect(node)
@@ -19,8 +19,8 @@ module RuboCop
19
19
  def_node_matcher :symbol_proc?, <<-PATTERN
20
20
  (block
21
21
  ${(send ...) (super ...) zsuper}
22
- $(args (arg _))
23
- $(send lvar $_))
22
+ (args (arg _var))
23
+ (send (lvar _var) $_))
24
24
  PATTERN
25
25
 
26
26
  def self.autocorrect_incompatible_with
@@ -28,7 +28,7 @@ module RuboCop
28
28
  end
29
29
 
30
30
  def on_block(node)
31
- symbol_proc?(node) do |send_or_super, block_args, block_body, method|
31
+ symbol_proc?(node) do |send_or_super, method|
32
32
  block_method_name = resolve_block_method_name(send_or_super)
33
33
 
34
34
  # TODO: Rails-specific handling that we should probably make
@@ -37,7 +37,6 @@ module RuboCop
37
37
  return if proc_node?(send_or_super)
38
38
  return if %i[lambda proc].include?(block_method_name)
39
39
  return if ignored_method?(block_method_name)
40
- return unless can_shorten?(block_args, block_body)
41
40
 
42
41
  offense(node, method, block_method_name)
43
42
  end
@@ -124,20 +123,6 @@ module RuboCop
124
123
  ignored_methods.include?(name.to_s)
125
124
  end
126
125
 
127
- def can_shorten?(block_args, block_body)
128
- argument_matches_receiver?(block_args, block_body)
129
- end
130
-
131
- # TODO: This might be clearer as a node matcher with unification
132
- def argument_matches_receiver?(block_args, block_body)
133
- receiver, = *block_body
134
-
135
- block_arg_name, = *block_args.children.first
136
- receiver_name, = *receiver
137
-
138
- block_arg_name == receiver_name
139
- end
140
-
141
126
  def super?(node)
142
127
  SUPER_TYPES.include?(node.type)
143
128
  end
@@ -54,6 +54,9 @@ module RuboCop
54
54
  include ConfigurableEnforcedStyle
55
55
  include SurroundingSpace
56
56
 
57
+ VARIABLE_TYPES = AST::Node::VARIABLES
58
+ NON_COMPLEX_TYPES = [*VARIABLE_TYPES, :const, :defined?, :yield].freeze
59
+
57
60
  MSG = '%s parentheses for ternary conditions.'.freeze
58
61
  MSG_COMPLEX = '%s parentheses for ternary expressions with' \
59
62
  ' complex conditions.'.freeze
@@ -61,7 +64,7 @@ module RuboCop
61
64
  def on_if(node)
62
65
  return unless node.ternary? && !infinite_loop? && offense?(node)
63
66
 
64
- add_offense(node, node.source_range, message(node))
67
+ add_offense(node, node.source_range)
65
68
  end
66
69
 
67
70
  private
@@ -102,17 +105,21 @@ module RuboCop
102
105
  if condition.begin_type?
103
106
  condition.to_a.any? { |x| complex_condition?(x) }
104
107
  else
105
- non_complex_type?(condition) ? false : true
108
+ non_complex_expression?(condition) ? false : true
106
109
  end
107
110
  end
108
111
 
109
112
  # Anything that is not a variable, constant, or method/.method call
110
113
  # will be counted as a complex expression.
111
- def non_complex_type?(condition)
112
- condition.variable? || condition.const_type? ||
113
- (condition.send_type? && !operator?(condition.method_name)) ||
114
- condition.defined_type? || condition.yield_type? ||
115
- square_brackets?(condition)
114
+ def non_complex_expression?(condition)
115
+ NON_COMPLEX_TYPES.include?(condition.type) ||
116
+ non_complex_send?(condition)
117
+ end
118
+
119
+ def non_complex_send?(node)
120
+ return false unless node.send_type?
121
+
122
+ !node.operator_method? || node.method?(:[])
116
123
  end
117
124
 
118
125
  def message(node)
@@ -165,9 +172,6 @@ module RuboCop
165
172
  (send {_ nil} _ $(send nil _)...)}
166
173
  PATTERN
167
174
 
168
- def_node_matcher :square_brackets?,
169
- '(send {(send _recv _msg) str array hash} :[] ...)'
170
-
171
175
  def correct_parenthesized(condition)
172
176
  lambda do |corrector|
173
177
  corrector.remove(condition.loc.begin)
@@ -96,16 +96,35 @@ module RuboCop
96
96
 
97
97
  return unless first_offense
98
98
 
99
- end_position =
100
- if first_offense.source_range == variables.first.source_range
101
- right.source_range.begin_pos
102
- else
103
- node.loc.operator.begin_pos
104
- end
99
+ if unused_variables_only?(first_offense, variables)
100
+ return left_side_range(left, right)
101
+ end
102
+
103
+ if Util.parentheses?(left)
104
+ return range_for_parentheses(first_offense, left)
105
+ end
106
+
107
+ range_between(
108
+ first_offense.source_range.begin_pos,
109
+ node.loc.operator.begin_pos
110
+ )
111
+ end
112
+
113
+ def unused_variables_only?(offense, variables)
114
+ offense.source_range == variables.first.source_range
115
+ end
116
+
117
+ def left_side_range(left, right)
118
+ range_between(
119
+ left.source_range.begin_pos, right.source_range.begin_pos
120
+ )
121
+ end
105
122
 
106
- range = range_between(first_offense.source_range.begin_pos,
107
- end_position)
108
- range_with_surrounding_space(range, :right)
123
+ def range_for_parentheses(offense, left)
124
+ range_between(
125
+ offense.source_range.begin_pos - 1,
126
+ left.loc.expression.end_pos - 1
127
+ )
109
128
  end
110
129
  end
111
130
  end
@@ -10,16 +10,11 @@ module RuboCop
10
10
 
11
11
  def on_def(node)
12
12
  return if in_module_or_instance_eval?(node)
13
- method_name, args, body = *node
14
- on_method_def(node, method_name, args, body)
15
- end
13
+ return if ignore_class_methods? && node.defs_type?
16
14
 
17
- def on_defs(node)
18
- return if in_module_or_instance_eval?(node)
19
- return if ignore_class_methods?
20
- _scope, method_name, args, body = *node
21
- on_method_def(node, method_name, args, body)
15
+ on_method_def(node)
22
16
  end
17
+ alias on_defs on_def
23
18
 
24
19
  private
25
20
 
@@ -37,10 +32,10 @@ module RuboCop
37
32
  false
38
33
  end
39
34
 
40
- def on_method_def(node, method_name, args, body)
41
- kind = if trivial_reader?(method_name, args, body)
35
+ def on_method_def(node)
36
+ kind = if trivial_reader?(node)
42
37
  'reader'
43
- elsif trivial_writer?(method_name, args, body)
38
+ elsif trivial_writer?(node)
44
39
  'writer'
45
40
  end
46
41
  return unless kind
@@ -69,61 +64,53 @@ module RuboCop
69
64
  Array(whitelist).map(&:to_sym) + [:initialize]
70
65
  end
71
66
 
72
- def predicate?(method_name)
73
- method_name[-1] == '?'
74
- end
75
-
76
67
  def dsl_writer?(method_name)
77
68
  !method_name.to_s.end_with?('=')
78
69
  end
79
70
 
80
- def trivial_reader?(method_name, args, body)
81
- looks_like_trivial_reader?(args, body) &&
82
- !allowed_method?(method_name, body) &&
83
- !allowed_reader?(method_name)
71
+ def trivial_reader?(node)
72
+ looks_like_trivial_reader?(node) &&
73
+ !allowed_method?(node) && !allowed_reader?(node)
84
74
  end
85
75
 
86
- def looks_like_trivial_reader?(args, body)
87
- args.children.empty? && body && body.ivar_type?
76
+ def looks_like_trivial_reader?(node)
77
+ !node.arguments? && node.body && node.body.ivar_type?
88
78
  end
89
79
 
90
- def trivial_writer?(method_name, args, body)
91
- looks_like_trivial_writer?(args, body) &&
92
- !allowed_method?(method_name, body) &&
93
- !allowed_writer?(method_name)
80
+ def trivial_writer?(node)
81
+ looks_like_trivial_writer?(node) &&
82
+ !allowed_method?(node) && !allowed_writer?(node.method_name)
94
83
  end
95
84
 
96
- def looks_like_trivial_writer?(args, body)
97
- args.children.one? &&
98
- !%i[restarg blockarg].include?(args.children[0].type) &&
99
- body && body.ivasgn_type? &&
100
- body.children[1] && body.children[1].lvar_type?
101
- end
85
+ def_node_matcher :looks_like_trivial_writer?, <<-PATTERN
86
+ {(def _ (args (arg ...)) (ivasgn _ (lvar _)))
87
+ (defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
88
+ PATTERN
102
89
 
103
- def allowed_method?(method_name, body)
104
- whitelist.include?(method_name) ||
105
- exact_name_match? && !names_match?(method_name, body)
90
+ def allowed_method?(node)
91
+ whitelist.include?(node.method_name) ||
92
+ exact_name_match? && !names_match?(node)
106
93
  end
107
94
 
108
95
  def allowed_writer?(method_name)
109
96
  allow_dsl_writers? && dsl_writer?(method_name)
110
97
  end
111
98
 
112
- def allowed_reader?(method_name)
113
- allow_predicates? && predicate?(method_name)
99
+ def allowed_reader?(node)
100
+ allow_predicates? && node.predicate_method?
114
101
  end
115
102
 
116
- def names_match?(method_name, body)
117
- ivar_name, = *body
103
+ def names_match?(node)
104
+ ivar_name, = *node.body
118
105
 
119
- method_name.to_s.sub(/[=?]$/, '') == ivar_name[1..-1]
106
+ node.method_name.to_s.sub(/[=?]$/, '') == ivar_name[1..-1]
120
107
  end
121
108
 
122
- def trivial_accessor_kind(method_name, args, body)
123
- if trivial_writer?(method_name, args, body) &&
124
- !dsl_writer?(method_name)
109
+ def trivial_accessor_kind(node)
110
+ if trivial_writer?(node) &&
111
+ !dsl_writer?(node.method_name)
125
112
  'writer'
126
- elsif trivial_reader?(method_name, args, body)
113
+ elsif trivial_reader?(node)
127
114
  'reader'
128
115
  end
129
116
  end
@@ -141,31 +128,27 @@ module RuboCop
141
128
  end
142
129
 
143
130
  def autocorrect_instance(node)
144
- method_name, args, body = *node
145
- unless names_match?(method_name, body) &&
146
- !predicate?(method_name) &&
147
- (kind = trivial_accessor_kind(method_name, args, body))
148
- return
149
- end
131
+ kind = trivial_accessor_kind(node)
132
+
133
+ return unless names_match?(node) && !node.predicate_method? && kind
150
134
 
151
135
  lambda do |corrector|
152
- corrector.replace(node.source_range, accessor(kind, method_name))
136
+ corrector.replace(node.source_range,
137
+ accessor(kind, node.method_name))
153
138
  end
154
139
  end
155
140
 
156
141
  def autocorrect_class(node)
157
- _, method_name, args, body = *node
158
- unless names_match?(method_name, body) &&
159
- (kind = trivial_accessor_kind(method_name, args, body))
160
- return
161
- end
142
+ kind = trivial_accessor_kind(node)
143
+
144
+ return unless names_match?(node) && kind
162
145
 
163
146
  lambda do |corrector|
164
147
  indent = ' ' * node.loc.column
165
148
  corrector.replace(
166
149
  node.source_range,
167
150
  ['class << self',
168
- "#{indent} #{accessor(kind, method_name)}",
151
+ "#{indent} #{accessor(kind, node.method_name)}",
169
152
  "#{indent}end"].join("\n")
170
153
  )
171
154
  end
@@ -11,7 +11,7 @@ module RuboCop
11
11
  def on_if(node)
12
12
  return unless node.unless? && node.else?
13
13
 
14
- add_offense(node, :expression)
14
+ add_offense(node)
15
15
  end
16
16
 
17
17
  def autocorrect(node)
@@ -19,7 +19,7 @@ module RuboCop
19
19
  def on_percent_literal(node)
20
20
  return if requires_interpolation?(node)
21
21
 
22
- add_offense(node, :expression)
22
+ add_offense(node)
23
23
  end
24
24
 
25
25
  def requires_interpolation?(node)
@@ -25,7 +25,7 @@ module RuboCop
25
25
  end
26
26
 
27
27
  def on_dstr(node)
28
- add_offense(node, :expression, MSG) if single_interpolation?(node)
28
+ add_offense(node) if single_interpolation?(node)
29
29
  end
30
30
 
31
31
  private
@@ -35,7 +35,7 @@ module RuboCop
35
35
  return unless start_with_percent_q_variant?(node)
36
36
  return if interpolated_quotes?(node) || allowed_percent_q?(node)
37
37
 
38
- add_offense(node, :expression)
38
+ add_offense(node)
39
39
  end
40
40
 
41
41
  def interpolated_quotes?(node)
@@ -5,9 +5,11 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for variable interpolation (like "#@ivar").
7
7
  class VariableInterpolation < Cop
8
+ # rubocop:disable Lint/InterpolationCheck
8
9
  MSG = 'Replace interpolated variable `%s` ' \
9
10
  'with expression `#{%s}`.'.freeze
10
11
 
12
+ # rubocop:enable Lint/InterpolationCheck
11
13
  def on_dstr(node)
12
14
  check_for_interpolation(node)
13
15
  end
@@ -23,12 +25,15 @@ module RuboCop
23
25
  private
24
26
 
25
27
  def check_for_interpolation(node)
26
- var_nodes(node.children).each do |v|
27
- var = v.source
28
- add_offense(v, :expression, format(MSG, var, var))
28
+ var_nodes(node.children).each do |var_node|
29
+ add_offense(var_node)
29
30
  end
30
31
  end
31
32
 
33
+ def message(node)
34
+ format(MSG, node.source, node.source)
35
+ end
36
+
32
37
  def autocorrect(node)
33
38
  lambda do |corrector|
34
39
  corrector.replace(node.source_range, "{#{node.source}}")
@@ -35,6 +35,7 @@ module RuboCop
35
35
  include ArrayMinSize
36
36
  include ArraySyntax
37
37
  include ConfigurableEnforcedStyle
38
+ include PercentArray
38
39
  include PercentLiteral
39
40
 
40
41
  PERCENT_MSG = 'Use `%w` or `%W` for an array of words.'.freeze
@@ -47,12 +48,16 @@ module RuboCop
47
48
 
48
49
  def on_array(node)
49
50
  if bracketed_array_of?(:str, node)
51
+ return if complex_content?(node.values)
52
+
50
53
  check_bracketed_array(node)
51
54
  elsif node.percent_literal?(:string)
52
55
  check_percent_array(node)
53
56
  end
54
57
  end
55
58
 
59
+ private
60
+
56
61
  def autocorrect(node)
57
62
  if style == :percent
58
63
  correct_percent(node, 'w')
@@ -61,33 +66,11 @@ module RuboCop
61
66
  end
62
67
  end
63
68
 
64
- private
65
-
66
69
  def check_bracketed_array(node)
67
- return if complex_content?(node.values) ||
68
- comments_in_array?(node) ||
69
- below_array_length?(node)
70
+ return if allowed_bracket_array?(node)
70
71
 
71
72
  array_style_detected(:brackets, node.values.size)
72
- add_offense(node, :expression, PERCENT_MSG) if style == :percent
73
- end
74
-
75
- def check_percent_array(node)
76
- array_style_detected(:percent, node.values.size)
77
- add_offense(node, :expression, ARRAY_MSG) if style == :brackets
78
- end
79
-
80
- def percent_syntax?(node)
81
- node.loc.begin && node.loc.begin.source =~ /\A%[wW]/
82
- end
83
-
84
- def comments_in_array?(node)
85
- comments = processed_source.comments
86
- array_range = node.source_range.to_a
87
-
88
- comments.any? do |comment|
89
- !(comment.loc.expression.to_a & array_range).empty?
90
- end
73
+ add_offense(node) if style == :percent
91
74
  end
92
75
 
93
76
  def complex_content?(strings)