rbs 0.11.0 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +9 -9
  3. data/CHANGELOG.md +24 -0
  4. data/Rakefile +16 -6
  5. data/Steepfile +28 -0
  6. data/bin/steep +4 -0
  7. data/bin/test_runner.rb +7 -5
  8. data/lib/rbs/ast/comment.rb +7 -1
  9. data/lib/rbs/ast/declarations.rb +15 -9
  10. data/lib/rbs/buffer.rb +1 -1
  11. data/lib/rbs/cli.rb +12 -4
  12. data/lib/rbs/constant.rb +1 -1
  13. data/lib/rbs/constant_table.rb +9 -8
  14. data/lib/rbs/definition.rb +22 -13
  15. data/lib/rbs/definition_builder.rb +79 -55
  16. data/lib/rbs/environment.rb +28 -10
  17. data/lib/rbs/environment_loader.rb +12 -12
  18. data/lib/rbs/location.rb +1 -5
  19. data/lib/rbs/method_type.rb +5 -5
  20. data/lib/rbs/namespace.rb +14 -3
  21. data/lib/rbs/parser.y +0 -8
  22. data/lib/rbs/prototype/rb.rb +3 -4
  23. data/lib/rbs/prototype/rbi.rb +1 -2
  24. data/lib/rbs/substitution.rb +4 -3
  25. data/lib/rbs/type_name.rb +18 -1
  26. data/lib/rbs/type_name_resolver.rb +10 -3
  27. data/lib/rbs/types.rb +27 -21
  28. data/lib/rbs/variance_calculator.rb +9 -6
  29. data/lib/rbs/version.rb +1 -1
  30. data/lib/rbs/writer.rb +25 -15
  31. data/sig/annotation.rbs +26 -0
  32. data/sig/buffer.rbs +28 -0
  33. data/sig/builtin_names.rbs +41 -0
  34. data/sig/comment.rbs +26 -0
  35. data/sig/constant.rbs +21 -0
  36. data/sig/constant_table.rbs +30 -0
  37. data/sig/declarations.rbs +202 -0
  38. data/sig/definition.rbs +129 -0
  39. data/sig/definition_builder.rbs +94 -0
  40. data/sig/environment.rbs +94 -0
  41. data/sig/environment_loader.rbs +58 -0
  42. data/sig/location.rbs +52 -0
  43. data/sig/members.rbs +160 -0
  44. data/sig/method_types.rbs +40 -0
  45. data/sig/namespace.rbs +124 -0
  46. data/sig/polyfill.rbs +3 -0
  47. data/sig/rbs.rbs +3 -0
  48. data/sig/substitution.rbs +39 -0
  49. data/sig/type_name_resolver.rbs +24 -0
  50. data/sig/typename.rbs +70 -0
  51. data/sig/types.rbs +361 -0
  52. data/sig/util.rbs +13 -0
  53. data/sig/variance_calculator.rbs +35 -0
  54. data/sig/version.rbs +3 -0
  55. data/sig/writer.rbs +40 -0
  56. data/stdlib/bigdecimal/big_decimal.rbs +887 -0
  57. data/stdlib/bigdecimal/math/big_math.rbs +142 -0
  58. data/stdlib/builtin/builtin.rbs +0 -3
  59. data/stdlib/builtin/kernel.rbs +2 -0
  60. data/stdlib/builtin/math.rbs +26 -26
  61. data/stdlib/builtin/struct.rbs +9 -10
  62. data/stdlib/forwardable/forwardable.rbs +204 -0
  63. data/stdlib/pathname/pathname.rbs +2 -0
  64. data/stdlib/pty/pty.rbs +5 -29
  65. data/stdlib/set/set.rbs +1 -1
  66. data/stdlib/uri/file.rbs +167 -0
  67. data/stdlib/uri/generic.rbs +875 -0
  68. data/stdlib/uri/http.rbs +158 -0
  69. data/stdlib/uri/https.rbs +108 -0
  70. data/stdlib/uri/ldap.rbs +224 -0
  71. data/stdlib/uri/ldaps.rbs +108 -0
  72. data/steep/Gemfile +3 -0
  73. data/steep/Gemfile.lock +51 -0
  74. metadata +43 -5
