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
@@ -5,6 +5,7 @@ require 'rainbow'
5
5
 
6
6
  require 'English'
7
7
  require 'set'
8
+ require 'forwardable'
8
9
  require 'powerpack/array/butfirst'
9
10
  require 'powerpack/enumerable/drop_last'
10
11
  require 'powerpack/hash/symbolize_keys'
@@ -22,9 +23,12 @@ require 'rubocop/node_pattern'
22
23
  require 'rubocop/string_interpreter'
23
24
  require 'rubocop/ast/sexp'
24
25
  require 'rubocop/ast/node'
26
+ require 'rubocop/ast/node/mixin/method_identifier_predicates'
25
27
  require 'rubocop/ast/node/mixin/binary_operator_node'
28
+ require 'rubocop/ast/node/mixin/collection_node'
26
29
  require 'rubocop/ast/node/mixin/conditional_node'
27
30
  require 'rubocop/ast/node/mixin/hash_element_node'
31
+ require 'rubocop/ast/node/mixin/method_dispatch_node'
28
32
  require 'rubocop/ast/node/mixin/modifier_node'
29
33
  require 'rubocop/ast/node/mixin/parameterized_node'
30
34
  require 'rubocop/ast/node/mixin/predicate_operator_node'
@@ -33,6 +37,7 @@ require 'rubocop/ast/node/args_node'
33
37
  require 'rubocop/ast/node/array_node'
34
38
  require 'rubocop/ast/node/block_node'
35
39
  require 'rubocop/ast/node/case_node'
40
+ require 'rubocop/ast/node/def_node'
36
41
  require 'rubocop/ast/node/ensure_node'
37
42
  require 'rubocop/ast/node/for_node'
38
43
  require 'rubocop/ast/node/hash_node'
@@ -40,12 +45,14 @@ require 'rubocop/ast/node/if_node'
40
45
  require 'rubocop/ast/node/keyword_splat_node'
41
46
  require 'rubocop/ast/node/or_node'
42
47
  require 'rubocop/ast/node/pair_node'
48
+ require 'rubocop/ast/node/regexp_node'
43
49
  require 'rubocop/ast/node/resbody_node'
44
50
  require 'rubocop/ast/node/send_node'
45
51
  require 'rubocop/ast/node/super_node'
46
52
  require 'rubocop/ast/node/until_node'
47
53
  require 'rubocop/ast/node/when_node'
48
54
  require 'rubocop/ast/node/while_node'
55
+ require 'rubocop/ast/node/yield_node'
49
56
  require 'rubocop/ast/builder'
50
57
  require 'rubocop/ast/traversal'
51
58
  require 'rubocop/error'
@@ -74,7 +81,6 @@ require 'rubocop/cop/variable_force/reference'
74
81
  require 'rubocop/cop/variable_force/scope'
75
82
  require 'rubocop/cop/variable_force/variable_table'
76
83
 
77
- require 'rubocop/cop/mixin/access_modifier_node'
78
84
  require 'rubocop/cop/mixin/annotation_comment'
79
85
  require 'rubocop/cop/mixin/array_hash_indentation'
80
86
  require 'rubocop/cop/mixin/array_min_size'
@@ -99,17 +105,18 @@ require 'rubocop/cop/mixin/frozen_string_literal'
99
105
  require 'rubocop/cop/mixin/hash_alignment'
100
106
  require 'rubocop/cop/mixin/ignored_pattern'
101
107
  require 'rubocop/cop/mixin/integer_node'
102
- require 'rubocop/cop/mixin/on_method_def'
103
108
  require 'rubocop/cop/mixin/match_range'
104
- require 'rubocop/cop/mixin/method_complexity' # relies on on_method_def
109
+ require 'rubocop/cop/mixin/method_complexity'
105
110
  require 'rubocop/cop/mixin/method_preference'
106
111
  require 'rubocop/cop/mixin/min_body_length'
107
112
  require 'rubocop/cop/mixin/multiline_expression_indentation'
108
113
  require 'rubocop/cop/mixin/multiline_literal_brace_layout'
109
114
  require 'rubocop/cop/mixin/negative_conditional'
115
+ require 'rubocop/cop/mixin/heredoc'
110
116
  require 'rubocop/cop/mixin/on_normal_if_unless'
111
117
  require 'rubocop/cop/mixin/parentheses'
112
118
  require 'rubocop/cop/mixin/parser_diagnostic'
