rubocop 0.81.0 → 0.85.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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -17
  3. data/config/default.yml +141 -35
  4. data/lib/rubocop.rb +17 -61
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +13 -7
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  8. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  9. data/lib/rubocop/comment_config.rb +1 -1
  10. data/lib/rubocop/config.rb +14 -2
  11. data/lib/rubocop/config_loader.rb +37 -33
  12. data/lib/rubocop/config_loader_resolver.rb +45 -6
  13. data/lib/rubocop/config_obsoletion.rb +1 -0
  14. data/lib/rubocop/config_store.rb +12 -2
  15. data/lib/rubocop/config_validator.rb +18 -1
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  17. data/lib/rubocop/cop/badge.rb +5 -5
  18. data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
  19. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  20. data/lib/rubocop/cop/commissioner.rb +0 -21
  21. data/lib/rubocop/cop/cop.rb +36 -21
  22. data/lib/rubocop/cop/corrector.rb +48 -24
  23. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
  24. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  25. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  26. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  29. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  30. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  31. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  32. data/lib/rubocop/cop/generator.rb +4 -3
  33. data/lib/rubocop/cop/ignored_node.rb +1 -3
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  35. data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
  36. data/lib/rubocop/cop/layout/class_structure.rb +19 -16
  37. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  38. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  39. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  40. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  41. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  42. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -3
  43. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
  44. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  45. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  47. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  48. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -6
  49. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -9
  50. data/lib/rubocop/cop/layout/heredoc_indentation.rb +21 -104
  51. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  52. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  53. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  54. data/lib/rubocop/cop/layout/line_length.rb +23 -20
  55. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  56. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  57. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  58. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  59. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  60. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  61. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  62. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  63. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  64. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  65. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  66. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
  68. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  69. data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
  70. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  71. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  72. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  73. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  74. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  75. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  76. data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
  77. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
  78. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +33 -2
  79. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  80. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  81. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  82. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  83. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  84. data/lib/rubocop/cop/lint/loop.rb +1 -1
  85. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  86. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  87. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  88. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  89. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
  90. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  91. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
  92. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  93. data/lib/rubocop/cop/lint/raise_exception.rb +42 -6
  94. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
  95. data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
  96. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  97. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  98. data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
  99. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  100. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  101. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  102. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  103. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  104. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  105. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
  106. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  107. data/lib/rubocop/cop/migration/department_name.rb +7 -7
  108. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  109. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  110. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
  111. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  112. data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
  113. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  114. data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -2
  115. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  116. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
  117. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  118. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +16 -0
  119. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
  120. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  121. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  122. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +1 -1
  123. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
  124. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  125. data/lib/rubocop/cop/naming/file_name.rb +27 -14
  126. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  127. data/lib/rubocop/cop/naming/method_name.rb +1 -5
  128. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  129. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  130. data/lib/rubocop/cop/registry.rb +74 -14
  131. data/lib/rubocop/cop/severity.rb +1 -3
  132. data/lib/rubocop/cop/style/alias.rb +4 -4
  133. data/lib/rubocop/cop/style/and_or.rb +7 -8
  134. data/lib/rubocop/cop/style/array_join.rb +2 -2
  135. data/lib/rubocop/cop/style/attr.rb +1 -3
  136. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  137. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  138. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  139. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  140. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -11
  141. data/lib/rubocop/cop/style/copyright.rb +3 -3
  142. data/lib/rubocop/cop/style/dir.rb +1 -1
  143. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  144. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  145. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  146. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  147. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  148. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  149. data/lib/rubocop/cop/style/empty_method.rb +2 -6
  150. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  151. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  152. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  153. data/lib/rubocop/cop/style/format_string.rb +2 -2
  154. data/lib/rubocop/cop/style/format_string_token.rb +2 -3
  155. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
  156. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  157. data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
  158. data/lib/rubocop/cop/style/hash_syntax.rb +19 -12
  159. data/lib/rubocop/cop/style/hash_transform_values.rb +0 -3
  160. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  161. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  162. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  163. data/lib/rubocop/cop/style/lambda.rb +2 -2
  164. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  165. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  166. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  167. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  168. data/lib/rubocop/cop/style/module_function.rb +2 -2
  169. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  170. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  171. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  172. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  173. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  174. data/lib/rubocop/cop/style/negated_unless.rb +3 -3
  175. data/lib/rubocop/cop/style/next.rb +2 -2
  176. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  177. data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
  178. data/lib/rubocop/cop/style/not.rb +1 -1
  179. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  180. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  181. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  182. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -7
  183. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  184. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  185. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  186. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  187. data/lib/rubocop/cop/style/proc.rb +1 -1
  188. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  189. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  190. data/lib/rubocop/cop/style/redundant_condition.rb +3 -4
  191. data/lib/rubocop/cop/style/redundant_conditional.rb +5 -4
  192. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  193. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  194. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  195. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
  196. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  197. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +130 -0
  198. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  199. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  200. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  201. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  202. data/lib/rubocop/cop/style/safe_navigation.rb +3 -7
  203. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  204. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  205. data/lib/rubocop/cop/style/special_global_vars.rb +3 -7
  206. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  207. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  208. data/lib/rubocop/cop/style/symbol_array.rb +2 -2
  209. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  210. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
  211. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -3
  212. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
  213. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +16 -13
  214. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
  215. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
  216. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  217. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  218. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  219. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  220. data/lib/rubocop/cop/style/when_then.rb +1 -1
  221. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  222. data/lib/rubocop/cop/style/word_array.rb +1 -1
  223. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  224. data/lib/rubocop/cop/team.rb +69 -25
  225. data/lib/rubocop/cop/util.rb +25 -1
  226. data/lib/rubocop/cop/utils/format_string.rb +18 -0
  227. data/lib/rubocop/cop/variable_force.rb +3 -9
  228. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  229. data/lib/rubocop/cop/variable_force/branch.rb +1 -3
  230. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  231. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  232. data/lib/rubocop/ext/processed_source.rb +18 -0
  233. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  234. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  235. data/lib/rubocop/formatter/formatter_set.rb +1 -4
  236. data/lib/rubocop/formatter/junit_formatter.rb +14 -4
  237. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  238. data/lib/rubocop/magic_comment.rb +1 -1
  239. data/lib/rubocop/name_similarity.rb +12 -9
  240. data/lib/rubocop/options.rb +33 -12
  241. data/lib/rubocop/remote_config.rb +1 -3
  242. data/lib/rubocop/result_cache.rb +5 -7
  243. data/lib/rubocop/rspec/cop_helper.rb +3 -26
  244. data/lib/rubocop/rspec/expect_offense.rb +49 -16
  245. data/lib/rubocop/rspec/shared_contexts.rb +54 -20
  246. data/lib/rubocop/runner.rb +21 -14
  247. data/lib/rubocop/target_finder.rb +7 -7
  248. data/lib/rubocop/target_ruby.rb +5 -2
  249. data/lib/rubocop/version.rb +5 -3
  250. metadata +47 -77
  251. data/lib/rubocop/ast/builder.rb +0 -85
  252. data/lib/rubocop/ast/node.rb +0 -637
  253. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  254. data/lib/rubocop/ast/node/and_node.rb +0 -29
  255. data/lib/rubocop/ast/node/args_node.rb +0 -29
  256. data/lib/rubocop/ast/node/array_node.rb +0 -57
  257. data/lib/rubocop/ast/node/block_node.rb +0 -121
  258. data/lib/rubocop/ast/node/break_node.rb +0 -17
  259. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  260. data/lib/rubocop/ast/node/case_node.rb +0 -56
  261. data/lib/rubocop/ast/node/class_node.rb +0 -31
  262. data/lib/rubocop/ast/node/def_node.rb +0 -82
  263. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  264. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  265. data/lib/rubocop/ast/node/float_node.rb +0 -12
  266. data/lib/rubocop/ast/node/for_node.rb +0 -53
  267. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  268. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  269. data/lib/rubocop/ast/node/if_node.rb +0 -175
  270. data/lib/rubocop/ast/node/int_node.rb +0 -12
  271. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  272. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  273. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  274. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  275. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  276. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  277. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  278. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  279. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  280. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  281. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  282. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  283. data/lib/rubocop/ast/node/module_node.rb +0 -24
  284. data/lib/rubocop/ast/node/or_node.rb +0 -29
  285. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  286. data/lib/rubocop/ast/node/range_node.rb +0 -18
  287. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  288. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  289. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  290. data/lib/rubocop/ast/node/return_node.rb +0 -24
  291. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  292. data/lib/rubocop/ast/node/send_node.rb +0 -13
  293. data/lib/rubocop/ast/node/str_node.rb +0 -16
  294. data/lib/rubocop/ast/node/super_node.rb +0 -21
  295. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  296. data/lib/rubocop/ast/node/until_node.rb +0 -35
  297. data/lib/rubocop/ast/node/when_node.rb +0 -53
  298. data/lib/rubocop/ast/node/while_node.rb +0 -35
  299. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  300. data/lib/rubocop/ast/sexp.rb +0 -16
  301. data/lib/rubocop/ast/traversal.rb +0 -202
  302. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  303. data/lib/rubocop/node_pattern.rb +0 -887
  304. data/lib/rubocop/processed_source.rb +0 -216
  305. data/lib/rubocop/string_util.rb +0 -14
  306. data/lib/rubocop/token.rb +0 -114
