rubocop-ast 1.36.1 → 1.37.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb157bc53c77f0b4583fe4a1fae816b2293db5a15a959f4fce65da9cea0d887f
4
- data.tar.gz: d3ebac2e11d25746a9b0a33815049848d7773049c69db74b4e667692e07f6189
3
+ metadata.gz: 71290c5f117f13043b681f7ce182d115284b84675bbfc0bf35448152ebfb42bd
4
+ data.tar.gz: 3c13a0e8e089409da5dd353bfea60c3981f56dac094f7a650690f3862bdf3e36
5
5
  SHA512:
6
- metadata.gz: b5810513b99608118aad971f53f3e88a535a3c6d281d3fe3a6a4615c3ec635697f377f610b30d230d2e529d39e84e0d48353bfaac44da2956c3c94716ec2740f
7
- data.tar.gz: 65ee46a6d28b659b967662dc971986b545044209dc879cfb6e1fe556c414754dccd13b8db01be73dbc168a1474bf8bf34b20dea768a4b84b7eef7e41bfce19e9
6
+ metadata.gz: '08c425d33229f9116b91905ef14ea762ad2d17603ae581795d3101526a51ee6a4c8e1ab2e508f2355b688e4143f668e71767f8283934ee3b27f045315add0a28'
7
+ data.tar.gz: 58173b8980810073f670c9087905923661d8a3fe0a43c17b354388ee07728611a6c5d1a690a2813184a6d4286c29c090d11d4f28de001ae395bfb774c53720bc
@@ -34,7 +34,7 @@ module RuboCop
34
34
  #
35
35
  # @return [Boolean] whether the array is enclosed in square brackets
36
36
  def square_brackets?
37
- loc.begin&.is?('[')
37
+ loc_is?(:begin, '[')
38
38
  end
39
39
 
40
40
  # Checks whether the `array` literal is delimited by percent brackets.
@@ -17,7 +17,7 @@ module RuboCop
17
17
  #
18
18
  # @return [Boolean] whether the `for` node has a `do` keyword
19
19
  def do?
20
- loc.begin&.is?('do')
20
+ loc_is?(:begin, 'do')
21
21
  end
22
22
 
23
23
  # Checks whether this node body is a void context.
@@ -115,7 +115,7 @@ module RuboCop
115
115
  #
116
116
  # @return [Boolean] whether the `hash` literal is enclosed in braces
117
117
  def braces?
118
- loc.end&.is?('}')
118
+ loc_is?(:end, '}')
119
119
  end
120
120
  end
121
121
  end
@@ -25,6 +25,13 @@ module RuboCop
25
25
  keyword == 'unless'
26
26
  end
27
27
 
28
+ # Checks whether the `if` node has an `then` clause.
29
+ #
30
+ # @return [Boolean] whether the node has an `then` clause
31
+ def then?
32
+ loc_is?(:begin, 'then')
33
+ end
34
+
28
35
  # Checks whether the `if` is an `elsif`. Parser handles these by nesting
29
36
  # `if` nodes in the `else` branch.
30
37
  #
@@ -24,7 +24,7 @@ module RuboCop
24
24
  #
25
25
  # @return [Boolean] whether the `in` node has a `then` keyword
26
26
  def then?
27
- loc.begin&.is?('then')
27
+ loc_is?(:begin, 'then')
28
28
  end
29
29
 
30
30
  # Returns the body of the `in` node.
@@ -117,7 +117,7 @@ module RuboCop
117
117
  #
118
118
  # @return [Boolean] whether the method was called with a connecting dot
119
119
  def dot?
120
- loc.respond_to?(:dot) && loc.dot&.is?('.')
120
+ loc_is?(:dot, '.')
121
121
  end
122
122
 
123
123
  # Checks whether the dispatched method uses a double colon to connect the
@@ -125,7 +125,7 @@ module RuboCop
125
125
  #
126
126
  # @return [Boolean] whether the method was called with a connecting dot
127
127
  def double_colon?
128
- loc.respond_to?(:dot) && loc.dot&.is?('::')
128
+ loc_is?(:dot, '::')
129
129
  end
130
130
 
131
131
  # Checks whether the dispatched method uses a safe navigation operator to
@@ -133,7 +133,7 @@ module RuboCop
133
133
  #
134
134
  # @return [Boolean] whether the method was called with a connecting dot
135
135
  def safe_navigation?
136
- loc.respond_to?(:dot) && loc.dot&.is?('&.')
136
+ loc_is?(:dot, '&.')
137
137
  end
138
138
 
139
139
  # Checks whether the *explicit* receiver of this method dispatch is
@@ -13,7 +13,7 @@ module RuboCop
13
13
  # @return [Boolean] whether this node's arguments are
14
14
  # wrapped in parentheses
15
15
  def parenthesized?
16
- loc.end&.is?(')')
16
+ loc_is?(:end, ')')
17
17
  end
18
18
 
19
19
  # A shorthand for getting the first argument of the node.
@@ -8,13 +8,15 @@ module RuboCop
8
8
  class MlhsNode < Node
