rubocop 0.49.1 → 0.52.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 (506) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -9
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +264 -118
  5. data/config/disabled.yml +13 -9
  6. data/config/enabled.yml +1156 -918
  7. data/lib/rubocop.rb +555 -489
  8. data/lib/rubocop/ast/builder.rb +6 -1
  9. data/lib/rubocop/ast/node.rb +68 -52
  10. data/lib/rubocop/ast/node/args_node.rb +15 -10
  11. data/lib/rubocop/ast/node/array_node.rb +10 -1
  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/basic_literal_node.rb +16 -0
  17. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  18. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  19. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  20. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  21. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  22. data/lib/rubocop/ast/node/send_node.rb +21 -150
  23. data/lib/rubocop/ast/node/str_node.rb +14 -0
  24. data/lib/rubocop/ast/node/super_node.rb +3 -24
  25. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  26. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  27. data/lib/rubocop/ast/traversal.rb +7 -7
  28. data/lib/rubocop/cached_data.rb +1 -6
  29. data/lib/rubocop/cli.rb +59 -13
  30. data/lib/rubocop/comment_config.rb +2 -5
  31. data/lib/rubocop/config.rb +136 -29
  32. data/lib/rubocop/config_loader.rb +61 -104
  33. data/lib/rubocop/config_loader_resolver.rb +102 -4
  34. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  35. data/lib/rubocop/cop/bundler/duplicated_gem.rb +13 -11
  36. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  37. data/lib/rubocop/cop/bundler/ordered_gems.rb +7 -58
  38. data/lib/rubocop/cop/commissioner.rb +6 -3
  39. data/lib/rubocop/cop/cop.rb +11 -6
  40. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  41. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +97 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  43. data/lib/rubocop/cop/generator.rb +122 -25
  44. data/lib/rubocop/cop/internal_affairs.rb +6 -2
  45. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  46. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +16 -5
  47. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  48. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  49. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  50. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  51. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -10
  52. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  53. data/lib/rubocop/cop/layout/align_hash.rb +18 -18
  54. data/lib/rubocop/cop/layout/align_parameters.rb +11 -23
  55. data/lib/rubocop/cop/layout/block_end_newline.rb +20 -6
  56. data/lib/rubocop/cop/layout/case_indentation.rb +15 -18
  57. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  58. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +7 -6
  59. data/lib/rubocop/cop/layout/comment_indentation.rb +42 -3
  60. data/lib/rubocop/cop/layout/dot_position.rb +31 -13
  61. data/lib/rubocop/cop/layout/else_alignment.rb +37 -17
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -1
  63. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +22 -18
  64. data/lib/rubocop/cop/layout/empty_lines.rb +16 -2
  65. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +23 -6
  66. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  67. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  68. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  69. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +10 -6
  71. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +5 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  73. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  74. data/lib/rubocop/cop/layout/extra_spacing.rb +23 -26
  75. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  76. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +9 -3
  77. data/lib/rubocop/cop/layout/indent_array.rb +68 -21
  78. data/lib/rubocop/cop/layout/indent_hash.rb +71 -26
  79. data/lib/rubocop/cop/layout/indent_heredoc.rb +70 -35
  80. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  81. data/lib/rubocop/cop/layout/indentation_width.rb +40 -27
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +10 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +32 -17
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  85. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +12 -11
  86. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  87. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  88. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +29 -27
  89. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +7 -3
  90. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  91. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +12 -4
  92. data/lib/rubocop/cop/layout/space_after_colon.rb +13 -6
  93. data/lib/rubocop/cop/layout/space_after_comma.rb +11 -1
  94. data/lib/rubocop/cop/layout/space_after_method_name.rb +8 -6
  95. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  96. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  97. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +32 -25
  98. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +28 -17
  99. data/lib/rubocop/cop/layout/space_around_keyword.rb +22 -16
  100. data/lib/rubocop/cop/layout/space_around_operators.rb +27 -14
  101. data/lib/rubocop/cop/layout/space_before_block_braces.rb +61 -12
  102. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  103. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -5
  104. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -4
  105. data/lib/rubocop/cop/layout/space_before_semicolon.rb +8 -1
  106. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +12 -14
  107. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  108. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +4 -4
  109. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +89 -18
  110. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +62 -36
  111. data/lib/rubocop/cop/layout/space_inside_parens.rb +40 -3
  112. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  113. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  114. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  115. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +32 -17
  116. data/lib/rubocop/cop/layout/tab.rb +7 -4
  117. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +11 -9
  118. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  119. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +12 -19
  120. data/lib/rubocop/cop/lint/assignment_in_condition.rb +16 -2
  121. data/lib/rubocop/cop/lint/block_alignment.rb +42 -30
  122. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  123. data/lib/rubocop/cop/lint/circular_argument_reference.rb +3 -14
  124. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  125. data/lib/rubocop/cop/lint/debugger.rb +18 -11
  126. data/lib/rubocop/cop/lint/def_end_alignment.rb +9 -14
  127. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  128. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  129. data/lib/rubocop/cop/lint/duplicate_methods.rb +75 -5
  130. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  131. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  132. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  133. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  134. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  135. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  136. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  137. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  138. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  139. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  140. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  141. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +36 -41
  142. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  143. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  144. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +25 -20
  145. data/lib/rubocop/cop/lint/inherit_exception.rb +16 -19
  146. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  147. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +21 -7
  148. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  149. data/lib/rubocop/cop/lint/loop.rb +1 -1
  150. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  151. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  152. data/lib/rubocop/cop/lint/nested_method_definition.rb +6 -8
  153. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  154. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  155. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
  156. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -3
  157. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -22
  158. data/lib/rubocop/cop/lint/percent_symbol_array.rb +12 -12
  159. data/lib/rubocop/cop/lint/rand_one.rb +8 -2
  160. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  161. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  162. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  163. data/lib/rubocop/cop/lint/require_parentheses.rb +5 -3
  164. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  165. data/lib/rubocop/cop/lint/rescue_type.rb +18 -9
  166. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  167. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  168. data/lib/rubocop/cop/lint/script_permission.rb +8 -1
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +37 -10
  171. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  172. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +7 -7
  173. data/lib/rubocop/cop/lint/syntax.rb +23 -20
  174. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  175. data/lib/rubocop/cop/lint/unified_integer.rb +5 -4
  176. data/lib/rubocop/cop/lint/unneeded_disable.rb +41 -16
  177. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  178. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +45 -19
  179. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  180. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  181. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  182. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  183. data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -16
  184. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  185. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  186. data/lib/rubocop/cop/lint/useless_setter_call.rb +15 -12
  187. data/lib/rubocop/cop/lint/void.rb +38 -27
  188. data/lib/rubocop/cop/message_annotator.rb +4 -2
  189. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  190. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  191. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  192. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  193. data/lib/rubocop/cop/metrics/line_length.rb +8 -5
  194. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  195. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  196. data/lib/rubocop/cop/metrics/parameter_lists.rb +14 -5
  197. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  198. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +3 -2
  199. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +2 -2
  200. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  202. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +14 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +8 -4
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -3
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  209. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  210. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -7
  211. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +74 -33
  212. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +34 -8
  213. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -1
  214. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +67 -0
  215. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  216. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -1
  217. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  218. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +9 -8
  219. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -10
  220. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  221. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  222. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  223. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  224. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  225. data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -17
  226. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -2
  227. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  228. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +35 -2
  229. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +7 -6
  230. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  231. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  232. data/lib/rubocop/cop/{style → naming}/file_name.rb +28 -13
  233. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  234. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  235. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  236. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  237. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  238. data/lib/rubocop/cop/{style → naming}/variable_number.rb +11 -28
  239. data/lib/rubocop/cop/offense.rb +6 -1
  240. data/lib/rubocop/cop/performance/caller.rb +39 -11
  241. data/lib/rubocop/cop/performance/case_when_splat.rb +3 -7
  242. data/lib/rubocop/cop/performance/casecmp.rb +9 -8
  243. data/lib/rubocop/cop/performance/compare_with_block.rb +23 -13
  244. data/lib/rubocop/cop/performance/count.rb +7 -4
  245. data/lib/rubocop/cop/performance/detect.rb +9 -6
  246. data/lib/rubocop/cop/performance/double_start_end_with.rb +12 -20
  247. data/lib/rubocop/cop/performance/end_with.rb +6 -6
  248. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  249. data/lib/rubocop/cop/performance/flat_map.rb +5 -2
  250. data/lib/rubocop/cop/performance/hash_each_methods.rb +85 -40
  251. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +9 -6
  252. data/lib/rubocop/cop/performance/range_include.rb +3 -3
  253. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -28
  254. data/lib/rubocop/cop/performance/redundant_match.rb +13 -12
  255. data/lib/rubocop/cop/performance/redundant_merge.rb +44 -26
  256. data/lib/rubocop/cop/performance/redundant_sort_by.rb +9 -6
  257. data/lib/rubocop/cop/performance/regexp_match.rb +19 -10
  258. data/lib/rubocop/cop/performance/reverse_each.rb +1 -1
  259. data/lib/rubocop/cop/performance/sample.rb +1 -1
  260. data/lib/rubocop/cop/performance/size.rb +3 -3
  261. data/lib/rubocop/cop/performance/start_with.rb +6 -6
  262. data/lib/rubocop/cop/performance/string_replacement.rb +6 -6
  263. data/lib/rubocop/cop/performance/times_map.rb +32 -22
  264. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  265. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  266. data/lib/rubocop/cop/rails/action_filter.rb +23 -1
  267. data/lib/rubocop/cop/rails/active_support_aliases.rb +4 -5
  268. data/lib/rubocop/cop/rails/application_job.rb +5 -3
  269. data/lib/rubocop/cop/rails/application_record.rb +5 -3
  270. data/lib/rubocop/cop/rails/blank.rb +20 -17
  271. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  272. data/lib/rubocop/cop/rails/date.rb +7 -6
  273. data/lib/rubocop/cop/rails/delegate.rb +53 -29
  274. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +4 -4
  275. data/lib/rubocop/cop/rails/dynamic_find_by.rb +2 -2
  276. data/lib/rubocop/cop/rails/enum_uniqueness.rb +4 -4
  277. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  278. data/lib/rubocop/cop/rails/exit.rb +8 -1
  279. data/lib/rubocop/cop/rails/file_path.rb +8 -11
  280. data/lib/rubocop/cop/rails/find_by.rb +2 -1
  281. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  282. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +8 -1
  283. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +76 -0
  284. data/lib/rubocop/cop/rails/http_positional_arguments.rb +40 -44
  285. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  286. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  287. data/lib/rubocop/cop/rails/not_null_column.rb +6 -6
  288. data/lib/rubocop/cop/rails/output.rb +11 -2
  289. data/lib/rubocop/cop/rails/output_safety.rb +16 -21
  290. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -10
  291. data/lib/rubocop/cop/rails/presence.rb +105 -0
  292. data/lib/rubocop/cop/rails/present.rb +14 -17
  293. data/lib/rubocop/cop/rails/read_write_attribute.rb +13 -13
  294. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  295. data/lib/rubocop/cop/rails/relative_date_constant.rb +11 -11
  296. data/lib/rubocop/cop/rails/request_referer.rb +3 -3
  297. data/lib/rubocop/cop/rails/reversible_migration.rb +36 -35
  298. data/lib/rubocop/cop/rails/safe_navigation.rb +7 -8
  299. data/lib/rubocop/cop/rails/save_bang.rb +19 -17
  300. data/lib/rubocop/cop/rails/scope_args.rb +2 -2
  301. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  302. data/lib/rubocop/cop/rails/time_zone.rb +3 -2
  303. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +4 -2
  304. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  305. data/lib/rubocop/cop/rails/validation.rb +8 -8
  306. data/lib/rubocop/cop/registry.rb +2 -1
  307. data/lib/rubocop/cop/security/eval.rb +4 -4
  308. data/lib/rubocop/cop/security/json_load.rb +7 -5
  309. data/lib/rubocop/cop/security/marshal_load.rb +8 -6
  310. data/lib/rubocop/cop/security/yaml_load.rb +4 -4
  311. data/lib/rubocop/cop/style/alias.rb +49 -27
  312. data/lib/rubocop/cop/style/and_or.rb +65 -45
  313. data/lib/rubocop/cop/style/array_join.rb +10 -1
  314. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  315. data/lib/rubocop/cop/style/attr.rb +15 -5
  316. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -5
  317. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  318. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  319. data/lib/rubocop/cop/style/block_comments.rb +17 -3
  320. data/lib/rubocop/cop/style/block_delimiters.rb +82 -16
  321. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +68 -32
  322. data/lib/rubocop/cop/style/case_equality.rb +13 -1
  323. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  324. data/lib/rubocop/cop/style/class_and_module_children.rb +8 -4
  325. data/lib/rubocop/cop/style/class_check.rb +29 -10
  326. data/lib/rubocop/cop/style/class_methods.rb +10 -9
  327. data/lib/rubocop/cop/style/class_vars.rb +5 -4
  328. data/lib/rubocop/cop/style/collection_methods.rb +5 -3
  329. data/lib/rubocop/cop/style/colon_method_call.rb +18 -2
  330. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  331. data/lib/rubocop/cop/style/command_literal.rb +90 -30
  332. data/lib/rubocop/cop/style/comment_annotation.rb +39 -11
  333. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  334. data/lib/rubocop/cop/style/conditional_assignment.rb +41 -41
  335. data/lib/rubocop/cop/style/copyright.rb +27 -28
  336. data/lib/rubocop/cop/style/date_time.rb +44 -0
  337. data/lib/rubocop/cop/style/def_with_parentheses.rb +31 -5
  338. data/lib/rubocop/cop/style/dir.rb +48 -0
  339. data/lib/rubocop/cop/style/documentation.rb +17 -2
  340. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  341. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  342. data/lib/rubocop/cop/style/each_for_simple_loop.rb +8 -8
  343. data/lib/rubocop/cop/style/each_with_object.rb +6 -5
  344. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  345. data/lib/rubocop/cop/style/empty_case_condition.rb +3 -3
  346. data/lib/rubocop/cop/style/empty_else.rb +55 -24
  347. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  348. data/lib/rubocop/cop/style/empty_literal.rb +25 -14
  349. data/lib/rubocop/cop/style/empty_method.rb +29 -25
  350. data/lib/rubocop/cop/style/encoding.rb +8 -51
  351. data/lib/rubocop/cop/style/end_block.rb +1 -1
  352. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  353. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  354. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  355. data/lib/rubocop/cop/style/flip_flop.rb +13 -2
  356. data/lib/rubocop/cop/style/for.rb +6 -2
  357. data/lib/rubocop/cop/style/format_string.rb +33 -5
  358. data/lib/rubocop/cop/style/format_string_token.rb +17 -15
  359. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -6
  360. data/lib/rubocop/cop/style/global_vars.rb +12 -2
  361. data/lib/rubocop/cop/style/guard_clause.rb +6 -4
  362. data/lib/rubocop/cop/style/hash_syntax.rb +56 -56
  363. data/lib/rubocop/cop/style/identical_conditional_branches.rb +12 -8
  364. data/lib/rubocop/cop/style/if_inside_else.rb +11 -11
  365. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -7
  366. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -2
  367. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -1
  368. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -6
  369. data/lib/rubocop/cop/style/infinite_loop.rb +4 -4
  370. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  371. data/lib/rubocop/cop/style/inverse_methods.rb +24 -14
  372. data/lib/rubocop/cop/style/lambda.rb +45 -43
  373. data/lib/rubocop/cop/style/lambda_call.rb +37 -10
  374. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -5
  375. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -19
  376. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  377. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -1
  378. data/lib/rubocop/cop/style/method_def_parentheses.rb +20 -25
  379. data/lib/rubocop/cop/style/method_missing.rb +13 -26
  380. data/lib/rubocop/cop/style/min_max.rb +68 -0
  381. data/lib/rubocop/cop/style/missing_else.rb +20 -6
  382. data/lib/rubocop/cop/style/mixin_grouping.rb +31 -21
  383. data/lib/rubocop/cop/style/mixin_usage.rb +71 -0
  384. data/lib/rubocop/cop/style/module_function.rb +27 -11
  385. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  386. data/lib/rubocop/cop/style/multiline_if_modifier.rb +8 -4
  387. data/lib/rubocop/cop/style/multiline_if_then.rb +15 -13
  388. data/lib/rubocop/cop/style/multiline_memoization.rb +33 -17
  389. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  390. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  391. data/lib/rubocop/cop/style/mutable_constant.rb +11 -15
  392. data/lib/rubocop/cop/style/negated_if.rb +27 -31
  393. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  394. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  395. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +26 -23
  396. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  397. data/lib/rubocop/cop/style/next.rb +41 -12
  398. data/lib/rubocop/cop/style/nil_comparison.rb +8 -8
  399. data/lib/rubocop/cop/style/non_nil_check.rb +41 -38
  400. data/lib/rubocop/cop/style/not.rb +15 -5
  401. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +8 -4
  402. data/lib/rubocop/cop/style/numeric_literals.rb +9 -9
  403. data/lib/rubocop/cop/style/numeric_predicate.rb +21 -21
  404. data/lib/rubocop/cop/style/one_line_conditional.rb +9 -4
  405. data/lib/rubocop/cop/style/option_hash.rb +11 -25
  406. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  407. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  408. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  409. data/lib/rubocop/cop/style/parentheses_around_condition.rb +30 -13
  410. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +25 -4
  411. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  412. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -1
  413. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -11
  414. data/lib/rubocop/cop/style/proc.rb +10 -2
  415. data/lib/rubocop/cop/style/raise_args.rb +22 -29
  416. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  417. data/lib/rubocop/cop/style/redundant_begin.rb +16 -5
  418. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  419. data/lib/rubocop/cop/style/redundant_exception.rb +4 -4
  420. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +14 -12
  422. data/lib/rubocop/cop/style/redundant_return.rb +28 -15
  423. data/lib/rubocop/cop/style/redundant_self.rb +35 -27
  424. data/lib/rubocop/cop/style/regexp_literal.rb +88 -27
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +12 -1
  426. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  427. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  428. data/lib/rubocop/cop/style/safe_navigation.rb +100 -48
  429. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  430. data/lib/rubocop/cop/style/semicolon.rb +19 -9
  431. data/lib/rubocop/cop/style/send.rb +10 -1
  432. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  433. data/lib/rubocop/cop/style/single_line_block_params.rb +16 -15
  434. data/lib/rubocop/cop/style/single_line_methods.rb +26 -18
  435. data/lib/rubocop/cop/style/special_global_vars.rb +19 -14
  436. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +23 -50
  437. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  438. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  439. data/lib/rubocop/cop/style/string_literals.rb +26 -3
  440. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +16 -1
  441. data/lib/rubocop/cop/style/string_methods.rb +19 -8
  442. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  443. data/lib/rubocop/cop/style/symbol_array.rb +7 -35
  444. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  445. data/lib/rubocop/cop/style/symbol_proc.rb +11 -25
  446. data/lib/rubocop/cop/style/ternary_parentheses.rb +46 -51
  447. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  448. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  449. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  450. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  451. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +70 -24
  452. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -65
  453. data/lib/rubocop/cop/style/unless_else.rb +16 -1
  454. data/lib/rubocop/cop/style/unneeded_capital_w.rb +18 -8
  455. data/lib/rubocop/cop/style/unneeded_interpolation.rb +15 -19
  456. data/lib/rubocop/cop/style/unneeded_percent_q.rb +14 -13
  457. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -9
  458. data/lib/rubocop/cop/style/when_then.rb +14 -1
  459. data/lib/rubocop/cop/style/while_until_do.rb +27 -4
  460. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -6
  461. data/lib/rubocop/cop/style/word_array.rb +9 -30
  462. data/lib/rubocop/cop/style/yoda_condition.rb +51 -22
  463. data/lib/rubocop/cop/style/zero_length_predicate.rb +44 -29
  464. data/lib/rubocop/cop/team.rb +16 -8
  465. data/lib/rubocop/cop/util.rb +43 -34
  466. data/lib/rubocop/cop/variable_force.rb +1 -1
  467. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  468. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  469. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  470. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -4
  471. data/lib/rubocop/formatter/formatter_set.rb +3 -1
  472. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  473. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  474. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  475. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  476. data/lib/rubocop/formatter/simple_text_formatter.rb +3 -3
  477. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  478. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  479. data/lib/rubocop/node_pattern.rb +46 -29
  480. data/lib/rubocop/options.rb +13 -8
  481. data/lib/rubocop/path_util.rb +15 -3
  482. data/lib/rubocop/processed_source.rb +8 -9
  483. data/lib/rubocop/rake_task.rb +16 -23
  484. data/lib/rubocop/remote_config.rb +13 -1
  485. data/lib/rubocop/result_cache.rb +1 -0
  486. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  487. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  488. data/lib/rubocop/rspec/shared_contexts.rb +4 -8
  489. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  490. data/lib/rubocop/rspec/support.rb +5 -5
  491. data/lib/rubocop/runner.rb +1 -1
  492. data/lib/rubocop/string_util.rb +2 -0
  493. data/lib/rubocop/token.rb +74 -0
  494. data/lib/rubocop/version.rb +1 -1
  495. metadata +118 -48
  496. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  497. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -41
  498. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  499. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
  500. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  501. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -45
  502. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -29
  503. data/lib/rubocop/cop/style/constant_name.rb +0 -29
  504. data/lib/rubocop/cop/style/method_name.rb +0 -34
  505. data/lib/rubocop/cop/style/predicate_name.rb +0 -67
  506. data/lib/rubocop/cop/style/variable_name.rb +0 -39
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # Common functionality for nodes that are a kind of method dispatch:
6
+ # `send`, `csend`, `super`, `zsuper`, `yield`
7
+ module MethodDispatchNode
8
+ extend NodePattern::Macros
9
+ include MethodIdentifierPredicates
10
+
11
+ # The receiving node of the method dispatch.
12
+ #
13
+ # @return [Node, nil] the receiver of the dispatched method or `nil`
14
+ def receiver
15
+ node_parts[0]
16
+ end
17
+
18
+ # The name of the dispatched method as a symbol.
19
+ #
20
+ # @return [Symbol] the name of the dispatched method
21
+ def method_name
22
+ node_parts[1]
23
+ end
24
+
25
+ # An array containing the arguments of the dispatched method.
26
+ #
27
+ # @return [Array<Node>] the arguments of the dispatched method
28
+ def arguments
29
+ node_parts[2..-1]
30
+ end
31
+
32
+ # Checks whether the dispatched method is a macro method. A macro method
33
+ # is defined as a method that sits in a class, module, or block body and
34
+ # has an implicit receiver.
35
+ #
36
+ # @note This does not include DSLs that use nested blocks, like RSpec
37
+ #
38
+ # @return [Boolean] whether the dispatched method is a macro method
39
+ def macro?
40
+ !receiver && macro_scope?
41
+ end
42
+
43
+ # Checks whether the dispatched method is a bare access modifier affects
44
+ # all methods defined after the macro.
45
+ #
46
+ # @return [Boolean] whether the dispatched method is access modifier
47
+ def access_modifier?
48
+ macro? && bare_access_modifier?
49
+ end
50
+
51
+ # Checks whether the name of the dispatched method matches the argument
52
+ # and has an implicit receiver.
53
+ #
54
+ # @param [Symbol, String] name the method name to check for
55
+ # @return [Boolean] whether the method name matches the argument
56
+ def command?(name)
57
+ !receiver && method?(name)
58
+ end
59
+
60
+ # Checks whether the dispatched method is a setter method.
61
+ #
62
+ # @return [Boolean] whether the dispatched method is a setter
63
+ def setter_method?
64
+ loc.respond_to?(:operator) && loc.operator
65
+ end
66
+
67
+ # Checks whether the dispatched method uses a dot to connect the
68
+ # receiver and the method name.
69
+ #
70
+ # This is useful for comparison operators, which can be called either
71
+ # with or without a dot, i.e. `foo == bar` or `foo.== bar`.
72
+ #
73
+ # @return [Boolean] whether the method was called with a connecting dot
74
+ def dot?
75
+ loc.respond_to?(:dot) && loc.dot && loc.dot.is?('.')
76
+ end
77
+
78
+ # Checks whether the dispatched method uses a double colon to connect the
79
+ # receiver and the method name.
80
+ #
81
+ # @return [Boolean] whether the method was called with a connecting dot
82
+ def double_colon?
83
+ loc.respond_to?(:dot) && loc.dot && loc.dot.is?('::')
84
+ end
85
+
86
+ # Checks whether the *explicit* receiver of this method dispatch is
87
+ # `self`.
88
+ #
89
+ # @return [Boolean] whether the receiver of this method dispatch is `self`
90
+ def self_receiver?
91
+ receiver && receiver.self_type?
92
+ end
93
+
94
+ # Checks whether the *explicit* receiver of this method dispatch is a
95
+ # `const` node.
96
+ #
97
+ # @return [Boolean] whether the receiver of this method dispatch
98
+ # is a `const` node
99
+ def const_receiver?
100
+ receiver && receiver.const_type?
101
+ end
102
+
103
+ # Checks whether the method dispatch is the implicit form of `#call`,
104
+ # e.g. `foo.(bar)`.
105
+ #
106
+ # @return [Boolean] whether the method is the implicit form of `#call`
107
+ def implicit_call?
108
+ method?(:call) && !loc.selector
109
+ end
110
+
111
+ # Whether this method dispatch has an explicit block.
112
+ #
113
+ # @return [Boolean] whether the dispatched method has a block
114
+ def block_literal?
115
+ parent && parent.block_type? && eql?(parent.send_node)
116
+ end
117
+
118
+ # The `block` node associated with this method dispatch, if any.
119
+ #
120
+ # @return [BlockNode, nil] the `block` node associated with this method
121
+ # call or `nil`
122
+ def block_node
123
+ parent if block_literal?
124
+ end
125
+
126
+ # Checks if this node is part of a chain of `def` modifiers.
127
+ #
128
+ # @example
129
+ #
130
+ # private def foo; end
131
+ #
132
+ # @return [Boolean] whether the dispatched method is a `def` modifier
133
+ def def_modifier?
134
+ send_type? &&
135
+ [self, *each_descendant(:send)].any?(&:adjacent_def_modifier?)
136
+ end
137
+
138
+ private
139
+
140
+ def_node_matcher :macro_scope?, <<-PATTERN
141
+ {^{({sclass class module block} ...) class_constructor?}
142
+ ^^{({sclass class module block} ... (begin ...)) class_constructor?}
143
+ ^#macro_kwbegin_wrapper?
144
+ #root_node?}
145
+ PATTERN
146
+
147
+ # Check if a node's parent is a kwbegin wrapper within a macro scope
148
+ #
149
+ # @param parent [Node] parent of the node being checked
150
+ #
151
+ # @return [Boolean] true if the parent is a kwbegin in a macro scope
152
+ def macro_kwbegin_wrapper?(parent)
153
+ parent.kwbegin_type? && macro_scope?(parent)
154
+ end
155
+
156
+ # Check if a node does not have a parent
157
+ #
158
+ # @param node [Node]
159
+ #
160
+ # @return [Boolean] if the parent is nil
161
+ def root_node?(node)
162
+ node.parent.nil?
163
+ end
164
+
165
+ def_node_matcher :adjacent_def_modifier?, <<-PATTERN
166
+ (send nil? _ ({def defs} ...))
167
+ PATTERN
168
+
169
+ def_node_matcher :bare_access_modifier?, <<-PATTERN
170
+ (send nil? {:public :protected :private :module_function})
171
+ PATTERN
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # Common predicates for nodes that reference method identifiers:
6
+ # `send`, `csend`, `def`, `defs`, `super`, `zsuper`
7
+ #
8
+ # @note this mixin expects `#method_name` and `#receiver` to be implemented
9
+ module MethodIdentifierPredicates
10
+ ENUMERATOR_METHODS = %i[collect collect_concat detect downto each
11
+ find find_all find_index inject loop map!
12
+ map reduce reject reject! reverse_each select
13
+ select! times upto].freeze
14
+
15
+ # Checks whether the method name matches the argument.
16
+ #
17
+ # @param [Symbol, String] name the method name to check for
18
+ # @return [Boolean] whether the method name matches the argument
19
+ def method?(name)
20
+ method_name == name.to_sym
21
+ end
22
+
23
+ # Checks whether the method is an operator method.
24
+ #
25
+ # @return [Boolean] whether the method is an operator
26
+ def operator_method?
27
+ RuboCop::Cop::Util::OPERATOR_METHODS.include?(method_name)
28
+ end
29
+
30
+ # Checks whether the method is a comparison method.
31
+ #
32
+ # @return [Boolean] whether the method is a comparison
33
+ def comparison_method?
34
+ Node::COMPARISON_OPERATORS.include?(method_name)
35
+ end
36
+
37
+ # Checks whether the method is an assignment method.
38
+ #
39
+ # @return [Boolean] whether the method is an assignment
40
+ def assignment_method?
41
+ !comparison_method? && method_name.to_s.end_with?('=')
42
+ end
43
+
44
+ # Checks whether the method is an enumerator method.
45
+ #
46
+ # @return [Boolean] whether the method is an enumerator
47
+ def enumerator_method?
48
+ ENUMERATOR_METHODS.include?(method_name) ||
49
+ method_name.to_s.start_with?('each_')
50
+ end
51
+
52
+ # Checks whether the method is a predicate method.
53
+ #
54
+ # @return [Boolean] whether the method is a predicate method
55
+ def predicate_method?
56
+ method_name.to_s.end_with?('?')
57
+ end
58
+
59
+ # Checks whether the method is a bang method.
60
+ #
61
+ # @return [Boolean] whether the method is a bang method
62
+ def bang_method?
63
+ method_name.to_s.end_with?('!')
64
+ end
65
+
66
+ # Checks whether the method is a camel case method,
67
+ # e.g. `Integer()`.
68
+ #
69
+ # @return [Boolean] whether the method is a camel case method
70
+ def camel_case_method?
71
+ method_name.to_s =~ /\A[A-Z]/
72
+ end
73
+
74
+ # Checks whether the *explicit* receiver of this node is `self`.
75
+ #
76
+ # @return [Boolean] whether the receiver of this node is `self`
77
+ def self_receiver?
78
+ receiver && receiver.self_type?
79
+ end
80
+
81
+ # Checks whether the *explicit* receiver of node is a `const` node.
82
+ #
83
+ # @return [Boolean] whether the receiver of this node is a `const` node
84
+ def const_receiver?
85
+ receiver && receiver.const_type?
86
+ end
87
+ end
88
+ end
89
+ end
@@ -3,71 +3,58 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  # Common functionality for nodes that are parameterized:
6
- # `send`, `super`, `zsuper` ...
6
+ # `send`, `super`, `zsuper`, `def`, `defs`
7
7
  module ParameterizedNode
8
- # Checks whether this super invocation's arguments are wrapped in
9
- # parentheses.
8
+ # Checks whether this node's arguments are wrapped in parentheses.
10
9
  #
11
- # @return [Boolean] whether this super invocation's arguments are
10
+ # @return [Boolean] whether this node's arguments are
12
11
  # wrapped in parentheses
13
12
  def parenthesized?
14
13
  loc.end && loc.end.is?(')')
15
14
  end
16
15
 
17
- # A shorthand for getting the first argument of the method invocation.
16
+ # A shorthand for getting the first argument of the node.
18
17
  # Equivalent to `arguments.first`.
19
18
  #
20
- # @return [Node, nil] the first argument of the method invocation,
19
+ # @return [Node, nil] the first argument of the node,
21
20
  # or `nil` if there are no arguments
22
21
  def first_argument
23
22
  arguments[0]
24
23
  end
25
24
 
26
- # A shorthand for getting the last argument of the method invocation.
25
+ # A shorthand for getting the last argument of the node.
27
26
  # Equivalent to `arguments.last`.
28
27
  #
29
- # @return [Node, nil] the last argument of the method invocation,
28
+ # @return [Node, nil] the last argument of the node,
30
29
  # or `nil` if there are no arguments
31
30
  def last_argument
32
31
  arguments[-1]
33
32
  end
34
33
 
35
- # Checks whether this method was invoked with arguments.
34
+ # Checks whether this node has any arguments.
36
35
  #
37
- # @return [Boolean] whether this method was invoked with arguments
36
+ # @return [Boolean] whether this node has any arguments
38
37
  def arguments?
39
38
  !arguments.empty?
40
39
  end
41
40
 
42
- # Checks whether any argument of the method invocation is a splat
41
+ # Checks whether any argument of the node is a splat
43
42
  # argument, i.e. `*splat`.
44
43
  #
45
- # @return [Boolean] whether the invoked method is a splat argument
44
+ # @return [Boolean] whether the node is a splat argument
46
45
  def splat_argument?
47
- arguments? && arguments.any?(&:splat_type?)
46
+ arguments? &&
47
+ (arguments.any?(&:splat_type?) || arguments.any?(&:restarg_type?))
48
48
  end
49
+ alias rest_argument? splat_argument?
49
50
 
50
- # Whether the last argument of the method invocation is a block pass,
51
+ # Whether the last argument of the node is a block pass,
51
52
  # i.e. `&block`.
52
53
  #
53
- # @return [Boolean] whether the invoked method is a block pass
54
+ # @return [Boolean] whether the last argument of the node is a block pass
54
55
  def block_argument?
55
- arguments? && last_argument.block_pass_type?
56
- end
57
-
58
- # Whether this method invocation has an explicit block.
59
- #
60
- # @return [Boolean] whether the invoked method has a block
61
- def block_literal?
62
- parent && parent.block_type? && eql?(parent.send_node)
63
- end
64
-
65
- # The block node associated with this method call, if any.
66
- #
67
- # @return [BlockNode, nil] the `block` node associated with this method
68
- # call or `nil`
69
- def block_node
70
- parent if block_literal?
56
+ arguments? &&
57
+ (last_argument.block_pass_type? || last_argument.blockarg_type?)
71
58
  end
72
59
  end
73
60
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `regexp` nodes. This will be used in place of a plain
6
+ # node when the builder constructs the AST, making its methods available
7
+ # to all `regexp` nodes within RuboCop.
8
+ class RegexpNode < Node
9
+ OPTIONS = {
10
+ x: Regexp::EXTENDED,
11
+ i: Regexp::IGNORECASE,
12
+ m: Regexp::MULTILINE,
13
+ n: Regexp::NOENCODING
14
+ }.freeze
15
+
16
+ # @return [Regexp] a regexp of this node
17
+ def to_regexp
18
+ option = regopt.children.map { |opt| OPTIONS[opt] }.inject(:|)
19
+ Regexp.new(content, option)
20
+ end
21
+
22
+ # @return [RuboCop::AST::Node] a regopt node
23
+ def regopt
24
+ first, second = *self
25
+ first.regopt_type? ? first : second
26
+ end
27
+
28
+ # @return [String] a string of regexp content
29
+ def content
30
+ str = children.first
31
+ str.str_content || ''
32
+ end
33
+ end
34
+ end
35
+ end
@@ -7,168 +7,39 @@ module RuboCop
7
7
  # to all `send` nodes within RuboCop.
8
8
  class SendNode < Node
9
9
  include ParameterizedNode
10
+ include MethodDispatchNode
11
+ ARROW = '->'.freeze
10
12
 
11
- ENUMERATOR_METHODS = %i[collect collect_concat detect downto each
12
- find find_all find_index inject loop map!
13
- map reduce reject reject! reverse_each select
14
- select! times upto].freeze
15
-
16
- # The receiving node of the method invocation.
17
- #
18
- # @return [Node, nil] the receiver of the invoked method or `nil`
19
- def receiver
20
- node_parts[0]
21
- end
22
-
23
- # The name of the invoked method called as a string.
24
- #
25
- # @return [Symbol] the name of the invoked method
26
- def method_name
27
- node_parts[1]
28
- end
29
-
30
- # An array containing the arguments of the method invocation.
31
- #
32
- # @return [Array<Node>] the arguments of the method invocation or `nil`
33
- def arguments
34
- node_parts[2..-1]
35
- end
36
-
37
- # Checks whether the method name matches the argument.
38
- #
39
- # @param [Symbol, String] name the method name to check for
40
- # @return [Boolean] whether the method name matches the argument
41
- def method?(name)
42
- method_name == name.to_sym
43
- end
44
-
45
- # Checks whether the method is a macro method. A macro method is defined
46
- # as a method that sits in a class- or module body and has an implicit
47
- # receiver.
48
- #
49
- # @note This does not include DSLs that use nested blocks, like RSpec
50
- #
51
- # @return [Boolean] whether the method is a macro method
52
- def macro?
53
- !receiver && macro_scope?
54
- end
55
-
56
- # Checks whether the method name matches the argument and has an
57
- # implicit receiver.
58
- #
59
- # @param [Symbol, String] name the method name to check for
60
- # @return [Boolean] whether the method name matches the argument
61
- def command?(name)
62
- !receiver && method?(name)
63
- end
64
-
65
- # Checks whether the invoked method is a setter method.
66
- #
67
- # @return [Boolean] whether the invoked method is a setter
68
- def setter_method?
69
- loc.operator
70
- end
71
-
72
- # Checks whether the invoked method is an operator method.
73
- #
74
- # @return [Boolean] whether the invoked method is an operator
75
- def operator_method?
76
- RuboCop::Cop::Util::OPERATOR_METHODS.include?(method_name)
77
- end
78
-
79
- # Checks whether the invoked method is a comparison method.
80
- #
81
- # @return [Boolean] whether the involed method is a comparison
82
- def comparison_method?
83
- COMPARISON_OPERATORS.include?(method_name)
84
- end
85
-
86
- # Checks whether the invoked method is an assignment method.
87
- #
88
- # @return [Boolean] whether the invoked method is an assignment.
89
- def assignment_method?
90
- !comparison_method? && method_name.to_s.end_with?('=')
91
- end
92
-
93
- # Checks whether the invoked method is an enumerator method.
94
- #
95
- # @return [Boolean] whether the invoked method is an enumerator.
96
- def enumerator_method?
97
- ENUMERATOR_METHODS.include?(method_name) ||
98
- method_name.to_s.start_with?('each_')
99
- end
100
-
101
- # Checks whether the method call uses a dot to connect the receiver and
102
- # the method name.
103
- #
104
- # This is useful for comparison operators, which can be called either
105
- # with or without a dot, i.e. `foo == bar` or `foo.== bar`.
106
- #
107
- # @return [Boolean] whether the method was called with a connecting dot
108
- def dot?
109
- loc.dot && loc.dot.is?('.')
110
- end
111
-
112
- # Checks whether the method call uses a double colon to connect the
113
- # receiver and the method name.
114
- #
115
- # @return [Boolean] whether the method was called with a connecting dot
116
- def double_colon?
117
- loc.dot && loc.dot.is?('::')
118
- end
119
-
120
- # Checks whether the receiver of this method invocation is `self`.
121
- #
122
- # @return [Boolean] whether the receiver of this method invocation
123
- # is `self`
124
- def self_receiver?
125
- receiver && receiver.self_type?
126
- end
127
-
128
- # Checks whether the method call is of the implicit form of `#call`,
129
- # e.g. `foo.(bar)`.
13
+ # Custom destructuring method. This can be used to normalize
14
+ # destructuring for different variations of the node.
130
15
  #
131
- # @return [Boolean] whether the method is an implicit form of `#call`
132
- def implicit_call?
133
- method_name == :call && !loc.selector
16
+ # @return [Array] the different parts of the `send` node
17
+ def node_parts
18
+ to_a
134
19
  end
135
20
 
136
- # Checks whether the invoked method is a predicate method.
21
+ # Checks whether this is a negation method, i.e. `!` or keyword `not`.
137
22
  #
138
- # @return [Boolean] whether the invoked method is a predicate method
139
- def predicate_method?
140
- method_name.to_s.end_with?('?')
23
+ # @return [Boolean] whether this method is a negation method
24
+ def negation_method?
25
+ keyword_bang? || keyword_not?
141
26
  end
142
27
 
143
- # Checks whether the invoked method is a bang method.
28
+ # Checks whether this is a lambda. Some versions of parser parses
29
+ # non-literal lambdas as a method send.
144
30
  #
145
- # @return [Boolean] whether the invoked method is a bang method
146
- def bang_method?
147
- method_name.to_s.end_with?('!')
31
+ # @return [Boolean] whether this method is a lambda
32
+ def lambda?
33
+ parent && parent.block_type? && method?(:lambda)
148
34
  end
149
35
 
150
- # Checks whether the invoked method is a camel case method,
151
- # e.g. `Integer()`.
36
+ # Checks whether this is a stabby lambda. e.g. `-> () {}`
152
37
  #
153
- # @return [Boolean] whether the invoked method is a camel case method
154
- def camel_case_method?
155
- method_name.to_s =~ /\A[A-Z]/
38
+ # @return [Boolean] whether this method is a staby lambda
39
+ def stabby_lambda?
40
+ selector = loc.selector
41
+ selector && selector.source == ARROW
156
42
  end
157
-
158
- # Custom destructuring method. This can be used to normalize
159
- # destructuring for different variations of the node.
160
- #
161
- # @return [Array] the different parts of the `send` node
162
- def node_parts
163
- to_a
164
- end
165
-
166
- private
167
-
168
- def_matcher :macro_scope?, <<-PATTERN
169
- {^({class module} ...)
170
- ^^({class module} ... (begin ...))}
171
- PATTERN
172
43
  end
173
44
  end
174
45
  end