@@ -3,14 +3,16 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '0.81.0'
6
+ STRING = '0.85.1'
7
7
 
8
- MSG = '%<version>s (using Parser %<parser_version>s, running on ' \
9
- '%<ruby_engine>s %<ruby_version>s %<ruby_platform>s)'
8
+ MSG = '%<version>s (using Parser %<parser_version>s, '\
9
+ 'rubocop-ast %<rubocop_ast_version>s, ' \
10
+ 'running on %<ruby_engine>s %<ruby_version>s %<ruby_platform>s)'
10
11
 
11
12
  def self.version(debug = false)
12
13
  if debug
13
14
  format(MSG, version: STRING, parser_version: Parser::VERSION,
15
+ rubocop_ast_version: RuboCop::AST::Version::STRING,
14
16
  ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
15
17
  ruby_platform: RUBY_PLATFORM)
16
18
  else
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.81.0
4
+ version: 0.85.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,22 +10,8 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-04-01 00:00:00.000000000 Z
13
+ date: 2020-06-07 00:00:00.000000000 Z
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: jaro_winkler
17
- requirement: !ruby/object:Gem::Requirement
18
- requirements:
19
- - - "~>"
20
- - !ruby/object:Gem::Version
21
- version: 1.5.1
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- requirements:
26
- - - "~>"
27
- - !ruby/object:Gem::Version
28
- version: 1.5.1
29
15
  - !ruby/object:Gem::Dependency