@@ -73,11 +73,11 @@ module RBS
73
73
  type(param.type, result: result, context: :contravariant)
74
74
  end
75
75
 
76
- if method_type.block
77
- method_type.block.type.each_param do |param|
76
+ if block = method_type.block
77
+ block.type.each_param do |param|
78
78
  type(param.type, result: result, context: :covariant)
79
79
  end
80
- type(method_type.block.type.return_type, result: result, context: :contravariant)
80
+ type(block.type.return_type, result: result, context: :contravariant)
81
81
  end
82
82
 
83
83
  type(method_type.type.return_type, result: result, context: :covariant)
@@ -113,19 +113,20 @@ module RBS
113
113
 
114
114
  type_params = case type
115
115
  when Types::ClassInstance
116
- env.class_decls[type.name]&.type_params
116
+ env.class_decls[type.name].type_params
117
117
  when Types::Interface
118
- env.interface_decls[type.name]&.decl&.type_params
118
+ env.interface_decls[type.name].decl.type_params
119
119
  end
120
120
 
121
121
  type.args.each.with_index do |ty, i|
122
122
  var = type_params.params[i]
123
- case var.variance
123
+ case var&.variance
124
124
  when :invariant
125
125
  type(ty, result: result, context: :invariant)
126
126
  when :covariant
127
127
  type(ty, result: result, context: context)
128
128
  when :contravariant
129
+ # @type var con: variance
129
130
  con = case context
130
131
  when :invariant
131
132
  :invariant
@@ -133,6 +134,8 @@ module RBS
133
134
  :contravariant
134
135
  when :contravariant
135
136
  :covariant
137
+ else
138
+ raise
136
139
  end
137
140
  type(ty, result: result, context: con)
138
141
  end
@@ -1,3 +1,3 @@
1
1
  module RBS
2
- VERSION = "0.11.0"
2
+ VERSION = "0.13.1"
3
3
  end
@@ -60,6 +60,8 @@ module RBS
60
60
 
61
61
  def write(decls)
62
62
  [nil, *decls].each_cons(2) do |prev, decl|
63
+ raise unless decl
64
+
63
65
  preserve_empty_line(prev, decl)
64
66
  write_decl decl
65
67
  end
@@ -68,8 +70,8 @@ module RBS
68
70
  def write_decl(decl)
69
71
  case decl
70
72
  when AST::Declarations::Class
71
- super_class = if decl.super_class
72
- " < #{name_and_args(decl.super_class.name, decl.super_class.args)}"
73
+ super_class = if super_class = decl.super_class
74
+ " < #{name_and_args(super_class.name, super_class.args)}"
73
75
  end
74
76
  write_comment decl.comment
75
77
  write_annotation decl.annotations
@@ -77,6 +79,8 @@ module RBS
77
79
 
78
80
  indent do
79
81
  [nil, *decl.members].each_cons(2) do |prev, member|
82
+ raise unless member
83
+
80
84
  preserve_empty_line prev, member
81
85
  write_member member
82
86
  end
@@ -134,9 +138,6 @@ module RBS
134
138
 
135
139
  puts "end"
136
140
 
137
- when AST::Declarations::Extension
138
- RBS.logger.warn "Extension is ignored: #{decl.name}"
139
-
140
141
  end
141
142
  end
142
143
 
@@ -288,20 +289,29 @@ module RBS
288
289
  end
289
290
 
290
291
  def preserve_empty_line(prev, decl)
291
- return unless prev
292
+ # @type var decl: _Located
292
293
 
293
- decl = decl.comment if decl.respond_to?(:comment) && decl.comment
294
+ return unless prev
294
295
 
295
- # When the signature is not constructed by the parser,
296
- # it always inserts an empty line.
297
- if !prev.location || !decl.location
298
- puts
299
- return
296
+ if (_ = decl).respond_to?(:comment)
297
+ if comment = (_ = decl).comment
298
+ decl = comment
299
+ end
300
300
  end
301
301
 
