rbi 0.0.12 → 0.0.15

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: ff552cac7ef282e9673502662c239c6e60e370d4d9e6d137db16ed03bd3c5a32
4
- data.tar.gz: 6ca736d5854621dde27bafffd8ad4b393d2c60d5f7b9e4eba8ab938e7f9123f4
3
+ metadata.gz: a98dd77d2fde6771b24b8ab87d585b94b944beea38a2d60a2ba38f7738deb67b
4
+ data.tar.gz: 56eb299a37b8755b57ebd72ffc4dcf6179a739e4146f6903c3d63450a586307b
5
5
  SHA512:
6
- metadata.gz: 9540175cf17bd99421f4c0e2d81dae2a6b79a0ba3528409c1aeb0fbc4923eb01b2b9a5d6d28a17c1b7d0ac4a4b06f10775ecabc460f54ad39fa5099256554730
7
- data.tar.gz: 75a8657c94d508c5b53793be7b53fe6570850c6088cd67fc75c85b5d42555824b248d6f2c7a62527e8e50555276eb4e32ba33bb406c948d66a1f0a11f7f16014
6
+ metadata.gz: 7e2a8e48b3210f41a3b38bf2844d895a0d232c8296b7122ecb64705ec9b77d56dd88ca0e1dd3b2fa15755ce90e63ee3ef17ccbc1174b3034b4d825bb4444c357
7
+ data.tar.gz: df19f77e6e4dd24e9309b03d4a1cd3008386bc3a48fe6998782008459fac78f9f97c52f603db2f65b1c68d42c3fe49f1145a7d40fcc845473c667ec4287127af
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  source "https://rubygems.org"
@@ -14,5 +14,5 @@ group(:development, :test) do
14
14
  gem("rubocop-shopify", require: false)
15
15
  gem("rubocop-sorbet", require: false)
16
16
  gem("sorbet", ">= 0.5.9204", require: false)
17
- gem("tapioca", "0.5.2", require: false)
17
+ gem("tapioca", require: false)
18
18
  end
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "bundler/gem_tasks"
data/lib/rbi/loc.rb CHANGED
@@ -32,5 +32,20 @@ module RBI
32
32
  def to_s
33
33
  "#{file}:#{begin_line}:#{begin_column}-#{end_line}:#{end_column}"
34
34
  end
35
+
36
+ sig { returns(T.nilable(String)) }
37
+ def source
38
+ file = self.file
39
+ return nil unless file
40
+ return nil unless ::File.file?(file)
41
+
42
+ return ::File.read(file) unless begin_line && end_line
43
+
44
+ string = String.new
45
+ ::File.foreach(file).with_index do |line, line_number|
46
+ string << line if line_number + 1 >= begin_line && line_number + 1 <= end_line
47
+ end
48
+ string
49
+ end
35
50
  end
36
51
  end
data/lib/rbi/parser.rb CHANGED
@@ -17,6 +17,39 @@ module RBI
17
17
  end
18
18
  end
19
19
 
20
+ class UnexpectedParserError < StandardError
21
+ extend T::Sig
22
+
23
+ sig { returns(Loc) }
24
+ attr_reader :last_location
25
+
26
+ sig { params(parent_exception: Exception, last_location: Loc).void }
27
+ def initialize(parent_exception, last_location)
28
+ super(parent_exception)
29
+ set_backtrace(parent_exception.backtrace)
30
+ @last_location = last_location
31
+ end
32
+
33
+ sig { params(io: T.any(IO, StringIO)).void }
34
+ def print_debug(io: $stderr)
35
+ io.puts ""
36
+ io.puts "##################################"
37
+ io.puts "### RBI::Parser internal error ###"
38
+ io.puts "##################################"
39
+ io.puts ""
40
+ io.puts "There was an internal parser error while processing this source."
41
+ io.puts ""
42
+ io.puts "Error: #{message} while parsing #{last_location}:"
43
+ io.puts ""
44
+ io.puts last_location.source || "<no source>"
45
+ io.puts ""
46
+ io.puts "Please open an issue at https://github.com/Shopify/rbi/issues/new."
47
+ io.puts ""
48
+ io.puts "##################################"
49
+ io.puts ""
50
+ end
51
+ end
52
+
20
53
  class Parser