30
16
  name: parallel
31
17
  requirement: !ruby/object:Gem::Requirement
@@ -74,6 +60,20 @@ dependencies:
74
60
  - - "<"
75
61
  - !ruby/object:Gem::Version
76
62
  version: '4.0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: regexp_parser
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '1.7'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '1.7'
77
77
  - !ruby/object:Gem::Dependency
78
78
  name: rexml
79
79
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +88,20 @@ dependencies:
88
88
  - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
+ - !ruby/object:Gem::Dependency
92
+ name: rubocop-ast
93
+ requirement: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 0.0.3
98
+ type: :runtime
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 0.0.3
91
105
  - !ruby/object:Gem::Dependency
92
106
  name: ruby-progressbar
93
107
  requirement: !ruby/object:Gem::Requirement
@@ -143,8 +157,8 @@ dependencies:
143
157
  - !ruby/object:Gem::Version
144
158
  version: '3.0'
145
159
  description: |2
146
- Automatic Ruby code style checking tool.
147
- Aims to enforce the community-driven Ruby Style Guide.
160
+ RuboCop is a Ruby code style checking and code formatting tool.
161
+ It aims to enforce the community-driven Ruby Style Guide.
148
162
  email: rubocop@googlegroups.com
149
163
  executables:
150
164
  - rubocop
@@ -162,57 +176,7 @@ files:
162
176
  - config/default.yml
163
177
  - exe/rubocop
164
178
  - lib/rubocop.rb
165
- - lib/rubocop/ast/builder.rb
166
- - lib/rubocop/ast/node.rb
167
- - lib/rubocop/ast/node/alias_node.rb
168
- - lib/rubocop/ast/node/and_node.rb
169
- - lib/rubocop/ast/node/args_node.rb
170
- - lib/rubocop/ast/node/array_node.rb
171
- - lib/rubocop/ast/node/block_node.rb
172
- - lib/rubocop/ast/node/break_node.rb
173
- - lib/rubocop/ast/node/case_match_node.rb
174
- - lib/rubocop/ast/node/case_node.rb
175
- - lib/rubocop/ast/node/class_node.rb
176
- - lib/rubocop/ast/node/def_node.rb
177
- - lib/rubocop/ast/node/defined_node.rb
178
- - lib/rubocop/ast/node/ensure_node.rb
179
- - lib/rubocop/ast/node/float_node.rb
180
- - lib/rubocop/ast/node/for_node.rb
181
- - lib/rubocop/ast/node/forward_args_node.rb
182
- - lib/rubocop/ast/node/hash_node.rb
183
- - lib/rubocop/ast/node/if_node.rb
184
- - lib/rubocop/ast/node/int_node.rb
185
- - lib/rubocop/ast/node/keyword_splat_node.rb
186
- - lib/rubocop/ast/node/mixin/basic_literal_node.rb
187
- - lib/rubocop/ast/node/mixin/binary_operator_node.rb
188
- - lib/rubocop/ast/node/mixin/collection_node.rb
189
- - lib/rubocop/ast/node/mixin/conditional_node.rb
190
- - lib/rubocop/ast/node/mixin/hash_element_node.rb
191
- - lib/rubocop/ast/node/mixin/method_dispatch_node.rb
192
- - lib/rubocop/ast/node/mixin/method_identifier_predicates.rb
193
- - lib/rubocop/ast/node/mixin/modifier_node.rb
194
- - lib/rubocop/ast/node/mixin/numeric_node.rb
195
- - lib/rubocop/ast/node/mixin/parameterized_node.rb
196
- - lib/rubocop/ast/node/mixin/predicate_operator_node.rb
197
- - lib/rubocop/ast/node/module_node.rb
198
- - lib/rubocop/ast/node/or_node.rb
199
- - lib/rubocop/ast/node/pair_node.rb
200
- - lib/rubocop/ast/node/range_node.rb
201
- - lib/rubocop/ast/node/regexp_node.rb
202
- - lib/rubocop/ast/node/resbody_node.rb
203
- - lib/rubocop/ast/node/retry_node.rb
204
- - lib/rubocop/ast/node/return_node.rb
205
- - lib/rubocop/ast/node/self_class_node.rb
206
- - lib/rubocop/ast/node/send_node.rb
207
- - lib/rubocop/ast/node/str_node.rb
208
- - lib/rubocop/ast/node/super_node.rb
209
- - lib/rubocop/ast/node/symbol_node.rb
210
- - lib/rubocop/ast/node/until_node.rb
211
- - lib/rubocop/ast/node/when_node.rb
212
- - lib/rubocop/ast/node/while_node.rb
213
- - lib/rubocop/ast/node/yield_node.rb
214
- - lib/rubocop/ast/sexp.rb
215
- - lib/rubocop/ast/traversal.rb
179
+ - lib/rubocop/ast_aliases.rb
216
180
  - lib/rubocop/cached_data.rb
217
181
  - lib/rubocop/cli.rb
218
182
  - lib/rubocop/cli/command.rb
@@ -293,6 +257,7 @@ files:
293
257
  - lib/rubocop/cop/layout/empty_lines.rb
294
258
  - lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb
295
259
  - lib/rubocop/cop/layout/empty_lines_around_arguments.rb