119
+ require 'rubocop/cop/mixin/percent_array'
113
120
  require 'rubocop/cop/mixin/percent_literal'
114
121
  require 'rubocop/cop/mixin/preceding_following_alignment'
115
122
  require 'rubocop/cop/mixin/rescue_node'
@@ -129,6 +136,7 @@ require 'rubocop/cop/mixin/trailing_comma'
129
136
  require 'rubocop/cop/mixin/unused_argument'
130
137
 
131
138
  require 'rubocop/cop/bundler/duplicated_gem'
139
+ require 'rubocop/cop/bundler/insecure_protocol_source'
132
140
  require 'rubocop/cop/bundler/ordered_gems'
133
141
 
134
142
  require 'rubocop/cop/layout/access_modifier_indentation'
@@ -207,6 +215,7 @@ require 'rubocop/cop/lint/ambiguous_operator'
207
215
  require 'rubocop/cop/lint/ambiguous_regexp_literal'
208
216
  require 'rubocop/cop/lint/assignment_in_condition'
209
217
  require 'rubocop/cop/lint/block_alignment'
218
+ require 'rubocop/cop/lint/boolean_symbol'
210
219
  require 'rubocop/cop/lint/circular_argument_reference'
211
220
  require 'rubocop/cop/lint/condition_position'
212
221
  require 'rubocop/cop/lint/debugger'
@@ -230,6 +239,7 @@ require 'rubocop/cop/lint/handle_exceptions'
230
239
  require 'rubocop/cop/lint/implicit_string_concatenation'
231
240
  require 'rubocop/cop/lint/inherit_exception'
232
241
  require 'rubocop/cop/lint/ineffective_access_modifier'
242
+ require 'rubocop/cop/lint/interpolation_check'
233
243
  require 'rubocop/cop/lint/invalid_character_literal'
234
244
  require 'rubocop/cop/lint/literal_in_condition'
235
245
  require 'rubocop/cop/lint/literal_in_interpolation'
@@ -242,9 +252,12 @@ require 'rubocop/cop/lint/parentheses_as_grouped_expression'
242
252
  require 'rubocop/cop/lint/percent_string_array'
243
253
  require 'rubocop/cop/lint/percent_symbol_array'
244
254
  require 'rubocop/cop/lint/rand_one'
255
+ require 'rubocop/cop/lint/redundant_with_index'
245
256
  require 'rubocop/cop/lint/require_parentheses'
246
257
  require 'rubocop/cop/lint/rescue_exception'
247
258
  require 'rubocop/cop/lint/rescue_type'
259
+ require 'rubocop/cop/lint/rescue_without_error_class'
260
+ require 'rubocop/cop/lint/return_in_void_context'
248
261
  require 'rubocop/cop/lint/safe_navigation_chain'
249
262
  require 'rubocop/cop/lint/script_permission'
250
263
  require 'rubocop/cop/lint/shadowed_exception'
@@ -258,6 +271,8 @@ require 'rubocop/cop/lint/unneeded_splat_expansion'
258
271
  require 'rubocop/cop/lint/unreachable_code'
259
272
  require 'rubocop/cop/lint/unused_block_argument'
260
273
  require 'rubocop/cop/lint/unused_method_argument'
274
+ require 'rubocop/cop/lint/uri_escape_unescape'
275
+ require 'rubocop/cop/lint/uri_regexp'
261
276
  require 'rubocop/cop/lint/useless_access_modifier'
262
277
  require 'rubocop/cop/lint/useless_assignment'
263
278
  require 'rubocop/cop/lint/useless_comparison'
@@ -276,6 +291,19 @@ require 'rubocop/cop/metrics/module_length'
276
291
  require 'rubocop/cop/metrics/parameter_lists'
277
292
  require 'rubocop/cop/metrics/perceived_complexity'
278
293
 
294
+ require 'rubocop/cop/naming/accessor_method_name'
295
+ require 'rubocop/cop/naming/ascii_identifiers'
296
+ require 'rubocop/cop/naming/class_and_module_camel_case'
297
+ require 'rubocop/cop/naming/constant_name'
298
+ require 'rubocop/cop/naming/file_name'
299
+ require 'rubocop/cop/naming/heredoc_delimiter_case'
300
+ require 'rubocop/cop/naming/heredoc_delimiter_naming'
301
+ require 'rubocop/cop/naming/method_name'
302
+ require 'rubocop/cop/naming/binary_operator_parameter_name'
303
+ require 'rubocop/cop/naming/predicate_name'
304
+ require 'rubocop/cop/naming/variable_name'
305
+ require 'rubocop/cop/naming/variable_number'
306
+
279
307
  require 'rubocop/cop/performance/caller'