21
54
  extend T::Sig
22
55
 
@@ -77,6 +110,19 @@ module RBI
77
110
  builder.tree
78
111
  rescue ::Parser::SyntaxError => e
79
112
  raise ParseError.new(e.message, Loc.from_ast_loc(file, e.diagnostic.location))
113
+ rescue ParseError => e
114
+ raise e
115
+ rescue => e
116
+ last_node = builder&.last_node
117
+ last_location = if last_node
118
+ Loc.from_ast_loc(file, last_node.location)
119
+ else
120
+ Loc.new(file: file)
121
+ end
122
+
123
+ exception = UnexpectedParserError.new(e, last_location)
124
+ exception.print_debug
125
+ raise exception
80
126
  end
81
127
  end
82
128
 
@@ -113,6 +159,9 @@ module RBI
113
159
  sig { returns(Tree) }
114
160
  attr_reader :tree
115
161
 
162
+ sig { returns(T.nilable(::AST::Node)) }
163
+ attr_reader :last_node
164
+
116
165
  sig do
117
166
  params(
118
167
  file: String,
@@ -127,7 +176,9 @@ module RBI
127
176
  @nodes_comments_assoc = nodes_comments_assoc
128
177
  @tree = T.let(Tree.new, Tree)
129
178
  @scopes_stack = T.let([@tree], T::Array[Tree])
179
+ @last_node = T.let(nil, T.nilable(::AST::Node))
130
180
  @last_sigs = T.let([], T::Array[RBI::Sig])
181
+ @last_sigs_comments = T.let([], T::Array[Comment])
131
182
 
132
183
  separate_header_comments
133
184
  end
@@ -141,6 +192,8 @@ module RBI
141
192
  sig { override.params(node: T.nilable(Object)).void }
142
193
  def visit(node)
143
194
  return unless node.is_a?(AST::Node)
195
+ @last_node = node
196
+
144
197
  case node.type
145
198
  when :module, :class, :sclass
146
199
  scope = parse_scope(node)
@@ -156,15 +209,18 @@ module RBI
156
209
  node = parse_send(node)
157
210
  current_scope << node if node
158
211
  when :block
159
- node = parse_block(node)
160
- if node.is_a?(Sig)
161
- @last_sigs << node
162
- elsif node
163
- current_scope << node
212
+ rbi_node = parse_block(node)
213
+ if rbi_node.is_a?(Sig)
214
+ @last_sigs << rbi_node
215
+ @last_sigs_comments.concat(node_comments(node))
216
+ elsif rbi_node
217
+ current_scope << rbi_node
164
218
  end
165
219
  else
166
220
  visit_all(node.children)
167
221
  end
222
+
223
+ @last_node = nil
168
224
  end
169
225
 
170
226
  private
@@ -214,7 +270,7 @@ module RBI
214
270
  params: node.children[1].children.map { |child| parse_param(child) },
215
271
  sigs: current_sigs,
216
272
  loc: loc,
217
- comments: node_comments(node)
273
+ comments: current_sigs_comments + node_comments(node)
218
274
  )
219
275
  when :defs
220
276
  Method.new(
@@ -223,7 +279,7 @@ module RBI
223
279
  is_singleton: true,
224
280
  sigs: current_sigs,
225
281
  loc: loc,
226
- comments: node_comments(node)
282
+ comments: current_sigs_comments + node_comments(node)
227
283
  )
228
284
  else
229
285
  raise ParseError.new("Unsupported def node type `#{node.type}`", loc)
@@ -270,13 +326,13 @@ module RBI
270
326
  case method_name
271
327
  when :attr_reader
272
328
  symbols = node.children[2..-1].map { |child| child.children[0] }
