rbs 0.10.0 → 0.13.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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +9 -9
  3. data/CHANGELOG.md +29 -0
  4. data/Gemfile +1 -0
  5. data/README.md +1 -1
  6. data/Rakefile +16 -6
  7. data/Steepfile +28 -0
  8. data/bin/steep +4 -0
  9. data/bin/test_runner.rb +7 -5
  10. data/docs/syntax.md +14 -1
  11. data/lib/rbs/ast/comment.rb +7 -1
  12. data/lib/rbs/ast/declarations.rb +15 -9
  13. data/lib/rbs/ast/members.rb +3 -8
  14. data/lib/rbs/buffer.rb +1 -1
  15. data/lib/rbs/cli.rb +72 -3
  16. data/lib/rbs/constant.rb +1 -1
  17. data/lib/rbs/constant_table.rb +9 -8
  18. data/lib/rbs/definition.rb +31 -14
  19. data/lib/rbs/definition_builder.rb +97 -67
  20. data/lib/rbs/environment.rb +28 -11
  21. data/lib/rbs/environment_loader.rb +67 -47
  22. data/lib/rbs/location.rb +1 -5
  23. data/lib/rbs/method_type.rb +5 -5
  24. data/lib/rbs/namespace.rb +14 -3
  25. data/lib/rbs/parser.y +2 -12
  26. data/lib/rbs/prototype/rb.rb +3 -5
  27. data/lib/rbs/prototype/rbi.rb +1 -4
  28. data/lib/rbs/prototype/runtime.rb +0 -4
  29. data/lib/rbs/substitution.rb +4 -3
  30. data/lib/rbs/test/setup.rb +5 -1
  31. data/lib/rbs/test/setup_helper.rb +15 -0
  32. data/lib/rbs/test/tester.rb +7 -5
  33. data/lib/rbs/test/type_check.rb +14 -2
  34. data/lib/rbs/type_name.rb +18 -1
  35. data/lib/rbs/type_name_resolver.rb +10 -3
  36. data/lib/rbs/types.rb +27 -21
  37. data/lib/rbs/variance_calculator.rb +9 -6
  38. data/lib/rbs/version.rb +1 -1
  39. data/lib/rbs/writer.rb +26 -17
  40. data/sig/annotation.rbs +26 -0
  41. data/sig/buffer.rbs +28 -0
  42. data/sig/builtin_names.rbs +41 -0
  43. data/sig/comment.rbs +26 -0
  44. data/sig/constant.rbs +21 -0
  45. data/sig/constant_table.rbs +30 -0
  46. data/sig/declarations.rbs +202 -0
  47. data/sig/definition.rbs +129 -0
  48. data/sig/definition_builder.rbs +94 -0
  49. data/sig/environment.rbs +94 -0
  50. data/sig/environment_loader.rbs +58 -0
  51. data/sig/location.rbs +52 -0
  52. data/sig/members.rbs +160 -0
  53. data/sig/method_types.rbs +40 -0
  54. data/sig/namespace.rbs +124 -0
  55. data/sig/polyfill.rbs +3 -0
  56. data/sig/rbs.rbs +3 -0
  57. data/sig/substitution.rbs +39 -0
  58. data/sig/type_name_resolver.rbs +24 -0
  59. data/sig/typename.rbs +70 -0
  60. data/sig/types.rbs +361 -0
  61. data/sig/util.rbs +13 -0
  62. data/sig/variance_calculator.rbs +35 -0
  63. data/sig/version.rbs +3 -0
  64. data/sig/writer.rbs +40 -0
  65. data/stdlib/bigdecimal/big_decimal.rbs +887 -0
  66. data/stdlib/bigdecimal/math/big_math.rbs +142 -0
  67. data/stdlib/builtin/array.rbs +2 -1
  68. data/stdlib/builtin/builtin.rbs +0 -3
  69. data/stdlib/builtin/hash.rbs +1 -1
  70. data/stdlib/builtin/kernel.rbs +2 -0
  71. data/stdlib/builtin/math.rbs +26 -26
  72. data/stdlib/builtin/struct.rbs +9 -10
  73. data/stdlib/date/date.rbs +1056 -0
  74. data/stdlib/date/date_time.rbs +582 -0
  75. data/stdlib/forwardable/forwardable.rbs +204 -0
  76. data/stdlib/pathname/pathname.rbs +2 -0
  77. data/stdlib/pty/pty.rbs +5 -29
  78. data/stdlib/set/set.rbs +1 -1
  79. data/stdlib/uri/file.rbs +167 -0
  80. data/stdlib/uri/generic.rbs +875 -0
  81. data/stdlib/uri/http.rbs +158 -0
  82. data/stdlib/uri/https.rbs +108 -0
  83. data/stdlib/uri/ldap.rbs +224 -0
  84. data/stdlib/uri/ldaps.rbs +108 -0
  85. data/stdlib/zlib/zlib.rbs +1 -1
  86. data/steep/Gemfile +3 -0
  87. data/steep/Gemfile.lock +51 -0
  88. metadata +45 -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.10.0"
2
+ VERSION = "0.13.0"
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
 
@@ -250,8 +251,7 @@ module RBS
250
251
 
251
252
  string = ""
252
253
 
253
- attrs = member.attributes.empty? ? "" : member.attributes.join(" ") + " "
254
- prefix = "#{attrs}def #{name}:"
254
+ prefix = "def #{name}:"
255
255
  padding = " " * (prefix.size-1)
256
256
 
257
257
  string << prefix
@@ -289,20 +289,29 @@ module RBS
289
289
  end
290
290
 
291
291
  def preserve_empty_line(prev, decl)
292
- return unless prev
292
+ # @type var decl: _Located
293
293
 
294
- decl = decl.comment if decl.respond_to?(:comment) && decl.comment
294
+ return unless prev
295
295
 
296
- # When the signature is not constructed by the parser,
297
- # it always inserts an empty line.
298
- if !prev.location || !decl.location
299
- puts
300
- return
296
+ if (_ = decl).respond_to?(:comment)
297
+ if comment = (_ = decl).comment
298
+ decl = comment
299
+ end
301
300
  end
302
301
 
303
- prev_end_line = prev.location.end_line
304
- start_line = decl.location.start_line
305
- 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.
306
315
  puts
307
316
  end
308
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