steep 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/exe/rbs +1 -1
  4. data/lib/steep/annotation_parser.rb +4 -4
  5. data/lib/steep/ast/buffer.rb +11 -7
  6. data/lib/steep/ast/builtin.rb +8 -0
  7. data/lib/steep/ast/types/factory.rb +55 -55
  8. data/lib/steep/drivers/check.rb +20 -4
  9. data/lib/steep/drivers/langserver.rb +6 -1
  10. data/lib/steep/drivers/vendor.rb +2 -2
  11. data/lib/steep/project/completion_provider.rb +5 -11
  12. data/lib/steep/project/dsl.rb +14 -0
  13. data/lib/steep/project/file.rb +42 -46
  14. data/lib/steep/project/hover_content.rb +11 -5
  15. data/lib/steep/project/options.rb +25 -3
  16. data/lib/steep/project/target.rb +10 -4
  17. data/lib/steep/signature/errors.rb +1 -1
  18. data/lib/steep/signature/validator.rb +8 -8
  19. data/lib/steep/source.rb +1 -1
  20. data/lib/steep/type_construction.rb +987 -711
  21. data/lib/steep/type_inference/constant_env.rb +1 -1
  22. data/lib/steep/type_inference/context.rb +7 -3
  23. data/lib/steep/type_inference/context_array.rb +111 -0
  24. data/lib/steep/type_inference/local_variable_type_env.rb +226 -0
  25. data/lib/steep/type_inference/logic.rb +130 -0
  26. data/lib/steep/type_inference/type_env.rb +5 -69
  27. data/lib/steep/typing.rb +79 -22
  28. data/lib/steep/version.rb +1 -1
  29. data/lib/steep.rb +6 -1
  30. data/smoke/alias/Steepfile +1 -0
  31. data/smoke/and/Steepfile +1 -0
  32. data/smoke/array/Steepfile +1 -0
  33. data/smoke/array/b.rb +0 -2
  34. data/smoke/block/Steepfile +1 -0
  35. data/smoke/case/Steepfile +1 -0
  36. data/smoke/class/Steepfile +1 -0
  37. data/smoke/const/Steepfile +1 -0
  38. data/smoke/dstr/Steepfile +1 -0
  39. data/smoke/ensure/Steepfile +1 -0
  40. data/smoke/enumerator/Steepfile +1 -0
  41. data/smoke/extension/Steepfile +1 -0
  42. data/smoke/extension/c.rb +1 -0
  43. data/smoke/hash/Steepfile +1 -0
  44. data/smoke/hello/Steepfile +1 -0
  45. data/smoke/if/Steepfile +1 -0
  46. data/smoke/if/a.rb +1 -1
  47. data/smoke/implements/Steepfile +1 -0
  48. data/smoke/initialize/Steepfile +1 -0
  49. data/smoke/integer/Steepfile +1 -0
  50. data/smoke/interface/Steepfile +1 -0
  51. data/smoke/kwbegin/Steepfile +1 -0
  52. data/smoke/lambda/Steepfile +1 -0
  53. data/smoke/literal/Steepfile +1 -0
  54. data/smoke/map/Steepfile +1 -0
  55. data/smoke/method/Steepfile +1 -0
  56. data/smoke/module/Steepfile +1 -0
  57. data/smoke/regexp/Steepfile +1 -0
  58. data/smoke/regression/Steepfile +1 -0
  59. data/smoke/rescue/Steepfile +1 -0
  60. data/smoke/rescue/a.rb +1 -1
  61. data/smoke/self/Steepfile +1 -0
  62. data/smoke/skip/Steepfile +1 -0
  63. data/smoke/stdout/Steepfile +1 -0
  64. data/smoke/super/Steepfile +1 -0
  65. data/smoke/type_case/Steepfile +1 -0
  66. data/smoke/yield/Steepfile +1 -0
  67. data/steep.gemspec +1 -1
  68. data/vendor/ruby-signature/.gitignore +2 -2
  69. data/vendor/ruby-signature/README.md +2 -2
  70. data/vendor/ruby-signature/Rakefile +2 -2
  71. data/vendor/ruby-signature/bin/annotate-with-rdoc +14 -13
  72. data/vendor/ruby-signature/bin/console +1 -1
  73. data/vendor/ruby-signature/bin/sort +7 -6
  74. data/vendor/ruby-signature/bin/test_runner.rb +0 -1
  75. data/vendor/ruby-signature/docs/CONTRIBUTING.md +1 -1
  76. data/vendor/ruby-signature/docs/sigs.md +3 -3
  77. data/vendor/ruby-signature/docs/stdlib.md +1 -1
  78. data/vendor/ruby-signature/docs/syntax.md +9 -9
  79. data/vendor/ruby-signature/exe/rbs +5 -1
  80. data/vendor/ruby-signature/lib/rbs/ast/annotation.rb +27 -0
  81. data/vendor/ruby-signature/lib/rbs/ast/comment.rb +27 -0
  82. data/vendor/ruby-signature/lib/rbs/ast/declarations.rb +395 -0
  83. data/vendor/ruby-signature/lib/rbs/ast/members.rb +362 -0
  84. data/vendor/ruby-signature/lib/rbs/buffer.rb +50 -0
  85. data/vendor/ruby-signature/lib/rbs/builtin_names.rb +55 -0
  86. data/vendor/ruby-signature/lib/rbs/cli.rb +558 -0
  87. data/vendor/ruby-signature/lib/rbs/constant.rb +26 -0
  88. data/vendor/ruby-signature/lib/rbs/constant_table.rb +150 -0
  89. data/vendor/ruby-signature/lib/rbs/definition.rb +170 -0
  90. data/vendor/ruby-signature/lib/rbs/definition_builder.rb +919 -0
  91. data/vendor/ruby-signature/lib/rbs/environment.rb +281 -0
  92. data/vendor/ruby-signature/lib/rbs/environment_loader.rb +136 -0
  93. data/vendor/ruby-signature/lib/rbs/environment_walker.rb +124 -0
  94. data/vendor/ruby-signature/lib/rbs/errors.rb +187 -0
  95. data/vendor/ruby-signature/lib/rbs/location.rb +102 -0
  96. data/vendor/ruby-signature/lib/rbs/method_type.rb +123 -0
  97. data/vendor/ruby-signature/lib/rbs/namespace.rb +91 -0
  98. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.rb +21 -23
  99. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.y +18 -18
  100. data/vendor/ruby-signature/lib/rbs/prototype/rb.rb +553 -0
  101. data/vendor/ruby-signature/lib/rbs/prototype/rbi.rb +587 -0
  102. data/vendor/ruby-signature/lib/rbs/prototype/runtime.rb +381 -0
  103. data/vendor/ruby-signature/lib/rbs/substitution.rb +46 -0
  104. data/vendor/ruby-signature/lib/rbs/test/errors.rb +61 -0
  105. data/vendor/ruby-signature/lib/rbs/test/hook.rb +294 -0
  106. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/test/setup.rb +7 -7
  107. data/vendor/ruby-signature/lib/rbs/test/spy.rb +325 -0
  108. data/vendor/ruby-signature/lib/rbs/test/test_helper.rb +183 -0
  109. data/vendor/ruby-signature/lib/rbs/test/type_check.rb +254 -0
  110. data/vendor/ruby-signature/lib/rbs/test.rb +26 -0
  111. data/vendor/ruby-signature/lib/rbs/type_name.rb +70 -0
  112. data/vendor/ruby-signature/lib/rbs/types.rb +936 -0
  113. data/vendor/ruby-signature/lib/rbs/variance_calculator.rb +138 -0
  114. data/vendor/ruby-signature/lib/rbs/vendorer.rb +47 -0
  115. data/vendor/ruby-signature/lib/rbs/version.rb +3 -0
  116. data/vendor/ruby-signature/lib/rbs/writer.rb +269 -0
  117. data/vendor/ruby-signature/lib/rbs.rb +64 -0
  118. data/vendor/ruby-signature/lib/ruby/signature.rb +4 -61
  119. data/vendor/ruby-signature/{ruby-signature.gemspec → rbs.gemspec} +4 -4
  120. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +58 -1
  121. data/vendor/ruby-signature/stdlib/base64/base64.rbs +69 -13
  122. data/vendor/ruby-signature/stdlib/benchmark/benchmark.rbs +372 -0
  123. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +9 -0
  124. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +1 -7
  125. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +2 -1
  126. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +3 -2
  127. data/vendor/ruby-signature/stdlib/builtin/file.rbs +902 -302
  128. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +190 -68
  129. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +3 -6
  130. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +6 -4
  131. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +146 -120
  132. data/vendor/ruby-signature/stdlib/builtin/math.rbs +310 -7
  133. data/vendor/ruby-signature/stdlib/builtin/method.rbs +11 -8
  134. data/vendor/ruby-signature/stdlib/builtin/module.rbs +959 -103
  135. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +3 -0
  136. data/vendor/ruby-signature/stdlib/builtin/process.rbs +981 -108
  137. data/vendor/ruby-signature/stdlib/builtin/random.rbs +215 -41
  138. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +47 -0
  139. data/vendor/ruby-signature/stdlib/builtin/string.rbs +9 -2
  140. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +282 -11
  141. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +11 -13
  142. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +25 -29
  143. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +1 -1
  144. data/vendor/ruby-signature/stdlib/builtin/time.rbs +875 -567
  145. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +243 -44
  146. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +103 -109
  147. data/vendor/ruby-signature/stdlib/coverage/coverage.rbs +62 -0
  148. data/vendor/ruby-signature/stdlib/csv/csv.rbs +773 -0
  149. data/vendor/ruby-signature/stdlib/erb/erb.rbs +375 -1
  150. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -4
  151. data/vendor/ruby-signature/stdlib/ipaddr/ipaddr.rbs +247 -0
  152. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +1088 -16
  153. data/vendor/ruby-signature/stdlib/set/set.rbs +251 -27
  154. metadata +49 -44
  155. data/exe/ruby-signature +0 -3
  156. data/vendor/ruby-signature/exe/ruby-signature +0 -7
  157. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +0 -29
  158. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +0 -29
  159. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +0 -391
  160. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +0 -364
  161. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +0 -52
  162. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +0 -54
  163. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +0 -555
  164. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +0 -28
  165. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +0 -152
  166. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +0 -172
  167. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +0 -921
  168. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +0 -283
  169. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +0 -138
  170. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +0 -126
  171. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +0 -189
  172. data/vendor/ruby-signature/lib/ruby/signature/location.rb +0 -104
  173. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +0 -125
  174. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +0 -93
  175. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +0 -444
  176. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +0 -579
  177. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +0 -383
  178. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +0 -48
  179. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +0 -63
  180. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +0 -290
  181. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +0 -327
  182. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +0 -185
  183. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +0 -256
  184. data/vendor/ruby-signature/lib/ruby/signature/test.rb +0 -28
  185. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +0 -72
  186. data/vendor/ruby-signature/lib/ruby/signature/types.rb +0 -932
  187. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +0 -140
  188. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +0 -49
  189. data/vendor/ruby-signature/lib/ruby/signature/version.rb +0 -5
  190. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +0 -271