273
- AttrReader.new(*symbols, sigs: current_sigs, loc: loc, comments: comments)
329
+ AttrReader.new(*symbols, sigs: current_sigs, loc: loc, comments: current_sigs_comments + comments)
274
330
  when :attr_writer
275
331
  symbols = node.children[2..-1].map { |child| child.children[0] }
276
- AttrWriter.new(*symbols, sigs: current_sigs, loc: loc, comments: comments)
332
+ AttrWriter.new(*symbols, sigs: current_sigs, loc: loc, comments: current_sigs_comments + comments)
277
333
  when :attr_accessor
278
334
  symbols = node.children[2..-1].map { |child| child.children[0] }
279
- AttrAccessor.new(*symbols, sigs: current_sigs, loc: loc, comments: comments)
335
+ AttrAccessor.new(*symbols, sigs: current_sigs, loc: loc, comments: current_sigs_comments + comments)
280
336
  when :include
281
337
  names = node.children[2..-1].map { |child| parse_expr(child) }
282
338
  Include.new(*names, loc: loc, comments: comments)
@@ -429,7 +485,14 @@ module RBI
429
485
  sig { params(node: AST::Node).returns(TEnumBlock) }
430
486
  def parse_enum(node)
431
487
  enum = TEnumBlock.new
432
- node.children[2].children.each do |child|
488
+
489
+ body = if node.children[2].type == :begin
490
+ node.children[2].children
491
+ else
492
+ [node.children[2]]
493
+ end
494
+
495
+ body.each do |child|
433
496
  enum << parse_name(child)
434
497
  end
435
498
  enum.loc = node_loc(node)
@@ -472,6 +535,13 @@ module RBI
472
535
  sigs
473
536
  end
474
537
 
538
+ sig { returns(T::Array[Comment]) }
539
+ def current_sigs_comments
540
+ comments = @last_sigs_comments.dup
541
+ @last_sigs_comments.clear
542
+ comments
543
+ end
544
+
475
545
  sig { void }
476
546
  def assoc_dangling_comments
477
547
  last_line = T.let(nil, T.nilable(Integer))
@@ -605,19 +675,25 @@ module RBI
605
675
  when :overridable
606
676
  @current.is_overridable = true
607
677
  when :checked
608
- @current.checked = node.children[2].children[0]
678
+ if node.children.length >= 3
679
+ @current.checked = node.children[2].children[0]
680
+ end
609
681
  when :type_parameters
610
682
  node.children[2..-1].each do |child|
611
683
  @current.type_params << child.children[0].to_s
612
684
  end
613
685
  when :params
614
- node.children[2].children.each do |child|
615
- name = child.children[0].children[0].to_s
616
- type = parse_expr(child.children[1])
617
- @current << SigParam.new(name, type)
686
+ if node.children.length >= 3
687
+ node.children[2].children.each do |child|
688
+ name = child.children[0].children[0].to_s
689
+ type = parse_expr(child.children[1])
690
+ @current << SigParam.new(name, type)
691
+ end
618
692
  end
619
693
  when :returns
620
- @current.return_type = parse_expr(node.children[2])
694
+ if node.children.length >= 3
695
+ @current.return_type = parse_expr(node.children[2])
696
+ end
621
697
  when :void
622
698
  @current.return_type = nil
623
699
  else
data/lib/rbi/version.rb CHANGED
@@ -1,6 +1,6 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RBI
5
- VERSION = "0.0.12"
5
+ VERSION = "0.0.15"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandre Terrasa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-08 00:00:00.000000000 Z
11
+ date: 2022-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ast
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 2.6.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 2.6.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sorbet-runtime
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -107,14 +107,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 2.4.0
110
+ version: 2.7.0
111
111
  required_rubygems_version: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - ">="
114
114
  - !ruby/object:Gem::Version
115
115
  version: '0'
116
116
  requirements: []
117
- rubygems_version: 3.2.20
117
+ rubygems_version: 3.3.3
118
118
  signing_key:
119
119
  specification_version: 4
120
120
  summary: RBI generation framework