280
308
  require 'rubocop/cop/performance/case_when_splat'
281
309
  require 'rubocop/cop/performance/casecmp'
@@ -300,13 +328,13 @@ require 'rubocop/cop/performance/compare_with_block'
300
328
  require 'rubocop/cop/performance/start_with'
301
329
  require 'rubocop/cop/performance/string_replacement'
302
330
  require 'rubocop/cop/performance/times_map'
331
+ require 'rubocop/cop/performance/unfreeze_string'
332
+ require 'rubocop/cop/performance/uri_default_parser'
303
333
 
304
- require 'rubocop/cop/style/accessor_method_name'
305
334
  require 'rubocop/cop/style/alias'
306
335
  require 'rubocop/cop/style/and_or'
307
336
  require 'rubocop/cop/style/array_join'
308
337
  require 'rubocop/cop/style/ascii_comments'
309
- require 'rubocop/cop/style/ascii_identifiers'
310
338
  require 'rubocop/cop/style/attr'
311
339
  require 'rubocop/cop/style/auto_resource_cleanup'
312
340
  require 'rubocop/cop/style/bare_percent_literals'
@@ -316,7 +344,6 @@ require 'rubocop/cop/style/block_delimiters'
316
344
  require 'rubocop/cop/style/braces_around_hash_parameters'
317
345
  require 'rubocop/cop/style/case_equality'
318
346
  require 'rubocop/cop/style/character_literal'
319
- require 'rubocop/cop/style/class_and_module_camel_case'
320
347
  require 'rubocop/cop/style/class_and_module_children'
321
348
  require 'rubocop/cop/style/class_check'
322
349
  require 'rubocop/cop/style/class_methods'
@@ -326,10 +353,9 @@ require 'rubocop/cop/style/colon_method_call'
326
353
  require 'rubocop/cop/style/command_literal'
327
354
  require 'rubocop/cop/style/comment_annotation'
328
355
  require 'rubocop/cop/style/conditional_assignment'
329
- require 'rubocop/cop/style/constant_name'
330
356
  require 'rubocop/cop/style/copyright'
331
357
  require 'rubocop/cop/style/def_with_parentheses'
332
- require 'rubocop/cop/style/preferred_hash_methods'
358
+ require 'rubocop/cop/style/dir'
333
359
  require 'rubocop/cop/style/documentation_method'
334
360
  require 'rubocop/cop/style/documentation'
335
361
  require 'rubocop/cop/style/double_negation'
@@ -342,7 +368,6 @@ require 'rubocop/cop/style/empty_method'
342
368
  require 'rubocop/cop/style/encoding'
343
369
  require 'rubocop/cop/style/end_block'
344
370
  require 'rubocop/cop/style/even_odd'
345
- require 'rubocop/cop/style/file_name'
346
371
  require 'rubocop/cop/style/flip_flop'
347
372
  require 'rubocop/cop/style/for'
348
373
  require 'rubocop/cop/style/format_string'
@@ -367,8 +392,8 @@ require 'rubocop/cop/style/method_call_without_args_parentheses'
367
392
  require 'rubocop/cop/style/method_call_with_args_parentheses'
368
393
  require 'rubocop/cop/style/method_called_on_do_end_block'
369
394
  require 'rubocop/cop/style/method_def_parentheses'
370
- require 'rubocop/cop/style/method_name'
371
395
  require 'rubocop/cop/style/method_missing'
396
+ require 'rubocop/cop/style/min_max'
372
397
  require 'rubocop/cop/style/missing_else'
373
398
  require 'rubocop/cop/style/mixin_grouping'
374
399
  require 'rubocop/cop/style/module_function'
@@ -392,7 +417,7 @@ require 'rubocop/cop/style/numeric_literals'
392
417
  require 'rubocop/cop/style/numeric_literal_prefix'
393
418
  require 'rubocop/cop/style/numeric_predicate'
394
419
  require 'rubocop/cop/style/one_line_conditional'
395
- require 'rubocop/cop/style/op_method'
420
+ require 'rubocop/cop/style/or_assignment'
396
421
  require 'rubocop/cop/style/option_hash'
