rubocop 0.83.0 → 0.84.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +20 -3
  4. data/lib/rubocop.rb +6 -59
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  7. data/lib/rubocop/config.rb +1 -3
  8. data/lib/rubocop/config_loader.rb +3 -9
  9. data/lib/rubocop/config_loader_resolver.rb +2 -6
  10. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  11. data/lib/rubocop/cop/corrector.rb +1 -3
  12. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -6
  13. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -3
  14. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  15. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  16. data/lib/rubocop/cop/generator.rb +1 -1
  17. data/lib/rubocop/cop/ignored_node.rb +1 -3
  18. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  19. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +62 -4
  20. data/lib/rubocop/cop/layout/first_argument_indentation.rb +0 -2
  21. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -3
  22. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  23. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -6
  24. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  25. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -3
  26. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  27. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -6
  28. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  29. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  30. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -6
  31. data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -2
  32. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +133 -0
  33. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -6
  34. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +11 -3
  35. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -3
  36. data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -1
  37. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  38. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -3
  39. data/lib/rubocop/cop/migration/department_name.rb +5 -9
  40. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  41. data/lib/rubocop/cop/mixin/array_min_size.rb +2 -6
  42. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -12
  43. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  44. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -3
  45. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -3
  46. data/lib/rubocop/cop/mixin/surrounding_space.rb +1 -3
  47. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -3
  48. data/lib/rubocop/cop/naming/file_name.rb +1 -3
  49. data/lib/rubocop/cop/registry.rb +2 -6
  50. data/lib/rubocop/cop/severity.rb +1 -3
  51. data/lib/rubocop/cop/style/and_or.rb +2 -2
  52. data/lib/rubocop/cop/style/attr.rb +1 -3
  53. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  54. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -3
  55. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  56. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  57. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -4
  58. data/lib/rubocop/cop/style/hash_syntax.rb +12 -5
  59. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  60. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  61. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -6
  62. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  63. data/lib/rubocop/cop/style/safe_navigation.rb +2 -6
  64. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  65. data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
  66. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -3
  67. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +2 -6
  68. data/lib/rubocop/cop/variable_force.rb +3 -9
  69. data/lib/rubocop/cop/variable_force/branch.rb +2 -6
  70. data/lib/rubocop/cop/variable_force/variable.rb +2 -6
  71. data/lib/rubocop/ext/processed_source.rb +18 -0
  72. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  73. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  74. data/lib/rubocop/formatter/formatter_set.rb +1 -3
  75. data/lib/rubocop/options.rb +2 -8
  76. data/lib/rubocop/remote_config.rb +1 -3
  77. data/lib/rubocop/result_cache.rb +1 -3
  78. data/lib/rubocop/rspec/cop_helper.rb +1 -3
  79. data/lib/rubocop/rspec/expect_offense.rb +3 -9
  80. data/lib/rubocop/rspec/shared_contexts.rb +54 -16
  81. data/lib/rubocop/runner.rb +8 -10
  82. data/lib/rubocop/target_finder.rb +2 -6
  83. data/lib/rubocop/version.rb +5 -3
  84. metadata +19 -56
  85. data/lib/rubocop/ast/builder.rb +0 -85
  86. data/lib/rubocop/ast/node.rb +0 -637
  87. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  88. data/lib/rubocop/ast/node/and_node.rb +0 -29
  89. data/lib/rubocop/ast/node/args_node.rb +0 -29
  90. data/lib/rubocop/ast/node/array_node.rb +0 -70
  91. data/lib/rubocop/ast/node/block_node.rb +0 -121
  92. data/lib/rubocop/ast/node/break_node.rb +0 -17
  93. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  94. data/lib/rubocop/ast/node/case_node.rb +0 -56
  95. data/lib/rubocop/ast/node/class_node.rb +0 -31
  96. data/lib/rubocop/ast/node/def_node.rb +0 -82
  97. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  98. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  99. data/lib/rubocop/ast/node/float_node.rb +0 -12
  100. data/lib/rubocop/ast/node/for_node.rb +0 -53
  101. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  102. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  103. data/lib/rubocop/ast/node/if_node.rb +0 -175
  104. data/lib/rubocop/ast/node/int_node.rb +0 -12
  105. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  106. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  107. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  108. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  109. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  110. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  111. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -269
  112. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  113. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  114. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  115. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  116. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  117. data/lib/rubocop/ast/node/module_node.rb +0 -24
  118. data/lib/rubocop/ast/node/or_node.rb +0 -29
  119. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  120. data/lib/rubocop/ast/node/range_node.rb +0 -18
  121. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  122. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  123. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  124. data/lib/rubocop/ast/node/return_node.rb +0 -24
  125. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  126. data/lib/rubocop/ast/node/send_node.rb +0 -17
  127. data/lib/rubocop/ast/node/str_node.rb +0 -16
  128. data/lib/rubocop/ast/node/super_node.rb +0 -21
  129. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  130. data/lib/rubocop/ast/node/until_node.rb +0 -35
  131. data/lib/rubocop/ast/node/when_node.rb +0 -53
  132. data/lib/rubocop/ast/node/while_node.rb +0 -35
  133. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  134. data/lib/rubocop/ast/sexp.rb +0 -16
  135. data/lib/rubocop/ast/traversal.rb +0 -202
  136. data/lib/rubocop/node_pattern.rb +0 -887
  137. data/lib/rubocop/processed_source.rb +0 -213
  138. 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