rbi 0.0.16 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/rbi/formatter.rb +15 -9
- data/lib/rbi/index.rb +19 -5
- data/lib/rbi/loc.rb +18 -3
- data/lib/rbi/model.rb +52 -42
- data/lib/rbi/parser.rb +632 -539
- data/lib/rbi/printer.rb +5 -3
- data/lib/rbi/rewriters/add_sig_templates.rb +2 -2
- data/lib/rbi/rewriters/annotate.rb +2 -1
- data/lib/rbi/rewriters/deannotate.rb +1 -0
- data/lib/rbi/rewriters/merge_trees.rb +23 -12
- data/lib/rbi/rewriters/nest_non_public_methods.rb +1 -0
- data/lib/rbi/rewriters/nest_singleton_methods.rb +1 -0
- data/lib/rbi/rewriters/remove_known_definitions.rb +16 -12
- data/lib/rbi/rewriters/sort_nodes.rb +21 -9
- data/lib/rbi/version.rb +1 -1
- data/lib/rbi.rb +0 -5
- metadata +7 -35
data/lib/rbi/printer.rb
CHANGED
@@ -22,7 +22,7 @@ module RBI
|
|
22
22
|
out: T.any(IO, StringIO),
|
23
23
|
indent: Integer,
|
24
24
|
print_locs: T::Boolean,
|
25
|
-
max_line_length: T.nilable(Integer)
|
25
|
+
max_line_length: T.nilable(Integer),
|
26
26
|
).void
|
27
27
|
end
|
28
28
|
def initialize(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
|
@@ -82,6 +82,7 @@ module RBI
|
|
82
82
|
sig { override.params(node: T.nilable(Node)).void }
|
83
83
|
def visit(node)
|
84
84
|
return unless node
|
85
|
+
|
85
86
|
node.accept_printer(self)
|
86
87
|
end
|
87
88
|
|
@@ -122,7 +123,7 @@ module RBI
|
|
122
123
|
out: T.any(IO, StringIO),
|
123
124
|
indent: Integer,
|
124
125
|
print_locs: T::Boolean,
|
125
|
-
max_line_length: T.nilable(Integer)
|
126
|
+
max_line_length: T.nilable(Integer),
|
126
127
|
).void
|
127
128
|
end
|
128
129
|
def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
|
@@ -149,7 +150,7 @@ module RBI
|
|
149
150
|
out: T.any(IO, StringIO),
|
150
151
|
indent: Integer,
|
151
152
|
print_locs: T::Boolean,
|
152
|
-
max_line_length: T.nilable(Integer)
|
153
|
+
max_line_length: T.nilable(Integer),
|
153
154
|
).void
|
154
155
|
end
|
155
156
|
def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
|
@@ -170,6 +171,7 @@ module RBI
|
|
170
171
|
return unless previous_node
|
171
172
|
return if previous_node.is_a?(BlankLine)
|
172
173
|
return if previous_node.oneline? && oneline?
|
174
|
+
|
173
175
|
v.printn
|
174
176
|
end
|
175
177
|
|
@@ -36,7 +36,7 @@ module RBI
|
|
36
36
|
|
37
37
|
attr.sigs << Sig.new(
|
38
38
|
params: params,
|
39
|
-
return_type: "T.untyped"
|
39
|
+
return_type: "T.untyped",
|
40
40
|
)
|
41
41
|
add_todo_comment(attr)
|
42
42
|
end
|
@@ -47,7 +47,7 @@ module RBI
|
|
47
47
|
|
48
48
|
method.sigs << Sig.new(
|
49
49
|
params: method.params.map { |param| SigParam.new(param.name, "T.untyped") },
|
50
|
-
return_type: "T.untyped"
|
50
|
+
return_type: "T.untyped",
|
51
51
|
)
|
52
52
|
add_todo_comment(method)
|
53
53
|
end
|
@@ -30,6 +30,7 @@ module RBI
|
|
30
30
|
sig { params(node: NodeWithComments).void }
|
31
31
|
def annotate_node(node)
|
32
32
|
return if node.annotations.one?(@annotation)
|
33
|
+
|
33
34
|
node.comments << Comment.new("@#{@annotation}")
|
34
35
|
end
|
35
36
|
|
@@ -49,7 +50,7 @@ module RBI
|
|
49
50
|
visitor = Rewriters::Annotate.new(
|
50
51
|
annotation,
|
51
52
|
annotate_scopes: annotate_scopes,
|
52
|
-
annotate_properties: annotate_properties
|
53
|
+
annotate_properties: annotate_properties,
|
53
54
|
)
|
54
55
|
visitor.visit(self)
|
55
56
|
end
|
@@ -47,16 +47,20 @@ module RBI
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
right.
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
class << self
|
51
|
+
extend T::Sig
|
52
|
+
|
53
|
+
sig { params(left: Tree, right: Tree, left_name: String, right_name: String, keep: Keep).returns(MergeTree) }
|
54
|
+
def merge_trees(left, right, left_name: "left", right_name: "right", keep: Keep::NONE)
|
55
|
+
left.nest_singleton_methods!
|
56
|
+
right.nest_singleton_methods!
|
57
|
+
rewriter = Rewriters::Merge.new(left_name: left_name, right_name: right_name, keep: keep)
|
58
|
+
rewriter.merge(left)
|
59
|
+
rewriter.merge(right)
|
60
|
+
tree = rewriter.tree
|
61
|
+
ConflictTreeMerger.new.visit(tree)
|
62
|
+
tree
|
63
|
+
end
|
60
64
|
end
|
61
65
|
|
62
66
|
sig { returns(MergeTree) }
|
@@ -293,6 +297,7 @@ module RBI
|
|
293
297
|
parent = T.let(parent_tree, T.nilable(Node))
|
294
298
|
while parent
|
295
299
|
return parent if parent.is_a?(ConflictTree)
|
300
|
+
|
296
301
|
parent = parent.parent_tree
|
297
302
|
end
|
298
303
|
nil
|
@@ -305,6 +310,7 @@ module RBI
|
|
305
310
|
sig { override.params(other: Node).void }
|
306
311
|
def merge_with(other)
|
307
312
|
return unless other.is_a?(NodeWithComments)
|
313
|
+
|
308
314
|
other.comments.each do |comment|
|
309
315
|
comments << comment unless comments.include?(comment)
|
310
316
|
end
|
@@ -332,7 +338,7 @@ module RBI
|
|
332
338
|
loc: T.nilable(Loc),
|
333
339
|
comments: T::Array[Comment],
|
334
340
|
conflicts: T::Array[Rewriters::Merge::Conflict],
|
335
|
-
block: T.nilable(T.proc.params(node: Tree).void)
|
341
|
+
block: T.nilable(T.proc.params(node: Tree).void),
|
336
342
|
).void
|
337
343
|
end
|
338
344
|
def initialize(loc: nil, comments: [], conflicts: [], &block)
|
@@ -406,12 +412,14 @@ module RBI
|
|
406
412
|
def compatible_with?(other)
|
407
413
|
return false unless other.is_a?(Attr)
|
408
414
|
return false unless names == other.names
|
415
|
+
|
409
416
|
sigs.empty? || other.sigs.empty? || sigs == other.sigs
|
410
417
|
end
|
411
418
|
|
412
419
|
sig { override.params(other: Node).void }
|
413
420
|
def merge_with(other)
|
414
421
|
return unless other.is_a?(Attr)
|
422
|
+
|
415
423
|
super
|
416
424
|
other.sigs.each do |sig|
|
417
425
|
sigs << sig unless sigs.include?(sig)
|
@@ -454,12 +462,14 @@ module RBI
|
|
454
462
|
return false unless other.is_a?(Method)
|
455
463
|
return false unless name == other.name
|
456
464
|
return false unless params == other.params
|
465
|
+
|
457
466
|
sigs.empty? || other.sigs.empty? || sigs == other.sigs
|
458
467
|
end
|
459
468
|
|
460
469
|
sig { override.params(other: Node).void }
|
461
470
|
def merge_with(other)
|
462
471
|
return unless other.is_a?(Method)
|
472
|
+
|
463
473
|
super
|
464
474
|
other.sigs.each do |sig|
|
465
475
|
sigs << sig unless sigs.include?(sig)
|
@@ -545,6 +555,7 @@ module RBI
|
|
545
555
|
sig { override.params(other: Node).void }
|
546
556
|
def merge_with(other)
|
547
557
|
return unless other.is_a?(TEnumBlock)
|
558
|
+
|
548
559
|
super
|
549
560
|
other.names.each do |name|
|
550
561
|
names << name unless names.include?(name)
|
@@ -625,7 +636,7 @@ module RBI
|
|
625
636
|
left: Scope,
|
626
637
|
right: Scope,
|
627
638
|
left_name: String,
|
628
|
-
right_name: String
|
639
|
+
right_name: String,
|
629
640
|
).void
|
630
641
|
end
|
631
642
|
def initialize(left:, right:, left_name: "left", right_name: "right")
|
@@ -48,18 +48,6 @@ module RBI
|
|
48
48
|
class RemoveKnownDefinitions < Visitor
|
49
49
|
extend T::Sig
|
50
50
|
|
51
|
-
sig do
|
52
|
-
params(
|
53
|
-
tree: Tree,
|
54
|
-
index: Index
|
55
|
-
).returns([Tree, T::Array[Operation]])
|
56
|
-
end
|
57
|
-
def self.remove(tree, index)
|
58
|
-
v = RemoveKnownDefinitions.new(index)
|
59
|
-
v.visit(tree)
|
60
|
-
[tree, v.operations]
|
61
|
-
end
|
62
|
-
|
63
51
|
sig { returns(T::Array[Operation]) }
|
64
52
|
attr_reader :operations
|
65
53
|
|
@@ -70,6 +58,22 @@ module RBI
|
|
70
58
|
@operations = T.let([], T::Array[Operation])
|
71
59
|
end
|
72
60
|
|
61
|
+
class << self
|
62
|
+
extend T::Sig
|
63
|
+
|
64
|
+
sig do
|
65
|
+
params(
|
66
|
+
tree: Tree,
|
67
|
+
index: Index,
|
68
|
+
).returns([Tree, T::Array[Operation]])
|
69
|
+
end
|
70
|
+
def remove(tree, index)
|
71
|
+
v = RemoveKnownDefinitions.new(index)
|
72
|
+
v.visit(tree)
|
73
|
+
[tree, v.operations]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
73
77
|
sig { params(nodes: T::Array[Node]).void }
|
74
78
|
def visit_all(nodes)
|
75
79
|
nodes.dup.each { |node| visit(node) }
|
@@ -11,20 +11,32 @@ module RBI
|
|
11
11
|
sort_node_names!(node) if node
|
12
12
|
|
13
13
|
return unless node.is_a?(Tree)
|
14
|
+
|
14
15
|
visit_all(node.nodes)
|
15
16
|
original_order = node.nodes.map.with_index.to_h
|
16
|
-
node.nodes.sort! do |a, b|
|
17
|
-
# First we try to compare the nodes by their node rank (based on the node type)
|
18
|
-
res = node_rank(a) <=> node_rank(b)
|
19
|
-
next res if res != 0 # we can sort the nodes by their rank, let's stop here
|
20
17
|
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
# The child nodes could contain private/protected markers. If so, they should not be moved in the file.
|
19
|
+
# Otherwise, some methods could see their privacy change. To avoid that problem, divide the array of child
|
20
|
+
# nodes into chunks based on whether any Visibility nodes appear, and sort the chunks independently. This
|
21
|
+
# applies the ordering rules from the node_rank method as much as possible, while preserving visibility.
|
22
|
+
sorted_nodes = node.nodes.chunk do |n|
|
23
|
+
n.is_a?(Visibility)
|
24
|
+
end.flat_map do |_, nodes|
|
25
|
+
nodes.sort! do |a, b|
|
26
|
+
# First we try to compare the nodes by their node rank (based on the node type)
|
27
|
+
res = node_rank(a) <=> node_rank(b)
|
28
|
+
next res if res != 0 # we can sort the nodes by their rank, let's stop here
|
29
|
+
|
30
|
+
# Then, if the nodes ranks are the same (res == 0), we try to compare the nodes by their name
|
31
|
+
res = node_name(a) <=> node_name(b)
|
32
|
+
next res if res && res != 0 # we can sort the nodes by their name, let's stop here
|
24
33
|
|
25
|
-
|
26
|
-
|
34
|
+
# Finally, if the two nodes have the same rank and the same name or at least one node is anonymous then,
|
35
|
+
T.must(original_order[a]) <=> T.must(original_order[b]) # we keep the original order
|
36
|
+
end
|
27
37
|
end
|
38
|
+
|
39
|
+
node.nodes.replace(sorted_nodes)
|
28
40
|
end
|
29
41
|
|
30
42
|
private
|
data/lib/rbi/version.rb
CHANGED
data/lib/rbi.rb
CHANGED
metadata
CHANGED
@@ -1,43 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre Terrasa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: ast
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: parser
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 2.6.4.0
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 2.6.4.0
|
41
13
|
- !ruby/object:Gem::Dependency
|
42
14
|
name: sorbet-runtime
|
43
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,19 +25,19 @@ dependencies:
|
|
53
25
|
- !ruby/object:Gem::Version
|
54
26
|
version: 0.5.9204
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
28
|
+
name: yarp
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
58
30
|
requirements:
|
59
31
|
- - ">="
|
60
32
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
33
|
+
version: 0.10.0
|
62
34
|
type: :runtime
|
63
35
|
prerelease: false
|
64
36
|
version_requirements: !ruby/object:Gem::Requirement
|
65
37
|
requirements:
|
66
38
|
- - ">="
|
67
39
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
40
|
+
version: 0.10.0
|
69
41
|
description:
|
70
42
|
email:
|
71
43
|
- ruby@shopify.com
|
@@ -107,14 +79,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
79
|
requirements:
|
108
80
|
- - ">="
|
109
81
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
82
|
+
version: 3.0.0
|
111
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
84
|
requirements:
|
113
85
|
- - ">="
|
114
86
|
- !ruby/object:Gem::Version
|
115
87
|
version: '0'
|
116
88
|
requirements: []
|
117
|
-
rubygems_version: 3.
|
89
|
+
rubygems_version: 3.4.19
|
118
90
|
signing_key:
|
119
91
|
specification_version: 4
|
120
92
|
summary: RBI generation framework
|