rbi 0.0.6 → 0.0.7
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/lib/rbi/model.rb +16 -3
- data/lib/rbi/parser.rb +1 -1
- data/lib/rbi/printer.rb +19 -19
- data/lib/rbi/rewriters/annotate.rb +57 -0
- data/lib/rbi/rewriters/deannotate.rb +45 -0
- data/lib/rbi/rewriters/merge_trees.rb +30 -8
- data/lib/rbi/version.rb +1 -1
- data/lib/rbi.rb +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97c295f819a7f55175bf02dc1722a7a6ad29c82f92c7f9be2636a47652d0b39f
|
4
|
+
data.tar.gz: f0ab6cb29d0e2a1a0ef78452543258761664d081845b042c0f5f1fc2f74f9773
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb97cd66fd4231f3609efede4b98f8590cf7fff1382b4dbae1997161a8b2aed5ed10e6bc388d8388a16dc71792ba5b5ec32561b37f353cc8b77cbfb778542a60
|
7
|
+
data.tar.gz: a44902b6c3a669c0d706952459b2ebdbe78bbfdcf75ed50b0d16274f9fafa2cba20adb7ce0b70bf2011765edcfe9ea4cf823bb973618e4babd091fdc5e3fafd8
|
data/Gemfile
CHANGED
@@ -13,5 +13,5 @@ group(:development, :test) do
|
|
13
13
|
gem("rubocop-shopify", require: false)
|
14
14
|
gem("rubocop-sorbet", require: false)
|
15
15
|
gem("sorbet", ">= 0.5.9204", require: false)
|
16
|
-
gem("tapioca",
|
16
|
+
gem("tapioca", "0.5.2", require: false)
|
17
17
|
end
|
data/lib/rbi/model.rb
CHANGED
@@ -66,7 +66,8 @@ module RBI
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
|
69
|
+
# An arbitrary blank line that can be added both in trees and comments
|
70
|
+
class BlankLine < Comment
|
70
71
|
extend T::Sig
|
71
72
|
|
72
73
|
sig { params(loc: T.nilable(Loc)).void }
|
@@ -89,6 +90,13 @@ module RBI
|
|
89
90
|
super(loc: loc)
|
90
91
|
@comments = comments
|
91
92
|
end
|
93
|
+
|
94
|
+
sig { returns(T::Array[String]) }
|
95
|
+
def annotations
|
96
|
+
comments
|
97
|
+
.select { |comment| comment.text.start_with?("@") }
|
98
|
+
.map { |comment| T.must(comment.text[1..]) }
|
99
|
+
end
|
92
100
|
end
|
93
101
|
|
94
102
|
class Tree < NodeWithComments
|
@@ -126,10 +134,10 @@ module RBI
|
|
126
134
|
extend T::Sig
|
127
135
|
|
128
136
|
sig { returns(Tree) }
|
129
|
-
|
137
|
+
attr_accessor :root
|
130
138
|
|
131
139
|
sig { returns(T.nilable(String)) }
|
132
|
-
|
140
|
+
attr_accessor :strictness
|
133
141
|
|
134
142
|
sig { returns(T::Array[Comment]) }
|
135
143
|
attr_accessor :comments
|
@@ -152,6 +160,11 @@ module RBI
|
|
152
160
|
def <<(node)
|
153
161
|
@root << node
|
154
162
|
end
|
163
|
+
|
164
|
+
sig { returns(T::Boolean) }
|
165
|
+
def empty?
|
166
|
+
@root.empty?
|
167
|
+
end
|
155
168
|
end
|
156
169
|
|
157
170
|
# Scopes
|
data/lib/rbi/parser.rb
CHANGED
@@ -178,7 +178,7 @@ module RBI
|
|
178
178
|
|
179
179
|
if last_line && comment_line > last_line + 1
|
180
180
|
# Preserve empty lines in file headers
|
181
|
-
tree.comments <<
|
181
|
+
tree.comments << BlankLine.new(loc: loc)
|
182
182
|
end
|
183
183
|
|
184
184
|
tree.comments << Comment.new(text, loc: loc)
|
data/lib/rbi/printer.rb
CHANGED
@@ -136,6 +136,15 @@ module RBI
|
|
136
136
|
out.string
|
137
137
|
end
|
138
138
|
|
139
|
+
sig { params(v: Printer).void }
|
140
|
+
def print_blank_line_before(v)
|
141
|
+
previous_node = v.previous_node
|
142
|
+
return unless previous_node
|
143
|
+
return if previous_node.is_a?(BlankLine)
|
144
|
+
return if previous_node.oneline? && oneline?
|
145
|
+
v.printn
|
146
|
+
end
|
147
|
+
|
139
148
|
sig { returns(T::Boolean) }
|
140
149
|
def oneline?
|
141
150
|
true
|
@@ -171,7 +180,7 @@ module RBI
|
|
171
180
|
end
|
172
181
|
end
|
173
182
|
|
174
|
-
class
|
183
|
+
class BlankLine
|
175
184
|
extend T::Sig
|
176
185
|
|
177
186
|
sig { override.params(v: Printer).void }
|
@@ -201,8 +210,7 @@ module RBI
|
|
201
210
|
|
202
211
|
sig { override.params(v: Printer).void }
|
203
212
|
def accept_printer(v)
|
204
|
-
|
205
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
213
|
+
print_blank_line_before(v)
|
206
214
|
|
207
215
|
v.printl("# #{loc}") if loc && v.print_locs
|
208
216
|
v.visit_all(comments)
|
@@ -295,8 +303,7 @@ module RBI
|
|
295
303
|
|
296
304
|
sig { override.params(v: Printer).void }
|
297
305
|
def accept_printer(v)
|
298
|
-
|
299
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
306
|
+
print_blank_line_before(v)
|
300
307
|
|
301
308
|
v.printl("# #{loc}") if loc && v.print_locs
|
302
309
|
v.visit_all(comments)
|
@@ -309,8 +316,7 @@ module RBI
|
|
309
316
|
|
310
317
|
sig { override.params(v: Printer).void }
|
311
318
|
def accept_printer(v)
|
312
|
-
|
313
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
319
|
+
print_blank_line_before(v)
|
314
320
|
|
315
321
|
v.visit_all(comments)
|
316
322
|
sigs.each { |sig| v.visit(sig) }
|
@@ -346,8 +352,7 @@ module RBI
|
|
346
352
|
|
347
353
|
sig { override.params(v: Printer).void }
|
348
354
|
def accept_printer(v)
|
349
|
-
|
350
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
355
|
+
print_blank_line_before(v)
|
351
356
|
|
352
357
|
v.visit_all(comments)
|
353
358
|
v.visit_all(sigs)
|
@@ -521,8 +526,7 @@ module RBI
|
|
521
526
|
|
522
527
|
sig { override.params(v: Printer).void }
|
523
528
|
def accept_printer(v)
|
524
|
-
|
525
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
529
|
+
print_blank_line_before(v)
|
526
530
|
|
527
531
|
v.printl("# #{loc}") if loc && v.print_locs
|
528
532
|
v.visit_all(comments)
|
@@ -543,8 +547,7 @@ module RBI
|
|
543
547
|
|
544
548
|
sig { override.params(v: Printer).void }
|
545
549
|
def accept_printer(v)
|
546
|
-
|
547
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
550
|
+
print_blank_line_before(v)
|
548
551
|
|
549
552
|
v.printl("# #{loc}") if loc && v.print_locs
|
550
553
|
v.visit_all(comments)
|
@@ -659,8 +662,7 @@ module RBI
|
|
659
662
|
|
660
663
|
sig { override.params(v: Printer).void }
|
661
664
|
def accept_printer(v)
|
662
|
-
|
663
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
665
|
+
print_blank_line_before(v)
|
664
666
|
|
665
667
|
v.printl("# #{loc}") if loc && v.print_locs
|
666
668
|
v.visit_all(comments)
|
@@ -699,8 +701,7 @@ module RBI
|
|
699
701
|
|
700
702
|
sig { override.params(v: Printer).void }
|
701
703
|
def accept_printer(v)
|
702
|
-
|
703
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
704
|
+
print_blank_line_before(v)
|
704
705
|
|
705
706
|
v.printl("# #{loc}") if loc && v.print_locs
|
706
707
|
v.visit_all(comments)
|
@@ -713,8 +714,7 @@ module RBI
|
|
713
714
|
|
714
715
|
sig { override.params(v: Printer).void }
|
715
716
|
def accept_printer(v)
|
716
|
-
|
717
|
-
v.printn if previous_node && (!previous_node.oneline? || !oneline?)
|
717
|
+
print_blank_line_before(v)
|
718
718
|
|
719
719
|
v.printl("# #{loc}") if loc && v.print_locs
|
720
720
|
v.visit_all(comments)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module RBI
|
5
|
+
module Rewriters
|
6
|
+
class Annotate < Visitor
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig { params(annotation: String, annotate_scopes: T::Boolean, annotate_properties: T::Boolean).void }
|
10
|
+
def initialize(annotation, annotate_scopes: false, annotate_properties: false)
|
11
|
+
super()
|
12
|
+
@annotation = annotation
|
13
|
+
@annotate_scopes = annotate_scopes
|
14
|
+
@annotate_properties = annotate_properties
|
15
|
+
end
|
16
|
+
|
17
|
+
sig { override.params(node: T.nilable(Node)).void }
|
18
|
+
def visit(node)
|
19
|
+
case node
|
20
|
+
when Scope
|
21
|
+
annotate_node(node) if @annotate_scopes || root?(node)
|
22
|
+
when Const, Attr, Method, TStructField, TypeMember
|
23
|
+
annotate_node(node) if @annotate_properties
|
24
|
+
end
|
25
|
+
visit_all(node.nodes) if node.is_a?(Tree)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
sig { params(node: NodeWithComments).void }
|
31
|
+
def annotate_node(node)
|
32
|
+
return if node.annotations.one?(@annotation)
|
33
|
+
node.comments << Comment.new("@#{@annotation}")
|
34
|
+
end
|
35
|
+
|
36
|
+
sig { params(node: Node).returns(T::Boolean) }
|
37
|
+
def root?(node)
|
38
|
+
parent = node.parent_tree
|
39
|
+
parent.is_a?(Tree) && parent.parent_tree.nil?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Tree
|
45
|
+
extend T::Sig
|
46
|
+
|
47
|
+
sig { params(annotation: String, annotate_scopes: T::Boolean, annotate_properties: T::Boolean).void }
|
48
|
+
def annotate!(annotation, annotate_scopes: false, annotate_properties: false)
|
49
|
+
visitor = Rewriters::Annotate.new(
|
50
|
+
annotation,
|
51
|
+
annotate_scopes: annotate_scopes,
|
52
|
+
annotate_properties: annotate_properties
|
53
|
+
)
|
54
|
+
visitor.visit(self)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module RBI
|
5
|
+
module Rewriters
|
6
|
+
class Deannotate < Visitor
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig { params(annotation: String).void }
|
10
|
+
def initialize(annotation)
|
11
|
+
super()
|
12
|
+
@annotation = annotation
|
13
|
+
end
|
14
|
+
|
15
|
+
sig { override.params(node: T.nilable(Node)).void }
|
16
|
+
def visit(node)
|
17
|
+
case node
|
18
|
+
when Scope, Const, Attr, Method, TStructField, TypeMember
|
19
|
+
deannotate_node(node)
|
20
|
+
end
|
21
|
+
visit_all(node.nodes) if node.is_a?(Tree)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
sig { params(node: NodeWithComments).void }
|
27
|
+
def deannotate_node(node)
|
28
|
+
return unless node.annotations.one?(@annotation)
|
29
|
+
node.comments.reject! do |comment|
|
30
|
+
comment.text == "@#{@annotation}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Tree
|
37
|
+
extend T::Sig
|
38
|
+
|
39
|
+
sig { params(annotation: String).void }
|
40
|
+
def deannotate!(annotation)
|
41
|
+
visitor = Rewriters::Deannotate.new(annotation)
|
42
|
+
visitor.visit(self)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -47,7 +47,7 @@ module RBI
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
sig { params(left: Tree, right: Tree, left_name: String, right_name: String, keep: Keep).returns(
|
50
|
+
sig { params(left: Tree, right: Tree, left_name: String, right_name: String, keep: Keep).returns(MergeTree) }
|
51
51
|
def self.merge_trees(left, right, left_name: "left", right_name: "right", keep: Keep::NONE)
|
52
52
|
left.nest_singleton_methods!
|
53
53
|
right.nest_singleton_methods!
|
@@ -59,7 +59,7 @@ module RBI
|
|
59
59
|
tree
|
60
60
|
end
|
61
61
|
|
62
|
-
sig { returns(
|
62
|
+
sig { returns(MergeTree) }
|
63
63
|
attr_reader :tree
|
64
64
|
|
65
65
|
sig { params(left_name: String, right_name: String, keep: Keep).void }
|
@@ -67,15 +67,15 @@ module RBI
|
|
67
67
|
@left_name = left_name
|
68
68
|
@right_name = right_name
|
69
69
|
@keep = keep
|
70
|
-
@tree = T.let(
|
70
|
+
@tree = T.let(MergeTree.new, MergeTree)
|
71
71
|
@scope_stack = T.let([@tree], T::Array[Tree])
|
72
72
|
end
|
73
73
|
|
74
|
-
sig { params(tree: Tree).
|
74
|
+
sig { params(tree: Tree).void }
|
75
75
|
def merge(tree)
|
76
76
|
v = TreeMerger.new(@tree, left_name: @left_name, right_name: @right_name, keep: @keep)
|
77
77
|
v.visit(tree)
|
78
|
-
v.conflicts
|
78
|
+
@tree.conflicts.concat(v.conflicts)
|
79
79
|
end
|
80
80
|
|
81
81
|
# Used for logging / error displaying purpose
|
@@ -314,9 +314,31 @@ module RBI
|
|
314
314
|
class Tree
|
315
315
|
extend T::Sig
|
316
316
|
|
317
|
-
sig { params(other: Tree).returns(
|
318
|
-
def merge(other)
|
319
|
-
Rewriters::Merge.merge_trees(self, other)
|
317
|
+
sig { params(other: Tree, left_name: String, right_name: String, keep: Rewriters::Merge::Keep).returns(MergeTree) }
|
318
|
+
def merge(other, left_name: "left", right_name: "right", keep: Rewriters::Merge::Keep::NONE)
|
319
|
+
Rewriters::Merge.merge_trees(self, other, left_name: left_name, right_name: right_name, keep: keep)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
# A tree that _might_ contain conflicts
|
324
|
+
class MergeTree < Tree
|
325
|
+
extend T::Sig
|
326
|
+
|
327
|
+
sig { returns(T::Array[Rewriters::Merge::Conflict]) }
|
328
|
+
attr_reader :conflicts
|
329
|
+
|
330
|
+
sig do
|
331
|
+
params(
|
332
|
+
loc: T.nilable(Loc),
|
333
|
+
comments: T::Array[Comment],
|
334
|
+
conflicts: T::Array[Rewriters::Merge::Conflict],
|
335
|
+
block: T.nilable(T.proc.params(node: Tree).void)
|
336
|
+
).void
|
337
|
+
end
|
338
|
+
def initialize(loc: nil, comments: [], conflicts: [], &block)
|
339
|
+
super(loc: loc, comments: comments)
|
340
|
+
@conflicts = conflicts
|
341
|
+
block&.call(self)
|
320
342
|
end
|
321
343
|
end
|
322
344
|
|
data/lib/rbi/version.rb
CHANGED
data/lib/rbi.rb
CHANGED
@@ -13,6 +13,8 @@ require "rbi/model"
|
|
13
13
|
require "rbi/visitor"
|
14
14
|
require "rbi/index"
|
15
15
|
require "rbi/rewriters/add_sig_templates"
|
16
|
+
require "rbi/rewriters/annotate"
|
17
|
+
require "rbi/rewriters/deannotate"
|
16
18
|
require "rbi/rewriters/merge_trees"
|
17
19
|
require "rbi/rewriters/nest_singleton_methods"
|
18
20
|
require "rbi/rewriters/nest_non_public_methods"
|
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.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre Terrasa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -83,6 +83,8 @@ files:
|
|
83
83
|
- lib/rbi/parser.rb
|
84
84
|
- lib/rbi/printer.rb
|
85
85
|
- lib/rbi/rewriters/add_sig_templates.rb
|
86
|
+
- lib/rbi/rewriters/annotate.rb
|
87
|
+
- lib/rbi/rewriters/deannotate.rb
|
86
88
|
- lib/rbi/rewriters/group_nodes.rb
|
87
89
|
- lib/rbi/rewriters/merge_trees.rb
|
88
90
|
- lib/rbi/rewriters/nest_non_public_methods.rb
|