rubocop 0.82.0 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -19
  3. data/config/default.yml +111 -23
  4. data/lib/rubocop.rb +16 -59
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +3 -3
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  10. data/lib/rubocop/comment_config.rb +1 -1
  11. data/lib/rubocop/config.rb +6 -2
  12. data/lib/rubocop/config_loader.rb +19 -24
  13. data/lib/rubocop/config_loader_resolver.rb +45 -6
  14. data/lib/rubocop/config_store.rb +12 -2
  15. data/lib/rubocop/config_validator.rb +2 -1
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  17. data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
  18. data/lib/rubocop/cop/commissioner.rb +0 -21
  19. data/lib/rubocop/cop/cop.rb +36 -21
  20. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -6
  21. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  23. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  24. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  25. data/lib/rubocop/cop/generator.rb +4 -3
  26. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  27. data/lib/rubocop/cop/ignored_node.rb +1 -3
  28. data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
  29. data/lib/rubocop/cop/layout/class_structure.rb +19 -16
  30. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
  31. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  32. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  33. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  34. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +128 -0
  35. data/lib/rubocop/cop/layout/end_of_line.rb +3 -3
  36. data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -4
  37. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -3
  38. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  39. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  40. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  41. data/lib/rubocop/cop/layout/hash_alignment.rb +7 -7
  42. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -7
  43. data/lib/rubocop/cop/layout/heredoc_indentation.rb +20 -103
  44. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  45. data/lib/rubocop/cop/layout/line_length.rb +21 -18
  46. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  47. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  48. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  49. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  50. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  51. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -3
  52. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  53. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  54. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  55. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +2 -4
  56. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  57. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  58. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
  59. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  60. data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
  61. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  62. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  63. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  64. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  65. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  66. data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
  67. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
  68. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  69. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
  70. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  71. data/lib/rubocop/cop/lint/loop.rb +1 -1
  72. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  73. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  74. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
  75. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
  76. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  77. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  78. data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
  79. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +5 -8
  80. data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
  81. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  82. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  83. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  84. data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
  85. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  86. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  87. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  88. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  89. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
  90. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  91. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
  92. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  93. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  94. data/lib/rubocop/cop/migration/department_name.rb +7 -7
  95. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  96. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  97. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
  98. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  99. data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
  100. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  101. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  102. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  103. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  104. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  105. data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -1
  106. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  107. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
  108. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  109. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  110. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  111. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  112. data/lib/rubocop/cop/mixin/range_help.rb +1 -1
  113. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  114. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -23
  115. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  116. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
  117. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  118. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  119. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -3
  120. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  121. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
  122. data/lib/rubocop/cop/naming/file_name.rb +28 -17
  123. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  124. data/lib/rubocop/cop/naming/method_name.rb +1 -5
  125. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  126. data/lib/rubocop/cop/registry.rb +63 -10
  127. data/lib/rubocop/cop/severity.rb +1 -3
  128. data/lib/rubocop/cop/style/and_or.rb +2 -2
  129. data/lib/rubocop/cop/style/array_join.rb +1 -1
  130. data/lib/rubocop/cop/style/attr.rb +1 -3
  131. data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -2
  132. data/lib/rubocop/cop/style/block_delimiters.rb +4 -12
  133. data/lib/rubocop/cop/style/case_equality.rb +1 -1
  134. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  135. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  136. data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
  137. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -4
  138. data/lib/rubocop/cop/style/copyright.rb +5 -5
  139. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
  140. data/lib/rubocop/cop/style/documentation.rb +2 -2
  141. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  142. data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
  143. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  144. data/lib/rubocop/cop/style/empty_method.rb +1 -5
  145. data/lib/rubocop/cop/style/encoding.rb +1 -1
  146. data/lib/rubocop/cop/style/exponential_notation.rb +5 -5
  147. data/lib/rubocop/cop/style/format_string_token.rb +2 -3
  148. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
  149. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  150. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -1
  151. data/lib/rubocop/cop/style/hash_syntax.rb +16 -7
  152. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  153. data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
  154. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  155. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  156. data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
  157. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  158. data/lib/rubocop/cop/style/lambda_call.rb +0 -20
  159. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  160. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  161. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  163. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  164. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  165. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  166. data/lib/rubocop/cop/style/negated_unless.rb +3 -3
  167. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  168. data/lib/rubocop/cop/style/next.rb +2 -2
  169. data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
  170. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  171. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -6
  172. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  173. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  174. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
  175. data/lib/rubocop/cop/style/redundant_fetch_block.rb +103 -0
  176. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -7
  177. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
  178. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  179. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  180. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  181. data/lib/rubocop/cop/style/safe_navigation.rb +2 -6
  182. data/lib/rubocop/cop/style/sample.rb +1 -1
  183. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  184. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  185. data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
  186. data/lib/rubocop/cop/style/struct_inheritance.rb +21 -0
  187. data/lib/rubocop/cop/style/symbol_array.rb +5 -5
  188. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -4
  189. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +3 -3
  190. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
  191. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +13 -13
  192. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
  193. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
  194. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  195. data/lib/rubocop/cop/style/when_then.rb +1 -1
  196. data/lib/rubocop/cop/style/word_array.rb +1 -1
  197. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  198. data/lib/rubocop/cop/team.rb +69 -25
  199. data/lib/rubocop/cop/util.rb +27 -3
  200. data/lib/rubocop/cop/utils/format_string.rb +18 -0
  201. data/lib/rubocop/cop/variable_force.rb +3 -9
  202. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  203. data/lib/rubocop/cop/variable_force/branch.rb +1 -3
  204. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  205. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  206. data/lib/rubocop/ext/processed_source.rb +18 -0
  207. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  208. data/lib/rubocop/formatter/disabled_config_formatter.rb +5 -13
  209. data/lib/rubocop/formatter/formatter_set.rb +2 -4
  210. data/lib/rubocop/formatter/junit_formatter.rb +14 -4
  211. data/lib/rubocop/magic_comment.rb +1 -1
  212. data/lib/rubocop/name_similarity.rb +18 -9
  213. data/lib/rubocop/options.rb +26 -11
  214. data/lib/rubocop/path_util.rb +2 -2
  215. data/lib/rubocop/platform.rb +1 -1
  216. data/lib/rubocop/remote_config.rb +1 -3
  217. data/lib/rubocop/result_cache.rb +5 -7
  218. data/lib/rubocop/rspec/cop_helper.rb +2 -25
  219. data/lib/rubocop/rspec/expect_offense.rb +58 -15
  220. data/lib/rubocop/rspec/shared_contexts.rb +54 -16
  221. data/lib/rubocop/runner.rb +20 -13
  222. data/lib/rubocop/target_finder.rb +8 -8
  223. data/lib/rubocop/target_ruby.rb +4 -1
  224. data/lib/rubocop/version.rb +5 -3
  225. metadata +51 -74
  226. data/lib/rubocop/ast/builder.rb +0 -85
  227. data/lib/rubocop/ast/node.rb +0 -637
  228. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  229. data/lib/rubocop/ast/node/and_node.rb +0 -29
  230. data/lib/rubocop/ast/node/args_node.rb +0 -29
  231. data/lib/rubocop/ast/node/array_node.rb +0 -70
  232. data/lib/rubocop/ast/node/block_node.rb +0 -121
  233. data/lib/rubocop/ast/node/break_node.rb +0 -17
  234. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  235. data/lib/rubocop/ast/node/case_node.rb +0 -56
  236. data/lib/rubocop/ast/node/class_node.rb +0 -31
  237. data/lib/rubocop/ast/node/def_node.rb +0 -82
  238. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  239. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  240. data/lib/rubocop/ast/node/float_node.rb +0 -12
  241. data/lib/rubocop/ast/node/for_node.rb +0 -53
  242. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  243. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  244. data/lib/rubocop/ast/node/if_node.rb +0 -175
  245. data/lib/rubocop/ast/node/int_node.rb +0 -12
  246. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  247. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  248. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  249. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  250. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  251. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  252. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -269
  253. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  254. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  255. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  256. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  257. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  258. data/lib/rubocop/ast/node/module_node.rb +0 -24
  259. data/lib/rubocop/ast/node/or_node.rb +0 -29
  260. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  261. data/lib/rubocop/ast/node/range_node.rb +0 -18
  262. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  263. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  264. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  265. data/lib/rubocop/ast/node/return_node.rb +0 -24
  266. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  267. data/lib/rubocop/ast/node/send_node.rb +0 -13
  268. data/lib/rubocop/ast/node/str_node.rb +0 -16
  269. data/lib/rubocop/ast/node/super_node.rb +0 -21
  270. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  271. data/lib/rubocop/ast/node/until_node.rb +0 -35
  272. data/lib/rubocop/ast/node/when_node.rb +0 -53
  273. data/lib/rubocop/ast/node/while_node.rb +0 -35
  274. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  275. data/lib/rubocop/ast/sexp.rb +0 -16
  276. data/lib/rubocop/ast/traversal.rb +0 -202
  277. data/lib/rubocop/node_pattern.rb +0 -887
  278. data/lib/rubocop/processed_source.rb +0 -213
  279. data/lib/rubocop/string_util.rb +0 -14
  280. data/lib/rubocop/token.rb +0 -114
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for primitive literal nodes: `sym`, `str`,
6
- # `int`, `float`, ...
7
- module BasicLiteralNode
8
- # Returns the value of the literal.
9
- #
10
- # @return [mixed] the value of the literal
11
- def value
12
- node_parts[0]
13
- end
14
- end
15
- end
16
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for nodes that are binary operations:
6
- # `or`, `and` ...
7
- module BinaryOperatorNode
8
- # Returns the left hand side node of the binary operation.
9
- #
10
- # @return [Node] the left hand side of the binary operation
11
- def lhs
12
- node_parts[0]
13
- end
14
-
15
- # Returns the right hand side node of the binary operation.
16
- #
17
- # @return [Node] the right hand side of the binary operation
18
- def rhs
19
- node_parts[1]
20
- end
21
-
22
- # Returns all of the conditions, including nested conditions,
23
- # of the binary operation.
24
- #
25
- # @return [Array<Node>] the left and right hand side of the binary
26
- # operation and the let and right hand side of any nested binary
27
- # operators
28
- def conditions
29
- lhs, rhs = *self
30
- lhs = lhs.children.first if lhs.begin_type?
31
- rhs = rhs.children.first if rhs.begin_type?
32
-
33
- [lhs, rhs].each_with_object([]) do |side, collection|
34
- if side.operator_keyword?
35
- collection.concat(side.conditions)
36
- else
37
- collection << side
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # A mixin that helps give collection nodes array polymorphism.
6
- module CollectionNode
7
- extend Forwardable
8
-
9
- ARRAY_METHODS =
10
- (Array.instance_methods - Object.instance_methods - [:to_a]).freeze
11
-
12
- def_delegators :to_a, *ARRAY_METHODS
13
- end
14
- end
15
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for nodes that have conditions:
6
- # `if`, `while`, `until`, `case`.
7
- # This currently doesn't include `when` nodes, because they have multiple
8
- # conditions, and need to be checked for that.
9
- module ConditionalNode
10
- # Checks whether the condition of the node is written on a single line.
11
- #
12
- # @return [Boolean] whether the condition is on a single line
13
- def single_line_condition?
14
- loc.keyword.line == condition.source_range.line
15
- end
16
-
17
- # Checks whether the condition of the node is written on more than
18
- # one line.
19
- #
20
- # @return [Boolean] whether the condition is on more than one line
21
- def multiline_condition?
22
- !single_line_condition?
23
- end
24
-
25
- # Returns the condition of the node. This works together with each node's
26
- # custom destructuring method to select the correct part of the node.
27
- #
28
- # @return [Node, nil] the condition of the node
29
- def condition
30
- node_parts[0]
31
- end
32
-
33
- # Returns the body associated with the condition. This works together with
34
- # each node's custom destructuring method to select the correct part of
35
- # the node.
36
- #
37
- # @note For `if` nodes, this is the truthy branch.
38
- #
39
- # @return [Node, nil] the body of the node
40
- def body
41
- node_parts[1]
42
- end
43
- end
44
- end
45
- end
@@ -1,125 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for nodes that can be used as hash elements:
6
- # `pair`, `kwsplat`
7
- module HashElementNode
8
- # Returns the key of this `hash` element.
9
- #
10
- # @note For keyword splats, this returns the whole node
11
- #
12
- # @return [Node] the key of the hash element
13
- def key
14
- node_parts[0]
15
- end
16
-
17
- # Returns the value of this `hash` element.
18
- #
19
- # @note For keyword splats, this returns the whole node
20
- #
21
- # @return [Node] the value of the hash element
22
- def value
23
- node_parts[1]
24
- end
25
-
26
- # Checks whether this `hash` element is on the same line as `other`.
27
- #
28
- # @note A multiline element is considered to be on the same line if it
29
- # shares any of its lines with `other`
30
- #
31
- # @return [Boolean] whether this element is on the same line as `other`
32
- def same_line?(other)
33
- loc.last_line == other.loc.line || loc.line == other.loc.last_line
34
- end
35
-
36
- # Returns the delta between this pair's key and the argument pair's.
37
- #
38
- # @note Keys on the same line always return a delta of 0
39
- # @note Keyword splats always return a delta of 0 for right alignment
40
- #
41
- # @param [Symbol] alignment whether to check the left or right side
42
- # @return [Integer] the delta between the two keys
43
- def key_delta(other, alignment = :left)
44
- HashElementDelta.new(self, other).key_delta(alignment)
45
- end
46
-
47
- # Returns the delta between this element's value and the argument's.
48
- #
49
- # @note Keyword splats always return a delta of 0
50
- #
51
- # @return [Integer] the delta between the two values
52
- def value_delta(other)
53
- HashElementDelta.new(self, other).value_delta
54
- end
55
-
56
- # Returns the delta between this element's delimiter and the argument's.
57
- #
58
- # @note Pairs with different delimiter styles return a delta of 0
59
- #
60
- # @return [Integer] the delta between the two delimiters
61
- def delimiter_delta(other)
62
- HashElementDelta.new(self, other).delimiter_delta
63
- end
64
-
65
- # A helper class for comparing the positions of different parts of a
66
- # `pair` node.
67
- class HashElementDelta
68
- def initialize(first, second)
69
- @first = first
70
- @second = second
71
-
72
- raise ArgumentError unless valid_argument_types?
73
- end
74
-
75
- def key_delta(alignment = :left)
76
- return 0 if first.same_line?(second)
77
- return 0 if keyword_splat? && alignment == :right
78
-
79
- delta(first.key.loc, second.key.loc, alignment)
80
- end
81
-
82
- def value_delta
83
- return 0 if first.same_line?(second)
84
- return 0 if keyword_splat?
85
-
86
- delta(first.value.loc, second.value.loc)
87
- end
88
-
89
- def delimiter_delta
90
- return 0 if first.same_line?(second)
91
- return 0 if first.delimiter != second.delimiter
92
-
93
- delta(first.loc.operator, second.loc.operator)
94
- end
95
-
96
- private
97
-
98
- attr_reader :first, :second
99
-
100
- def valid_argument_types?
101
- [first, second].all? do |argument|
102
- argument.pair_type? || argument.kwsplat_type?
103
- end
104
- end
105
-
106
- def delta(first, second, alignment = :left)
107
- case alignment
108
- when :left
109
- first.column - second.column
110
- when :right
111
- first.last_column - second.last_column
112
- else
113
- 0
114
- end
115
- end
116
-
117
- def keyword_splat?
118
- [first, second].any?(&:kwsplat_type?)
119
- end
120
- end
121
-
122
- private_constant :HashElementDelta
123
- end
124
- end
125
- end
@@ -1,269 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module AST
5
- # Common functionality for nodes that are a kind of method dispatch:
6
- # `send`, `csend`, `super`, `zsuper`, `yield`, `defined?`
7
- module MethodDispatchNode
8
- extend NodePattern::Macros
9
- include MethodIdentifierPredicates
10
-
11
- ARITHMETIC_OPERATORS = %i[+ - * / % **].freeze
12
- SPECIAL_MODIFIERS = %w[private protected].freeze
13
-
14
- # The receiving node of the method dispatch.
15
- #
16
- # @return [Node, nil] the receiver of the dispatched method or `nil`
17
- def receiver
18
- node_parts[0]
19
- end
20
-
21
- # The name of the dispatched method as a symbol.
22
- #
23
- # @return [Symbol] the name of the dispatched method
24
- def method_name
25
- node_parts[1]
26
- end
27
-
28
- # An array containing the arguments of the dispatched method.
29
- #
30
- # @return [Array<Node>] the arguments of the dispatched method
31
- def arguments
32
- node_parts[2..-1]
33
- end
34
-
35
- # The `block` node associated with this method dispatch, if any.
36
- #
37
- # @return [BlockNode, nil] the `block` node associated with this method
38
- # call or `nil`
39
- def block_node
40
- parent if block_literal?
41
- end
42
-
43
- # Checks whether the dispatched method is a macro method. A macro method
44
- # is defined as a method that sits in a class, module, or block body and
45
- # has an implicit receiver.
46
- #
47
- # @note This does not include DSLs that use nested blocks, like RSpec
48
- #
49
- # @return [Boolean] whether the dispatched method is a macro method
50
- def macro?
51
- !receiver && macro_scope?
52
- end
53
-
54
- # Checks whether the dispatched method is an access modifier.
55
- #
56
- # @return [Boolean] whether the dispatched method is an access modifier
57
- def access_modifier?
58
- bare_access_modifier? || non_bare_access_modifier?
59
- end
60
-
61
- # Checks whether the dispatched method is a bare access modifier that
62
- # affects all methods defined after the macro.
63
- #
64
- # @return [Boolean] whether the dispatched method is a bare
65
- # access modifier
66
- def bare_access_modifier?
67
- macro? && bare_access_modifier_declaration?
68
- end
69
-
70
- # Checks whether the dispatched method is a non-bare access modifier that
71
- # affects only the method it receives.
72
- #
73
- # @return [Boolean] whether the dispatched method is a non-bare
74
- # access modifier
75
- def non_bare_access_modifier?
76
- macro? && non_bare_access_modifier_declaration?
77
- end
78
-
79
- # Checks whether the dispatched method is a bare `private` or `protected`
80
- # access modifier that affects all methods defined after the macro.
81
- #
82
- # @return [Boolean] whether the dispatched method is a bare
83
- # `private` or `protected` access modifier
84
- def special_modifier?
85
- bare_access_modifier? && SPECIAL_MODIFIERS.include?(source)
86
- end
87
-
88
- # Checks whether the name of the dispatched method matches the argument
89
- # and has an implicit receiver.
90
- #
91
- # @param [Symbol, String] name the method name to check for
92
- # @return [Boolean] whether the method name matches the argument
93
- def command?(name)
94
- !receiver && method?(name)
95
- end
96
-
97
- # Checks whether the dispatched method is a setter method.
98
- #
99
- # @return [Boolean] whether the dispatched method is a setter
100
- def setter_method?
101
- loc.respond_to?(:operator) && loc.operator
102
- end
103
- alias assignment? setter_method?
104
-
105
- # Checks whether the dispatched method uses a dot to connect the
106
- # receiver and the method name.
107
- #
108
- # This is useful for comparison operators, which can be called either
109
- # with or without a dot, i.e. `foo == bar` or `foo.== bar`.
110
- #
111
- # @return [Boolean] whether the method was called with a connecting dot
112
- def dot?
113
- loc.respond_to?(:dot) && loc.dot && loc.dot.is?('.')
114
- end
115
-
116
- # Checks whether the dispatched method uses a double colon to connect the
117
- # receiver and the method name.
118
- #
119
- # @return [Boolean] whether the method was called with a connecting dot
120
- def double_colon?
121
- loc.respond_to?(:dot) && loc.dot && loc.dot.is?('::')
122
- end
123
-
124
- # Checks whether the dispatched method uses a safe navigation operator to
125
- # connect the receiver and the method name.
126
- #
127
- # @return [Boolean] whether the method was called with a connecting dot
128
- def safe_navigation?
129
- loc.respond_to?(:dot) && loc.dot && loc.dot.is?('&.')
130
- end
131
-
132
- # Checks whether the *explicit* receiver of this method dispatch is
133
- # `self`.
134
- #
135
- # @return [Boolean] whether the receiver of this method dispatch is `self`
136
- def self_receiver?
137
- receiver&.self_type?
138
- end
139
-
140
- # Checks whether the *explicit* receiver of this method dispatch is a
141
- # `const` node.
142
- #
143
- # @return [Boolean] whether the receiver of this method dispatch
144
- # is a `const` node
145
- def const_receiver?
146
- receiver&.const_type?
147
- end
148
-
149
- # Checks whether the method dispatch is the implicit form of `#call`,
150
- # e.g. `foo.(bar)`.
151
- #
152
- # @return [Boolean] whether the method is the implicit form of `#call`
153
- def implicit_call?
154
- method?(:call) && !loc.selector
155
- end
156
-
157
- # Whether this method dispatch has an explicit block.
158
- #
159
- # @return [Boolean] whether the dispatched method has a block
160
- def block_literal?
161
- parent&.block_type? && eql?(parent.send_node)
162
- end
163
-
164
- # Checks whether this node is an arithmetic operation
165
- #
166
- # @return [Boolean] whether the dispatched method is an arithmetic
167
- # operation
168
- def arithmetic_operation?
169
- ARITHMETIC_OPERATORS.include?(method_name)
170
- end
171
-
172
- # Checks if this node is part of a chain of `def` modifiers.
173
- #
174
- # @example
175
- #
176
- # private def foo; end
177
- #
178
- # @return [Boolean] whether the dispatched method is a `def` modifier
179
- def def_modifier?
180
- send_type? &&
181
- [self, *each_descendant(:send)].any?(&:adjacent_def_modifier?)
182
- end
183
-
184
- # Checks whether this is a lambda. Some versions of parser parses
185
- # non-literal lambdas as a method send.
186
- #
187
- # @return [Boolean] whether this method is a lambda
188
- def lambda?
189
- block_literal? && command?(:lambda)
190
- end
191
-
192
- # Checks whether this is a lambda literal (stabby lambda.)
193
- #
194
- # @example
195
- #
196
- # -> (foo) { bar }
197
- #
198
- # @return [Boolean] whether this method is a lambda literal
199
- def lambda_literal?
200
- block_literal? && loc.expression && loc.expression.source == '->'
201
- end
202
-
203
- # Checks whether this is a unary operation.
204
- #
205
- # @example
206
- #
207
- # -foo
208
- #
209
- # @return [Boolean] whether this method is a unary operation
210
- def unary_operation?
211
- return false unless loc.selector
212
-
213
- operator_method? && loc.expression.begin_pos == loc.selector.begin_pos
214
- end
215
-
216
- # Checks whether this is a binary operation.
217
- #
218
- # @example
219
- #
220
- # foo + bar
221
- #
222
- # @return [Bookean] whether this method is a binary operation
223
- def binary_operation?
224
- return false unless loc.selector
225
-
226
- operator_method? && loc.expression.begin_pos != loc.selector.begin_pos
227
- end
228
-
229
- private
230
-
231
- def_node_matcher :macro_scope?, <<~PATTERN
232
- {^{({sclass class module block} ...) class_constructor?}
233
- ^^{({sclass class module block} ... ({begin if} ...)) class_constructor?}
234
- ^#macro_kwbegin_wrapper?
235
- #root_node?}
236
- PATTERN
237
-
238
- # Check if a node's parent is a kwbegin wrapper within a macro scope
239
- #
240
- # @param parent [Node] parent of the node being checked
241
- #
242
- # @return [Boolean] true if the parent is a kwbegin in a macro scope
243
- def macro_kwbegin_wrapper?(parent)
244
- parent.kwbegin_type? && macro_scope?(parent)
245
- end
246
-
247
- # Check if a node does not have a parent
248
- #
249
- # @param node [Node]
250
- #
251
- # @return [Boolean] if the parent is nil
252
- def root_node?(node)
253
- node.parent.nil?
254
- end
255
-
256
- def_node_matcher :adjacent_def_modifier?, <<~PATTERN
257
- (send nil? _ ({def defs} ...))
258
- PATTERN
259
-
260
- def_node_matcher :bare_access_modifier_declaration?, <<~PATTERN
261
- (send nil? {:public :protected :private :module_function})
262
- PATTERN
263
-
264
- def_node_matcher :non_bare_access_modifier_declaration?, <<~PATTERN
265
- (send nil? {:public :protected :private :module_function} _)
266
- PATTERN
267
- end
268
- end
269
- end