rubocop 0.82.0 → 0.86.0

Sign up to get free protection for your applications and to get access to all the features.
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