260
+ - lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb
296
261
  - lib/rubocop/cop/layout/empty_lines_around_begin_body.rb
297
262
  - lib/rubocop/cop/layout/empty_lines_around_block_body.rb
298
263
  - lib/rubocop/cop/layout/empty_lines_around_class_body.rb
@@ -314,6 +279,7 @@ files:
314
279
  - lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb
315
280
  - lib/rubocop/cop/layout/heredoc_indentation.rb
316
281
  - lib/rubocop/cop/layout/indentation_consistency.rb
282
+ - lib/rubocop/cop/layout/indentation_style.rb
317
283
  - lib/rubocop/cop/layout/indentation_width.rb
318
284
  - lib/rubocop/cop/layout/initial_indentation.rb
319
285
  - lib/rubocop/cop/layout/leading_comment_space.rb
@@ -340,6 +306,7 @@ files:
340
306
  - lib/rubocop/cop/layout/space_around_block_parameters.rb
341
307
  - lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb
342
308
  - lib/rubocop/cop/layout/space_around_keyword.rb
309
+ - lib/rubocop/cop/layout/space_around_method_call_operator.rb
343
310
  - lib/rubocop/cop/layout/space_around_operators.rb
344
311
  - lib/rubocop/cop/layout/space_before_block_braces.rb
345
312
  - lib/rubocop/cop/layout/space_before_comma.rb
@@ -356,7 +323,6 @@ files:
356
323
  - lib/rubocop/cop/layout/space_inside_range_literal.rb
357
324
  - lib/rubocop/cop/layout/space_inside_reference_brackets.rb
358
325
  - lib/rubocop/cop/layout/space_inside_string_interpolation.rb
359
- - lib/rubocop/cop/layout/tab.rb
360
326
  - lib/rubocop/cop/layout/trailing_empty_lines.rb
361
327
  - lib/rubocop/cop/layout/trailing_whitespace.rb
362
328
  - lib/rubocop/cop/lint/ambiguous_block_association.rb
@@ -368,6 +334,7 @@ files:
368
334
  - lib/rubocop/cop/lint/circular_argument_reference.rb
369
335
  - lib/rubocop/cop/lint/debugger.rb
370
336
  - lib/rubocop/cop/lint/deprecated_class_methods.rb
337
+ - lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb
371
338
  - lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb
372
339
  - lib/rubocop/cop/lint/duplicate_case_condition.rb
373
340
  - lib/rubocop/cop/lint/duplicate_hash_key.rb
@@ -392,6 +359,7 @@ files:
392
359
  - lib/rubocop/cop/lint/literal_in_interpolation.rb
393
360
  - lib/rubocop/cop/lint/loop.rb
394
361
  - lib/rubocop/cop/lint/missing_cop_enable_directive.rb
362
+ - lib/rubocop/cop/lint/mixed_regexp_capture_types.rb
395
363
  - lib/rubocop/cop/lint/multiple_comparison.rb
396
364
  - lib/rubocop/cop/lint/nested_method_definition.rb
397
365
  - lib/rubocop/cop/lint/nested_percent_literal.rb
@@ -504,6 +472,7 @@ files:
504
472
  - lib/rubocop/cop/mixin/preferred_delimiters.rb
505
473
  - lib/rubocop/cop/mixin/range_help.rb
506
474
  - lib/rubocop/cop/mixin/rational_literal.rb
475
+ - lib/rubocop/cop/mixin/regexp_literal_help.rb
507
476
  - lib/rubocop/cop/mixin/rescue_node.rb
508
477
  - lib/rubocop/cop/mixin/safe_assignment.rb
509
478
  - lib/rubocop/cop/mixin/space_after_punctuation.rb
@@ -571,6 +540,7 @@ files:
571
540
  - lib/rubocop/cop/style/date_time.rb
572
541
  - lib/rubocop/cop/style/def_with_parentheses.rb
573
542
  - lib/rubocop/cop/style/dir.rb
543
+ - lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb
574
544
  - lib/rubocop/cop/style/documentation.rb
575
545
  - lib/rubocop/cop/style/documentation_method.rb
576
546
  - lib/rubocop/cop/style/double_cop_disable_directive.rb
@@ -588,6 +558,7 @@ files:
588
558
  - lib/rubocop/cop/style/eval_with_location.rb
589
559
  - lib/rubocop/cop/style/even_odd.rb
590
560
  - lib/rubocop/cop/style/expand_path_arguments.rb
561
+ - lib/rubocop/cop/style/exponential_notation.rb
591
562
  - lib/rubocop/cop/style/float_division.rb
592
563
  - lib/rubocop/cop/style/for.rb
593
564
  - lib/rubocop/cop/style/format_string.rb
@@ -669,6 +640,8 @@ files:
669
640
  - lib/rubocop/cop/style/redundant_interpolation.rb
670
641
  - lib/rubocop/cop/style/redundant_parentheses.rb
671
642
  - lib/rubocop/cop/style/redundant_percent_q.rb
643
+ - lib/rubocop/cop/style/redundant_regexp_character_class.rb
644
+ - lib/rubocop/cop/style/redundant_regexp_escape.rb
672
645
  - lib/rubocop/cop/style/redundant_return.rb
673
646
  - lib/rubocop/cop/style/redundant_self.rb
674
647
  - lib/rubocop/cop/style/redundant_sort.rb
