syntax_tree 6.0.1 → 6.0.2

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: b1e39c546fb96aea864e8190b8a8ff338543afd644d2334edad5b98663d418f2
4
- data.tar.gz: 7633b68e7b42fcd782fc1c89395d93679e72828fe1a9214e741ad00718543c6b
3
+ metadata.gz: 20b5dfab3c47b63217fc1b3a6f1fbbd56f51e8358e4b3514e6bf8fd9da083ed6
4
+ data.tar.gz: f4c18e39ae2b5cb14aae4de6d95494959d41ac78757b01da621b68d514c59bfb
5
5
  SHA512:
6
- metadata.gz: a0990a769cbc448e549d14542610ccfbf09536ada139cc10701871a506a1b160a8ce751712a94a8f003d3b2c1828a6b5d4bd5384efe63f0f82a21c0762b689d5
7
- data.tar.gz: a08b4057370c230bfd713ff9a717ea4f2a02be4f8610af51b18143ff9b2b9e542541b77c049488c500033751b50adc279d5e3a8beb0568f5e2bb165793c612d4
6
+ metadata.gz: 35bff4e2d47a2141e5014771cd30f268408e44ff59d247895dc52bee18f4ff7ebcd163e6ce464eb9908e2027ac7a86785cd5c5573baadfaadb3f690e3689526d
7
+ data.tar.gz: 82722a335946c31d43753a51efc954e8f28a4e39015dd01c3a983f7cdcd6f2dff9e90cb9046b00c2508ee6d9654e33f1760e40c9b1fd70fdf6343fa74855f8b1
data/CHANGELOG.md CHANGED
@@ -6,6 +6,18 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [6.0.2] - 2023-03-03
10
+
11
+ ### Added
12
+
13
+ - The `WithScope` visitor mixin will now additionally report local variables defined through regular expression named captures.
14
+ - The `WithScope` visitor mixin now properly handles destructured splat arguments in required positions.
15
+
16
+ ### Changed
17
+
18
+ - Fixed the AST output by adding blocks to `Command` and `CommandCall` nodes in the `FieldVisitor`.
19
+ - Fixed the location of lambda local variables (e.g., `->(; a) {}`).
20
+
9
21
  ## [6.0.1] - 2023-02-26
10
22
 
11
23
  ### Added
@@ -572,7 +584,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
572
584
 
573
585
  - 🎉 Initial release! 🎉
574
586
 
575
- [unreleased]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v6.0.1...HEAD
587
+ [unreleased]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v6.0.2...HEAD
588
+ [6.0.2]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v6.0.1...v6.0.2
576
589
  [6.0.1]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v6.0.0...v6.0.1
577
590
  [6.0.0]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v5.3.0...v6.0.0
578
591
  [5.3.0]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v5.2.0...v5.3.0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- syntax_tree (6.0.1)
4
+ syntax_tree (6.0.2)
5
5
  prettier_print (>= 1.2.0)
6
6
 
7
7
  GEM
@@ -19,7 +19,7 @@ GEM
19
19
  rake (13.0.6)
20
20
  regexp_parser (2.7.0)
21
21
  rexml (3.2.5)
22
- rubocop (1.46.0)
22
+ rubocop (1.47.0)
23
23
  json (~> 2.3)
24
24
  parallel (~> 1.10)
25
25
  parser (>= 3.2.0.0)
@@ -29,9 +29,9 @@ GEM
29
29
  rubocop-ast (>= 1.26.0, < 2.0)
30
30
  ruby-progressbar (~> 1.7)
31
31
  unicode-display_width (>= 2.4.0, < 3.0)
32
- rubocop-ast (1.26.0)
32
+ rubocop-ast (1.27.0)
33
33
  parser (>= 3.2.1.0)
34
- ruby-progressbar (1.11.0)
34
+ ruby-progressbar (1.12.0)
35
35
  simplecov (0.22.0)
36
36
  docile (~> 1.1)
37
37
  simplecov-html (~> 0.11)
@@ -263,6 +263,7 @@ module SyntaxTree
263
263
  node(node, "command") do
264
264
  field("message", node.message)
265
265
  field("arguments", node.arguments)
266
+ field("block", node.block) if node.block
266
267
  comments(node)
267
268
  end
268
269
  end
@@ -273,6 +274,7 @@ module SyntaxTree
273
274
  field("operator", node.operator)
274
275
  field("message", node.message)
275
276
  field("arguments", node.arguments) if node.arguments
277
+ field("block", node.block) if node.block
276
278
  comments(node)
277
279
  end
