rubocop 0.42.0 → 0.52.1

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 (627) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +106 -20
  4. data/assets/output.html.erb +21 -10
  5. data/bin/rubocop +1 -2
  6. data/config/default.yml +914 -483
  7. data/config/disabled.yml +61 -41
  8. data/config/enabled.yml +1396 -878
  9. data/lib/rubocop/ast/builder.rb +72 -0
  10. data/lib/rubocop/ast/node/and_node.rb +37 -0
  11. data/lib/rubocop/ast/node/args_node.rb +29 -0
  12. data/lib/rubocop/ast/node/array_node.rb +57 -0
  13. data/lib/rubocop/ast/node/block_node.rb +116 -0
  14. data/lib/rubocop/ast/node/case_node.rb +64 -0
  15. data/lib/rubocop/ast/node/def_node.rb +71 -0
  16. data/lib/rubocop/ast/node/ensure_node.rb +25 -0
  17. data/lib/rubocop/ast/node/for_node.rb +61 -0
  18. data/lib/rubocop/ast/node/hash_node.rb +109 -0
  19. data/lib/rubocop/ast/node/if_node.rb +146 -0
  20. data/lib/rubocop/ast/node/keyword_splat_node.rb +45 -0
  21. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  22. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +23 -0
  23. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  24. data/lib/rubocop/ast/node/mixin/conditional_node.rb +45 -0
  25. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +125 -0
  26. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  27. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  28. data/lib/rubocop/ast/node/mixin/modifier_node.rb +17 -0
  29. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +61 -0
  30. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
  31. data/lib/rubocop/ast/node/or_node.rb +37 -0
  32. data/lib/rubocop/ast/node/pair_node.rb +64 -0
  33. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  34. data/lib/rubocop/ast/node/resbody_node.rb +25 -0
  35. data/lib/rubocop/ast/node/send_node.rb +45 -0
  36. data/lib/rubocop/ast/node/str_node.rb +14 -0
  37. data/lib/rubocop/ast/node/super_node.rb +21 -0
  38. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  39. data/lib/rubocop/ast/node/until_node.rb +43 -0
  40. data/lib/rubocop/ast/node/when_node.rb +61 -0
  41. data/lib/rubocop/ast/node/while_node.rb +43 -0
  42. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  43. data/lib/rubocop/ast/node.rb +634 -0
  44. data/lib/rubocop/ast/sexp.rb +16 -0
  45. data/lib/rubocop/{ast_node → ast}/traversal.rb +23 -24
  46. data/lib/rubocop/cached_data.rb +11 -31
  47. data/lib/rubocop/cli.rb +116 -33
  48. data/lib/rubocop/comment_config.rb +4 -10
  49. data/lib/rubocop/config.rb +355 -102
  50. data/lib/rubocop/config_loader.rb +93 -78
  51. data/lib/rubocop/config_loader_resolver.rb +106 -7
  52. data/lib/rubocop/config_store.rb +4 -1
  53. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  54. data/lib/rubocop/cop/badge.rb +73 -0
  55. data/lib/rubocop/cop/bundler/duplicated_gem.rb +71 -0
  56. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  57. data/lib/rubocop/cop/bundler/ordered_gems.rb +71 -0
  58. data/lib/rubocop/cop/commissioner.rb +27 -10
  59. data/lib/rubocop/cop/cop.rb +62 -107
  60. data/lib/rubocop/cop/corrector.rb +0 -1
  61. data/lib/rubocop/cop/correctors/alignment_corrector.rb +121 -0
  62. data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
  63. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  64. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +62 -0
  65. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  66. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  67. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  68. data/lib/rubocop/cop/correctors/space_corrector.rb +34 -0
  69. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  70. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +31 -0
  71. data/lib/rubocop/cop/force.rb +0 -1
  72. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  73. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +106 -0
  74. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  75. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  76. data/lib/rubocop/cop/generator.rb +191 -0
  77. data/lib/rubocop/cop/ignored_node.rb +0 -1
  78. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  79. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
  80. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  81. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  82. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  83. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  84. data/lib/rubocop/cop/internal_affairs.rb +8 -0
  85. data/lib/rubocop/cop/{style → layout}/access_modifier_indentation.rb +39 -10
  86. data/lib/rubocop/cop/layout/align_array.rb +39 -0
  87. data/lib/rubocop/cop/layout/align_hash.rb +235 -0
  88. data/lib/rubocop/cop/{style → layout}/align_parameters.rb +38 -19
  89. data/lib/rubocop/cop/{style → layout}/block_end_newline.rb +26 -8
  90. data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
  91. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  92. data/lib/rubocop/cop/{style → layout}/closing_parenthesis_indentation.rb +18 -13
  93. data/lib/rubocop/cop/{style → layout}/comment_indentation.rb +48 -6
  94. data/lib/rubocop/cop/{style → layout}/dot_position.rb +34 -21
  95. data/lib/rubocop/cop/{style → layout}/else_alignment.rb +55 -37
  96. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -0
  97. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +147 -0
  98. data/lib/rubocop/cop/{style → layout}/empty_lines.rb +17 -4
  99. data/lib/rubocop/cop/{style → layout}/empty_lines_around_access_modifier.rb +40 -24
  100. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +87 -0
  101. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +46 -0
  102. data/lib/rubocop/cop/{style → layout}/empty_lines_around_block_body.rb +9 -12
  103. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +68 -0
  104. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +135 -0
  105. data/lib/rubocop/cop/{style → layout}/empty_lines_around_method_body.rb +10 -7
  106. data/lib/rubocop/cop/{style → layout}/empty_lines_around_module_body.rb +27 -9
  107. data/lib/rubocop/cop/layout/end_of_line.rb +52 -0
  108. data/lib/rubocop/cop/{style → layout}/extra_spacing.rb +63 -53
  109. data/lib/rubocop/cop/{style → layout}/first_array_element_line_break.rb +5 -2
  110. data/lib/rubocop/cop/{style → layout}/first_hash_element_line_break.rb +5 -2
  111. data/lib/rubocop/cop/{style → layout}/first_method_argument_line_break.rb +7 -4
  112. data/lib/rubocop/cop/{style → layout}/first_method_parameter_line_break.rb +8 -5
  113. data/lib/rubocop/cop/{style → layout}/first_parameter_indentation.rb +32 -26
  114. data/lib/rubocop/cop/{style → layout}/indent_array.rb +75 -25
  115. data/lib/rubocop/cop/{style → layout}/indent_assignment.rb +9 -6
  116. data/lib/rubocop/cop/{style → layout}/indent_hash.rb +80 -31
  117. data/lib/rubocop/cop/layout/indent_heredoc.rb +208 -0
  118. data/lib/rubocop/cop/{style → layout}/indentation_consistency.rb +7 -5
  119. data/lib/rubocop/cop/{style → layout}/indentation_width.rb +151 -117
  120. data/lib/rubocop/cop/layout/initial_indentation.rb +45 -0
  121. data/lib/rubocop/cop/layout/leading_comment_space.rb +58 -0
  122. data/lib/rubocop/cop/{style → layout}/multiline_array_brace_layout.rb +52 -16
  123. data/lib/rubocop/cop/{style → layout}/multiline_assignment_layout.rb +18 -21
  124. data/lib/rubocop/cop/{style → layout}/multiline_block_layout.rb +37 -43
  125. data/lib/rubocop/cop/{style → layout}/multiline_hash_brace_layout.rb +55 -15
  126. data/lib/rubocop/cop/{style → layout}/multiline_method_call_brace_layout.rb +15 -4
  127. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +221 -0
  128. data/lib/rubocop/cop/{style → layout}/multiline_method_definition_brace_layout.rb +12 -5
  129. data/lib/rubocop/cop/{style → layout}/multiline_operation_indentation.rb +23 -13
  130. data/lib/rubocop/cop/{style → layout}/rescue_ensure_alignment.rb +24 -13
  131. data/lib/rubocop/cop/{style → layout}/space_after_colon.rb +17 -13
  132. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  133. data/lib/rubocop/cop/{style → layout}/space_after_method_name.rb +11 -11
  134. data/lib/rubocop/cop/layout/space_after_not.rb +38 -0
  135. data/lib/rubocop/cop/{style → layout}/space_after_semicolon.rb +14 -4
  136. data/lib/rubocop/cop/{style → layout}/space_around_block_parameters.rb +52 -28
  137. data/lib/rubocop/cop/{style → layout}/space_around_equals_in_parameter_default.rb +29 -21
  138. data/lib/rubocop/cop/{style → layout}/space_around_keyword.rb +33 -29
  139. data/lib/rubocop/cop/layout/space_around_operators.rb +159 -0
  140. data/lib/rubocop/cop/layout/space_before_block_braces.rb +107 -0
  141. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  142. data/lib/rubocop/cop/{style → layout}/space_before_comment.rb +11 -7
  143. data/lib/rubocop/cop/{style → layout}/space_before_first_arg.rb +23 -20
  144. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  145. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +85 -0
  146. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +236 -0
  147. data/lib/rubocop/cop/{style → layout}/space_inside_array_percent_literal.rb +8 -8
  148. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +228 -0
  149. data/lib/rubocop/cop/{style → layout}/space_inside_hash_literal_braces.rb +91 -51
  150. data/lib/rubocop/cop/layout/space_inside_parens.rb +53 -0
  151. data/lib/rubocop/cop/{style → layout}/space_inside_percent_literal_delimiters.rb +14 -13
  152. data/lib/rubocop/cop/{style → layout}/space_inside_range_literal.rb +16 -17
  153. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +90 -0
  154. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +80 -0
  155. data/lib/rubocop/cop/{style → layout}/tab.rb +8 -6
  156. data/lib/rubocop/cop/{style → layout}/trailing_blank_lines.rb +14 -15
  157. data/lib/rubocop/cop/{style → layout}/trailing_whitespace.rb +3 -4
  158. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +59 -0
  159. data/lib/rubocop/cop/lint/ambiguous_operator.rb +13 -9
  160. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +7 -1
  161. data/lib/rubocop/cop/lint/assignment_in_condition.rb +55 -25
  162. data/lib/rubocop/cop/lint/block_alignment.rb +75 -34
  163. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  164. data/lib/rubocop/cop/lint/circular_argument_reference.rb +17 -15
  165. data/lib/rubocop/cop/lint/condition_position.rb +16 -15
  166. data/lib/rubocop/cop/lint/debugger.rb +57 -23
  167. data/lib/rubocop/cop/lint/def_end_alignment.rb +28 -14
  168. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +19 -10
  169. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  170. data/lib/rubocop/cop/lint/duplicate_methods.rb +108 -14
  171. data/lib/rubocop/cop/lint/duplicated_key.rb +16 -9
  172. data/lib/rubocop/cop/lint/each_with_object_argument.rb +15 -6
  173. data/lib/rubocop/cop/lint/else_layout.rb +27 -31
  174. data/lib/rubocop/cop/lint/empty_ensure.rb +44 -3
  175. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  176. data/lib/rubocop/cop/lint/empty_interpolation.rb +16 -3
  177. data/lib/rubocop/cop/lint/empty_when.rb +38 -0
  178. data/lib/rubocop/cop/lint/end_alignment.rb +57 -39
  179. data/lib/rubocop/cop/lint/end_in_method.rb +24 -2
  180. data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
  181. data/lib/rubocop/cop/lint/float_out_of_range.rb +10 -6
  182. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +67 -46
  183. data/lib/rubocop/cop/lint/handle_exceptions.rb +41 -4
  184. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +9 -5
  185. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +42 -29
  186. data/lib/rubocop/cop/lint/inherit_exception.rb +34 -23
  187. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  188. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +51 -40
  189. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -8
  190. data/lib/rubocop/cop/lint/loop.rb +37 -2
  191. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  192. data/lib/rubocop/cop/lint/multiple_compare.rb +48 -0
  193. data/lib/rubocop/cop/lint/nested_method_definition.rb +54 -12
  194. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  195. data/lib/rubocop/cop/lint/next_without_accumulator.rb +7 -3
  196. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +32 -23
  197. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +22 -14
  198. data/lib/rubocop/cop/lint/percent_string_array.rb +42 -27
  199. data/lib/rubocop/cop/lint/percent_symbol_array.rb +28 -19
  200. data/lib/rubocop/cop/lint/rand_one.rb +17 -8
  201. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  202. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  203. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  204. data/lib/rubocop/cop/lint/require_parentheses.rb +24 -30
  205. data/lib/rubocop/cop/lint/rescue_exception.rb +21 -2
  206. data/lib/rubocop/cop/lint/rescue_type.rb +90 -0
  207. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  208. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +70 -0
  209. data/lib/rubocop/cop/lint/script_permission.rb +49 -0
  210. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  211. data/lib/rubocop/cop/lint/shadowed_exception.rb +78 -57
  212. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +25 -2
  213. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +18 -12
  214. data/lib/rubocop/cop/lint/syntax.rb +23 -21
  215. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -4
  216. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  217. data/lib/rubocop/cop/lint/unneeded_disable.rb +117 -56
  218. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  219. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +167 -0
  220. data/lib/rubocop/cop/lint/unreachable_code.rb +72 -8
  221. data/lib/rubocop/cop/lint/unused_block_argument.rb +87 -27
  222. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  223. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +75 -0
  224. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  225. data/lib/rubocop/cop/lint/useless_access_modifier.rb +40 -18
  226. data/lib/rubocop/cop/lint/useless_assignment.rb +45 -14
  227. data/lib/rubocop/cop/lint/useless_comparison.rb +8 -10
  228. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +16 -2
  229. data/lib/rubocop/cop/lint/useless_setter_call.rb +57 -43
  230. data/lib/rubocop/cop/lint/void.rb +83 -23
  231. data/lib/rubocop/cop/message_annotator.rb +118 -0
  232. data/lib/rubocop/cop/metrics/abc_size.rb +3 -4
  233. data/lib/rubocop/cop/metrics/block_length.rb +32 -0
  234. data/lib/rubocop/cop/metrics/block_nesting.rb +21 -10
  235. data/lib/rubocop/cop/metrics/class_length.rb +3 -2
  236. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -4
  237. data/lib/rubocop/cop/metrics/line_length.rb +67 -14
  238. data/lib/rubocop/cop/metrics/method_length.rb +10 -10
  239. data/lib/rubocop/cop/metrics/module_length.rb +3 -2
  240. data/lib/rubocop/cop/metrics/parameter_lists.rb +15 -6
  241. data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -6
  242. data/lib/rubocop/cop/mixin/alignment.rb +70 -0
  243. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -1
  244. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +26 -22
  245. data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
  246. data/lib/rubocop/cop/mixin/array_syntax.rb +4 -12
  247. data/lib/rubocop/cop/mixin/check_assignment.rb +6 -7
  248. data/lib/rubocop/cop/mixin/classish_length.rb +0 -1
  249. data/lib/rubocop/cop/mixin/code_length.rb +4 -3
  250. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -16
  251. data/lib/rubocop/cop/mixin/configurable_formatting.rb +48 -0
  252. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -4
  253. data/lib/rubocop/cop/mixin/configurable_naming.rb +5 -35
  254. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  255. data/lib/rubocop/cop/mixin/def_node.rb +29 -0
  256. data/lib/rubocop/cop/mixin/documentation_comment.rb +46 -0
  257. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  258. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +119 -27
  259. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  260. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +11 -27
  261. data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
  262. data/lib/rubocop/cop/mixin/first_element_line_break.rb +15 -11
  263. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +15 -13
  264. data/lib/rubocop/cop/mixin/hash_alignment.rb +116 -0
  265. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  266. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  267. data/lib/rubocop/cop/mixin/integer_node.rb +2 -1
  268. data/lib/rubocop/cop/mixin/match_range.rb +4 -6
  269. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -8
  270. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  271. data/lib/rubocop/cop/mixin/min_body_length.rb +2 -1
  272. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +100 -66
  273. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +49 -51
  274. data/lib/rubocop/cop/mixin/negative_conditional.rb +18 -13
  275. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -25
  276. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +48 -0
  277. data/lib/rubocop/cop/mixin/parentheses.rb +2 -8
  278. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -2
  279. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  280. data/lib/rubocop/cop/mixin/percent_literal.rb +69 -6
  281. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +16 -5
  282. data/lib/rubocop/cop/mixin/rescue_node.rb +23 -0
  283. data/lib/rubocop/cop/mixin/safe_assignment.rb +3 -1
  284. data/lib/rubocop/cop/mixin/safe_mode.rb +22 -0
  285. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -10
  286. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -14
  287. data/lib/rubocop/cop/mixin/statement_modifier.rb +29 -32
  288. data/lib/rubocop/cop/mixin/string_help.rb +3 -2
  289. data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -15
  290. data/lib/rubocop/cop/mixin/surrounding_space.rb +78 -9
  291. data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
  292. data/lib/rubocop/cop/mixin/target_ruby_version.rb +16 -0
  293. data/lib/rubocop/cop/mixin/too_many_lines.rb +39 -0
  294. data/lib/rubocop/cop/mixin/trailing_comma.rb +37 -38
  295. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -16
  296. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  297. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +36 -5
  298. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +42 -0
  299. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  300. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  301. data/lib/rubocop/cop/{style → naming}/file_name.rb +72 -29
  302. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  303. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  304. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  305. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  306. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  307. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  308. data/lib/rubocop/cop/offense.rb +9 -5
  309. data/lib/rubocop/cop/performance/caller.rb +69 -0
  310. data/lib/rubocop/cop/performance/case_when_splat.rb +65 -89
  311. data/lib/rubocop/cop/performance/casecmp.rb +37 -25
  312. data/lib/rubocop/cop/performance/compare_with_block.rb +117 -0
  313. data/lib/rubocop/cop/performance/count.rb +33 -43
  314. data/lib/rubocop/cop/performance/detect.rb +30 -31
  315. data/lib/rubocop/cop/performance/double_start_end_with.rb +55 -26
  316. data/lib/rubocop/cop/performance/end_with.rb +9 -9
  317. data/lib/rubocop/cop/performance/fixed_size.rb +21 -17
  318. data/lib/rubocop/cop/performance/flat_map.rb +30 -33
  319. data/lib/rubocop/cop/performance/hash_each_methods.rb +129 -0
  320. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +14 -14
  321. data/lib/rubocop/cop/performance/range_include.rb +5 -4
  322. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -29
  323. data/lib/rubocop/cop/performance/redundant_match.rb +19 -15
  324. data/lib/rubocop/cop/performance/redundant_merge.rb +100 -52
  325. data/lib/rubocop/cop/performance/redundant_sort_by.rb +17 -14
  326. data/lib/rubocop/cop/performance/regexp_match.rb +224 -0
  327. data/lib/rubocop/cop/performance/reverse_each.rb +3 -6
  328. data/lib/rubocop/cop/performance/sample.rb +84 -83
  329. data/lib/rubocop/cop/performance/size.rb +22 -15
  330. data/lib/rubocop/cop/performance/start_with.rb +9 -9
  331. data/lib/rubocop/cop/performance/string_replacement.rb +35 -70
  332. data/lib/rubocop/cop/performance/times_map.rb +33 -24
  333. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  334. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  335. data/lib/rubocop/cop/rails/action_filter.rb +67 -47
  336. data/lib/rubocop/cop/rails/active_support_aliases.rb +68 -0
  337. data/lib/rubocop/cop/rails/application_job.rb +40 -0
  338. data/lib/rubocop/cop/rails/application_record.rb +40 -0
  339. data/lib/rubocop/cop/rails/blank.rb +142 -0
  340. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  341. data/lib/rubocop/cop/rails/date.rb +47 -42
  342. data/lib/rubocop/cop/rails/delegate.rb +55 -33
  343. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +51 -0
  344. data/lib/rubocop/cop/rails/dynamic_find_by.rb +82 -0
  345. data/lib/rubocop/cop/rails/enum_uniqueness.rb +45 -0
  346. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  347. data/lib/rubocop/cop/rails/exit.rb +17 -11
  348. data/lib/rubocop/cop/rails/file_path.rb +72 -0
  349. data/lib/rubocop/cop/rails/find_by.rb +14 -20
  350. data/lib/rubocop/cop/rails/find_each.rb +8 -21
  351. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +9 -2
  352. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +84 -0
  353. data/lib/rubocop/cop/rails/http_positional_arguments.rb +102 -0
  354. data/lib/rubocop/cop/rails/inverse_of.rb +218 -0
  355. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  356. data/lib/rubocop/cop/rails/not_null_column.rb +67 -0
  357. data/lib/rubocop/cop/rails/output.rb +15 -13
  358. data/lib/rubocop/cop/rails/output_safety.rb +65 -17
  359. data/lib/rubocop/cop/rails/pluralization_grammar.rb +30 -29
  360. data/lib/rubocop/cop/rails/presence.rb +118 -0
  361. data/lib/rubocop/cop/rails/present.rb +143 -0
  362. data/lib/rubocop/cop/rails/read_write_attribute.rb +20 -26
  363. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +133 -0
  364. data/lib/rubocop/cop/rails/relative_date_constant.rb +88 -0
  365. data/lib/rubocop/cop/rails/request_referer.rb +28 -13
  366. data/lib/rubocop/cop/rails/reversible_migration.rb +281 -0
  367. data/lib/rubocop/cop/rails/safe_navigation.rb +90 -0
  368. data/lib/rubocop/cop/rails/save_bang.rb +104 -19
  369. data/lib/rubocop/cop/rails/scope_args.rb +5 -10
  370. data/lib/rubocop/cop/rails/skips_model_validations.rb +70 -0
  371. data/lib/rubocop/cop/rails/time_zone.rb +34 -21
  372. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +17 -14
  373. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  374. data/lib/rubocop/cop/rails/validation.rb +16 -20
  375. data/lib/rubocop/cop/registry.rb +172 -0
  376. data/lib/rubocop/cop/security/eval.rb +30 -0
  377. data/lib/rubocop/cop/security/json_load.rb +46 -0
  378. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  379. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  380. data/lib/rubocop/cop/severity.rb +1 -2
  381. data/lib/rubocop/cop/style/alias.rb +54 -33
  382. data/lib/rubocop/cop/style/and_or.rb +77 -63
  383. data/lib/rubocop/cop/style/array_join.rb +13 -9
  384. data/lib/rubocop/cop/style/ascii_comments.rb +25 -7
  385. data/lib/rubocop/cop/style/attr.rb +24 -11
  386. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -16
  387. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -11
  388. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  389. data/lib/rubocop/cop/style/block_comments.rb +20 -11
  390. data/lib/rubocop/cop/style/block_delimiters.rb +122 -51
  391. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +142 -54
  392. data/lib/rubocop/cop/style/case_equality.rb +15 -4
  393. data/lib/rubocop/cop/style/character_literal.rb +12 -5
  394. data/lib/rubocop/cop/style/class_and_module_children.rb +85 -6
  395. data/lib/rubocop/cop/style/class_check.rb +35 -19
  396. data/lib/rubocop/cop/style/class_methods.rb +13 -14
  397. data/lib/rubocop/cop/style/class_vars.rb +5 -5
  398. data/lib/rubocop/cop/style/collection_methods.rb +12 -13
  399. data/lib/rubocop/cop/style/colon_method_call.rb +24 -16
  400. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  401. data/lib/rubocop/cop/style/command_literal.rb +98 -32
  402. data/lib/rubocop/cop/style/comment_annotation.rb +41 -15
  403. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  404. data/lib/rubocop/cop/style/conditional_assignment.rb +161 -112
  405. data/lib/rubocop/cop/style/copyright.rb +32 -34
  406. data/lib/rubocop/cop/style/date_time.rb +44 -0
  407. data/lib/rubocop/cop/style/def_with_parentheses.rb +32 -9
  408. data/lib/rubocop/cop/style/dir.rb +48 -0
  409. data/lib/rubocop/cop/style/documentation.rb +44 -58
  410. data/lib/rubocop/cop/style/documentation_method.rb +76 -0
  411. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  412. data/lib/rubocop/cop/style/each_for_simple_loop.rb +14 -13
  413. data/lib/rubocop/cop/style/each_with_object.rb +28 -25
  414. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  415. data/lib/rubocop/cop/style/empty_case_condition.rb +18 -30
  416. data/lib/rubocop/cop/style/empty_else.rb +82 -51
  417. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  418. data/lib/rubocop/cop/style/empty_literal.rb +76 -48
  419. data/lib/rubocop/cop/style/empty_method.rb +112 -0
  420. data/lib/rubocop/cop/style/encoding.rb +10 -40
  421. data/lib/rubocop/cop/style/end_block.rb +1 -2
  422. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  423. data/lib/rubocop/cop/style/even_odd.rb +25 -44
  424. data/lib/rubocop/cop/style/flip_flop.rb +13 -3
  425. data/lib/rubocop/cop/style/for.rb +19 -15
  426. data/lib/rubocop/cop/style/format_string.rb +88 -42
  427. data/lib/rubocop/cop/style/format_string_token.rb +163 -0
  428. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +90 -15
  429. data/lib/rubocop/cop/style/global_vars.rb +14 -5
  430. data/lib/rubocop/cop/style/guard_clause.rb +22 -62
  431. data/lib/rubocop/cop/style/hash_syntax.rb +109 -59
  432. data/lib/rubocop/cop/style/identical_conditional_branches.rb +73 -32
  433. data/lib/rubocop/cop/style/if_inside_else.rb +16 -20
  434. data/lib/rubocop/cop/style/if_unless_modifier.rb +48 -39
  435. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +6 -12
  436. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -2
  437. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -7
  438. data/lib/rubocop/cop/style/infinite_loop.rb +33 -32
  439. data/lib/rubocop/cop/style/inline_comment.rb +17 -5
  440. data/lib/rubocop/cop/style/inverse_methods.rb +149 -0
  441. data/lib/rubocop/cop/style/lambda.rb +66 -63
  442. data/lib/rubocop/cop/style/lambda_call.rb +50 -20
  443. data/lib/rubocop/cop/style/line_end_concatenation.rb +38 -17
  444. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +90 -0
  445. data/lib/rubocop/cop/style/{method_call_parentheses.rb → method_call_without_args_parentheses.rb} +32 -25
  446. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +9 -9
  447. data/lib/rubocop/cop/style/method_def_parentheses.rb +101 -29
  448. data/lib/rubocop/cop/style/method_missing.rb +14 -20
  449. data/lib/rubocop/cop/style/min_max.rb +68 -0
  450. data/lib/rubocop/cop/style/missing_else.rb +61 -21
  451. data/lib/rubocop/cop/style/mixin_grouping.rb +145 -0
  452. data/lib/rubocop/cop/style/mixin_usage.rb +82 -0
  453. data/lib/rubocop/cop/style/module_function.rb +44 -18
  454. data/lib/rubocop/cop/style/multiline_block_chain.rb +8 -15
  455. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  456. data/lib/rubocop/cop/style/multiline_if_then.rb +21 -14
  457. data/lib/rubocop/cop/style/multiline_memoization.rb +93 -0
  458. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -9
  459. data/lib/rubocop/cop/style/multiple_comparison.rb +77 -0
  460. data/lib/rubocop/cop/style/mutable_constant.rb +17 -9
  461. data/lib/rubocop/cop/style/negated_if.rb +76 -25
  462. data/lib/rubocop/cop/style/negated_while.rb +4 -22
  463. data/lib/rubocop/cop/style/nested_modifier.rb +17 -47
  464. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +32 -28
  465. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -6
  466. data/lib/rubocop/cop/style/next.rb +72 -53
  467. data/lib/rubocop/cop/style/nil_comparison.rb +10 -14
  468. data/lib/rubocop/cop/style/non_nil_check.rb +69 -62
  469. data/lib/rubocop/cop/style/not.rb +19 -13
  470. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +16 -7
  471. data/lib/rubocop/cop/style/numeric_literals.rb +33 -12
  472. data/lib/rubocop/cop/style/numeric_predicate.rb +30 -32
  473. data/lib/rubocop/cop/style/one_line_conditional.rb +21 -17
  474. data/lib/rubocop/cop/style/option_hash.rb +11 -37
  475. data/lib/rubocop/cop/style/optional_arguments.rb +20 -9
  476. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  477. data/lib/rubocop/cop/style/parallel_assignment.rb +83 -64
  478. data/lib/rubocop/cop/style/parentheses_around_condition.rb +37 -19
  479. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +50 -15
  480. data/lib/rubocop/cop/style/percent_q_literals.rb +40 -17
  481. data/lib/rubocop/cop/style/perl_backrefs.rb +9 -3
  482. data/lib/rubocop/cop/style/preferred_hash_methods.rb +48 -14
  483. data/lib/rubocop/cop/style/proc.rb +13 -10
  484. data/lib/rubocop/cop/style/raise_args.rb +46 -50
  485. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  486. data/lib/rubocop/cop/style/redundant_begin.rb +16 -6
  487. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  488. data/lib/rubocop/cop/style/redundant_exception.rb +4 -5
  489. data/lib/rubocop/cop/style/redundant_freeze.rb +7 -10
  490. data/lib/rubocop/cop/style/redundant_parentheses.rb +70 -31
  491. data/lib/rubocop/cop/style/redundant_return.rb +61 -23
  492. data/lib/rubocop/cop/style/redundant_self.rb +62 -60
  493. data/lib/rubocop/cop/style/regexp_literal.rb +100 -34
  494. data/lib/rubocop/cop/style/rescue_modifier.rb +15 -17
  495. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  496. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  497. data/lib/rubocop/cop/style/safe_navigation.rb +197 -0
  498. data/lib/rubocop/cop/style/self_assignment.rb +20 -17
  499. data/lib/rubocop/cop/style/semicolon.rb +25 -17
  500. data/lib/rubocop/cop/style/send.rb +14 -4
  501. data/lib/rubocop/cop/style/signal_exception.rb +105 -7
  502. data/lib/rubocop/cop/style/single_line_block_params.rb +27 -21
  503. data/lib/rubocop/cop/style/single_line_methods.rb +45 -31
  504. data/lib/rubocop/cop/style/special_global_vars.rb +32 -28
  505. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +24 -53
  506. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  507. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  508. data/lib/rubocop/cop/style/string_literals.rb +31 -5
  509. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +20 -2
  510. data/lib/rubocop/cop/style/string_methods.rb +22 -9
  511. data/lib/rubocop/cop/style/struct_inheritance.rb +5 -17
  512. data/lib/rubocop/cop/style/symbol_array.rb +39 -65
  513. data/lib/rubocop/cop/style/symbol_literal.rb +1 -2
  514. data/lib/rubocop/cop/style/symbol_proc.rb +35 -52
  515. data/lib/rubocop/cop/style/ternary_parentheses.rb +143 -42
  516. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  517. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +31 -20
  518. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +26 -8
  519. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  520. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +97 -37
  521. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -66
  522. data/lib/rubocop/cop/style/unless_else.rb +19 -13
  523. data/lib/rubocop/cop/style/unneeded_capital_w.rb +24 -10
  524. data/lib/rubocop/cop/style/unneeded_interpolation.rb +22 -24
  525. data/lib/rubocop/cop/style/unneeded_percent_q.rb +28 -22
  526. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -10
  527. data/lib/rubocop/cop/style/when_then.rb +18 -4
  528. data/lib/rubocop/cop/style/while_until_do.rb +34 -16
  529. data/lib/rubocop/cop/style/while_until_modifier.rb +32 -12
  530. data/lib/rubocop/cop/style/word_array.rb +45 -102
  531. data/lib/rubocop/cop/style/yoda_condition.rb +107 -0
  532. data/lib/rubocop/cop/style/zero_length_predicate.rb +55 -32
  533. data/lib/rubocop/cop/team.rb +33 -35
  534. data/lib/rubocop/cop/util.rb +120 -54
  535. data/lib/rubocop/cop/variable_force/assignment.rb +5 -9
  536. data/lib/rubocop/cop/variable_force/branch.rb +318 -0
  537. data/lib/rubocop/cop/variable_force/branchable.rb +21 -0
  538. data/lib/rubocop/cop/variable_force/reference.rb +1 -2
  539. data/lib/rubocop/cop/variable_force/scope.rb +37 -26
  540. data/lib/rubocop/cop/variable_force/variable.rb +12 -12
  541. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -4
  542. data/lib/rubocop/cop/variable_force.rb +72 -39
  543. data/lib/rubocop/error.rb +0 -1
  544. data/lib/rubocop/formatter/base_formatter.rb +4 -9
  545. data/lib/rubocop/formatter/clang_style_formatter.rb +2 -3
  546. data/lib/rubocop/formatter/colorizable.rb +9 -10
  547. data/lib/rubocop/formatter/disabled_config_formatter.rb +48 -35
  548. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -1
  549. data/lib/rubocop/formatter/emacs_style_formatter.rb +0 -1
  550. data/lib/rubocop/formatter/file_list_formatter.rb +0 -1
  551. data/lib/rubocop/formatter/formatter_set.rb +16 -13
  552. data/lib/rubocop/formatter/fuubar_style_formatter.rb +6 -1
  553. data/lib/rubocop/formatter/html_formatter.rb +5 -5
  554. data/lib/rubocop/formatter/json_formatter.rb +9 -4
  555. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -1
  556. data/lib/rubocop/formatter/progress_formatter.rb +0 -1
  557. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  558. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -17
  559. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  560. data/lib/rubocop/formatter/text_util.rb +0 -1
  561. data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -5
  562. data/lib/rubocop/magic_comment.rb +210 -0
  563. data/lib/rubocop/name_similarity.rb +0 -1
  564. data/lib/rubocop/node_pattern.rb +181 -118
  565. data/lib/rubocop/options.rb +154 -88
  566. data/lib/rubocop/path_util.rb +38 -4
  567. data/lib/rubocop/platform.rb +11 -0
  568. data/lib/rubocop/processed_source.rb +23 -20
  569. data/lib/rubocop/rake_task.rb +16 -24
  570. data/lib/rubocop/remote_config.rb +40 -13
  571. data/lib/rubocop/result_cache.rb +33 -24
  572. data/lib/rubocop/rspec/cop_helper.rb +21 -7
  573. data/lib/rubocop/rspec/expect_offense.rb +165 -0
  574. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -2
  575. data/lib/rubocop/rspec/shared_contexts.rb +24 -9
  576. data/lib/rubocop/rspec/shared_examples.rb +10 -19
  577. data/lib/rubocop/rspec/support.rb +5 -5
  578. data/lib/rubocop/runner.rb +74 -39
  579. data/lib/rubocop/string_interpreter.rb +0 -1
  580. data/lib/rubocop/string_util.rb +11 -6
  581. data/lib/rubocop/target_finder.rb +70 -8
  582. data/lib/rubocop/token.rb +79 -2
  583. data/lib/rubocop/version.rb +2 -5
  584. data/lib/rubocop/warning.rb +0 -1
  585. data/lib/rubocop.rb +569 -398
  586. metadata +301 -112
  587. data/lib/rubocop/ast_node/builder.rb +0 -31
  588. data/lib/rubocop/ast_node/sexp.rb +0 -14
  589. data/lib/rubocop/ast_node.rb +0 -623
  590. data/lib/rubocop/cop/lint/eval.rb +0 -23
  591. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -39
  592. data/lib/rubocop/cop/lint/useless_array_splat.rb +0 -56
  593. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -42
  594. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -152
  595. data/lib/rubocop/cop/mixin/hash_node.rb +0 -15
  596. data/lib/rubocop/cop/mixin/if_node.rb +0 -37
  597. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -31
  598. data/lib/rubocop/cop/mixin/space_inside.rb +0 -79
  599. data/lib/rubocop/cop/performance/hash_each.rb +0 -86
  600. data/lib/rubocop/cop/performance/push_splat.rb +0 -47
  601. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -46
  602. data/lib/rubocop/cop/style/align_array.rb +0 -21
  603. data/lib/rubocop/cop/style/align_hash.rb +0 -256
  604. data/lib/rubocop/cop/style/case_indentation.rb +0 -92
  605. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -30
  606. data/lib/rubocop/cop/style/constant_name.rb +0 -30
  607. data/lib/rubocop/cop/style/empty_line_between_defs.rb +0 -76
  608. data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +0 -40
  609. data/lib/rubocop/cop/style/end_of_line.rb +0 -31
  610. data/lib/rubocop/cop/style/initial_indentation.rb +0 -38
  611. data/lib/rubocop/cop/style/leading_comment_space.rb +0 -33
  612. data/lib/rubocop/cop/style/method_name.rb +0 -29
  613. data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +0 -176
  614. data/lib/rubocop/cop/style/op_method.rb +0 -44
  615. data/lib/rubocop/cop/style/predicate_name.rb +0 -68
  616. data/lib/rubocop/cop/style/space_after_comma.rb +0 -22
  617. data/lib/rubocop/cop/style/space_after_not.rb +0 -42
  618. data/lib/rubocop/cop/style/space_around_operators.rb +0 -132
  619. data/lib/rubocop/cop/style/space_before_block_braces.rb +0 -65
  620. data/lib/rubocop/cop/style/space_before_comma.rb +0 -17
  621. data/lib/rubocop/cop/style/space_before_semicolon.rb +0 -17
  622. data/lib/rubocop/cop/style/space_inside_block_braces.rb +0 -166
  623. data/lib/rubocop/cop/style/space_inside_brackets.rb +0 -21
  624. data/lib/rubocop/cop/style/space_inside_parens.rb +0 -17
  625. data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +0 -52
  626. data/lib/rubocop/cop/style/variable_name.rb +0 -40
  627. data/lib/rubocop/cop/variable_force/locatable.rb +0 -197
