rbi 0.2.4 → 0.3.0

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.
@@ -4,9 +4,8 @@
4
4
  module RBI
5
5
  module Rewriters
6
6
  class SortNodes < Visitor
7
- extend T::Sig
8
-
9
- sig { override.params(node: T.nilable(Node)).void }
7
+ # @override
8
+ #: (Node? node) -> void
10
9
  def visit(node)
11
10
  sort_node_names!(node) if node
12
11
 
@@ -41,7 +40,7 @@ module RBI
41
40
 
42
41
  private
43
42
 
44
- sig { params(node: Node).returns(Integer) }
43
+ #: (Node node) -> Integer
45
44
  def node_rank(node)
46
45
  case node
47
46
  when Group then group_rank(node.kind)
@@ -69,7 +68,7 @@ module RBI
69
68
  end
70
69
  end
71
70
 
72
- sig { params(kind: Group::Kind).returns(Integer) }
71
+ #: (Group::Kind kind) -> Integer
73
72
  def group_rank(kind)
74
73
  case kind
75
74
  when Group::Kind::Mixins then 0
@@ -90,7 +89,7 @@ module RBI
90
89
  end
91
90
  end
92
91
 
93
- sig { params(node: Node).returns(T.nilable(String)) }
92
+ #: (Node node) -> String?
94
93
  def node_name(node)
95
94
  case node
96
95
  when Module, Class, Struct, Const, Method, Helper, RequiresAncestor
@@ -102,7 +101,7 @@ module RBI
102
101
  end
103
102
  end
104
103
 
105
- sig { params(node: Node).void }
104
+ #: (Node node) -> void
106
105
  def sort_node_names!(node)
107
106
  case node
108
107
  when Attr
@@ -113,9 +112,7 @@ module RBI
113
112
  end
114
113
 
115
114
  class Tree
116
- extend T::Sig
117
-
118
- sig { void }
115
+ #: -> void
119
116
  def sort_nodes!
120
117
  visitor = Rewriters::SortNodes.new
121
118
  visitor.visit(self)
@@ -0,0 +1,87 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RBI
5
+ module Rewriters
6
+ # Translate all RBS signature comments to Sorbet RBI signatures
7
+ class TranslateRBSSigs < Visitor
8
+ class Error < RBI::Error; end
9
+
10
+ # @override
11
+ #: (Node? node) -> void
12
+ def visit(node)
13
+ return unless node
14
+
15
+ case node
16
+ when Tree
17
+ visit_all(node.nodes)
18
+ when AttrAccessor, AttrReader, AttrWriter
19
+ rbs_comments = extract_rbs_comments(node)
20
+ rbs_comments.each do |comment|
21
+ node.sigs << translate_rbs_attr_type(node, comment)
22
+ end
23
+ when Method
24
+ rbs_comments = extract_rbs_comments(node)
25
+ rbs_comments.each do |comment|
26
+ node.sigs << translate_rbs_method_type(node, comment)
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ #: (Method | Attr) -> Array[RBSComment]
34
+ def extract_rbs_comments(node)
35
+ comments = node.comments.dup
36
+ node.comments.clear
37
+
38
+ rbs_sigs = T.let([], T::Array[RBSComment])
39
+
40
+ comments.each do |comment|
41
+ case comment
42
+ when RBSComment
43
+ rbs_sigs << comment
44
+ else
45
+ node.comments << comment
46
+ end
47
+ end
48
+
49
+ rbs_sigs
50
+ end
51
+
52
+ #: (Method, RBSComment) -> Sig
53
+ def translate_rbs_method_type(node, comment)
54
+ method_type = ::RBS::Parser.parse_method_type(comment.text)
55
+ translator = RBS::MethodTypeTranslator.new(node)
56
+ translator.visit(method_type)
57
+ translator.result
58
+ end
59
+
60
+ #: (Attr, RBSComment) -> Sig
61
+ def translate_rbs_attr_type(node, comment)
62
+ attr_type = ::RBS::Parser.parse_type(comment.text)
63
+ sig = Sig.new
64
+
65
+ if node.is_a?(AttrWriter)
66
+ if node.names.size != 1
67
+ raise Error, "AttrWriter must have exactly one name"
68
+ end
69
+
70
+ name = T.must(node.names.first)
71
+ sig.params << SigParam.new(name.to_s, RBS::TypeTranslator.translate(attr_type))
72
+ end
73
+
74
+ sig.return_type = RBS::TypeTranslator.translate(attr_type)
75
+ sig
76
+ end
77
+ end
78
+ end
79
+
80
+ class Tree
81
+ #: -> void
82
+ def translate_rbs_sigs!
83
+ visitor = Rewriters::TranslateRBSSigs.new
84
+ visitor.visit(self)
85
+ end
86
+ end
87
+ end