@@ -685,6 +658,7 @@ files:
685
658
  - lib/rubocop/cop/style/signal_exception.rb
686
659
  - lib/rubocop/cop/style/single_line_block_params.rb
687
660
  - lib/rubocop/cop/style/single_line_methods.rb
661
+ - lib/rubocop/cop/style/slicing_with_range.rb
688
662
  - lib/rubocop/cop/style/special_global_vars.rb
689
663
  - lib/rubocop/cop/style/stabby_lambda_parentheses.rb
690
664
  - lib/rubocop/cop/style/stderr_puts.rb
@@ -730,13 +704,13 @@ files:
730
704
  - lib/rubocop/cop/variable_force/variable_table.rb
731
705
  - lib/rubocop/core_ext/string.rb
732
706
  - lib/rubocop/error.rb
707
+ - lib/rubocop/ext/processed_source.rb
733
708
  - lib/rubocop/file_finder.rb
734
709
  - lib/rubocop/formatter/auto_gen_config_formatter.rb
735
710
  - lib/rubocop/formatter/base_formatter.rb
736
711
  - lib/rubocop/formatter/clang_style_formatter.rb
737
712
  - lib/rubocop/formatter/colorizable.rb
738
713
  - lib/rubocop/formatter/disabled_config_formatter.rb
739
- - lib/rubocop/formatter/disabled_lines_formatter.rb
740
714
  - lib/rubocop/formatter/emacs_style_formatter.rb
741
715
  - lib/rubocop/formatter/file_list_formatter.rb
742
716
  - lib/rubocop/formatter/formatter_set.rb
@@ -754,11 +728,9 @@ files:
754
728
  - lib/rubocop/formatter/worst_offenders_formatter.rb
755
729
  - lib/rubocop/magic_comment.rb
756
730
  - lib/rubocop/name_similarity.rb
757
- - lib/rubocop/node_pattern.rb
758
731
  - lib/rubocop/options.rb
759
732
  - lib/rubocop/path_util.rb
760
733
  - lib/rubocop/platform.rb
761
- - lib/rubocop/processed_source.rb
762
734
  - lib/rubocop/rake_task.rb
763
735
  - lib/rubocop/remote_config.rb
764
736
  - lib/rubocop/result_cache.rb
@@ -769,10 +741,8 @@ files:
769
741
  - lib/rubocop/rspec/support.rb
770
742
  - lib/rubocop/runner.rb
771
743
  - lib/rubocop/string_interpreter.rb
772
- - lib/rubocop/string_util.rb
773
744
  - lib/rubocop/target_finder.rb
774
745
  - lib/rubocop/target_ruby.rb
775
- - lib/rubocop/token.rb
776
746
  - lib/rubocop/version.rb
777
747
  - lib/rubocop/warning.rb
778
748
  - lib/rubocop/yaml_duplication_checker.rb
@@ -780,7 +750,7 @@ homepage: https://github.com/rubocop-hq/rubocop
780
750
  licenses:
781
751
  - MIT
782
752
  metadata:
783
- homepage_uri: https://www.rubocop.org/
753
+ homepage_uri: https://rubocop.org/
784
754
  changelog_uri: https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md
785
755
  source_code_uri: https://github.com/rubocop-hq/rubocop/
786
756
  documentation_uri: https://docs.rubocop.org/
@@ -793,7 +763,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
793
763
  requirements:
794
764
  - - ">="
795
765
  - !ruby/object:Gem::Version
796
- version: 2.3.0
766
+ version: 2.4.0
797
767
  required_rubygems_version: !ruby/object:Gem::Requirement
798
768
  requirements:
799
769
  - - ">="