397
422
  require 'rubocop/cop/style/optional_arguments'
398
423
  require 'rubocop/cop/style/parallel_assignment'
@@ -400,7 +425,7 @@ require 'rubocop/cop/style/parentheses_around_condition'
400
425
  require 'rubocop/cop/style/percent_literal_delimiters'
401
426
  require 'rubocop/cop/style/percent_q_literals'
402
427
  require 'rubocop/cop/style/perl_backrefs'
403
- require 'rubocop/cop/style/predicate_name'
428
+ require 'rubocop/cop/style/preferred_hash_methods'
404
429
  require 'rubocop/cop/style/proc'
405
430
  require 'rubocop/cop/style/raise_args'
406
431
  require 'rubocop/cop/style/redundant_begin'
@@ -409,8 +434,10 @@ require 'rubocop/cop/style/redundant_freeze'
409
434
  require 'rubocop/cop/style/redundant_parentheses'
410
435
  require 'rubocop/cop/style/redundant_return'
411
436
  require 'rubocop/cop/style/redundant_self'
437
+ require 'rubocop/cop/style/redundant_conditional'
412
438
  require 'rubocop/cop/style/regexp_literal'
413
439
  require 'rubocop/cop/style/rescue_modifier'
440
+ require 'rubocop/cop/style/return_nil'
414
441
  require 'rubocop/cop/style/safe_navigation'
415
442
  require 'rubocop/cop/style/self_assignment'
416
443
  require 'rubocop/cop/style/semicolon'
@@ -437,8 +464,6 @@ require 'rubocop/cop/style/unneeded_capital_w'
437
464
  require 'rubocop/cop/style/unneeded_interpolation'
438
465
  require 'rubocop/cop/style/unneeded_percent_q'
439
466
  require 'rubocop/cop/style/variable_interpolation'
440
- require 'rubocop/cop/style/variable_name'
441
- require 'rubocop/cop/style/variable_number'
442
467
  require 'rubocop/cop/style/when_then'
443
468
  require 'rubocop/cop/style/while_until_do'
444
469
  require 'rubocop/cop/style/while_until_modifier'
@@ -461,6 +486,7 @@ require 'rubocop/cop/rails/file_path'
461
486
  require 'rubocop/cop/rails/find_by'
462
487
  require 'rubocop/cop/rails/find_each'
463
488
  require 'rubocop/cop/rails/has_and_belongs_to_many'
489
+ require 'rubocop/cop/rails/has_many_or_has_one_dependent'
464
490
  require 'rubocop/cop/rails/http_positional_arguments'
465
491
  require 'rubocop/cop/rails/not_null_column'
466
492
  require 'rubocop/cop/rails/output_safety'
@@ -498,6 +524,7 @@ require 'rubocop/formatter/html_formatter'
498
524
  require 'rubocop/formatter/json_formatter'
499
525
  require 'rubocop/formatter/offense_count_formatter'
500
526
  require 'rubocop/formatter/progress_formatter'
527
+ require 'rubocop/formatter/tap_formatter'
501
528
  require 'rubocop/formatter/worst_offenders_formatter'
502
529
 
503
530
  require 'rubocop/formatter/formatter_set'
@@ -19,6 +19,7 @@ module RuboCop
19
19
  ArrayNode => [:array],
20
20
  BlockNode => [:block],
21
21
  CaseNode => [:case],
22
+ DefNode => %i[def defs],
22
23
  EnsureNode => [:ensure],
23
24
  ForNode => [:for],
24
25
  HashNode => [:hash],
@@ -26,12 +27,14 @@ module RuboCop
26
27
  KeywordSplatNode => [:kwsplat],
27
28
  OrNode => [:or],
28
29
  PairNode => [:pair],
30
+ RegexpNode => [:regexp],
29
31
  ResbodyNode => [:resbody],
30
32
  SendNode => %i[csend send],
31
33
  SuperNode => %i[super zsuper],
32
34
  UntilNode => %i[until until_post],
33
35
  WhenNode => [:when],
34
- WhileNode => %i[while while_post]
36
+ WhileNode => %i[while while_post],
37
+ YieldNode => [:yield]
35
38
  }.freeze
36
39
 
37
40
  # Generates {Node} from the given information.
@@ -20,8 +20,10 @@ module RuboCop
20
20
  #
21
21
  class Node < Parser::AST::Node # rubocop:disable Metrics/ClassLength
22
22
  include RuboCop::AST::Sexp