278
280
  end
@@ -2391,8 +2391,14 @@ module SyntaxTree
2391
2391
  }
2392
2392
  }
2393
2393
 
2394
+ parent_line = lineno - 1
2395
+ parent_column =
2396
+ consume_token(Semicolon).location.start_column - tokens[index][0][1]
2397
+
2394
2398
  tokens[(index + 1)..].each_with_object([]) do |token, locals|
2395
2399
  (lineno, column), type, value, = token
2400
+ column += parent_column if lineno == 1
2401
+ lineno += parent_line
2396
2402
 
2397
2403
  # Make the state transition for the parser. If there isn't a transition
2398
2404
  # from the current state to a new state for this type, then we're in a
@@ -176,7 +176,8 @@ module SyntaxTree
176
176
  program =
177
177
  SyntaxTree.parse(SyntaxTree.read(File.expand_path("node.rb", __dir__)))
178
178
 
179
- main_statements = program.statements.body.last.bodystmt.statements.body
179
+ program_statements = program.statements
180
+ main_statements = program_statements.body.last.bodystmt.statements.body
180
181
  main_statements.each_with_index do |main_statement, main_statement_index|
181
182
  # Ensure we are only looking at class declarations.
182
183
  next unless main_statement.is_a?(SyntaxTree::ClassDeclaration)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SyntaxTree
4
- VERSION = "6.0.1"
4
+ VERSION = "6.0.2"
5
5
  end
@@ -189,6 +189,15 @@ module SyntaxTree
189
189
  super
190
190
  end
191
191
 
192
+ def visit_block_var(node)
193
+ node.locals.each do |local|
194
+ current_scope.add_local_definition(local, :variable)
195
+ end
196
+
197
+ super
198
+ end
199
+ alias visit_lambda_var visit_block_var
200
+
192
201
  # Visit for keeping track of local variable definitions
193
202
  def visit_var_field(node)
194
203
  value = node.value
@@ -217,11 +226,72 @@ module SyntaxTree
217
226
  super
218
227
  end
219
228
 
229
+ # When using regex named capture groups, vcalls might actually be a variable
230
+ def visit_vcall(node)
231
+ value = node.value
232
+ definition = current_scope.find_local(value.value)
233
+ current_scope.add_local_usage(value, definition.type) if definition
234
+
235
+ super
236
+ end
237
+
238
+ # Visit for capturing local variables defined in regex named capture groups
239
+ def visit_binary(node)
240
+ if node.operator == :=~
241
+ left = node.left
242
+
243
+ if left.is_a?(RegexpLiteral) && left.parts.length == 1 &&
244
+ left.parts.first.is_a?(TStringContent)
245
+ content = left.parts.first
246
+
247
+ value = content.value
248
+ location = content.location
249
+ start_line = location.start_line
250
+
251
+ Regexp
252
+ .new(value, Regexp::FIXEDENCODING)
253
+ .names
254
+ .each do |name|
255
+ offset = value.index(/\(\?<#{Regexp.escape(name)}>/)
256
+ line = start_line + value[0...offset].count("\n")
257
+
258
+ # We need to add 3 to account for these three characters
259
+ # prefixing a named capture (?<
260
+ column = location.start_column + offset + 3
261
+ if value[0...offset].include?("\n")
262
+ column =
263
+ value[0...offset].length - value[0...offset].rindex("\n") +
264
+ 3 - 1
265
+ end
266
+
267
+ ident_location =
268
+ Location.new(
269
+ start_line: line,
270
+ start_char: location.start_char + offset,
271
+ start_column: column,
272
+ end_line: line,
273
+ end_char: location.start_char + offset + name.length,
274
+ end_column: column + name.length
275
+ )
276
+
277
+ identifier = Ident.new(value: name, location: ident_location)
278
+ current_scope.add_local_definition(identifier, :variable)
279
+ end
280
+ end
281
+ end
282
+
283
+ super
284
+ end
285
+
220
286
  private
221
287
 
222
288
  def add_argument_definitions(list)
223
289
  list.each do |param|
224
- if param.is_a?(SyntaxTree::MLHSParen)
290
+ case param
291
+ when ArgStar
292
+ value = param.value
293
+ current_scope.add_local_definition(value, :argument) if value
294
+ when MLHSParen
225
295
  add_argument_definitions(param.contents.parts)
226
296
  else
227
297
  current_scope.add_local_definition(param, :argument)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syntax_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.1
4
+ version: 6.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Newton
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-26 00:00:00.000000000 Z
11
+ date: 2023-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prettier_print