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