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,183 @@
1
+ module RBS
2
+ module Test
3
+ module TypeAssertions
4
+ module ClassMethods
5
+ attr_reader :target
6
+
7
+ def library(*libs)
8
+ @libs = libs
9
+ @env = nil
10
+ @target = nil
11
+ end
12
+
13
+ def env
14
+ @env ||= begin
15
+ loader = RBS::EnvironmentLoader.new
16
+ (@libs || []).each do |lib|
17
+ loader.add library: lib
18
+ end
19
+
20
+ RBS::Environment.new.tap do |env|
21
+ loader.load(env: env)
22
+ end
23
+ end
24
+ end
25
+
26
+ def builder
27
+ @builder ||= DefinitionBuilder.new(env: env)
28
+ end
29
+
30
+ def testing(type_or_string)
31
+ type = case type_or_string
32
+ when String
33
+ RBS::Parser.parse_type(type_or_string, variables: [])
34
+ else
35
+ type_or_string
36
+ end
37
+
38
+ definition = case type
39
+ when Types::ClassInstance
40
+ builder.build_instance(type.name)
41
+ when Types::ClassSingleton
42
+ builder.build_singleton(type.name)
43
+ else
44
+ raise "Test target should be class instance or class singleton: #{type}"
45
+ end
46
+
47
+ @target = [type, definition]
48
+ end
49
+ end
50
+
51
+ def self.included(base)
52
+ base.extend ClassMethods
53
+ end
54
+
55
+ def env
56
+ self.class.env
57
+ end
58
+
59
+ def builder
60
+ self.class.builder
61
+ end
62
+
63
+ def targets
64
+ @targets ||= []
65
+ end
66
+
67
+ def target
68
+ targets.last || self.class.target
69
+ end
70
+
71
+ def testing(type_or_string)
72
+ type = case type_or_string
73
+ when String
74
+ RBS::Parser.parse_type(type_or_string, variables: [])
75
+ else
76
+ type_or_string
77
+ end
78
+
79
+ definition = case type
80
+ when Types::ClassInstance
81
+ builder.build_instance(type.name)
82
+ when Types::ClassSingleton
83
+ builder.build_singleton(type.name)
84
+ else
85
+ raise "Test target should be class instance or class singleton: #{type}"
86
+ end
87
+
88
+ targets.push [type, definition]
89
+
90
+ if block_given?
91
+ begin
92
+ yield
93
+ ensure
94
+ targets.pop
95
+ end
96
+ else
97
+ [type, definition]
98
+ end
99
+ end
100
+
101
+ ruby2_keywords def assert_send_type(method_type, receiver, method, *args, &block)
102
+ trace = []
103
+ spy = Spy.wrap(receiver, method)
104
+ spy.callback = -> (result) { trace << result }
105
+
106
+ exception = nil
107
+
108
+ begin
109
+ spy.wrapped_object.__send__(method, *args, &block)
110
+ rescue => exn
111
+ exception = exn
112
+ end
113
+
114
+ mt = case method_type
115
+ when String
116
+ RBS::Parser.parse_method_type(method_type, variables: [])
117
+ when RBS::MethodType
118
+ method_type
119
+ end
120
+
121
+ typecheck = TypeCheck.new(self_class: receiver.class, builder: builder)
122
+ errors = typecheck.method_call(method, mt, trace.last, errors: [])
123
+
124
+ assert_empty errors.map {|x| RBS::Test::Errors.to_string(x) }, "Call trace does not match with given method type: #{trace.last.inspect}"
125
+
126
+ type, definition = target
127
+ method_types = case
128
+ when definition.instance_type?
129
+ subst = Substitution.build(definition.declaration.type_params.each.map(&:name),
130
+ type.args)
131
+ definition.methods[method].method_types.map do |method_type|
132
+ method_type.sub(subst)
133
+ end
134
+ when definition.class_type?
135
+ definition.methods[method].method_types
136
+ end
137
+
138
+ all_errors = method_types.map {|t| typecheck.method_call(method, t, trace.last, errors: []) }
139
+ assert all_errors.any? {|es| es.empty? }, "Call trace does not match one of method definitions:\n #{trace.last.inspect}\n #{method_types.join(" | ")}"
140
+
141
+ if exception
142
+ raise exception
143
+ end
144
+ end
145
+
146
+ ruby2_keywords def refute_send_type(method_type, receiver, method, *args, &block)
147
+ trace = []
148
+ spy = Spy.wrap(receiver, method)
149
+ spy.callback = -> (result) { trace << result }
150
+
151
+ exception = nil
152
+ begin
153
+ spy.wrapped_object.__send__(method, *args, &block)
154
+ rescue Exception => exn
155
+ exception = exn
156
+ end
157
+
158
+ mt = case method_type
159
+ when String
160
+ RBS::Parser.parse_method_type(method_type, variables: [])
161
+ when RBS::MethodType
162
+ method_type
163
+ end
164
+
165
+ mt = mt.update(block: if mt.block
166
+ MethodType::Block.new(
167
+ type: mt.block.type.with_return_type(Types::Bases::Any.new(location: nil)),
168
+ required: mt.block.required
169
+ )
170
+ end,
171
+ type: mt.type.with_return_type(Types::Bases::Any.new(location: nil)))
172
+
173
+ typecheck = TypeCheck.new(self_class: receiver.class, builder: builder)
174
+ errors = typecheck.method_call(method, mt, trace.last, errors: [])
175
+
176
+ assert_operator exception, :is_a?, ::Exception
177
+ assert_empty errors.map {|x| RBS::Test::Errors.to_string(x) }
178
+
179
+ exception
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,254 @@
1
+ module RBS
2
+ module Test
3
+ class TypeCheck
4
+ attr_reader :self_class
5
+ attr_reader :builder
6
+
7
+ def initialize(self_class:, builder:)
8
+ @self_class = self_class
9
+ @builder = builder
10
+ end
11
+
12
+ def method_call(method_name, method_type, call, errors:)
13
+ args(method_name, method_type, method_type.type, call.method_call, errors, type_error: Errors::ArgumentTypeError, argument_error: Errors::ArgumentError)
14
+ self.return(method_name, method_type, method_type.type, call.method_call, errors, return_error: Errors::ReturnTypeError)
15
+
16
+ if method_type.block
17
+ case
18
+ when !call.block_calls.empty?
19
+ call.block_calls.each do |block_call|
20
+ args(method_name, method_type, method_type.block.type, block_call, errors, type_error: Errors::BlockArgumentTypeError, argument_error: Errors::BlockArgumentError)
21
+ self.return(method_name, method_type, method_type.block.type, block_call, errors, return_error: Errors::BlockReturnTypeError)
22
+ end
23
+ when !call.block_given
24
+ # Block is not given
25
+ if method_type.block.required
26
+ errors << Errors::MissingBlockError.new(klass: self_class, method_name: method_name, method_type: method_type)
27
+ end
28
+ else
29
+ # Block is given, but not yielded
30
+ end
31
+ else
32
+ if call.block_given
33
+ errors << Errors::UnexpectedBlockError.new(klass: self_class, method_name: method_name, method_type: method_type)
34
+ end
35
+ end
36
+
37
+ errors
38
+ end
39
+
40
+ def args(method_name, method_type, fun, call, errors, type_error:, argument_error:)
41
+ test = zip_args(call.arguments, fun) do |val, param|
42
+ unless self.value(val, param.type)
43
+ errors << type_error.new(klass: self_class,
44
+ method_name: method_name,
45
+ method_type: method_type,
46
+ param: param,
47
+ value: val)
48
+ end
49
+ end
50
+
51
+ unless test
52
+ errors << argument_error.new(klass: self_class,
53
+ method_name: method_name,
54
+ method_type: method_type)
55
+ end
56
+ end
57
+
58
+ def return(method_name, method_type, fun, call, errors, return_error:)
59
+ unless call.exception
60
+ unless value(call.return_value, fun.return_type)
61
+ errors << return_error.new(klass: self_class,
62
+ method_name: method_name,
63
+ method_type: method_type,
64
+ type: fun.return_type,
65
+ value: call.return_value)
66
+ end
67
+ end
68
+ end
69
+
70
+ def zip_keyword_args(hash, fun)
71
+ fun.required_keywords.each do |name, param|
72
+ if hash.key?(name)
73
+ yield(hash[name], param)
74
+ else
75
+ return false
76
+ end
77
+ end
78
+
79
+ fun.optional_keywords.each do |name, param|
80
+ if hash.key?(name)
81
+ yield(hash[name], param)
82
+ end
83
+ end
84
+
85
+ hash.each do |name, value|
86
+ next if fun.required_keywords.key?(name)
87
+ next if fun.optional_keywords.key?(name)
88
+
89
+ if fun.rest_keywords
90
+ yield value, fun.rest_keywords
91
+ else
92
+ return false
93
+ end
94
+ end
95
+
96
+ true
97
+ end
98
+
99
+ def keyword?(value)
100
+ value.is_a?(Hash) && value.keys.all? {|key| key.is_a?(Symbol) }
101
+ end
102
+
103
+ def zip_args(args, fun, &block)
104
+ case
105
+ when args.empty?
106
+ if fun.required_positionals.empty? && fun.trailing_positionals.empty? && fun.required_keywords.empty?
107
+ true
108
+ else
109
+ false
110
+ end
111
+ when !fun.required_positionals.empty?
112
+ yield_self do
113
+ param, fun_ = fun.drop_head
114
+ yield(args.first, param)
115
+ zip_args(args.drop(1), fun_, &block)
116
+ end
117
+ when fun.has_keyword?
118
+ yield_self do
119
+ hash = args.last
120
+ if keyword?(hash)
121
+ zip_keyword_args(hash, fun, &block) &&
122
+ zip_args(args.take(args.size - 1),
123
+ fun.update(required_keywords: {}, optional_keywords: {}, rest_keywords: nil),
124
+ &block)
125
+ else
126
+ fun.required_keywords.empty? &&
127
+ zip_args(args,
128
+ fun.update(required_keywords: {}, optional_keywords: {}, rest_keywords: nil),
129
+ &block)
130
+ end
131
+ end
132
+ when !fun.trailing_positionals.empty?
133
+ yield_self do
134
+ param, fun_ = fun.drop_tail
135
+ yield(args.last, param)
136
+ zip_args(args.take(args.size - 1), fun_, &block)
137
+ end
138
+ when !fun.optional_positionals.empty?
139
+ yield_self do
140
+ param, fun_ = fun.drop_head
141
+ yield(args.first, param)
142
+ zip_args(args.drop(1), fun_, &block)
143
+ end
144
+ when fun.rest_positionals
145
+ yield_self do
146
+ yield(args.first, fun.rest_positionals)
147
+ zip_args(args.drop(1), fun, &block)
148
+ end
149
+ else
150
+ false
151
+ end
152
+ end
153
+
154
+ def value(val, type)
155
+ case type
156
+ when Types::Bases::Any
157
+ true
158
+ when Types::Bases::Bool
159
+ true
160
+ when Types::Bases::Top
161
+ true
162
+ when Types::Bases::Bottom
163
+ false
164
+ when Types::Bases::Void
165
+ true
166
+ when Types::Bases::Self
167
+ Test.call(val, IS_AP, self_class)
168
+ when Types::Bases::Nil
169
+ Test.call(val, IS_AP, ::NilClass)
170
+ when Types::Bases::Class
171
+ Test.call(val, IS_AP, Class)
172
+ when Types::Bases::Instance
173
+ Test.call(val, IS_AP, self_class)
174
+ when Types::ClassInstance
175
+ klass = Object.const_get(type.name.to_s)
176
+ case
177
+ when klass == ::Array
178
+ Test.call(val, IS_AP, klass) && val.all? {|v| value(v, type.args[0]) }
179
+ when klass == ::Hash
180
+ Test.call(val, IS_AP, klass) && val.all? {|k, v| value(k, type.args[0]) && value(v, type.args[1]) }
181
+ when klass == ::Range
182
+ Test.call(val, IS_AP, klass) && value(val.begin, type.args[0]) && value(val.end, type.args[0])
183
+ when klass == ::Enumerator
184
+ if Test.call(val, IS_AP, klass)
185
+ case val.size
186
+ when Float::INFINITY
187
+ values = []
188
+ ret = self
189
+ val.lazy.take(10).each do |*args|
190
+ values << args
191
+ nil
192
+ end
193
+ else
194
+ values = []
195
+ ret = val.each do |*args|
196
+ values << args
197
+ nil
198
+ end
199
+ end
200
+
201
+ values.all? do |v|
202
+ if v.size == 1
203
+ # Only one block argument.
204
+ value(v[0], type.args[0]) || value(v, type.args[0])
205
+ else
206
+ value(v, type.args[0])
207
+ end
208
+ end &&
209
+ if ret.equal?(self)
210
+ type.args[1].is_a?(Types::Bases::Bottom)
211
+ else
212
+ value(ret, type.args[1])
213
+ end
214
+ end
215
+ else
216
+ Test.call(val, IS_AP, klass)
217
+ end
218
+ when Types::ClassSingleton
219
+ klass = Object.const_get(type.name.to_s)
220
+ val == klass
221
+ when Types::Interface
222
+ methods = Set.new(Test.call(val, METHODS))
223
+ decl = builder.env.find_class(type.name)
224
+ if (definition = builder.build_interface(type.name, decl))
225
+ definition.methods.each_key.all? do |method_name|
226
+ methods.member?(method_name)
227
+ end
228
+ end
229
+ when Types::Variable
230
+ true
231
+ when Types::Literal
232
+ val == type.literal
233
+ when Types::Union
234
+ type.types.any? {|type| value(val, type) }
235
+ when Types::Intersection
236
+ type.types.all? {|type| value(val, type) }
237
+ when Types::Optional
238
+ Test.call(val, IS_AP, ::NilClass) || value(val, type.type)
239
+ when Types::Alias
240
+ value(val, builder.expand_alias(type.name))
241
+ when Types::Tuple
242
+ Test.call(val, IS_AP, ::Array) &&
243
+ type.types.map.with_index {|ty, index| value(val[index], ty) }.all?
244
+ when Types::Record
245
+ Test::call(val, IS_AP, ::Hash)
246
+ when Types::Proc
247
+ Test::call(val, IS_AP, ::Proc)
248
+ else
249
+ false
250
+ end
251
+ end
252
+ end
253
+ end
254
+ end
@@ -0,0 +1,26 @@
1
+ require "rbs/test/spy"
2
+ require "rbs/test/errors"
3
+ require "rbs/test/type_check"
4
+ require "rbs/test/hook"
5
+
6
+ module RBS
7
+ module Test
8
+ IS_AP = Kernel.instance_method(:is_a?)
9
+ DEFINE_METHOD = Module.instance_method(:define_method)
10
+ INSTANCE_EVAL = BasicObject.instance_method(:instance_eval)
11
+ INSTANCE_EXEC = BasicObject.instance_method(:instance_exec)
12
+ METHOD = Kernel.instance_method(:method)
13
+ CLASS = Kernel.instance_method(:class)
14
+ SINGLETON_CLASS = Kernel.instance_method(:singleton_class)
15
+ PP = Kernel.instance_method(:pp)
16
+ INSPECT = Kernel.instance_method(:inspect)
17
+ METHODS = Kernel.instance_method(:methods)
18
+
19
+ ArgumentsReturn = Struct.new(:arguments, :return_value, :exception, keyword_init: true)
20
+ CallTrace = Struct.new(:method_name, :method_call, :block_calls, :block_given, keyword_init: true)
21
+
22
+ def self.call(receiver, method, *args, **kwargs, &block)
23
+ method.bind_call(receiver, *args, **kwargs, &block)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,70 @@
1
+ module RBS
2
+ class TypeName
3
+ attr_reader :namespace
4
+ attr_reader :name
5
+ attr_reader :kind
6
+
7
+ def initialize(namespace:, name:)
8
+ @namespace = namespace
9
+ @name = name
10
+ @kind = case name.to_s[0,1]
11
+ when /[A-Z]/
12
+ :class
13
+ when /[a-z]/
14
+ :alias
15
+ when "_"
16
+ :interface
17
+ end
18
+ end
19
+
20
+ def ==(other)
21
+ other.is_a?(self.class) && other.namespace == namespace && other.name == name
22
+ end
23
+
24
+ alias eql? ==
25
+
26
+ def hash
27
+ self.class.hash ^ namespace.hash ^ name.hash
28
+ end
29
+
30
+ def to_s
31
+ "#{namespace.to_s}#{name}"
32
+ end
33
+
34
+ def to_json(*a)
35
+ to_s.to_json(*a)
36
+ end
37
+
38
+ def to_namespace
39
+ namespace.append(self.name)
40
+ end
41
+
42
+ def class?
43
+ kind == :class
44
+ end
45
+
46
+ def alias?
47
+ kind == :alias
48
+ end
49
+
50
+ def absolute!
51
+ self.class.new(namespace: namespace.absolute!, name: name)
52
+ end
53
+
54
+ def absolute?
55
+ namespace.absolute?
56
+ end
57
+
58
+ def relative!
59
+ self.class.new(namespace: namespace.relative!, name: name)
60
+ end
61
+
62
+ def interface?
63
+ kind == :interface
64
+ end
65
+
66
+ def with_prefix(namespace)
67
+ self.class.new(namespace: namespace + self.namespace, name: name)
68
+ end
69
+ end
70
+ end