302
- prev_end_line = prev.location.end_line
303
- start_line = decl.location.start_line
304
- if start_line - prev_end_line > 1
302
+ prev_loc = prev.location
303
+ decl_loc = decl.location
304
+
305
+ if prev_loc && decl_loc
306
+ prev_end_line = prev_loc.end_line
307
+ start_line = decl_loc.start_line
308
+
309
+ if start_line - prev_end_line > 1
310
+ puts
311
+ end
312
+ else
313
+ # When the signature is not constructed by the parser,
314
+ # it always inserts an empty line.
305
315
  puts
306
316
  end
307
317
  end
@@ -0,0 +1,26 @@
1
+ module RBS
2
+ module AST
3
+ # RBS allows writing annotations of declarations and members.
4
+ #
5
+ # %a{annotation_here}
6
+ # class Hello
7
+ # %a{rbs:test:skip}
8
+ # def foo: () -> void
9
+ # end
10
+ #
11
+ class Annotation
12
+ attr_reader string: String
13
+ attr_reader location: Location?
14
+
15
+ def initialize: (string: String, location: Location?) -> void
16
+
17
+ def ==: (untyped other) -> bool
18
+
19
+ alias eql? ==
20
+
21
+ def hash: () -> Integer
22
+
23
+ def to_json: (*untyped) -> String
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ module RBS
2
+ class Buffer
3
+ # Location in a buffer.
4
+ # A pair of line number (1 origin) and column number (0 origin).
5
+ #
6
+ type loc = [Integer, Integer]
7
+
8
+ # Name to identify Buffer.
9
+ attr_reader name: untyped
10
+
11
+ # The content of the buffer.
12
+ attr_reader content: String
13
+
14
+ attr_reader lines: Array[String]
15
+
16
+ attr_reader ranges: Array[Range[Integer]]
17
+
18
+ def initialize: (name: untyped name, content: String content) -> void
19
+
20
+ # Translate position to location.
21
+ def pos_to_loc: (Integer pos) -> loc
22
+
23
+ # Translate location to position.
24
+ def loc_to_pos: (loc loc) -> Integer
25
+
26
+ def last_position: () -> Integer
27
+ end
28
+ end
@@ -0,0 +1,41 @@
1
+ module RBS
2
+ module BuiltinNames
3
+ class Name
4
+ attr_reader name: TypeName
5
+
6
+ def initialize: (name: TypeName) -> void
7
+
8
+ def to_s: () -> String
9
+
10
+ def instance_type: (*Types::t) -> Types::ClassInstance
11
+
12
+ def instance_type?: (Types::t) -> bool
13
+
14
+ def singleton_type: () -> Types::ClassSingleton
15
+
16
+ def singleton_type?: (Types::t) -> bool
17
+
18
+ def self.define: (Symbol, ?namespace: Namespace) -> instance
19
+ end
20
+
21
+ BasicObject: Name
22
+ Object: Name
23
+ Kernel: Name
24
+ String: Name
25
+ Comparable: Name
26
+ Enumerable: Name
27
+ Class: Name
28
+ Module: Name
29
+ Array: Name
30
+ Hash: Name
31
+ Range: Name
32
+ Enumerator: Name
33
+ Set: Name
34
+ Symbol: Name
35
+ Integer: Name
36
+ Float: Name
37
+ Regexp: Name
38
+ TrueClass: Name
39
+ FalseClass: Name
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ module RBS
2
+ module AST
3
+ # RBS allows writing documentation of declarations and members.
4
+ #
5
+ # # This is a doc for class.
6
+ # class Hello
7
+ # end
8
+ #
9
+ class Comment
10
+ attr_reader string: String
11
+ attr_reader location: Location?
12
+
13
+ def initialize: (string: String, location: Location?) -> void
14
+
15
+ def ==: (untyped other) -> bool
16
+
17
+ alias eql? ==
18
+
19
+ def hash: () -> Integer
20
+
21
+ def to_json: (*untyped) -> String
22
+
23
+ def concat: (string: String, location: Location?) -> self
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ module RBS
2
+ class Constant
3
+ type constant_entry = Environment::ClassEntry
4
+ | Environment::ModuleEntry
5
+ | Environment::SingleEntry[TypeName, AST::Declarations::Constant]
6
+
7
+ attr_reader name: TypeName
8
+
9
+ attr_reader type: Types::t
10
+
11
+ attr_reader entry: constant_entry
12
+
13
+ def initialize: (name: TypeName, type: Types::t, entry: constant_entry) -> void
14
+
15
+ def ==: (untyped other) -> bool
16
+
17
+ alias eql? ==
18
+
19
+ def hash: () -> Integer
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ module RBS
2
+ class ConstantTable
3
+ attr_reader definition_builder: DefinitionBuilder
4
+ attr_reader constant_scopes_cache: Hash[TypeName, Array[Namespace]]
5
+ attr_reader resolver: TypeNameResolver
6
+ attr_reader env(): Environment
7
+
8
+ def initialize: (builder: DefinitionBuilder) -> void
9
+
10
+ def absolute_type: (Types::t, context: Array[Namespace]) -> Types::t
11
+
12
+ def absolute_type_name: (TypeName, context: Array[Namespace], location: Location?) -> TypeName
13
+
14
+ def name_to_constant: (TypeName) -> Constant?
15
+
16
+ def split_name: (TypeName) -> Array[Symbol]
17
+
18
+ def resolve_constant_reference: (TypeName name, context: Array[Namespace]) -> Constant?
19
+
20
+ def resolve_constant_reference_context: (Symbol, context: Array[Namespace]) -> Constant?
21
+
22
+ def resolve_constant_reference_inherit: (Symbol, scopes: Array[Namespace], ?no_object: bool) -> Constant?
23
+
24
+ def constant_scopes: (TypeName) -> Array[Namespace]
25
+
26
+ def constant_scopes_module: (TypeName, scopes: Array[Namespace]) -> Array[Namespace]
27
+
28
+ def constant_scopes0: (TypeName, ?scopes: Array[Namespace]) -> Array[Namespace]
29
+ end
30
+ end
@@ -0,0 +1,202 @@
1
+ module RBS
2
+ module AST
3
+ module Declarations
4
+ type t = Class | Module | Interface | Constant | Global | Alias
5
+
6
+ class Base
7
+ end
8
+
9
+ type variance = :invariant | :covariant | :contravariant
10
+
11
+ class ModuleTypeParams
12
+ class TypeParam
13
+ attr_reader name: Symbol
14
+ attr_reader variance: variance
15
+ attr_reader skip_validation: bool
16
+
17
+ def initialize: (name: Symbol, variance: variance, skip_validation: bool) -> void
18
+
19
+ include _ToJson
20
+ end
21
+
22
+ attr_reader params: Array[TypeParam]
23
+
24
+ def initialize: () -> void
25
+
26
+ def add: (TypeParam param) -> self
27
+
28
+ include _HashEqual
29
+ include _ToJson
30
+
31
+ def []: (Symbol) -> TypeParam?
32
+
33
+ def each: { (TypeParam) -> void } -> void
34
+ | () -> Enumerator[TypeParam, void]
35
+
36
+ def self.empty: () -> instance
37
+
38
+ def variance: (Symbol) -> variance
39
+
40
+ def skip_validation?: (Symbol) -> bool
41
+
42
+ def empty?: () -> bool
43
+
44
+ def size: () -> Integer
45
+
46
+ def rename_to: (Array[Symbol] names) -> ModuleTypeParams
47
+ end
48
+
49
+ interface _WithMember
50
+ def members: () -> Array[untyped]
51
+ end
52
+
53
+ module NestedDeclarationHelper : _WithMember
54
+ def each_member: () { (Members::t) -> void } -> void
55
+ | () -> Enumerator[Members::t, void]
56
+
57
+ def each_decl: () { (t) -> void } -> void
58
+ | () -> Enumerator[t, void]
59
+ end
60
+
61
+ module MixinHelper : _WithMember
62
+ type mixin_member = Members::Include | Members::Extend | Members::Prepend
63
+
64
+ @mixins: Array[mixin_member]
65
+
66
+ def each_mixin: () { (mixin_member) -> void } -> void
67
+ | () -> Enumerator[mixin_member, void]
68
+ end
69
+
70
+ class Class < Base
71
+ type member = Members::t | t
72
+
73
+ class Super
74
+ attr_reader name: TypeName
75
+ attr_reader args: Array[Types::t]
76
+
77
+ def initialize: (name: TypeName, args: Array[Types::t]) -> void
78
+
79
+ include _HashEqual
80
+ include _ToJson
81
+ end
82
+
83
+ include NestedDeclarationHelper
84
+ include MixinHelper
85
+
86
+ attr_reader name: TypeName
87
+ attr_reader type_params: ModuleTypeParams
88
+ attr_reader members: Array[member]
89
+ attr_reader super_class: Super?
90
+ attr_reader annotations: Array[Annotation]
91
+ attr_reader location: Location?
92
+ attr_reader comment: Comment?
93
+
94
+ def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], super_class: Super?, annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
95
+
96
+ include _HashEqual
97
+ include _ToJson
98
+ end
99
+
100
+ class Module < Base
101
+ type member = Members::t | t
102
+
103
+ class Self
104
+ attr_reader name: TypeName
105
+ attr_reader args: Array[Types::t]
106
+ attr_reader location: Location?
107
+
108
+ def initialize: (name: TypeName, args: Array[Types::t], location: Location?) -> void
109
+
110
+ include _HashEqual
111
+ include _ToJson
112
+
113
+ def to_s: () -> String
114
+ end
115
+
116
+ include NestedDeclarationHelper
117
+ include MixinHelper
118
+
119
+ attr_reader name: TypeName
120
+ attr_reader type_params: ModuleTypeParams
121
+ attr_reader members: Array[member]
122
+ attr_reader location: Location?
123
+ attr_reader annotations: Array[Annotation]
124
+ attr_reader self_types: Array[Self]
125
+ attr_reader comment: Comment?
126
+
127
+ def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], location: Location?, annotations: Array[Annotation], self_types: Array[Self], comment: Comment?) -> void
128
+
129
+ include _HashEqual
130
+ include _ToJson
131
+ end
132
+
133
+ class Extension < Base
134
+ attr_reader name: TypeName
135
+ attr_reader type_params: ModuleTypeParams
136
+ attr_reader extension_name: Symbol
137
+ attr_reader members: Array[Members::t]
138
+ attr_reader annotations: Array[Annotation]
139
+ attr_reader location: Location?
140
+ attr_reader comment: Comment?
141
+
142
+ def initialize: (name: TypeName, type_params: ModuleTypeParams, extension_name: Symbol, members: Array[Members::t], annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
143
+
144
+ include _HashEqual
145
+ include _ToJson
146
+ end
147
+
148
+ class Interface
149
+ type member = Members::t
150
+
151
+ attr_reader name: TypeName
152
+ attr_reader type_params: ModuleTypeParams
153
+ attr_reader members: Array[member]
154
+ attr_reader annotations: Array[Annotation]
155
+ attr_reader location: Location?
156
+ attr_reader comment: Comment?
157
+
158
+ def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
159
+
160
+ include _HashEqual
161
+ include _ToJson
162
+ end
163
+
164
+ class Alias < Base
165
+ attr_reader name: TypeName
166
+ attr_reader type: Types::t
167
+ attr_reader annotations: Array[Annotation]
168
+ attr_reader location: Location?
169
+ attr_reader comment: Comment?
170
+
171
+ def initialize: (name: TypeName, type: Types::t, annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
172
+
173
+ include _HashEqual
174
+ include _ToJson
175
+ end
176
+
177
+ class Constant < Base
178
+ attr_reader name: TypeName
179
+ attr_reader type: Types::t
180
+ attr_reader location: Location?
181
+ attr_reader comment: Comment?
182
+
183
+ def initialize: (name: TypeName, type: Types::t, location: Location?, comment: Comment?) -> void
184
+
185
+ include _HashEqual
186
+ include _ToJson
187
+ end
188
+
189
+ class Global < Base
190
+ attr_reader name: Symbol
191
+ attr_reader type: Types::t
192
+ attr_reader location: Location?
193
+ attr_reader comment: Comment?
194
+
195
+ def initialize: (name: Symbol, type: Types::t, location: Location?, comment: Comment?) -> void
196
+
197
+ include _HashEqual
198
+ include _ToJson
199
+ end
200
+ end
201
+ end
202
+ end