23
+ extend NodePattern::Macros
23
24
 
24
- COMPARISON_OPERATORS = %i[! == === != <= >= > < <=>].freeze
25
+ # <=> isn't included here, because it doesn't return a boolean.
26
+ COMPARISON_OPERATORS = %i[== === != <= >= > <].freeze
25
27
 
26
28
  TRUTHY_LITERALS = %i[str dstr xstr int float sym dsym array
27
29
  hash regexp true irange erange complex
@@ -44,19 +46,6 @@ module RuboCop
44
46
  OPERATOR_KEYWORDS = %i[and or].freeze
45
47
  SPECIAL_KEYWORDS = %w[__FILE__ __LINE__ __ENCODING__].freeze
46
48
 
47
- # def_matcher can be used to define a pattern-matching method on Node
48
- class << self
49
- def def_matcher(method_name, pattern_str)
50
- compiler = RuboCop::NodePattern::Compiler.new(pattern_str, 'self')
51
- src = "def #{method_name}(" \
52
- "#{compiler.emit_param_list});" \
53
- "#{compiler.emit_method_code};end"
54
-
55
- location = caller_locations(1, 1).first
56
- class_eval(src, location.path, location.lineno)
57
- end
58
- end
59
-
60
49
  # @see http://rubydoc.info/gems/ast/AST/Node:initialize
61
50
  def initialize(type, children = [], properties = {})
62
51
  @mutable_attributes = {}
@@ -271,12 +260,17 @@ module RuboCop
271
260
 
272
261
  ## Destructuring
273
262
 
274
- def_matcher :receiver, '{(send $_ ...) (block (send $_ ...) ...)}'
275
- def_matcher :method_name, '{(send _ $_ ...) (block (send _ $_ ...) ...)}'
276
- def_matcher :method_args, '{(send _ _ $...) (block (send _ _ $...) ...)}'
263
+ def_node_matcher :receiver, <<-PATTERN
264
+ {(send $_ ...) (block (send $_ ...) ...)}
265
+ PATTERN
266
+
267
+ def_node_matcher :method_name, <<-PATTERN
268
+ {(send _ $_ ...) (block (send _ $_ ...) ...)}
269
+ PATTERN
270
+
277
271
  # Note: for masgn, #asgn_rhs will be an array node
278
- def_matcher :asgn_rhs, '[assignment? (... $_)]'
279
- def_matcher :str_content, '(str $_)'
272
+ def_node_matcher :asgn_rhs, '[assignment? (... $_)]'
273
+ def_node_matcher :str_content, '(str $_)'
280
274
 
281
275
  def const_name
282
276
  return unless const_type?
@@ -288,7 +282,7 @@ module RuboCop
288
282
  end
289
283
  end
290
284
 
291
- def_matcher :defined_module0, <<-PATTERN
285
+ def_node_matcher :defined_module0, <<-PATTERN
292
286
  {(class (const $_ $_) ...)
293
287
  (module (const $_ $_) ...)
294
288
  (casgn $_ $_ (send (const nil {:Class :Module}) :new ...))
@@ -332,10 +326,15 @@ module RuboCop
332
326
  method_name.to_s.end_with?('='.freeze)
333
327
  end
334
328
 
335
- def_matcher :equals_asgn?, '{lvasgn ivasgn cvasgn gvasgn casgn masgn}'
336
- def_matcher :shorthand_asgn?, '{op_asgn or_asgn and_asgn}'
337
- def_matcher :assignment?,
338
- '{equals_asgn? shorthand_asgn? asgn_method_call?}'
329
+ def_node_matcher :equals_asgn?, <<-PATTERN
330
+ {lvasgn ivasgn cvasgn gvasgn casgn masgn}
331
+ PATTERN
332
+
333
+ def_node_matcher :shorthand_asgn?, '{op_asgn or_asgn and_asgn}'
334
+
335
+ def_node_matcher :assignment?, <<-PATTERN
336
+ {equals_asgn? shorthand_asgn? asgn_method_call?}
337
+ PATTERN
339
338
 
340
339
  def literal?
341
340
  LITERALS.include?(type)
@@ -368,7 +367,7 @@ module RuboCop
368
367
  case type
369
368
  when :send
370
369
  receiver, method_name, *args = *self
371
- COMPARISON_OPERATORS.include?(method_name) &&
370
+ [*COMPARISON_OPERATORS, :!, :<=>].include?(method_name) &&
372
371
  receiver.send(recursive_kind) &&
373
372
  args.all?(&recursive_kind)
374
373
  when :begin, :pair, *OPERATOR_KEYWORDS, *COMPOSITE_LITERALS
@@ -439,24 +438,25 @@ module RuboCop
439
438
  int_type? || float_type?
440
439
  end
441
440
 
442
- def_matcher :guard_clause?, <<-PATTERN
441
+ def_node_matcher :guard_clause?, <<-PATTERN
443
442
  [{(send nil {:raise :fail} ...) return break next} single_line?]
444
443
  PATTERN
445
444
 
446
- def_matcher :lambda?, '(block (send nil :lambda) ...)'
447
- def_matcher :proc?, <<-PATTERN
445
+ def_node_matcher :proc?, <<-PATTERN
448
446
  {(block (send nil :proc) ...)
449
447
  (block (send (const nil :Proc) :new) ...)
450
448
  (send (const nil :Proc) :new)}
451
449
  PATTERN
452
- def_matcher :lambda_or_proc?, '{lambda? proc?}'
453
450
 
454
- def_matcher :class_constructor?, <<-PATTERN
451
+ def_node_matcher :lambda?, '(block (send nil :lambda) ...)'
452
+ def_node_matcher :lambda_or_proc?, '{lambda? proc?}'
453
+
454
+ def_node_matcher :class_constructor?, <<-PATTERN
455
455
  { (send (const nil {:Class :Module}) :new ...)
456
456
  (block (send (const nil {:Class :Module}) :new ...) ...)}
457
457
  PATTERN
458
458
 
459
- def_matcher :module_definition?, <<-PATTERN
459
+ def_node_matcher :module_definition?, <<-PATTERN
460
460
  {class module (casgn _ _ class_constructor?)}
461
461
  PATTERN
462
462
 
@@ -468,7 +468,7 @@ module RuboCop
468
468
  # So, does the return value of this node matter? If we changed it to
469
469
  # `(...; nil)`, might that affect anything?
470
470
  #
471
- # rubocop:disable Metrics/MethodLength
471
+ # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
472
472
  def value_used?
473
473
  # Be conservative and return true if we're not sure.
474
474
  return false if parent.nil?
@@ -490,7 +490,7 @@ module RuboCop
490
490
  true
491
491
  end
492
492
  end
493
- # rubocop:enable Metrics/MethodLength
493
+ # rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
494
494
 
495
495
  # Some expressions are evaluated for their value, some for their side
496
496
  # effects, and some for both.
@@ -596,15 +596,9 @@ module RuboCop
596
596
  end
597
597
  end
598
598
 
599
- def new_class_or_module_block?(block_node)
600
- receiver = block_node.receiver
601
-
602
- block_node.method_name == :new &&
603
- receiver && receiver.const_type? &&
604
- (receiver.const_name == 'Class' || receiver.const_name == 'Module') &&
605
- block_node.parent &&
606
- block_node.parent.casgn_type?
607
- end
599
+ def_node_matcher :new_class_or_module_block?, <<-PATTERN
600
+ ^(casgn _ _ (block (send (const _ {:Class :Module}) :new) ...))
601
+ PATTERN
608
602
  end
609
603
  end
610
604
  end
@@ -6,19 +6,7 @@ module RuboCop
6
6
  # node when the builder constructs the AST, making its methods available
7
7
  # to all `args` nodes within RuboCop.
8
8
  class ArgsNode < Node
9
- # Whether this `args` node has any arguments.
10
- #
11
- # @return [Boolean] whether this `args` node has any arguments
12
- def empty?
13
- to_a.empty?
14
- end
15
-
16
- # The number of arguments in this `args` node.
17
- #
18
- # @return [Integer] the number of arguments in this `args` node
19
- def size
20
- to_a.size
21
- end
9
+ include CollectionNode
22
10
  end
23
11
  end
24
12
  end
@@ -43,6 +43,15 @@ module RuboCop
43
43
  loc.begin && loc.begin.source.start_with?('%')
44
44
  end
45
45
  end
46
+
47
+ # Checks whether the `array` literal is delimited by either percent or
48
+ # square brackets
49
+ #
50
+ # @return [Boolean] whether the array is enclosed in percent or square
51
+ # brackets
52
+ def bracketed?
53
+ square_brackets? || percent_literal?
54
+ end
46
55
  end
47
56
  end
48
57
  end