rbi 0.0.1 → 0.0.5
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 +9 -5
- data/README.md +38 -10
- data/Rakefile +2 -0
- data/lib/rbi/index.rb +186 -0
- data/lib/rbi/loc.rb +36 -0
- data/lib/rbi/model.rb +1251 -0
- data/lib/rbi/parser.rb +568 -0
- data/lib/rbi/printer.rb +756 -0
- data/lib/rbi/rewriters/add_sig_templates.rb +71 -0
- data/lib/rbi/rewriters/group_nodes.rb +104 -0
- data/lib/rbi/rewriters/merge_trees.rb +629 -0
- data/lib/rbi/rewriters/nest_non_public_methods.rb +63 -0
- data/lib/rbi/rewriters/nest_singleton_methods.rb +40 -0
- data/lib/rbi/rewriters/sort_nodes.rb +84 -0
- data/lib/rbi/version.rb +4 -1
- data/lib/rbi/visitor.rb +19 -0
- data/lib/rbi.rb +17 -5
- metadata +34 -67
- data/exe/rbi +0 -7
- data/lib/rbi/cli.rb +0 -19
@@ -0,0 +1,71 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module RBI
|
5
|
+
module Rewriters
|
6
|
+
class AddSigTemplates < Visitor
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig { params(with_todo_comment: T::Boolean).void }
|
10
|
+
def initialize(with_todo_comment: true)
|
11
|
+
super()
|
12
|
+
@with_todo_comment = with_todo_comment
|
13
|
+
end
|
14
|
+
|
15
|
+
sig { override.params(node: T.nilable(Node)).void }
|
16
|
+
def visit(node)
|
17
|
+
case node
|
18
|
+
when Tree
|
19
|
+
visit_all(node.nodes)
|
20
|
+
when Attr
|
21
|
+
add_attr_sig(node)
|
22
|
+
when Method
|
23
|
+
add_method_sig(node)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
sig { params(attr: Attr).void }
|
30
|
+
def add_attr_sig(attr)
|
31
|
+
return unless attr.sigs.empty?
|
32
|
+
return if attr.names.size > 1
|
33
|
+
|
34
|
+
params = []
|
35
|
+
params << SigParam.new(attr.names.first.to_s, "T.untyped") if attr.is_a?(AttrWriter)
|
36
|
+
|
37
|
+
attr.sigs << Sig.new(
|
38
|
+
params: params,
|
39
|
+
return_type: "T.untyped"
|
40
|
+
)
|
41
|
+
add_todo_comment(attr)
|
42
|
+
end
|
43
|
+
|
44
|
+
sig { params(method: Method).void }
|
45
|
+
def add_method_sig(method)
|
46
|
+
return unless method.sigs.empty?
|
47
|
+
|
48
|
+
method.sigs << Sig.new(
|
49
|
+
params: method.params.map { |param| SigParam.new(param.name, "T.untyped") },
|
50
|
+
return_type: "T.untyped"
|
51
|
+
)
|
52
|
+
add_todo_comment(method)
|
53
|
+
end
|
54
|
+
|
55
|
+
sig { params(node: NodeWithComments).void }
|
56
|
+
def add_todo_comment(node)
|
57
|
+
node.comments << Comment.new("TODO: fill in signature with appropriate type information") if @with_todo_comment
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class Tree
|
63
|
+
extend T::Sig
|
64
|
+
|
65
|
+
sig { params(with_todo_comment: T::Boolean).void }
|
66
|
+
def add_sig_templates!(with_todo_comment: true)
|
67
|
+
visitor = Rewriters::AddSigTemplates.new(with_todo_comment: with_todo_comment)
|
68
|
+
visitor.visit(self)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module RBI
|
5
|
+
module Rewriters
|
6
|
+
class GroupNodes < Visitor
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig { override.params(node: T.nilable(Node)).void }
|
10
|
+
def visit(node)
|
11
|
+
return unless node
|
12
|
+
|
13
|
+
case node
|
14
|
+
when Tree
|
15
|
+
kinds = node.nodes.map(&:group_kind)
|
16
|
+
kinds.compact!
|
17
|
+
kinds.uniq!
|
18
|
+
|
19
|
+
groups = {}
|
20
|
+
kinds.each { |kind| groups[kind] = Group.new(kind) }
|
21
|
+
|
22
|
+
node.nodes.dup.each do |child|
|
23
|
+
visit(child)
|
24
|
+
child.detach
|
25
|
+
groups[child.group_kind] << child
|
26
|
+
end
|
27
|
+
|
28
|
+
groups.each { |_, group| node << group }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Tree
|
35
|
+
extend T::Sig
|
36
|
+
|
37
|
+
sig { void }
|
38
|
+
def group_nodes!
|
39
|
+
visitor = Rewriters::GroupNodes.new
|
40
|
+
visitor.visit(self)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Node
|
45
|
+
extend T::Sig
|
46
|
+
|
47
|
+
sig { returns(Group::Kind) }
|
48
|
+
def group_kind
|
49
|
+
case self
|
50
|
+
when Include, Extend
|
51
|
+
Group::Kind::Mixins
|
52
|
+
when Helper
|
53
|
+
Group::Kind::Helpers
|
54
|
+
when TypeMember
|
55
|
+
Group::Kind::TypeMembers
|
56
|
+
when MixesInClassMethods
|
57
|
+
Group::Kind::MixesInClassMethods
|
58
|
+
when TStructField
|
59
|
+
Group::Kind::TStructFields
|
60
|
+
when TEnumBlock
|
61
|
+
Group::Kind::TEnums
|
62
|
+
when VisibilityGroup
|
63
|
+
Group::Kind::Methods
|
64
|
+
when Method
|
65
|
+
if name == "initialize"
|
66
|
+
Group::Kind::Inits
|
67
|
+
else
|
68
|
+
Group::Kind::Methods
|
69
|
+
end
|
70
|
+
when Scope, Const
|
71
|
+
Group::Kind::Consts
|
72
|
+
else
|
73
|
+
raise "Unknown group for #{self}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class Group < Tree
|
79
|
+
extend T::Sig
|
80
|
+
|
81
|
+
sig { returns(Kind) }
|
82
|
+
attr_reader :kind
|
83
|
+
|
84
|
+
sig { params(kind: Kind).void }
|
85
|
+
def initialize(kind)
|
86
|
+
super()
|
87
|
+
@kind = kind
|
88
|
+
end
|
89
|
+
|
90
|
+
class Kind < T::Enum
|
91
|
+
enums do
|
92
|
+
Mixins = new
|
93
|
+
Helpers = new
|
94
|
+
TypeMembers = new
|
95
|
+
MixesInClassMethods = new
|
96
|
+
TStructFields = new
|
97
|
+
TEnums = new
|
98
|
+
Inits = new
|
99
|
+
Methods = new
|
100
|
+
Consts = new
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|