9
9
  # Returns all the assignment nodes on the left hand side (LHS) of a multiple assignment.
10
10
  # These are generally assignment nodes (`lvasgn`, `ivasgn`, `cvasgn`, `gvasgn`, `casgn`)
11
- # but can also be `send` nodes in case of `foo.bar, ... =` or `foo[:bar], ... =`.
11
+ # but can also be `send` nodes in case of `foo.bar, ... =` or `foo[:bar], ... =`,
12
+ # or a `splat` node for `*, ... =`.
12
13
  #
13
14
  # @return [Array<Node>] the assignment nodes of the multiple assignment LHS
14
15
  def assignments
15
16
  child_nodes.flat_map do |node|
16
17
  if node.splat_type?
17
- node.child_nodes.first
18
+ # Anonymous splats have no children
19
+ node.child_nodes.first || node
18
20
  elsif node.mlhs_type?
19
21
  node.assignments
20
22
  else
@@ -8,13 +8,49 @@ module RuboCop
8
8
  class StrNode < Node
9
9
  include BasicLiteralNode
10
10
 
11
+ PERCENT_LITERAL_TYPES = {
12
+ :% => /\A%(?=[^a-zA-Z])/,
13
+ :q => /\A%q/,
14
+ :Q => /\A%Q/
15
+ }.freeze
16
+
17
+ def single_quoted?
18
+ loc_is?(:begin, "'")
19
+ end
20
+
21
+ def double_quoted?
22
+ loc_is?(:begin, '"')
23
+ end
24
+
11
25
  def character_literal?
12
- loc.respond_to?(:begin) && loc.begin&.is?('?')
26
+ loc_is?(:begin, '?')
13
27
  end
14
28
 
15
29
  def heredoc?
16
30
  loc.is_a?(Parser::Source::Map::Heredoc)
17
31
  end
32
+
33
+ # Checks whether the string literal is delimited by percent brackets.
34
+ #
35
+ # @overload percent_literal?
36
+ # Check for any string percent literal.
37
+ #
38
+ # @overload percent_literal?(type)
39
+ # Check for a string percent literal of type `type`.
40
+ #
41
+ # @param type [Symbol] an optional percent literal type
42
+ #
43
+ # @return [Boolean] whether the string is enclosed in percent brackets
44
+ def percent_literal?(type = nil)
45
+ opening_delimiter = loc.begin if loc.respond_to?(:begin)
46
+ return false unless opening_delimiter
47
+
48
+ if type
49
+ opening_delimiter.source.match?(PERCENT_LITERAL_TYPES.fetch(type))
50
+ else
51
+ opening_delimiter.source.start_with?('%')
52
+ end
53
+ end
18
54
  end
19
55
  end
20
56
  end
@@ -28,7 +28,7 @@ module RuboCop
28
28
  #
29
29
  # @return [Boolean] whether the `until` node has a `do` keyword
30
30
  def do?
31
- loc.begin&.is?('do')
31
+ loc_is?(:begin, 'do')
32
32
  end
33
33
  end
34
34
  end
@@ -33,7 +33,7 @@ module RuboCop
33
33
  #
34
34
  # @return [Boolean] whether the `when` node has a `then` keyword
35
35
  def then?
36
- loc.begin&.is?('then')
36
+ loc_is?(:begin, 'then')
37
37
  end
38
38
 
39
39
  # Returns the body of the `when` node.
@@ -28,7 +28,7 @@ module RuboCop
28
28
  #
29
29
  # @return [Boolean] whether the `until` node has a `do` keyword
30
30
  def do?
31
- loc.begin&.is?('do')
31
+ loc_is?(:begin, 'do')
32
32
  end
33
33
  end
34
34
  end
@@ -497,7 +497,7 @@ module RuboCop
497
497
  end
498
498
 
499
499
  def parenthesized_call?
500
- loc.respond_to?(:begin) && loc.begin&.is?('(')
500
+ loc_is?(:begin, '(')
501
501
  end
502
502
 
503
503
  def call_type?
@@ -529,11 +529,22 @@ module RuboCop
529
529
  end
530
530
 
531
531
  def guard_clause?
532
- node = and_type? || or_type? ? rhs : self
532
+ node = operator_keyword? ? rhs : self
533
533
 
534
534
  node.match_guard_clause?
535
535
  end
536
536
 
537
+ # Shortcut to safely test a particular location, even if
538
+ # this location does not exist or is `nil`
539
+ def loc_is?(which_loc, str)
540
+ return false unless loc.respond_to?(which_loc)
541
+
542
+ location = loc.public_send(which_loc)
543
+ return false unless location
544
+
545
+ location.is?(str)
546
+ end
547
+
537
548
  # @!method match_guard_clause?(node = self)
538
549
  def_node_matcher :match_guard_clause?, <<~PATTERN
539
550
  [${(send nil? {:raise :fail} ...) return break next} single_line?]
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  module Version
6
- STRING = '1.36.1'
6
+ STRING = '1.37.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-ast
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.36.1
4
+ version: 1.37.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-11-13 00:00:00.000000000 Z
13
+ date: 2024-12-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parser