@@ -1,85 +0,0 @@
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
- numblock: BlockNode,
24
- break: BreakNode,
25
- case_match: CaseMatchNode,
26
- case: CaseNode,
27
- class: ClassNode,
28
- def: DefNode,
29
- defined?: DefinedNode,
30
- defs: DefNode,
31
- ensure: EnsureNode,
32
- for: ForNode,
33
- forward_args: ForwardArgsNode,
34
- float: FloatNode,
35
- hash: HashNode,
36
- if: IfNode,
37
- int: IntNode,
38
- irange: RangeNode,
39
- erange: RangeNode,
40
- kwsplat: KeywordSplatNode,
41
- module: ModuleNode,
42
- or: OrNode,
43
- pair: PairNode,
44
- regexp: RegexpNode,
45
- resbody: ResbodyNode,
46
- retry: RetryNode,
47
- return: ReturnNode,
48
- csend: SendNode,
49
- send: SendNode,
50
- str: StrNode,
51
- dstr: StrNode,
52
- xstr: StrNode,
53
- sclass: SelfClassNode,
54
- super: SuperNode,
55
- zsuper: SuperNode,
56
- sym: SymbolNode,
57
- until: UntilNode,
58
- until_post: UntilNode,
59
- when: WhenNode,
60
- while: WhileNode,
61
- while_post: WhileNode,
62
- yield: YieldNode
63
- }.freeze
64
-
65
- # Generates {Node} from the given information.
66
- #
67
- # @return [Node] the generated node
68
- def n(type, children, source_map)
69
- node_klass(type).new(type, children, location: source_map)
70
- end
71
-
72
- # TODO: Figure out what to do about literal encoding handling...
73
- # More details here https://github.com/whitequark/parser/issues/283
74
- def string_value(token)
75
- value(token)
76
- end
77
-
78
- private
79
-
80
- def node_klass(type)
81
- NODE_MAP[type] || Node
82
- end
83
- end
84
- end
85
- end
@@ -1,637 +0,0 @@
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=
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
- # @yieldparam [Node] node each ancestor node
145
- # @return [self] if a block is given
146
- # @return [Enumerator] if no block is given
147
- def each_ancestor(*types, &block)
148
- return to_enum(__method__, *types) unless block_given?
149
-
150
- visit_ancestors(types, &block)
151
-
152
- self
153
- end
154
-
155
- # Returns an array of ancestor nodes.
156
- # This is a shorthand for `node.each_ancestor.to_a`.
157
- #
158
- # @return [Array<Node>] an array of ancestor nodes
159
- def ancestors
160
- each_ancestor.to_a
161
- end
162
-
163
- # Calls the given block for each child node.
164
- # If no block is given, an `Enumerator` is returned.
165
- #
166
- # Note that this is different from `node.children.each { |child| ... }`
167
- # which yields all children including non-node elements.
168
- #
169
- # @overload each_child_node
170
- # Yield all nodes.
171
- # @overload each_child_node(type)
172
- # Yield only nodes matching the type.
173
- # @param [Symbol] type a node type
174
- # @overload each_child_node(type_a, type_b, ...)
175
- # Yield only nodes matching any of the types.
176
- # @param [Symbol] type_a a node type
177
- # @param [Symbol] type_b a node type
178
- # @yieldparam [Node] node each child node
179
- # @return [self] if a block is given
180
- # @return [Enumerator] if no block is given
181
- def each_child_node(*types)
182
- return to_enum(__method__, *types) unless block_given?
183
-
184
- children.each do |child|
185
- next unless child.is_a?(Node)
186
-
187
- yield child if types.empty? || types.include?(child.type)
188
- end
189
-
190
- self
191
- end
192
-
193
- # Returns an array of child nodes.
194
- # This is a shorthand for `node.each_child_node.to_a`.
195
- #
196
- # @return [Array<Node>] an array of child nodes
197
- def child_nodes
198
- each_child_node.to_a
199
- end
200
-
201
- # Calls the given block for each descendant node with depth first order.
202
- # If no block is given, an `Enumerator` is returned.
203
- #
204
- # @overload each_descendant
205
- # Yield all nodes.
206
- # @overload each_descendant(type)
207
- # Yield only nodes matching the type.
208
- # @param [Symbol] type a node type
209
- # @overload each_descendant(type_a, type_b, ...)
210
- # Yield only nodes matching any of the types.
211
- # @param [Symbol] type_a a node type
212
- # @param [Symbol] type_b a node type
213
- # @yieldparam [Node] node each descendant node
214
- # @return [self] if a block is given
215
- # @return [Enumerator] if no block is given
216
- def each_descendant(*types, &block)
217
- return to_enum(__method__, *types) unless block_given?
218
-
219
- visit_descendants(types, &block)
220
-
221
- self
222
- end
223
-
224
- # Returns an array of descendant nodes.
225
- # This is a shorthand for `node.each_descendant.to_a`.
226
- #
227
- # @return [Array<Node>] an array of descendant nodes
228
- def descendants
229
- each_descendant.to_a
230
- end
231
-
232
- # Calls the given block for the receiver and each descendant node in
233
- # depth-first order.
234
- # If no block is given, an `Enumerator` is returned.
235
- #
236
- # This method would be useful when you treat the receiver node as the root
237
- # of a tree and want to iterate over all nodes in the tree.
238
- #
239
- # @overload each_node
240
- # Yield all nodes.
241
- # @overload each_node(type)
242
- # Yield only nodes matching the type.
243
- # @param [Symbol] type a node type
244
- # @overload each_node(type_a, type_b, ...)
245
- # Yield only nodes matching any of the types.
246
- # @param [Symbol] type_a a node type
247
- # @param [Symbol] type_b a node type
248
- # @yieldparam [Node] node each node
249
- # @return [self] if a block is given
250
- # @return [Enumerator] if no block is given
251
- def each_node(*types, &block)
252
- return to_enum(__method__, *types) unless block_given?
253
-
254
- yield self if types.empty? || types.include?(type)
255
-
256
- visit_descendants(types, &block)
257
-
258
- self
259
- end
260
-
261
- def source
262
- loc.expression.source
263
- end
264
-
265
- def source_range
266
- loc.expression
267
- end
268
-
269
- def first_line
270
- loc.line
271
- end
272
-
273
- def last_line
274
- loc.last_line
275
- end
276
-
277
- def line_count
278
- return 0 unless source_range
279
-
280
- source_range.last_line - source_range.first_line + 1
281
- end
282
-
283
- def nonempty_line_count
284
- source.lines.grep(/\S/).size
285
- end
286
-
287
- def source_length
288
- source_range ? source_range.size : 0
289
- end
290
-
291
- ## Destructuring
292
-
293
- def_node_matcher :receiver, <<~PATTERN
294
- {(send $_ ...) ({block numblock} (send $_ ...) ...)}
295
- PATTERN
296
-
297
- def_node_matcher :str_content, '(str $_)'
298
-
299
- def const_name
300
- return unless const_type?
301
-
302
- namespace, name = *self
303
- if namespace && !namespace.cbase_type?
304
- "#{namespace.const_name}::#{name}"
305
- else
306
- name.to_s
307
- end
308
- end
309
-
310
- def_node_matcher :defined_module0, <<~PATTERN
311
- {(class (const $_ $_) ...)
312
- (module (const $_ $_) ...)
313
- (casgn $_ $_ (send (const nil? {:Class :Module}) :new ...))
314
- (casgn $_ $_ (block (send (const nil? {:Class :Module}) :new ...) ...))}
315
- PATTERN
316
-
317
- private :defined_module0
318
-
319
- def defined_module
320
- namespace, name = *defined_module0
321
- s(:const, namespace, name) if name
322
- end
323
-
324
- def defined_module_name
325
- (const = defined_module) && const.const_name
326
- end
327
-
328
- ## Searching the AST
329
-
330
- def parent_module_name
331
- # what class or module is this method/constant/etc definition in?
332
- # returns nil if answer cannot be determined
333
- ancestors = each_ancestor(:class, :module, :sclass, :casgn, :block)
334
- result = ancestors.map do |ancestor|
335
- parent_module_name_part(ancestor) { |full_name| return full_name }
336
- end.compact.reverse.join('::')
337
- result.empty? ? 'Object' : result
338
- end
339
-
340
- ## Predicates
341
-
342
- def multiline?
343
- line_count > 1
344
- end
345
-
346
- def single_line?
347
- line_count == 1
348
- end
349
-
350
- def empty_source?
351
- source_length.zero?
352
- end
353
-
354
- # Some cops treat the shovel operator as a kind of assignment.
355
- def_node_matcher :assignment_or_similar?, <<~PATTERN
356
- {assignment? (send _recv :<< ...)}
357
- PATTERN
358
-
359
- def literal?
360
- LITERALS.include?(type)
361
- end
362
-
363
- def basic_literal?
364
- BASIC_LITERALS.include?(type)
365
- end
366
-
367
- def truthy_literal?
368
- TRUTHY_LITERALS.include?(type)
369
- end
370
-
371
- def falsey_literal?
372
- FALSEY_LITERALS.include?(type)
373
- end
374
-
375
- def mutable_literal?
376
- MUTABLE_LITERALS.include?(type)
377
- end
378
-
379
- def immutable_literal?
380
- IMMUTABLE_LITERALS.include?(type)
381
- end
382
-
383
- %i[literal basic_literal].each do |kind|
384
- recursive_kind = :"recursive_#{kind}?"
385
- kind_filter = :"#{kind}?"
386
- define_method(recursive_kind) do
387
- case type
388
- when :send
389
- [*COMPARISON_OPERATORS, :!, :<=>].include?(method_name) &&
390
- receiver.send(recursive_kind) &&
391
- arguments.all?(&recursive_kind)
392
- when :begin, :pair, *OPERATOR_KEYWORDS, *COMPOSITE_LITERALS
393
- children.compact.all?(&recursive_kind)
394
- else
395
- send(kind_filter)
396
- end
397
- end
398
- end
399
-
400
- def variable?
401
- VARIABLES.include?(type)
402
- end
403
-
404
- def reference?
405
- REFERENCES.include?(type)
406
- end
407
-
408
- def equals_asgn?
409
- EQUALS_ASSIGNMENTS.include?(type)
410
- end
411
-
412
- def shorthand_asgn?
413
- SHORTHAND_ASSIGNMENTS.include?(type)
414
- end
415
-
416
- def assignment?
417
- ASSIGNMENTS.include?(type)
418
- end
419
-
420
- def basic_conditional?
421
- BASIC_CONDITIONALS.include?(type)
422
- end
423
-
424
- def conditional?
425
- CONDITIONALS.include?(type)
426
- end
427
-
428
- def keyword?
429
- return true if special_keyword? || send_type? && prefix_not?
430
- return false unless KEYWORDS.include?(type)
431
-
432
- !OPERATOR_KEYWORDS.include?(type) || loc.operator.is?(type.to_s)
433
- end
434
-
435
- def special_keyword?
436
- SPECIAL_KEYWORDS.include?(source)
437
- end
438
-
439
- def operator_keyword?
440
- OPERATOR_KEYWORDS.include?(type)
441
- end
442
-
443
- def parenthesized_call?
444
- loc.respond_to?(:begin) && loc.begin && loc.begin.is?('(')
445
- end
446
-
447
- def call_type?
448
- send_type? || csend_type?
449
- end
450
-
451
- def chained?
452
- parent&.call_type? && eql?(parent.receiver)
453
- end
454
-
455
- def argument?
456
- parent&.send_type? && parent.arguments.include?(self)
457
- end
458
-
459
- def boolean_type?
460
- true_type? || false_type?
461
- end
462
-
463
- def numeric_type?
464
- int_type? || float_type?
465
- end
466
-
467
- def range_type?
468
- irange_type? || erange_type?
469
- end
470
-
471
- def guard_clause?
472
- node = and_type? || or_type? ? rhs : self
473
-
474
- node.match_guard_clause?
475
- end
476
-
477
- def_node_matcher :match_guard_clause?, <<~PATTERN
478
- [${(send nil? {:raise :fail} ...) return break next} single_line?]
479
- PATTERN
480
-
481
- def_node_matcher :proc?, <<~PATTERN
482
- {(block (send nil? :proc) ...)
483
- (block (send (const nil? :Proc) :new) ...)
484
- (send (const nil? :Proc) :new)}
485
- PATTERN
486
-
487
- def_node_matcher :lambda?, '({block numblock} (send nil? :lambda) ...)'
488
- def_node_matcher :lambda_or_proc?, '{lambda? proc?}'
489
-
490
- def_node_matcher :class_constructor?, <<~PATTERN
491
- { (send (const nil? {:Class :Module}) :new ...)
492
- (block (send (const nil? {:Class :Module}) :new ...) ...)}
493
- PATTERN
494
-
495
- # Some expressions are evaluated for their value, some for their side
496
- # effects, and some for both
497
- # If we know that an expression is useful only for its side effects, that
498
- # means we can transform it in ways which preserve the side effects, but
499
- # change the return value
500
- # So, does the return value of this node matter? If we changed it to
501
- # `(...; nil)`, might that affect anything?
502
- #
503
- # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
504
- def value_used?
505
- # Be conservative and return true if we're not sure.
506
- return false if parent.nil?
507
-
508
- case parent.type
509
- when :array, :defined?, :dstr, :dsym, :eflipflop, :erange, :float,
510
- :hash, :iflipflop, :irange, :not, :pair, :regexp, :str, :sym,
511
- :when, :xstr
512
- parent.value_used?
513
- when :begin, :kwbegin
514
- begin_value_used?
515
- when :for
516
- for_value_used?
517
- when :case, :if
518
- case_if_value_used?
519
- when :while, :until, :while_post, :until_post
520
- while_until_value_used?
521
- else
522
- true
523
- end
524
- end
525
- # rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
526
-
527
- # Some expressions are evaluated for their value, some for their side
528
- # effects, and some for both.
529
- # If we know that expressions are useful only for their return values,
530
- # and have no side effects, that means we can reorder them, change the
531
- # number of times they are evaluated, or replace them with other
532
- # expressions which are equivalent in value.
533
- # So, is evaluation of this node free of side effects?
534
- #
535
- def pure?
536
- # Be conservative and return false if we're not sure
537
- case type
538
- when :__FILE__, :__LINE__, :const, :cvar, :defined?, :false, :float,
539
- :gvar, :int, :ivar, :lvar, :nil, :str, :sym, :true, :regopt
540
- true
541
- when :and, :array, :begin, :case, :dstr, :dsym, :eflipflop, :ensure,
542
- :erange, :for, :hash, :if, :iflipflop, :irange, :kwbegin, :not,
543
- :or, :pair, :regexp, :until, :until_post, :when, :while,
544
- :while_post
545
- child_nodes.all?(&:pure?)
546
- else
547
- false
548
- end
549
- end
550
-
551
- protected
552
-
553
- def visit_descendants(types, &block)
554
- each_child_node do |child|
555
- yield child if types.empty? || types.include?(child.type)
556
- child.visit_descendants(types, &block)
557
- end
558
- end
559
-
560
- private
561
-
562
- def visit_ancestors(types)
563
- last_node = self
564
-
565
- while (current_node = last_node.parent)
566
- yield current_node if types.empty? ||
567
- types.include?(current_node.type)
568
- last_node = current_node
569
- end
570
- end
571
-
572
- def begin_value_used?
573
- # the last child node determines the value of the parent
574
- sibling_index == parent.children.size - 1 ? parent.value_used? : false
575
- end
576
-
577
- def for_value_used?
578
- # `for var in enum; body; end`
579
- # (for <var> <enum> <body>)
580
- sibling_index == 2 ? parent.value_used? : true
581
- end
582
-
583
- def case_if_value_used?
584
- # (case <condition> <when...>)
585
- # (if <condition> <truebranch> <falsebranch>)
586
- sibling_index.zero? ? true : parent.value_used?
587
- end
588
-
589
- def while_until_value_used?
590
- # (while <condition> <body>) -> always evaluates to `nil`
591
- sibling_index.zero?
592
- end
593
-
594
- def parent_module_name_part(node)
595
- case node.type
596
- when :class, :module, :casgn
597
- # TODO: if constant name has cbase (leading ::), then we don't need
598
- # to keep traversing up through nested classes/modules
599
- node.defined_module_name
600
- when :sclass
601
- yield parent_module_name_for_sclass(node)
602
- else # block
603
- parent_module_name_for_block(node) { yield nil }
604
- end
605
- end
606
-
607
- def parent_module_name_for_sclass(sclass_node)
608
- # TODO: look for constant definition and see if it is nested
609
- # inside a class or module
610
- subject = sclass_node.children[0]
611
-
612
- if subject.const_type?
613
- "#<Class:#{subject.const_name}>"
614
- elsif subject.self_type?
615
- "#<Class:#{sclass_node.parent_module_name}>"
616
- end
617
- end
618
-
619
- def parent_module_name_for_block(ancestor)
620
- if ancestor.method?(:class_eval)
621
- # `class_eval` with no receiver applies to whatever module or class
622
- # we are currently in
623
- return unless (receiver = ancestor.receiver)
624
-
625
- yield unless receiver.const_type?
626
- receiver.const_name
627
- elsif !new_class_or_module_block?(ancestor)
628
- yield
629
- end
630
- end
631
-
632
- def_node_matcher :new_class_or_module_block?, <<~PATTERN
633
- ^(casgn _ _ (block (send (const _ {:Class :Module}) :new) ...))
634
- PATTERN
635
- end
636
- end
637
- end