rbi 0.0.11 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Rakefile +1 -1
- data/lib/rbi/formatter.rb +66 -0
- data/lib/rbi/loc.rb +15 -0
- data/lib/rbi/model.rb +5 -2
- data/lib/rbi/parser.rb +86 -9
- data/lib/rbi/printer.rb +6 -4
- data/lib/rbi/rewriters/group_nodes.rb +2 -0
- data/lib/rbi/version.rb +2 -2
- data/lib/rbi.rb +1 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 570f1035fa8bb56861eabd49590fbf2374f428c053f0fc189e27958feedf0c4b
|
4
|
+
data.tar.gz: 0dbb944e45b675851de18089c22a23c4c527f03dfca281426db8fb3cff94372e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45e5f53144cc46f1cd2c86b55c1d490ab5bd4b2d3bf5e593b3f6405e6b4583645c13130cdc6762f0e5eb18f5f74bfa1dfe990d108f6db21da394ba4d30a7b810
|
7
|
+
data.tar.gz: 603617b73fc3e4e862f897bf0b10b165efd4ac608c07b71e3ef43e1190e4d1fff2f26484a65d8f4d9e5965eafa99435d02bf668fef756abe5a24f1fa3e41f52b
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module RBI
|
5
|
+
class Formatter
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
sig { returns(T::Boolean) }
|
9
|
+
attr_accessor :add_sig_templates, :group_nodes, :nest_singleton_methods, :nest_non_public_methods, :sort_nodes
|
10
|
+
|
11
|
+
sig { returns(T.nilable(Integer)) }
|
12
|
+
attr_accessor :max_line_length
|
13
|
+
|
14
|
+
sig do
|
15
|
+
params(
|
16
|
+
add_sig_templates: T::Boolean,
|
17
|
+
group_nodes: T::Boolean,
|
18
|
+
max_line_length: T.nilable(Integer),
|
19
|
+
nest_singleton_methods: T::Boolean,
|
20
|
+
nest_non_public_methods: T::Boolean,
|
21
|
+
sort_nodes: T::Boolean
|
22
|
+
).void
|
23
|
+
end
|
24
|
+
def initialize(
|
25
|
+
add_sig_templates: false,
|
26
|
+
group_nodes: false,
|
27
|
+
max_line_length: nil,
|
28
|
+
nest_singleton_methods: false,
|
29
|
+
nest_non_public_methods: false,
|
30
|
+
sort_nodes: false
|
31
|
+
)
|
32
|
+
@add_sig_templates = add_sig_templates
|
33
|
+
@group_nodes = group_nodes
|
34
|
+
@max_line_length = max_line_length
|
35
|
+
@nest_singleton_methods = nest_singleton_methods
|
36
|
+
@nest_non_public_methods = nest_non_public_methods
|
37
|
+
@sort_nodes = sort_nodes
|
38
|
+
end
|
39
|
+
|
40
|
+
sig { params(file: RBI::File).returns(String) }
|
41
|
+
def print_file(file)
|
42
|
+
format_file(file)
|
43
|
+
file.string(max_line_length: @max_line_length)
|
44
|
+
end
|
45
|
+
|
46
|
+
sig { params(tree: RBI::Tree).returns(String) }
|
47
|
+
def print_tree(tree)
|
48
|
+
format_tree(tree)
|
49
|
+
tree.string(max_line_length: @max_line_length)
|
50
|
+
end
|
51
|
+
|
52
|
+
sig { params(file: RBI::File).void }
|
53
|
+
def format_file(file)
|
54
|
+
format_tree(file.root)
|
55
|
+
end
|
56
|
+
|
57
|
+
sig { params(tree: RBI::Tree).void }
|
58
|
+
def format_tree(tree)
|
59
|
+
tree.add_sig_templates! if @add_sig_templates
|
60
|
+
tree.nest_singleton_methods! if @nest_singleton_methods
|
61
|
+
tree.nest_non_public_methods! if @nest_non_public_methods
|
62
|
+
tree.group_nodes! if @group_nodes
|
63
|
+
tree.sort_nodes! if @sort_nodes
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
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/model.rb
CHANGED
@@ -1026,7 +1026,7 @@ module RBI
|
|
1026
1026
|
attr_accessor :return_type
|
1027
1027
|
|
1028
1028
|
sig { returns(T::Boolean) }
|
1029
|
-
attr_accessor :is_abstract, :is_override, :is_overridable
|
1029
|
+
attr_accessor :is_abstract, :is_override, :is_overridable, :is_final
|
1030
1030
|
|
1031
1031
|
sig { returns(T::Array[String]) }
|
1032
1032
|
attr_reader :type_params
|
@@ -1041,6 +1041,7 @@ module RBI
|
|
1041
1041
|
is_abstract: T::Boolean,
|
1042
1042
|
is_override: T::Boolean,
|
1043
1043
|
is_overridable: T::Boolean,
|
1044
|
+
is_final: T::Boolean,
|
1044
1045
|
type_params: T::Array[String],
|
1045
1046
|
checked: T.nilable(Symbol),
|
1046
1047
|
loc: T.nilable(Loc),
|
@@ -1053,6 +1054,7 @@ module RBI
|
|
1053
1054
|
is_abstract: false,
|
1054
1055
|
is_override: false,
|
1055
1056
|
is_overridable: false,
|
1057
|
+
is_final: false,
|
1056
1058
|
type_params: [],
|
1057
1059
|
checked: nil,
|
1058
1060
|
loc: nil,
|
@@ -1064,6 +1066,7 @@ module RBI
|
|
1064
1066
|
@is_abstract = is_abstract
|
1065
1067
|
@is_override = is_override
|
1066
1068
|
@is_overridable = is_overridable
|
1069
|
+
@is_final = is_final
|
1067
1070
|
@type_params = type_params
|
1068
1071
|
@checked = checked
|
1069
1072
|
block&.call(self)
|
@@ -1078,7 +1081,7 @@ module RBI
|
|
1078
1081
|
def ==(other)
|
1079
1082
|
return false unless other.is_a?(Sig)
|
1080
1083
|
params == other.params && return_type == other.return_type && is_abstract == other.is_abstract &&
|
1081
|
-
is_override == other.is_override && is_overridable == other.is_overridable &&
|
1084
|
+
is_override == other.is_override && is_overridable == other.is_overridable && is_final == other.is_final &&
|
1082
1085
|
type_params == other.type_params && checked == other.checked
|
1083
1086
|
end
|
1084
1087
|
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,6 +176,7 @@ 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])
|
131
181
|
|
132
182
|
separate_header_comments
|
@@ -141,6 +191,8 @@ module RBI
|
|
141
191
|
sig { override.params(node: T.nilable(Object)).void }
|
142
192
|
def visit(node)
|
143
193
|
return unless node.is_a?(AST::Node)
|
194
|
+
@last_node = node
|
195
|
+
|
144
196
|
case node.type
|
145
197
|
when :module, :class, :sclass
|
146
198
|
scope = parse_scope(node)
|
@@ -165,6 +217,8 @@ module RBI
|
|
165
217
|
else
|
166
218
|
visit_all(node.children)
|
167
219
|
end
|
220
|
+
|
221
|
+
@last_node = nil
|
168
222
|
end
|
169
223
|
|
170
224
|
private
|
@@ -289,7 +343,14 @@ module RBI
|
|
289
343
|
names = node.children[2..-1].map { |child| parse_name(child) }
|
290
344
|
MixesInClassMethods.new(*names, loc: loc, comments: comments)
|
291
345
|
when :public, :protected, :private
|
292
|
-
visibility =
|
346
|
+
visibility = case method_name
|
347
|
+
when :protected
|
348
|
+
Protected.new(loc: loc)
|
349
|
+
when :private
|
350
|
+
Private.new(loc: loc)
|
351
|
+
else
|
352
|
+
Public.new(loc: loc)
|
353
|
+
end
|
293
354
|
nested_node = node.children[2]
|
294
355
|
case nested_node&.type
|
295
356
|
when :def, :defs
|
@@ -422,7 +483,14 @@ module RBI
|
|
422
483
|
sig { params(node: AST::Node).returns(TEnumBlock) }
|
423
484
|
def parse_enum(node)
|
424
485
|
enum = TEnumBlock.new
|
425
|
-
|
486
|
+
|
487
|
+
body = if node.children[2].type == :begin
|
488
|
+
node.children[2].children
|
489
|
+
else
|
490
|
+
[node.children[2]]
|
491
|
+
end
|
492
|
+
|
493
|
+
body.each do |child|
|
426
494
|
enum << parse_name(child)
|
427
495
|
end
|
428
496
|
enum.loc = node_loc(node)
|
@@ -561,7 +629,7 @@ module RBI
|
|
561
629
|
sig { params(node: AST::Node).returns(Sig) }
|
562
630
|
def self.build(node)
|
563
631
|
v = SigBuilder.new
|
564
|
-
v.visit_all(node.children
|
632
|
+
v.visit_all(node.children)
|
565
633
|
v.current
|
566
634
|
end
|
567
635
|
|
@@ -588,6 +656,9 @@ module RBI
|
|
588
656
|
visit(node.children[0]) if node.children[0]
|
589
657
|
name = node.children[1]
|
590
658
|
case name
|
659
|
+
when :sig
|
660
|
+
arg = node.children[2]
|
661
|
+
@current.is_final = arg && arg.children[0] == :final
|
591
662
|
when :abstract
|
592
663
|
@current.is_abstract = true
|
593
664
|
when :override
|
@@ -595,19 +666,25 @@ module RBI
|
|
595
666
|
when :overridable
|
596
667
|
@current.is_overridable = true
|
597
668
|
when :checked
|
598
|
-
|
669
|
+
if node.children.length >= 3
|
670
|
+
@current.checked = node.children[2].children[0]
|
671
|
+
end
|
599
672
|
when :type_parameters
|
600
673
|
node.children[2..-1].each do |child|
|
601
674
|
@current.type_params << child.children[0].to_s
|
602
675
|
end
|
603
676
|
when :params
|
604
|
-
node.children
|
605
|
-
|
606
|
-
|
607
|
-
|
677
|
+
if node.children.length >= 3
|
678
|
+
node.children[2].children.each do |child|
|
679
|
+
name = child.children[0].children[0].to_s
|
680
|
+
type = parse_expr(child.children[1])
|
681
|
+
@current << SigParam.new(name, type)
|
682
|
+
end
|
608
683
|
end
|
609
684
|
when :returns
|
610
|
-
|
685
|
+
if node.children.length >= 3
|
686
|
+
@current.return_type = parse_expr(node.children[2])
|
687
|
+
end
|
611
688
|
when :void
|
612
689
|
@current.return_type = nil
|
613
690
|
else
|
data/lib/rbi/printer.rb
CHANGED
@@ -200,7 +200,7 @@ module RBI
|
|
200
200
|
end
|
201
201
|
|
202
202
|
lines.each do |line|
|
203
|
-
text = line.
|
203
|
+
text = line.rstrip
|
204
204
|
v.printt("#")
|
205
205
|
v.print(" #{text}") unless text.empty?
|
206
206
|
v.printn
|
@@ -455,7 +455,7 @@ module RBI
|
|
455
455
|
|
456
456
|
sig { returns(T::Array[String]) }
|
457
457
|
def comments_lines
|
458
|
-
comments.flat_map { |comment| comment.text.lines.map(&:
|
458
|
+
comments.flat_map { |comment| comment.text.lines.map(&:rstrip) }
|
459
459
|
end
|
460
460
|
end
|
461
461
|
|
@@ -670,7 +670,9 @@ module RBI
|
|
670
670
|
|
671
671
|
sig { params(v: Printer).void }
|
672
672
|
def print_as_line(v)
|
673
|
-
v.printt("sig
|
673
|
+
v.printt("sig")
|
674
|
+
v.print("(:final)") if is_final
|
675
|
+
v.print(" { ")
|
674
676
|
sig_modifiers.each do |modifier|
|
675
677
|
v.print("#{modifier}.")
|
676
678
|
end
|
@@ -758,7 +760,7 @@ module RBI
|
|
758
760
|
|
759
761
|
sig { returns(T::Array[String]) }
|
760
762
|
def comments_lines
|
761
|
-
comments.flat_map { |comment| comment.text.lines.map(&:
|
763
|
+
comments.flat_map { |comment| comment.text.lines.map(&:rstrip) }
|
762
764
|
end
|
763
765
|
end
|
764
766
|
|
data/lib/rbi/version.rb
CHANGED
data/lib/rbi.rb
CHANGED
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.
|
4
|
+
version: 0.0.14
|
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-
|
11
|
+
date: 2022-03-15 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:
|
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:
|
40
|
+
version: 2.6.4.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sorbet-runtime
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -77,6 +77,7 @@ files:
|
|
77
77
|
- README.md
|
78
78
|
- Rakefile
|
79
79
|
- lib/rbi.rb
|
80
|
+
- lib/rbi/formatter.rb
|
80
81
|
- lib/rbi/index.rb
|
81
82
|
- lib/rbi/loc.rb
|
82
83
|
- lib/rbi/model.rb
|