@@ -0,0 +1,634 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # `RuboCop::AST::Node` is a subclass of `Parser::AST::Node`. It provides
6
+ # access to parent nodes and an object-oriented way to traverse an AST with
7
+ # the power of `Enumerable`.
8
+ #
9
+ # It has predicate methods for every node type, like this:
10
+ #
11
+ # @example
12
+ # node.send_type? # Equivalent to: `node.type == :send`
13
+ # node.op_asgn_type? # Equivalent to: `node.type == :op_asgn`
14
+ #
15
+ # # Non-word characters (other than a-zA-Z0-9_) in type names are omitted.
16
+ # node.defined_type? # Equivalent to: `node.type == :defined?`
17
+ #
18
+ # # Find the first lvar node under the receiver node.
19
+ # lvar_node = node.each_descendant.find(&:lvar_type?)
20
+ #
21
+ class Node < Parser::AST::Node # rubocop:disable Metrics/ClassLength
22
+ include RuboCop::AST::Sexp
23
+ extend NodePattern::Macros
24
+
25
+ # <=> isn't included here, because it doesn't return a boolean.
26
+ COMPARISON_OPERATORS = %i[== === != <= >= > <].freeze
27
+ ARITHMETIC_OPERATORS = %i[+ - * / % **].freeze
28
+
29
+ TRUTHY_LITERALS = %i[str dstr xstr int float sym dsym array
30
+ hash regexp true irange erange complex
31
+ rational regopt].freeze
32
+ FALSEY_LITERALS = %i[false nil].freeze
33
+ LITERALS = (TRUTHY_LITERALS + FALSEY_LITERALS).freeze
34
+ COMPOSITE_LITERALS = %i[dstr xstr dsym array hash irange
35
+ erange regexp].freeze
36
+ BASIC_LITERALS = (LITERALS - COMPOSITE_LITERALS).freeze
37
+ MUTABLE_LITERALS = %i[str dstr xstr array hash].freeze
38
+ IMMUTABLE_LITERALS = (LITERALS - MUTABLE_LITERALS).freeze
39
+
40
+ VARIABLES = %i[ivar gvar cvar lvar].freeze
41
+ REFERENCES = %i[nth_ref back_ref].freeze
42
+ KEYWORDS = %i[alias and break case class def defs defined?
43
+ kwbegin do else ensure for if module next
44
+ not or postexe redo rescue retry return self
45
+ super zsuper then undef until when while
46
+ yield].freeze
47
+ OPERATOR_KEYWORDS = %i[and or].freeze
48
+ SPECIAL_KEYWORDS = %w[__FILE__ __LINE__ __ENCODING__].freeze
49
+
50
+ # @see http://rubydoc.info/gems/ast/AST/Node:initialize
51
+ def initialize(type, children = [], properties = {})
52
+ @mutable_attributes = {}
53
+
54
+ # ::AST::Node#initialize freezes itself.
55
+ super
56
+
57
+ # #parent= may be invoked multiple times for a node because there are
58
+ # pending nodes while constructing AST and they are replaced later.
59
+ # For example, `lvar` and `send` type nodes are initially created as an
60
+ # `ident` type node and fixed to the appropriate type later.
61
+ # So, the #parent attribute needs to be mutable.
62
+ each_child_node do |child_node|
63
+ child_node.parent = self unless child_node.complete?
64
+ end
65
+ end
66
+
67
+ Parser::Meta::NODE_TYPES.each do |node_type|
68
+ method_name = "#{node_type.to_s.gsub(/\W/, '')}_type?"
69
+ define_method(method_name) do
70
+ type == node_type
71
+ end
72
+ end
73
+
74
+ # Returns the parent node, or `nil` if the receiver is a root node.
75
+ #
76
+ # @return [Node, nil] the parent node or `nil`
77
+ def parent
78
+ @mutable_attributes[:parent]
79
+ end
80
+
81
+ def parent=(node)
82
+ @mutable_attributes[:parent] = node
83
+ end
84
+
85
+ def complete!
86
+ @mutable_attributes.freeze
87
+ each_child_node(&:complete!)
88
+ end
89
+
90
+ def complete?
91
+ @mutable_attributes.frozen?
92
+ end
93
+
94
+ protected :parent=
95
+
96
+ # Override `AST::Node#updated` so that `AST::Processor` does not try to
97
+ # mutate our ASTs. Since we keep references from children to parents and
98
+ # not just the other way around, we cannot update an AST and share
99
+ # identical subtrees. Rather, the entire AST must be copied any time any
100
+ # part of it is changed.
101
+ def updated(type = nil, children = nil, properties = {})
102
+ properties[:location] ||= @location
103
+ self.class.new(type || @type, children || @children, properties)
104
+ end
105
+
106
+ # Returns the index of the receiver node in its siblings. (Sibling index
107
+ # uses zero based numbering.)
108
+ #
109
+ # @return [Integer] the index of the receiver node in its siblings
110
+ def sibling_index
111
+ parent.children.index { |sibling| sibling.equal?(self) }
112
+ end
113
+
114
+ # Calls the given block for each ancestor node from parent to root.
115
+ # If no block is given, an `Enumerator` is returned.
116
+ #
117
+ # @overload each_ancestor
118
+ # Yield all nodes.
119
+ # @overload each_ancestor(type)
120
+ # Yield only nodes matching the type.
121
+ # @param [Symbol] type a node type
122
+ # @overload each_ancestor(type_a, type_b, ...)
123
+ # Yield only nodes matching any of the types.
124
+ # @param [Symbol] type_a a node type
125
+ # @param [Symbol] type_b a node type
126
+ # @overload each_ancestor(types)
127
+ # Yield only nodes matching any of types in the array.
128
+ # @param [Array<Symbol>] types an array containing node types
129
+ # @yieldparam [Node] node each ancestor node
130
+ # @return [self] if a block is given
131
+ # @return [Enumerator] if no block is given
132
+ def each_ancestor(*types, &block)
133
+ return to_enum(__method__, *types) unless block_given?
134
+
135
+ visit_ancestors(types, &block)
136
+
137
+ self
138
+ end
139
+
140
+ # Returns an array of ancestor nodes.
141
+ # This is a shorthand for `node.each_ancestor.to_a`.
142
+ #
143
+ # @return [Array<Node>] an array of ancestor nodes
144
+ def ancestors
145
+ each_ancestor.to_a
146
+ end
147
+
148
+ # Calls the given block for each child node.
149
+ # If no block is given, an `Enumerator` is returned.
150
+ #
151
+ # Note that this is different from `node.children.each { |child| ... }`
152
+ # which yields all children including non-node elements.
153
+ #
154
+ # @overload each_child_node
155
+ # Yield all nodes.
156
+ # @overload each_child_node(type)
157
+ # Yield only nodes matching the type.
158
+ # @param [Symbol] type a node type
159
+ # @overload each_child_node(type_a, type_b, ...)
160
+ # Yield only nodes matching any of the types.
161
+ # @param [Symbol] type_a a node type
162
+ # @param [Symbol] type_b a node type
163
+ # @overload each_child_node(types)
164
+ # Yield only nodes matching any of types in the array.
165
+ # @param [Array<Symbol>] types an array containing node types
166
+ # @yieldparam [Node] node each child node
167
+ # @return [self] if a block is given
168
+ # @return [Enumerator] if no block is given
169
+ def each_child_node(*types)
170
+ return to_enum(__method__, *types) unless block_given?
171
+
172
+ children.each do |child|
173
+ next unless child.is_a?(Node)
174
+ yield child if types.empty? || types.include?(child.type)
175
+ end
176
+
177
+ self
178
+ end
179
+
180
+ # Returns an array of child nodes.
181
+ # This is a shorthand for `node.each_child_node.to_a`.
182
+ #
183
+ # @return [Array<Node>] an array of child nodes
184
+ def child_nodes
185
+ each_child_node.to_a
186
+ end
187
+
188
+ # Calls the given block for each descendant node with depth first order.
189
+ # If no block is given, an `Enumerator` is returned.
190
+ #
191
+ # @overload each_descendant
192
+ # Yield all nodes.
193
+ # @overload each_descendant(type)
194
+ # Yield only nodes matching the type.
195
+ # @param [Symbol] type a node type
196
+ # @overload each_descendant(type_a, type_b, ...)
197
+ # Yield only nodes matching any of the types.
198
+ # @param [Symbol] type_a a node type
199
+ # @param [Symbol] type_b a node type
200
+ # @overload each_descendant(types)
201
+ # Yield only nodes matching any of types in the array.
202
+ # @param [Array<Symbol>] types an array containing node types
203
+ # @yieldparam [Node] node each descendant node
204
+ # @return [self] if a block is given
205
+ # @return [Enumerator] if no block is given
206
+ def each_descendant(*types, &block)
207
+ return to_enum(__method__, *types) unless block_given?
208
+
209
+ visit_descendants(types, &block)
210
+
211
+ self
212
+ end
213
+
214
+ # Returns an array of descendant nodes.
215
+ # This is a shorthand for `node.each_descendant.to_a`.
216
+ #
217
+ # @return [Array<Node>] an array of descendant nodes
218
+ def descendants
219
+ each_descendant.to_a
220
+ end
221
+
222
+ # Calls the given block for the receiver and each descendant node in
223
+ # depth-first order.
224
+ # If no block is given, an `Enumerator` is returned.
225
+ #
226
+ # This method would be useful when you treat the receiver node as the root
227
+ # of a tree and want to iterate over all nodes in the tree.
228
+ #
229
+ # @overload each_node
230
+ # Yield all nodes.
231
+ # @overload each_node(type)
232
+ # Yield only nodes matching the type.
233
+ # @param [Symbol] type a node type
234
+ # @overload each_node(type_a, type_b, ...)
235
+ # Yield only nodes matching any of the types.
236
+ # @param [Symbol] type_a a node type
237
+ # @param [Symbol] type_b a node type
238
+ # @overload each_node(types)
239
+ # Yield only nodes matching any of types in the array.
240
+ # @param [Array<Symbol>] types an array containing node types
241
+ # @yieldparam [Node] node each node
242
+ # @return [self] if a block is given
243
+ # @return [Enumerator] if no block is given
244
+ def each_node(*types, &block)
245
+ return to_enum(__method__, *types) unless block_given?
246
+
247
+ yield self if types.empty? || types.include?(type)
248
+
249
+ visit_descendants(types, &block)
250
+
251
+ self
252
+ end
253
+
254
+ def source
255
+ loc.expression.source
256
+ end
257
+
258
+ def source_range
259
+ loc.expression
260
+ end
261
+
262
+ def first_line
263
+ loc.line
264
+ end
265
+
266
+ def last_line
267
+ loc.last_line
268
+ end
269
+
270
+ def line_count
271
+ return 0 unless source_range
272
+ source_range.last_line - source_range.first_line + 1
273
+ end
274
+
275
+ def nonempty_line_count
276
+ source.lines.grep(/\S/).size
277
+ end
278
+
279
+ def source_length
280
+ source_range ? source_range.size : 0
281
+ end
282
+
283
+ ## Destructuring
284
+
285
+ def_node_matcher :receiver, <<-PATTERN
286
+ {(send $_ ...) (block (send $_ ...) ...)}
287
+ PATTERN
288
+
289
+ def_node_matcher :method_name, <<-PATTERN
290
+ {(send _ $_ ...) (block (send _ $_ ...) ...)}
291
+ PATTERN
292
+
293
+ # Note: for masgn, #asgn_rhs will be an array node
294
+ def_node_matcher :asgn_rhs, '[assignment? (... $_)]'
295
+ def_node_matcher :str_content, '(str $_)'
296
+
297
+ def const_name
298
+ return unless const_type?
299
+ namespace, name = *self
300
+ if namespace && !namespace.cbase_type?
301
+ "#{namespace.const_name}::#{name}"
302
+ else
303
+ name.to_s
304
+ end
305
+ end
306
+
307
+ def_node_matcher :defined_module0, <<-PATTERN
308
+ {(class (const $_ $_) ...)
309
+ (module (const $_ $_) ...)
310
+ (casgn $_ $_ (send (const nil? {:Class :Module}) :new ...))
311
+ (casgn $_ $_ (block (send (const nil? {:Class :Module}) :new ...) ...))}
312
+ PATTERN
313
+ private :defined_module0
314
+
315
+ def defined_module
316
+ namespace, name = *defined_module0
317
+ s(:const, namespace, name) if name
318
+ end
319
+
320
+ def defined_module_name
321
+ (const = defined_module) && const.const_name
322
+ end
323
+
324
+ ## Searching the AST
325
+
326
+ def parent_module_name
327
+ # what class or module is this method/constant/etc definition in?
328
+ # returns nil if answer cannot be determined
329
+ ancestors = each_ancestor(:class, :module, :sclass, :casgn, :block)
330
+ result = ancestors.map do |ancestor|
331
+ parent_module_name_part(ancestor) { |full_name| return full_name }
332
+ end.compact.reverse.join('::')
333
+ result.empty? ? 'Object' : result
334
+ end
335
+
336
+ ## Predicates
337
+
338
+ def multiline?
339
+ line_count > 1
340
+ end
341
+
342
+ def single_line?
343
+ line_count == 1
344
+ end
345
+
346
+ def empty_source?
347
+ source_length.zero?
348
+ end
349
+
350
+ def asgn_method_call?
351
+ !COMPARISON_OPERATORS.include?(method_name) &&
352
+ method_name.to_s.end_with?('='.freeze)
353
+ end
354
+
355
+ def arithmetic_operation?
356
+ ARITHMETIC_OPERATORS.include?(method_name)
357
+ end
358
+
359
+ def_node_matcher :equals_asgn?, <<-PATTERN
360
+ {lvasgn ivasgn cvasgn gvasgn casgn masgn}
361
+ PATTERN
362
+
363
+ def_node_matcher :shorthand_asgn?, '{op_asgn or_asgn and_asgn}'
364
+
365
+ def_node_matcher :assignment?, <<-PATTERN
366
+ {equals_asgn? shorthand_asgn? asgn_method_call?}
367
+ PATTERN
368
+
369
+ def literal?
370
+ LITERALS.include?(type)
371
+ end
372
+
373
+ def basic_literal?
374
+ BASIC_LITERALS.include?(type)
375
+ end
376
+
377
+ def truthy_literal?
378
+ TRUTHY_LITERALS.include?(type)
379
+ end
380
+
381
+ def falsey_literal?
382
+ FALSEY_LITERALS.include?(type)
383
+ end
384
+
385
+ def mutable_literal?
386
+ MUTABLE_LITERALS.include?(type)
387
+ end
388
+
389
+ def immutable_literal?
390
+ IMMUTABLE_LITERALS.include?(type)
391
+ end
392
+
393
+ %i[literal basic_literal].each do |kind|
394
+ recursive_kind = :"recursive_#{kind}?"
395
+ kind_filter = :"#{kind}?"
396
+ define_method(recursive_kind) do
397
+ case type
398
+ when :send
399
+ receiver, method_name, *args = *self
400
+ [*COMPARISON_OPERATORS, :!, :<=>].include?(method_name) &&
401
+ receiver.send(recursive_kind) &&
402
+ args.all?(&recursive_kind)
403
+ when :begin, :pair, *OPERATOR_KEYWORDS, *COMPOSITE_LITERALS
404
+ children.all?(&recursive_kind)
405
+ else
406
+ send(kind_filter)
407
+ end
408
+ end
409
+ end
410
+
411
+ def variable?
412
+ VARIABLES.include?(type)
413
+ end
414
+
415
+ def reference?
416
+ REFERENCES.include?(type)
417
+ end
418
+
419
+ def keyword?
420
+ return true if special_keyword? || keyword_not?
421
+ return false unless KEYWORDS.include?(type)
422
+
423
+ !OPERATOR_KEYWORDS.include?(type) || loc.operator.is?(type.to_s)
424
+ end
425
+
426
+ def special_keyword?
427
+ SPECIAL_KEYWORDS.include?(source)
428
+ end
429
+
430
+ def operator_keyword?
431
+ OPERATOR_KEYWORDS.include?(type)
432
+ end
433
+
434
+ def keyword_not?
435
+ _receiver, method_name, *args = *self
436
+ args.empty? && method_name == :! && loc.selector.is?('not'.freeze)
437
+ end
438
+
439
+ def keyword_bang?
440
+ _receiver, method_name, *args = *self
441
+ args.empty? && method_name == :! && loc.selector.is?('!'.freeze)
442
+ end
443
+
444
+ def unary_operation?
445
+ return false unless loc.respond_to?(:selector) && loc.selector
446
+ Cop::Util.operator?(loc.selector.source.to_sym) &&
447
+ source_range.begin_pos == loc.selector.begin_pos
448
+ end
449
+
450
+ def binary_operation?
451
+ return false unless loc.respond_to?(:selector) && loc.selector
452
+ Cop::Util.operator?(method_name) &&
453
+ source_range.begin_pos != loc.selector.begin_pos
454
+ end
455
+
456
+ def chained?
457
+ return false unless argument?
458
+
459
+ receiver, _method_name, *_args = *parent
460
+ equal?(receiver)
461
+ end
462
+
463
+ def argument?
464
+ parent && parent.send_type?
465
+ end
466
+
467
+ def numeric_type?
468
+ int_type? || float_type?
469
+ end
470
+
471
+ def_node_matcher :guard_clause?, <<-PATTERN
472
+ [{(send nil? {:raise :fail} ...) return break next} single_line?]
473
+ PATTERN
474
+
475
+ def_node_matcher :proc?, <<-PATTERN
476
+ {(block (send nil? :proc) ...)
477
+ (block (send (const nil? :Proc) :new) ...)
478
+ (send (const nil? :Proc) :new)}
479
+ PATTERN
480
+
481
+ def_node_matcher :lambda?, '(block (send nil? :lambda) ...)'
482
+ def_node_matcher :lambda_or_proc?, '{lambda? proc?}'
483
+
484
+ def_node_matcher :class_constructor?, <<-PATTERN
485
+ { (send (const nil? {:Class :Module}) :new ...)
486
+ (block (send (const nil? {:Class :Module}) :new ...) ...)}
487
+ PATTERN
488
+
489
+ def_node_matcher :module_definition?, <<-PATTERN
490
+ {class module (casgn _ _ class_constructor?)}
491
+ PATTERN
492
+
493
+ # Some expressions are evaluated for their value, some for their side
494
+ # effects, and some for both
495
+ # If we know that an expression is useful only for its side effects, that
496
+ # means we can transform it in ways which preserve the side effects, but
497
+ # change the return value
498
+ # So, does the return value of this node matter? If we changed it to
499
+ # `(...; nil)`, might that affect anything?
500
+ #
501
+ # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
502
+ def value_used?
503
+ # Be conservative and return true if we're not sure.
504
+ return false if parent.nil?
505
+
506
+ case parent.type
507
+ when :array, :defined?, :dstr, :dsym, :eflipflop, :erange, :float,
508
+ :hash, :iflipflop, :irange, :not, :pair, :regexp, :str, :sym,
509
+ :when, :xstr
510
+ parent.value_used?
511
+ when :begin, :kwbegin
512
+ begin_value_used?
513
+ when :for
514
+ for_value_used?
515
+ when :case, :if
516
+ case_if_value_used?
517
+ when :while, :until, :while_post, :until_post
518
+ while_until_value_used?
519
+ else
520
+ true
521
+ end
522
+ end
523
+ # rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
524
+
525
+ # Some expressions are evaluated for their value, some for their side
526
+ # effects, and some for both.
527
+ # If we know that expressions are useful only for their return values,
528
+ # and have no side effects, that means we can reorder them, change the
529
+ # number of times they are evaluated, or replace them with other
530
+ # expressions which are equivalent in value.
531
+ # So, is evaluation of this node free of side effects?
532
+ #
533
+ def pure?
534
+ # Be conservative and return false if we're not sure
535
+ case type
536
+ when :__FILE__, :__LINE__, :const, :cvar, :defined?, :false, :float,
537
+ :gvar, :int, :ivar, :lvar, :nil, :str, :sym, :true, :regopt
538
+ true
539
+ when :and, :array, :begin, :case, :dstr, :dsym, :eflipflop, :ensure,
540
+ :erange, :for, :hash, :if, :iflipflop, :irange, :kwbegin, :not,
541
+ :or, :pair, :regexp, :until, :until_post, :when, :while,
542
+ :while_post
543
+ child_nodes.all?(&:pure?)
544
+ else
545
+ false
546
+ end
547
+ end
548
+
549
+ protected
550
+
551
+ def visit_descendants(types, &block)
552
+ each_child_node do |child|
553
+ yield child if types.empty? || types.include?(child.type)
554
+ child.visit_descendants(types, &block)
555
+ end
556
+ end
557
+
558
+ private
559
+
560
+ def visit_ancestors(types)
561
+ last_node = self
562
+
563
+ while (current_node = last_node.parent)
564
+ yield current_node if types.empty? ||
565
+ types.include?(current_node.type)
566
+ last_node = current_node
567
+ end
568
+ end
569
+
570
+ def begin_value_used?
571
+ # the last child node determines the value of the parent
572
+ sibling_index == parent.children.size - 1 ? parent.value_used? : false
573
+ end
574
+
575
+ def for_value_used?
576
+ # `for var in enum; body; end`
577
+ # (for <var> <enum> <body>)
578
+ sibling_index == 2 ? parent.value_used? : true
579
+ end
580
+
581
+ def case_if_value_used?
582
+ # (case <condition> <when...>)
583
+ # (if <condition> <truebranch> <falsebranch>)
584
+ sibling_index.zero? ? true : parent.value_used?
585
+ end
586
+
587
+ def while_until_value_used?
588
+ # (while <condition> <body>) -> always evaluates to `nil`
589
+ sibling_index.zero?
590
+ end
591
+
592
+ def parent_module_name_part(node)
593
+ case node.type
594
+ when :class, :module, :casgn
595
+ # TODO: if constant name has cbase (leading ::), then we don't need
596
+ # to keep traversing up through nested classes/modules
597
+ node.defined_module_name
598
+ when :sclass
599
+ yield parent_module_name_for_sclass(node)
600
+ else # block
601
+ parent_module_name_for_block(node) { yield nil }
602
+ end
603
+ end
604
+
605
+ def parent_module_name_for_sclass(sclass_node)
606
+ # TODO: look for constant definition and see if it is nested
607
+ # inside a class or module
608
+ subject = sclass_node.children[0]
609
+
610
+ if subject.const_type?
611
+ "#<Class:#{subject.const_name}>"
612
+ elsif subject.self_type?
613
+ "#<Class:#{sclass_node.parent_module_name}>"
614
+ end
615
+ end
616
+
617
+ def parent_module_name_for_block(ancestor)
618
+ if ancestor.method_name == :class_eval
619
+ # `class_eval` with no receiver applies to whatever module or class
620
+ # we are currently in
621
+ return unless (receiver = ancestor.receiver)
622
+ yield unless receiver.const_type?
623
+ receiver.const_name
624
+ elsif !new_class_or_module_block?(ancestor)
625
+ yield
626
+ end
627
+ end
628
+
629
+ def_node_matcher :new_class_or_module_block?, <<-PATTERN
630
+ ^(casgn _ _ (block (send (const _ {:Class :Module}) :new) ...))
631
+ PATTERN
632
+ end
633
+ end
634
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # This module provides a shorthand method to create a {Node} like
6
+ # `Parser::AST::Sexp`.
7
+ #
8
+ # @see http://rubydoc.info/gems/ast/AST/Sexp
9
+ module Sexp
10
+ # Creates a {Node} with type `type` and children `children`.
11
+ def s(type, *children)
12
+ Node.new(type, children)
13
+ end
14
+ end
15
+ end
16
+ end