@@ -0,0 +1,381 @@
1
+ module RBS
2
+ module Prototype
3
+ class Runtime
4
+ attr_reader :patterns
5
+ attr_reader :env
6
+ attr_reader :merge
7
+ attr_reader :owners_included
8
+
9
+ def initialize(patterns:, env:, merge:, owners_included: [])
10
+ @patterns = patterns
11
+ @decls = nil
12
+ @env = env
13
+ @merge = merge
14
+ @owners_included = owners_included.map do |name|
15
+ Object.const_get(name)
16
+ end
17
+ end
18
+
19
+ def target?(const)
20
+ patterns.any? do |pattern|
21
+ if pattern.end_with?("*")
22
+ (const.name || "").start_with?(pattern.chop)
23
+ else
24
+ const.name == pattern
25
+ end
26
+ end
27
+ end
28
+
29
+ def builder
30
+ @builder ||= DefinitionBuilder.new(env: env)
31
+ end
32
+
33
+ def parse(file)
34
+ require file
35
+ end
36
+
37
+ def decls
38
+ unless @decls
39
+ @decls = []
40
+ ObjectSpace.each_object(Module).select {|mod| target?(mod) }.sort_by(&:name).each do |mod|
41
+ case mod
42
+ when Class
43
+ generate_class mod
44
+ when Module
45
+ generate_module mod
46
+ end
47
+ end
48
+ end
49
+ @decls
50
+ end
51
+
52
+ def to_type_name(name)
53
+ *prefix, last = name.split(/::/)
54
+
55
+ if prefix.empty?
56
+ TypeName.new(name: last.to_sym, namespace: Namespace.empty)
57
+ else
58
+ TypeName.new(name: last.to_sym, namespace: Namespace.parse(prefix.join("::")))
59
+ end
60
+ end
61
+
62
+ def each_mixin(mixins, *super_mixes)
63
+ supers = Set.new(super_mixes)
64
+ mixins.each do |mix|
65
+ unless supers.include?(mix)
66
+ yield mix
67
+ end
68
+ end
69
+ end
70
+
71
+ def method_type(method)
72
+ untyped = Types::Bases::Any.new(location: nil)
73
+
74
+ required_positionals = []
75
+ optional_positionals = []
76
+ rest = nil
77
+ trailing_positionals = []
78
+ required_keywords = {}
79
+ optional_keywords = {}
80
+ rest_keywords = nil
81
+
82
+ requireds = required_positionals
83
+
84
+ block = nil
85
+
86
+ method.parameters.each do |kind, name|
87
+ case kind
88
+ when :req
89
+ requireds << Types::Function::Param.new(name: name, type: untyped)
90
+ when :opt
91
+ requireds = trailing_positionals
92
+ optional_positionals << Types::Function::Param.new(name: name, type: untyped)
93
+ when :rest
94
+ requireds = trailing_positionals
95
+ rest = Types::Function::Param.new(name: name, type: untyped)
96
+ when :keyreq
97
+ required_keywords[name] = Types::Function::Param.new(name: nil, type: untyped)
98
+ when :key
99
+ optional_keywords[name] = Types::Function::Param.new(name: nil, type: untyped)
100
+ when :keyrest
101
+ rest_keywords = Types::Function::Param.new(name: nil, type: untyped)
102
+ when :block
103
+ block = MethodType::Block.new(
104
+ type: Types::Function.empty(untyped).update(rest_positionals: Types::Function::Param.new(name: nil, type: untyped)),
105
+ required: true
106
+ )
107
+ end
108
+ end
109
+
110
+ method_type = Types::Function.new(
111
+ required_positionals: required_positionals,
112
+ optional_positionals: optional_positionals,
113
+ rest_positionals: rest,
114
+ trailing_positionals: trailing_positionals,
115
+ required_keywords: required_keywords,
116
+ optional_keywords: optional_keywords,
117
+ rest_keywords: rest_keywords,
118
+ return_type: untyped
119
+ )
120
+
121
+ MethodType.new(
122
+ location: nil,
123
+ type_params: [],
124
+ type: method_type,
125
+ block: block
126
+ )
127
+ end
128
+
129
+ def merge_rbs(module_name, members, instance: nil, singleton: nil)
130
+ if merge
131
+ if env.class?(module_name.absolute!)
132
+ case
133
+ when instance
134
+ method = builder.build_instance(module_name.absolute!).methods[instance]
135
+ method_name = instance
136
+ kind = :instance
137
+ when singleton
138
+ method = builder.build_singleton(module_name.absolute!).methods[singleton]
139
+ method_name = singleton
140
+ kind = :singleton
141
+ end
142
+
143
+ if method
144
+ members << AST::Members::MethodDefinition.new(
145
+ name: method_name,
146
+ types: method.method_types.map {|type|
147
+ type.update.tap do |ty|
148
+ def ty.to_s
149
+ location.source
150
+ end
151
+ end
152
+ },
153
+ kind: kind,
154
+ location: nil,
155
+ comment: method.comment,
156
+ annotations: method.annotations,
157
+ attributes: method.attributes
158
+ )
159
+ return
160
+ end
161
+ end
162
+
163
+ yield
164
+ else
165
+ yield
166
+ end
167
+ end
168
+
169
+ def target_method?(mod, instance: nil, singleton: nil)
170
+ case
171
+ when instance
172
+ method = mod.instance_method(instance)
173
+ method.owner == mod || owners_included.any? {|m| method.owner == m }
174
+ when singleton
175
+ method = mod.singleton_class.instance_method(singleton)
176
+ method.owner == mod.singleton_class || owners_included.any? {|m| method.owner == m.singleton_class }
177
+ end
178
+ end
179
+
180
+ def generate_methods(mod, module_name, members)
181
+ mod.singleton_methods.select {|name| target_method?(mod, singleton: name) }.sort.each do |name|
182
+ method = mod.singleton_class.instance_method(name)
183
+
184
+ if method.name == method.original_name
185
+ merge_rbs(module_name, members, singleton: name) do
186
+ RBS.logger.info "missing #{module_name}.#{name} #{method.source_location}"
187
+
188
+ members << AST::Members::MethodDefinition.new(
189
+ name: method.name,
190
+ types: [method_type(method)],
191
+ kind: :singleton,
192
+ location: nil,
193
+ comment: nil,
194
+ annotations: [],
195
+ attributes: []
196
+ )
197
+ end
198
+ else
199
+ members << AST::Members::Alias.new(
200
+ new_name: method.name,
201
+ old_name: method.original_name,
202
+ kind: :singleton,
203
+ location: nil,
204
+ comment: nil,
205
+ annotations: [],
206
+ )
207
+ end
208
+ end
209
+
210
+ public_instance_methods = mod.public_instance_methods.select {|name| target_method?(mod, instance: name) }
211
+ unless public_instance_methods.empty?
212
+ members << AST::Members::Public.new(location: nil)
213
+
214
+ public_instance_methods.sort.each do |name|
215
+ method = mod.instance_method(name)
216
+
217
+ if method.name == method.original_name
218
+ merge_rbs(module_name, members, instance: name) do
219
+ RBS.logger.info "missing #{module_name}##{name} #{method.source_location}"
220
+
221
+ members << AST::Members::MethodDefinition.new(
222
+ name: method.name,
223
+ types: [method_type(method)],
224
+ kind: :instance,
225
+ location: nil,
226
+ comment: nil,
227
+ annotations: [],
228
+ attributes: []
229
+ )
230
+ end
231
+ else
232
+ members << AST::Members::Alias.new(
233
+ new_name: method.name,
234
+ old_name: method.original_name,
235
+ kind: :instance,
236
+ location: nil,
237
+ comment: nil,
238
+ annotations: [],
239
+ )
240
+ end
241
+ end
242
+ end
243
+
244
+ private_instance_methods = mod.private_instance_methods.select {|name| target_method?(mod, instance: name) }
245
+ unless private_instance_methods.empty?
246
+ members << AST::Members::Private.new(location: nil)
247
+
248
+ private_instance_methods.sort.each do |name|
249
+ method = mod.instance_method(name)
250
+
251
+ if method.name == method.original_name
252
+ merge_rbs(module_name, members, instance: name) do
253
+ RBS.logger.info "missing #{module_name}##{name} #{method.source_location}"
254
+
255
+ members << AST::Members::MethodDefinition.new(
256
+ name: method.name,
257
+ types: [method_type(method)],
258
+ kind: :instance,
259
+ location: nil,
260
+ comment: nil,
261
+ annotations: [],
262
+ attributes: []
263
+ )
264
+ end
265
+ else
266
+ members << AST::Members::Alias.new(
267
+ new_name: method.name,
268
+ old_name: method.original_name,
269
+ kind: :instance,
270
+ location: nil,
271
+ comment: nil,
272
+ annotations: [],
273
+ )
274
+ end
275
+ end
276
+ end
277
+ end
278
+
279
+ def generate_constants(mod)
280
+ mod.constants(false).sort.each do |name|
281
+ value = mod.const_get(name)
282
+
283
+ next if value.is_a?(Class) || value.is_a?(Module)
284
+ type = case value
285
+ when true, false
286
+ Types::Bases::Bool.new(location: nil)
287
+ when nil
288
+ Types::Optional.new(
289
+ type: Types::Bases::Any.new(location: nil),
290
+ location: nil
291
+ )
292
+ else
293
+ Types::ClassInstance.new(name: to_type_name(value.class.to_s), args: [], location: nil)
294
+ end
295
+
296
+ @decls << AST::Declarations::Constant.new(
297
+ name: "#{mod.to_s}::#{name}",
298
+ type: type,
299
+ location: nil,
300
+ comment: nil
301
+ )
302
+ end
303
+ end
304
+
305
+ def generate_class(mod)
306
+ type_name = to_type_name(mod.name)
307
+ super_class = if mod.superclass == ::Object
308
+ nil
309
+ else
310
+ AST::Declarations::Class::Super.new(name: to_type_name(mod.superclass.name), args: [])
311
+ end
312
+
313
+ decl = AST::Declarations::Class.new(
314
+ name: type_name,
315
+ type_params: AST::Declarations::ModuleTypeParams.empty,
316
+ super_class: super_class,
317
+ members: [],
318
+ annotations: [],
319
+ location: nil,
320
+ comment: nil
321
+ )
322
+
323
+ each_mixin(mod.included_modules, *mod.superclass.included_modules, *mod.included_modules.flat_map(&:included_modules)) do |included_module|
324
+ module_name = to_type_name(included_module.name)
325
+ if module_name.namespace == type_name.namespace
326
+ module_name = TypeName.new(name: module_name.name, namespace: Namespace.empty)
327
+ end
328
+
329
+ decl.members << AST::Members::Include.new(
330
+ name: module_name,
331
+ args: [],
332
+ location: nil,
333
+ comment: nil,
334
+ annotations: []
335
+ )
336
+ end
337
+
338
+ generate_methods(mod, type_name, decl.members)
339
+
340
+ @decls << decl
341
+
342
+ generate_constants mod
343
+ end
344
+
345
+ def generate_module(mod)
346
+ type_name = to_type_name(mod.name)
347
+
348
+ decl = AST::Declarations::Module.new(
349
+ name: type_name,
350
+ type_params: AST::Declarations::ModuleTypeParams.empty,
351
+ self_type: nil,
352
+ members: [],
353
+ annotations: [],
354
+ location: nil,
355
+ comment: nil
356
+ )
357
+
358
+ each_mixin(mod.included_modules, *mod.included_modules.flat_map(&:included_modules), namespace: type_name.namespace) do |included_module|
359
+ module_name = to_type_name(included_module.name)
360
+ if module_name.namespace == type_name.namespace
361
+ module_name = TypeName.new(name: module_name.name, namespace: Namespace.empty)
362
+ end
363
+
364
+ decl.members << AST::Members::Include.new(
365
+ name: module_name,
366
+ args: [],
367
+ location: nil,
368
+ comment: nil,
369
+ annotations: []
370
+ )
371
+ end
372
+
373
+ generate_methods(mod, type_name, decl.members)
374
+
375
+ @decls << decl
376
+
377
+ generate_constants mod
378
+ end
379
+ end
380
+ end
381
+ end
@@ -0,0 +1,46 @@
1
+ module RBS
2
+ class Substitution
3
+ attr_reader :mapping
4
+
5
+ def initialize()
6
+ @mapping = {}
7
+ end
8
+
9
+ def add(from:, to:)
10
+ mapping[from] = to
11
+ end
12
+
13
+ def self.build(variables, types, &block)
14
+ unless variables.size == types.size
15
+ raise "Broken substitution: variables=#{variables}, types=#{types}"
16
+ end
17
+
18
+ mapping = variables.zip(types).to_h
19
+
20
+ self.new.tap do |subst|
21
+ mapping.each do |v, t|
22
+ type = block_given? ? yield(t) : t
23
+ subst.add(from: v, to: type)
24
+ end
25
+ end
26
+ end
27
+
28
+ def apply(ty)
29
+ case ty
30
+ when Types::Variable
31
+ mapping[ty.name] || ty
32
+ else
33
+ ty
34
+ end
35
+ end
36
+
37
+ def without(*vars)
38
+ self.class.new.tap do |subst|
39
+ subst.mapping.merge!(mapping)
40
+ vars.each do |var|
41
+ subst.mapping.delete(var)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,61 @@
1
+ module RBS
2
+ module Test
3
+ module Errors
4
+ ArgumentTypeError =
5
+ Struct.new(:klass, :method_name, :method_type, :param, :value, keyword_init: true)
6
+ BlockArgumentTypeError =
7
+ Struct.new(:klass, :method_name, :method_type, :param, :value, keyword_init: true)
8
+ ArgumentError =
9
+ Struct.new(:klass, :method_name, :method_type, keyword_init: true)
10
+ BlockArgumentError =
11
+ Struct.new(:klass, :method_name, :method_type, keyword_init: true)
12
+ ReturnTypeError =
13
+ Struct.new(:klass, :method_name, :method_type, :type, :value, keyword_init: true)
14
+ BlockReturnTypeError =
15
+ Struct.new(:klass, :method_name, :method_type, :type, :value, keyword_init: true)
16
+
17
+ UnexpectedBlockError = Struct.new(:klass, :method_name, :method_type, keyword_init: true)
18
+ MissingBlockError = Struct.new(:klass, :method_name, :method_type, keyword_init: true)
19
+
20
+ UnresolvedOverloadingError = Struct.new(:klass, :method_name, :method_types, keyword_init: true)
21
+
22
+ def self.format_param(param)
23
+ if param.name
24
+ "`#{param.type}` (#{param.name})"
25
+ else
26
+ "`#{param.type}`"
27
+ end
28
+ end
29
+
30
+ def self.inspect_(obj)
31
+ Hook.inspect_(obj)
32
+ end
33
+
34
+ def self.to_string(error)
35
+ method = "#{error.klass.name}#{error.method_name}"
36
+ case error
37
+ when ArgumentTypeError
38
+ "[#{method}] ArgumentTypeError: expected #{format_param error.param} but given `#{inspect_(error.value)}`"
39
+ when BlockArgumentTypeError
40
+ "[#{method}] BlockArgumentTypeError: expected #{format_param error.param} but given `#{inspect_(error.value)}`"
41
+ when ArgumentError
42
+ "[#{method}] ArgumentError: expected method type #{error.method_type}"
43
+ when BlockArgumentError
44
+ "[#{method}] BlockArgumentError: expected method type #{error.method_type}"
45
+ when ReturnTypeError
46
+ "[#{method}] ReturnTypeError: expected `#{error.type}` but returns `#{inspect_(error.value)}`"
47
+ when BlockReturnTypeError
48
+ "[#{method}] BlockReturnTypeError: expected `#{error.type}` but returns `#{inspect_(error.value)}`"
49
+ when UnexpectedBlockError
50
+ "[#{method}] UnexpectedBlockError: unexpected block is given for `#{error.method_type}`"
51
+ when MissingBlockError
52
+ "[#{method}] MissingBlockError: required block is missing for `#{error.method_type}`"
53
+ when UnresolvedOverloadingError
54
+ "[#{method}] UnresolvedOverloadingError: couldn't find a suitable overloading"
55
+ else
56
+ raise "Unexpected error: #{inspect_(error)}"
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end