steep 0.11.1 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +27 -0
- data/.gitmodules +3 -0
- data/CHANGELOG.md +5 -0
- data/README.md +48 -90
- data/Rakefile +10 -6
- data/Steepfile +1 -0
- data/bin/setup +1 -0
- data/bin/smoke_runner.rb +9 -14
- data/exe/rbs +3 -0
- data/exe/ruby-signature +3 -0
- data/exe/steep +1 -0
- data/lib/steep.rb +32 -26
- data/lib/steep/annotation_parser.rb +167 -0
- data/lib/steep/ast/annotation/collection.rb +7 -7
- data/lib/steep/ast/types.rb +60 -0
- data/lib/steep/ast/types/any.rb +1 -1
- data/lib/steep/ast/types/factory.rb +535 -0
- data/lib/steep/ast/types/name.rb +3 -3
- data/lib/steep/ast/types/var.rb +1 -1
- data/lib/steep/cli.rb +56 -240
- data/lib/steep/drivers/annotations.rb +36 -19
- data/lib/steep/drivers/check.rb +55 -91
- data/lib/steep/drivers/init.rb +54 -0
- data/lib/steep/drivers/langserver.rb +241 -150
- data/lib/steep/drivers/print_project.rb +56 -0
- data/lib/steep/drivers/signature_error_printer.rb +25 -0
- data/lib/steep/drivers/trace_printer.rb +25 -0
- data/lib/steep/drivers/utils/driver_helper.rb +26 -0
- data/lib/steep/drivers/validate.rb +18 -38
- data/lib/steep/drivers/vendor.rb +46 -0
- data/lib/steep/drivers/watch.rb +78 -140
- data/lib/steep/errors.rb +22 -13
- data/lib/steep/interface/interface.rb +91 -0
- data/lib/steep/interface/method.rb +0 -4
- data/lib/steep/interface/method_type.rb +362 -2
- data/lib/steep/interface/substitution.rb +22 -0
- data/lib/steep/project.rb +25 -233
- data/lib/steep/project/dsl.rb +132 -0
- data/lib/steep/project/file.rb +93 -76
- data/lib/steep/project/file_loader.rb +63 -0
- data/lib/steep/project/options.rb +7 -0
- data/lib/steep/project/target.rb +190 -0
- data/lib/steep/signature/errors.rb +25 -77
- data/lib/steep/signature/validator.rb +122 -0
- data/lib/steep/source.rb +12 -7
- data/lib/steep/subtyping/check.rb +357 -633
- data/lib/steep/subtyping/constraints.rb +2 -2
- data/lib/steep/subtyping/trace.rb +23 -0
- data/lib/steep/type_construction.rb +509 -455
- data/lib/steep/type_inference/constant_env.rb +16 -24
- data/lib/steep/type_inference/type_env.rb +26 -18
- data/lib/steep/version.rb +1 -1
- data/sample/Steepfile +6 -0
- data/sample/lib/conference.rb +12 -0
- data/sample/sig/conference.rbs +6 -0
- data/smoke/alias/Steepfile +4 -0
- data/smoke/alias/a.rb +2 -2
- data/smoke/alias/{a.rbi → a.rbs} +1 -1
- data/smoke/and/Steepfile +4 -0
- data/smoke/array/Steepfile +4 -0
- data/smoke/array/a.rb +2 -2
- data/smoke/array/b.rb +4 -4
- data/smoke/array/c.rb +2 -2
- data/smoke/block/Steepfile +5 -0
- data/smoke/block/{a.rbi → a.rbs} +1 -1
- data/smoke/block/{c.rbi → c.rbs} +0 -0
- data/smoke/block/d.rb +6 -6
- data/smoke/case/Steepfile +4 -0
- data/smoke/case/a.rb +4 -3
- data/smoke/class/Steepfile +4 -0
- data/smoke/class/a.rb +1 -4
- data/smoke/class/a.rbs +24 -0
- data/smoke/class/h.rb +6 -2
- data/smoke/class/{h.rbi → h.rbs} +1 -2
- data/smoke/class/i.rb +1 -2
- data/smoke/class/i.rbs +9 -0
- data/smoke/const/Steepfile +4 -0
- data/smoke/dstr/Steepfile +4 -0
- data/smoke/ensure/Steepfile +4 -0
- data/smoke/ensure/a.rb +1 -1
- data/smoke/enumerator/Steepfile +4 -0
- data/smoke/enumerator/a.rb +7 -7
- data/smoke/enumerator/b.rb +6 -6
- data/smoke/extension/Steepfile +4 -0
- data/smoke/extension/{a.rbi → a.rbs} +2 -2
- data/smoke/extension/{e.rbi → e.rbs} +2 -2
- data/smoke/hash/Steepfile +4 -0
- data/smoke/hash/{a.rbi → a.rbs} +0 -0
- data/smoke/hash/b.rb +2 -2
- data/smoke/hash/c.rb +1 -1
- data/smoke/hash/e.rbs +3 -0
- data/smoke/hash/f.rb +1 -1
- data/smoke/hello/Steepfile +4 -0
- data/smoke/hello/hello.rbs +7 -0
- data/smoke/if/Steepfile +4 -0
- data/smoke/implements/Steepfile +4 -0
- data/smoke/implements/a.rbs +6 -0
- data/smoke/initialize/Steepfile +4 -0
- data/smoke/initialize/a.rbs +3 -0
- data/smoke/integer/Steepfile +4 -0
- data/smoke/integer/a.rb +5 -3
- data/smoke/interface/Steepfile +4 -0
- data/smoke/interface/{a.rbi → a.rbs} +0 -0
- data/smoke/kwbegin/Steepfile +4 -0
- data/smoke/lambda/Steepfile +4 -0
- data/smoke/lambda/a.rb +9 -2
- data/smoke/literal/Steepfile +4 -0
- data/smoke/literal/{literal_methods.rbi → literal_methods.rbs} +0 -0
- data/smoke/map/Steepfile +4 -0
- data/smoke/map/a.rb +1 -1
- data/smoke/method/Steepfile +4 -0
- data/smoke/method/{a.rbi → a.rbs} +0 -0
- data/smoke/method/b.rb +1 -4
- data/smoke/method/d.rb +1 -0
- data/smoke/method/d.rbs +3 -0
- data/smoke/module/Steepfile +4 -0
- data/smoke/module/a.rb +1 -1
- data/smoke/module/a.rbs +16 -0
- data/smoke/module/c.rb +1 -1
- data/smoke/regexp/Steepfile +4 -0
- data/smoke/regexp/a.rb +2 -2
- data/smoke/regexp/b.rb +16 -16
- data/smoke/regression/Steepfile +5 -0
- data/smoke/regression/array.rb +2 -2
- data/smoke/regression/hash.rb +2 -2
- data/smoke/regression/poly_new.rb +2 -0
- data/smoke/regression/poly_new.rbs +4 -0
- data/smoke/regression/set_divide.rb +2 -2
- data/smoke/rescue/Steepfile +4 -0
- data/smoke/rescue/a.rb +1 -1
- data/smoke/self/Steepfile +4 -0
- data/smoke/self/a.rbs +4 -0
- data/smoke/skip/Steepfile +4 -0
- data/smoke/stdout/Steepfile +4 -0
- data/smoke/stdout/{a.rbi → a.rbs} +1 -1
- data/smoke/super/Steepfile +4 -0
- data/smoke/super/a.rbs +10 -0
- data/smoke/type_case/Steepfile +4 -0
- data/smoke/type_case/a.rb +1 -1
- data/smoke/yield/Steepfile +4 -0
- data/smoke/yield/a.rb +2 -2
- data/steep.gemspec +14 -7
- data/vendor/ruby-signature/.github/workflows/ruby.yml +27 -0
- data/vendor/ruby-signature/.gitignore +12 -0
- data/vendor/ruby-signature/.rubocop.yml +15 -0
- data/vendor/ruby-signature/BSDL +22 -0
- data/vendor/ruby-signature/COPYING +56 -0
- data/vendor/ruby-signature/Gemfile +6 -0
- data/vendor/ruby-signature/README.md +93 -0
- data/vendor/ruby-signature/Rakefile +66 -0
- data/vendor/ruby-signature/bin/annotate-with-rdoc +156 -0
- data/vendor/ruby-signature/bin/console +14 -0
- data/vendor/ruby-signature/bin/query-rdoc +103 -0
- data/vendor/ruby-signature/bin/setup +10 -0
- data/vendor/ruby-signature/bin/sort +88 -0
- data/vendor/ruby-signature/bin/test_runner.rb +17 -0
- data/vendor/ruby-signature/docs/CONTRIBUTING.md +97 -0
- data/vendor/ruby-signature/docs/sigs.md +148 -0
- data/vendor/ruby-signature/docs/stdlib.md +152 -0
- data/vendor/ruby-signature/docs/syntax.md +528 -0
- data/vendor/ruby-signature/exe/rbs +3 -0
- data/vendor/ruby-signature/exe/ruby-signature +7 -0
- data/vendor/ruby-signature/lib/ruby/signature.rb +64 -0
- data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +29 -0
- data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +29 -0
- data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +391 -0
- data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +364 -0
- data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +52 -0
- data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +54 -0
- data/vendor/ruby-signature/lib/ruby/signature/cli.rb +534 -0
- data/vendor/ruby-signature/lib/ruby/signature/constant.rb +28 -0
- data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +152 -0
- data/vendor/ruby-signature/lib/ruby/signature/definition.rb +172 -0
- data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +921 -0
- data/vendor/ruby-signature/lib/ruby/signature/environment.rb +283 -0
- data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +138 -0
- data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +126 -0
- data/vendor/ruby-signature/lib/ruby/signature/errors.rb +189 -0
- data/vendor/ruby-signature/lib/ruby/signature/location.rb +104 -0
- data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +125 -0
- data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +93 -0
- data/vendor/ruby-signature/lib/ruby/signature/parser.y +1343 -0
- data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +441 -0
- data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +579 -0
- data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +383 -0
- data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +48 -0
- data/vendor/ruby-signature/lib/ruby/signature/test.rb +28 -0
- data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +63 -0
- data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +290 -0
- data/vendor/ruby-signature/lib/ruby/signature/test/setup.rb +58 -0
- data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +324 -0
- data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +185 -0
- data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +256 -0
- data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +72 -0
- data/vendor/ruby-signature/lib/ruby/signature/types.rb +932 -0
- data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +140 -0
- data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +49 -0
- data/vendor/ruby-signature/lib/ruby/signature/version.rb +5 -0
- data/vendor/ruby-signature/lib/ruby/signature/writer.rb +271 -0
- data/vendor/ruby-signature/ruby-signature.gemspec +45 -0
- data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +3 -0
- data/vendor/ruby-signature/stdlib/base64/base64.rbs +15 -0
- data/vendor/ruby-signature/stdlib/builtin/array.rbs +1997 -0
- data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +280 -0
- data/vendor/ruby-signature/stdlib/builtin/binding.rbs +177 -0
- data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +35 -0
- data/vendor/ruby-signature/stdlib/builtin/class.rbs +145 -0
- data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +116 -0
- data/vendor/ruby-signature/stdlib/builtin/complex.rbs +400 -0
- data/vendor/ruby-signature/stdlib/builtin/constants.rbs +37 -0
- data/vendor/ruby-signature/stdlib/builtin/data.rbs +5 -0
- data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +2 -0
- data/vendor/ruby-signature/stdlib/builtin/dir.rbs +419 -0
- data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +606 -0
- data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +404 -0
- data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +260 -0
- data/vendor/ruby-signature/stdlib/builtin/errno.rbs +781 -0
- data/vendor/ruby-signature/stdlib/builtin/errors.rbs +582 -0
- data/vendor/ruby-signature/stdlib/builtin/exception.rbs +193 -0
- data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +40 -0
- data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +68 -0
- data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +12 -0
- data/vendor/ruby-signature/stdlib/builtin/file.rbs +476 -0
- data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +59 -0
- data/vendor/ruby-signature/stdlib/builtin/float.rbs +696 -0
- data/vendor/ruby-signature/stdlib/builtin/gc.rbs +121 -0
- data/vendor/ruby-signature/stdlib/builtin/hash.rbs +1029 -0
- data/vendor/ruby-signature/stdlib/builtin/integer.rbs +710 -0
- data/vendor/ruby-signature/stdlib/builtin/io.rbs +683 -0
- data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +574 -0
- data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +135 -0
- data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +141 -0
- data/vendor/ruby-signature/stdlib/builtin/math.rbs +66 -0
- data/vendor/ruby-signature/stdlib/builtin/method.rbs +182 -0
- data/vendor/ruby-signature/stdlib/builtin/module.rbs +248 -0
- data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +82 -0
- data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +409 -0
- data/vendor/ruby-signature/stdlib/builtin/object.rbs +824 -0
- data/vendor/ruby-signature/stdlib/builtin/proc.rbs +426 -0
- data/vendor/ruby-signature/stdlib/builtin/process.rbs +354 -0
- data/vendor/ruby-signature/stdlib/builtin/random.rbs +93 -0
- data/vendor/ruby-signature/stdlib/builtin/range.rbs +226 -0
- data/vendor/ruby-signature/stdlib/builtin/rational.rbs +424 -0
- data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +10 -0
- data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +131 -0
- data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +14 -0
- data/vendor/ruby-signature/stdlib/builtin/signal.rbs +55 -0
- data/vendor/ruby-signature/stdlib/builtin/string.rbs +770 -0
- data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +13 -0
- data/vendor/ruby-signature/stdlib/builtin/struct.rbs +40 -0
- data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +230 -0
- data/vendor/ruby-signature/stdlib/builtin/thread.rbs +1112 -0
- data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +23 -0
- data/vendor/ruby-signature/stdlib/builtin/time.rbs +739 -0
- data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +91 -0
- data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +46 -0
- data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +159 -0
- data/vendor/ruby-signature/stdlib/builtin/warning.rbs +17 -0
- data/vendor/ruby-signature/stdlib/erb/erb.rbs +18 -0
- data/vendor/ruby-signature/stdlib/find/find.rbs +44 -0
- data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +21 -0
- data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +23 -0
- data/vendor/ruby-signature/stdlib/prime/prime.rbs +188 -0
- data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +9 -0
- data/vendor/ruby-signature/stdlib/set/set.rbs +77 -0
- data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +53 -0
- metadata +244 -54
- data/.travis.yml +0 -7
- data/lib/steep/ast/signature/alias.rb +0 -19
- data/lib/steep/ast/signature/class.rb +0 -33
- data/lib/steep/ast/signature/const.rb +0 -17
- data/lib/steep/ast/signature/env.rb +0 -138
- data/lib/steep/ast/signature/extension.rb +0 -21
- data/lib/steep/ast/signature/gvar.rb +0 -17
- data/lib/steep/ast/signature/interface.rb +0 -31
- data/lib/steep/ast/signature/members.rb +0 -115
- data/lib/steep/ast/signature/module.rb +0 -21
- data/lib/steep/drivers/print_interface.rb +0 -94
- data/lib/steep/drivers/scaffold.rb +0 -321
- data/lib/steep/drivers/utils/each_signature.rb +0 -31
- data/lib/steep/interface/abstract.rb +0 -68
- data/lib/steep/interface/builder.rb +0 -637
- data/lib/steep/interface/instantiated.rb +0 -163
- data/lib/steep/interface/ivar_chain.rb +0 -26
- data/lib/steep/parser.y +0 -1278
- data/lib/steep/project/listener.rb +0 -53
- data/smoke/class/a.rbi +0 -24
- data/smoke/class/d.rb +0 -9
- data/smoke/class/e.rb +0 -12
- data/smoke/class/i.rbi +0 -9
- data/smoke/hash/e.rbi +0 -3
- data/smoke/hello/hello.rbi +0 -7
- data/smoke/implements/a.rbi +0 -6
- data/smoke/initialize/a.rbi +0 -3
- data/smoke/module/a.rbi +0 -16
- data/smoke/self/a.rbi +0 -4
- data/smoke/super/a.rbi +0 -10
- data/stdlib/builtin.rbi +0 -787
@@ -199,7 +199,7 @@ module Steep
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
-
def solution(checker, variance:, variables:)
|
202
|
+
def solution(checker, variance:, variables:, self_type:)
|
203
203
|
vars = []
|
204
204
|
types = []
|
205
205
|
|
@@ -210,7 +210,7 @@ module Steep
|
|
210
210
|
lower_bound = lower_bound(var)
|
211
211
|
relation = Relation.new(sub_type: lower_bound, super_type: upper_bound)
|
212
212
|
|
213
|
-
checker.check(relation, constraints: self.class.empty).yield_self do |result|
|
213
|
+
checker.check(relation, self_type: self_type, constraints: self.class.empty).yield_self do |result|
|
214
214
|
if result.success?
|
215
215
|
vars << var
|
216
216
|
|
@@ -7,6 +7,29 @@ module Steep
|
|
7
7
|
@array = array
|
8
8
|
end
|
9
9
|
|
10
|
+
def interface(sub, sup, &block)
|
11
|
+
push :interface, sub, sup, &block
|
12
|
+
end
|
13
|
+
|
14
|
+
def method(name, sub, sup, &block)
|
15
|
+
push :method, sub, sup, name, &block
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_type(name, sub, sup, &block)
|
19
|
+
push :method_type, sub, sup, name, &block
|
20
|
+
end
|
21
|
+
|
22
|
+
def type(sub, sup, &block)
|
23
|
+
push :type, sub, sup, &block
|
24
|
+
end
|
25
|
+
|
26
|
+
def push(*xs)
|
27
|
+
array << xs
|
28
|
+
yield
|
29
|
+
ensure
|
30
|
+
array.pop
|
31
|
+
end
|
32
|
+
|
10
33
|
def add(sup, sub)
|
11
34
|
array << [sup, sub]
|
12
35
|
yield
|
@@ -6,22 +6,20 @@ module Steep
|
|
6
6
|
attr_reader :method_type
|
7
7
|
attr_reader :return_type
|
8
8
|
attr_reader :constructor
|
9
|
+
attr_reader :super_method
|
9
10
|
|
10
|
-
def initialize(name:, method:, method_type:, return_type:, constructor:)
|
11
|
+
def initialize(name:, method:, method_type:, return_type:, constructor:, super_method:)
|
11
12
|
@name = name
|
12
13
|
@method = method
|
13
14
|
@return_type = return_type
|
14
15
|
@method_type = method_type
|
15
16
|
@constructor = constructor
|
17
|
+
@super_method = super_method
|
16
18
|
end
|
17
19
|
|
18
20
|
def block_type
|
19
21
|
method_type&.block
|
20
22
|
end
|
21
|
-
|
22
|
-
def super_method
|
23
|
-
method&.super_method
|
24
|
-
end
|
25
23
|
end
|
26
24
|
|
27
25
|
class BlockContext
|
@@ -51,8 +49,10 @@ module Steep
|
|
51
49
|
attr_reader :implement_name
|
52
50
|
attr_reader :current_namespace
|
53
51
|
attr_reader :class_name
|
52
|
+
attr_reader :instance_definition
|
53
|
+
attr_reader :module_definition
|
54
54
|
|
55
|
-
def initialize(instance_type:, module_type:, implement_name:, current_namespace:, const_env:, class_name:)
|
55
|
+
def initialize(instance_type:, module_type:, implement_name:, current_namespace:, const_env:, class_name:, instance_definition: nil, module_definition: nil)
|
56
56
|
@instance_type = instance_type
|
57
57
|
@module_type = module_type
|
58
58
|
@defined_instance_methods = Set.new
|
@@ -61,6 +61,8 @@ module Steep
|
|
61
61
|
@current_namespace = current_namespace
|
62
62
|
@const_env = const_env
|
63
63
|
@class_name = class_name
|
64
|
+
@instance_definition = instance_definition
|
65
|
+
@module_definition = module_definition
|
64
66
|
end
|
65
67
|
|
66
68
|
def const_context
|
@@ -107,8 +109,12 @@ module Steep
|
|
107
109
|
)
|
108
110
|
end
|
109
111
|
|
110
|
-
def
|
111
|
-
|
112
|
+
def check_relation(sub_type:, super_type:, constraints: Subtyping::Constraints.empty)
|
113
|
+
checker.check(Subtyping::Relation.new(sub_type: sub_type, super_type: super_type), self_type: self_type, constraints: constraints)
|
114
|
+
end
|
115
|
+
|
116
|
+
def for_new_method(method_name, node, args:, self_type:, definition:)
|
117
|
+
annots = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
|
112
118
|
type_env = TypeInference::TypeEnv.new(subtyping: checker,
|
113
119
|
const_env: module_context&.const_env || self.type_env.const_env)
|
114
120
|
|
@@ -116,151 +122,83 @@ module Steep
|
|
116
122
|
type_env.set(const: name, type: type)
|
117
123
|
end
|
118
124
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
module_type: class_type,
|
129
|
-
with_private: true)
|
130
|
-
end
|
131
|
-
else
|
132
|
-
checker.resolve(self_type)
|
133
|
-
end
|
134
|
-
interface_method = self_interface&.yield_self do |interface|
|
135
|
-
interface.methods[method_name]&.yield_self do |method|
|
136
|
-
if self_type.is_a?(AST::Types::Name::Base) && method.type_name == self_type.name
|
137
|
-
method
|
138
|
-
else
|
139
|
-
Interface::Method.new(type_name: self_type,
|
140
|
-
name: method_name,
|
141
|
-
types: method.types,
|
142
|
-
super_method: method,
|
143
|
-
attributes: [])
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
annotation_method = annotations.method_type(method_name)&.yield_self do |method_type|
|
149
|
-
subst = Interface::Substitution.build([],
|
150
|
-
instance_type: module_context&.instance_type || AST::Types::Instance.new,
|
151
|
-
module_type: module_context&.module_type || AST::Types::Class.new,
|
152
|
-
self_type: self_type)
|
153
|
-
Interface::Method.new(type_name: nil,
|
154
|
-
name: method_name,
|
155
|
-
types: [method_type.subst(subst)],
|
156
|
-
super_method: interface_method&.super_method,
|
157
|
-
attributes: [])
|
158
|
-
end
|
159
|
-
|
160
|
-
if interface_method && annotation_method
|
161
|
-
interface_types = interface_method.types.map do |method_type|
|
162
|
-
subst = Interface::Substitution.build(method_type.type_params)
|
163
|
-
method_type.instantiate(subst)
|
164
|
-
end
|
165
|
-
|
166
|
-
unknowns = []
|
167
|
-
annotation_types = annotation_method.types.each.with_object([]) do |method_type, array|
|
168
|
-
fresh = method_type.type_params.map {|var| AST::Types::Var.fresh(var) }
|
169
|
-
unknowns.push(*fresh)
|
170
|
-
|
171
|
-
subst = Interface::Substitution.build(method_type.type_params, fresh)
|
172
|
-
array << method_type.instantiate(subst)
|
173
|
-
end
|
174
|
-
|
175
|
-
constraints = Subtyping::Constraints.new(unknowns: unknowns)
|
176
|
-
interface_types.each do |type|
|
177
|
-
constraints.add_var(*type.free_variables.to_a)
|
178
|
-
end
|
125
|
+
definition_method_type = if definition
|
126
|
+
definition.methods[method_name]&.yield_self do |method|
|
127
|
+
method.method_types
|
128
|
+
.map {|method_type| checker.factory.method_type(method_type, self_type: self_type) }
|
129
|
+
.select {|method_type| method_type.is_a?(Interface::MethodType) }
|
130
|
+
.inject {|t1, t2| t1 + t2}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
annotation_method_type = annotations.method_type(method_name)
|
179
134
|
|
180
|
-
|
181
|
-
annotation_method.with_types(annotation_types),
|
182
|
-
interface_method.with_types(interface_types),
|
183
|
-
assumption: Set.new,
|
184
|
-
trace: Subtyping::Trace.new,
|
185
|
-
constraints: constraints)
|
135
|
+
method_type = annotation_method_type || definition_method_type
|
186
136
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
)
|
137
|
+
if annots&.return_type && method_type&.return_type
|
138
|
+
check_relation(sub_type: annots.return_type, super_type: method_type.return_type).else do |result|
|
139
|
+
typing.add_error Errors::MethodReturnTypeAnnotationMismatch.new(node: node,
|
140
|
+
method_type: method_type.return_type,
|
141
|
+
annotation_type: annots.return_type,
|
142
|
+
result: result)
|
194
143
|
end
|
195
144
|
end
|
196
145
|
|
197
|
-
|
146
|
+
# constructor_method = method&.attributes&.include?(:constructor)
|
198
147
|
|
199
|
-
|
200
|
-
when method && method.types.size == 1
|
201
|
-
method_type = method.types.first
|
202
|
-
return_type = method_type.return_type
|
148
|
+
if method_type
|
203
149
|
var_types = TypeConstruction.parameter_types(args, method_type)
|
204
|
-
unless TypeConstruction.valid_parameter_env?(var_types, args.reject {|arg| arg.type == :blockarg
|
150
|
+
unless TypeConstruction.valid_parameter_env?(var_types, args.reject {|arg| arg.type == :blockarg}, method_type.params)
|
205
151
|
typing.add_error Errors::MethodArityMismatch.new(node: node)
|
206
152
|
end
|
207
|
-
|
208
|
-
if (block_arg = args.find {|arg| arg.type == :blockarg })
|
209
|
-
if method_type.block
|
210
|
-
block_type = if method_type.block.optional?
|
211
|
-
AST::Types::Union.build(types: [method_type.block.type, AST::Builtin.nil_type])
|
212
|
-
else
|
213
|
-
method_type.block.type
|
214
|
-
end
|
215
|
-
var_types[block_arg.children[0].name] = block_type
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
when method
|
220
|
-
typing.add_error Errors::MethodDefinitionWithOverloading.new(node: node, method: method)
|
221
|
-
return_type = union_type(*method.types.map(&:return_type))
|
222
|
-
var_types = {}
|
223
|
-
else
|
224
|
-
var_types = {}
|
225
153
|
end
|
226
154
|
|
227
|
-
if
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
155
|
+
if (block_arg = args.find {|arg| arg.type == :blockarg})
|
156
|
+
if method_type&.block
|
157
|
+
block_type = if method_type.block.optional?
|
158
|
+
AST::Types::Union.build(types: [method_type.block.type, AST::Builtin.nil_type])
|
159
|
+
else
|
160
|
+
method_type.block.type
|
161
|
+
end
|
162
|
+
var_types[block_arg.children[0].name] = block_type
|
235
163
|
end
|
236
164
|
end
|
237
165
|
|
238
|
-
|
166
|
+
super_method = if definition
|
167
|
+
if (this_method = definition.methods[method_name])
|
168
|
+
if module_context&.class_name == checker.factory.type_name(this_method.defined_in.name.absolute!)
|
169
|
+
this_method.super_method
|
170
|
+
else
|
171
|
+
this_method
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
239
175
|
|
240
176
|
method_context = MethodContext.new(
|
241
177
|
name: method_name,
|
242
|
-
method:
|
178
|
+
method: definition && definition.methods[method_name],
|
243
179
|
method_type: method_type,
|
244
|
-
return_type: annots.return_type || return_type,
|
245
|
-
constructor:
|
180
|
+
return_type: annots.return_type || method_type&.return_type || AST::Builtin.any_type,
|
181
|
+
constructor: false,
|
182
|
+
super_method: super_method
|
246
183
|
)
|
247
184
|
|
248
|
-
var_types
|
249
|
-
|
185
|
+
if var_types
|
186
|
+
var_types.each do |name, type|
|
187
|
+
type_env.set(lvar: name, type: type)
|
188
|
+
end
|
250
189
|
end
|
251
190
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
ivar_types.each do |name, type|
|
257
|
-
type_env.set(ivar: name, type: type)
|
191
|
+
if definition
|
192
|
+
definition.instance_variables.each do |name, decl|
|
193
|
+
type_env.set(ivar: name, type: checker.factory.type(decl.type))
|
194
|
+
end
|
258
195
|
end
|
259
196
|
|
260
197
|
type_env = type_env.with_annotations(
|
261
198
|
lvar_types: annots.lvar_types,
|
262
199
|
ivar_types: annots.ivar_types,
|
263
200
|
const_types: annots.const_types,
|
201
|
+
self_type: annots.self_type || self_type
|
264
202
|
)
|
265
203
|
|
266
204
|
self.class.new(
|
@@ -269,7 +207,7 @@ module Steep
|
|
269
207
|
annotations: annots,
|
270
208
|
type_env: type_env,
|
271
209
|
block_context: nil,
|
272
|
-
self_type: self_type,
|
210
|
+
self_type: annots.self_type || self_type,
|
273
211
|
method_context: method_context,
|
274
212
|
typing: typing,
|
275
213
|
module_context: module_context,
|
@@ -281,13 +219,13 @@ module Steep
|
|
281
219
|
new_module_name = Names::Module.from_node(node.children.first) or raise "Unexpected module name: #{node.children.first}"
|
282
220
|
new_namespace = nested_namespace_for_module(new_module_name)
|
283
221
|
|
284
|
-
annots = source.annotations(block: node,
|
222
|
+
annots = source.annotations(block: node, factory: checker.factory, current_module: new_namespace)
|
285
223
|
module_type = AST::Builtin::Module.instance_type
|
286
224
|
|
287
225
|
implement_module_name = yield_self do
|
288
226
|
if (annotation = annots.implement_module_annotation)
|
289
227
|
absolute_name(annotation.name.name).yield_self do |absolute_name|
|
290
|
-
if checker.
|
228
|
+
if checker.factory.module_name?(absolute_name)
|
291
229
|
AST::Annotation::Implements::Module.new(name: absolute_name,
|
292
230
|
args: annotation.name.args)
|
293
231
|
else
|
@@ -297,10 +235,11 @@ module Steep
|
|
297
235
|
end
|
298
236
|
else
|
299
237
|
absolute_name(new_module_name).yield_self do |absolute_name|
|
300
|
-
if checker.
|
301
|
-
|
238
|
+
if checker.factory.module_name?(absolute_name)
|
239
|
+
absolute_name_ = checker.factory.type_name_1(absolute_name)
|
240
|
+
decl = checker.factory.env.find_class(absolute_name_)
|
302
241
|
AST::Annotation::Implements::Module.new(name: absolute_name,
|
303
|
-
args:
|
242
|
+
args: decl.type_params.each.map(&:name))
|
304
243
|
end
|
305
244
|
end
|
306
245
|
end
|
@@ -308,22 +247,25 @@ module Steep
|
|
308
247
|
|
309
248
|
if implement_module_name
|
310
249
|
module_name = implement_module_name.name
|
311
|
-
module_args = implement_module_name.args.map {|x| AST::Types::Var.new(name: x)
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
250
|
+
module_args = implement_module_name.args.map {|x| AST::Types::Var.new(name: x)}
|
251
|
+
|
252
|
+
type_name_ = checker.factory.type_name_1(implement_module_name.name)
|
253
|
+
module_decl = checker.factory.definition_builder.env.find_class(type_name_)
|
254
|
+
instance_def = checker.factory.definition_builder.build_instance(type_name_)
|
255
|
+
module_def = checker.factory.definition_builder.build_singleton(type_name_)
|
256
|
+
|
257
|
+
instance_type = AST::Types::Intersection.build(
|
258
|
+
types: [
|
259
|
+
AST::Types::Name::Instance.new(name: module_name, args: module_args),
|
260
|
+
AST::Builtin::Object.instance_type,
|
261
|
+
module_decl.self_type&.yield_self {|ty|
|
262
|
+
absolute_type = checker.factory.env.absolute_type(ty, namespace: module_decl.name.absolute!.namespace)
|
263
|
+
checker.factory.type(absolute_type)
|
264
|
+
}
|
265
|
+
].compact
|
266
|
+
)
|
322
267
|
|
323
|
-
module_type = AST::Types::
|
324
|
-
AST::Builtin::Module.instance_type,
|
325
|
-
AST::Types::Name::Module.new(name: module_name)
|
326
|
-
])
|
268
|
+
module_type = AST::Types::Name::Class.new(name: module_name, constructor: nil)
|
327
269
|
end
|
328
270
|
|
329
271
|
if annots.instance_type
|
@@ -339,7 +281,7 @@ module Steep
|
|
339
281
|
else
|
340
282
|
Names::Module.new(name: new_namespace.path.last, namespace: new_namespace.parent)
|
341
283
|
end
|
342
|
-
module_const_env = TypeInference::ConstantEnv.new(
|
284
|
+
module_const_env = TypeInference::ConstantEnv.new(factory: checker.factory, context: const_context)
|
343
285
|
|
344
286
|
module_context_ = ModuleContext.new(
|
345
287
|
instance_type: instance_type,
|
@@ -347,13 +289,15 @@ module Steep
|
|
347
289
|
implement_name: implement_module_name,
|
348
290
|
current_namespace: new_namespace,
|
349
291
|
const_env: module_const_env,
|
350
|
-
class_name: absolute_name(new_module_name)
|
292
|
+
class_name: absolute_name(new_module_name),
|
293
|
+
instance_definition: instance_def,
|
294
|
+
module_definition: module_def
|
351
295
|
)
|
352
296
|
|
353
297
|
module_type_env = TypeInference::TypeEnv.build(annotations: annots,
|
354
298
|
subtyping: checker,
|
355
299
|
const_env: module_const_env,
|
356
|
-
signatures: checker.
|
300
|
+
signatures: checker.factory.env)
|
357
301
|
|
358
302
|
self.class.new(
|
359
303
|
checker: checker,
|
@@ -374,12 +318,12 @@ module Steep
|
|
374
318
|
super_class_name = node.children[1] && Names::Module.from_node(node.children[1])
|
375
319
|
new_namespace = nested_namespace_for_module(new_class_name)
|
376
320
|
|
377
|
-
annots = source.annotations(block: node,
|
321
|
+
annots = source.annotations(block: node, factory: checker.factory, current_module: new_namespace)
|
378
322
|
|
379
323
|
implement_module_name = yield_self do
|
380
324
|
if (annotation = annots.implement_module_annotation)
|
381
325
|
absolute_name(annotation.name.name).yield_self do |absolute_name|
|
382
|
-
if checker.
|
326
|
+
if checker.factory.class_name?(absolute_name)
|
383
327
|
AST::Annotation::Implements::Module.new(name: absolute_name,
|
384
328
|
args: annotation.name.args)
|
385
329
|
else
|
@@ -390,16 +334,17 @@ module Steep
|
|
390
334
|
else
|
391
335
|
name = nil
|
392
336
|
name ||= absolute_name(new_class_name).yield_self do |absolute_name|
|
393
|
-
absolute_name if checker.
|
337
|
+
absolute_name if checker.factory.class_name?(absolute_name)
|
394
338
|
end
|
395
339
|
name ||= super_class_name && absolute_name(super_class_name).yield_self do |absolute_name|
|
396
|
-
absolute_name if checker.
|
340
|
+
absolute_name if checker.factory.class_name?(absolute_name)
|
397
341
|
end
|
398
342
|
|
399
343
|
if name
|
400
|
-
|
344
|
+
absolute_name_ = checker.factory.type_name_1(name)
|
345
|
+
decl = checker.factory.env.find_class(absolute_name_)
|
401
346
|
AST::Annotation::Implements::Module.new(name: name,
|
402
|
-
args:
|
347
|
+
args: decl.type_params.each.map(&:name))
|
403
348
|
end
|
404
349
|
end
|
405
350
|
end
|
@@ -410,12 +355,22 @@ module Steep
|
|
410
355
|
|
411
356
|
if implement_module_name
|
412
357
|
class_name = implement_module_name.name
|
413
|
-
class_args = implement_module_name.args.map {|x| AST::Types::Var.new(name: x)
|
358
|
+
class_args = implement_module_name.args.map {|x| AST::Types::Var.new(name: x)}
|
414
359
|
|
415
|
-
|
360
|
+
type_name_ = checker.factory.type_name_1(implement_module_name.name)
|
361
|
+
instance_def = checker.factory.definition_builder.build_instance(type_name_)
|
362
|
+
module_def = checker.factory.definition_builder.build_singleton(type_name_)
|
416
363
|
|
417
364
|
instance_type = AST::Types::Name::Instance.new(name: class_name, args: class_args)
|
418
|
-
module_type = AST::Types::Name::Class.new(name: class_name, constructor:
|
365
|
+
module_type = AST::Types::Name::Class.new(name: class_name, constructor: nil)
|
366
|
+
end
|
367
|
+
|
368
|
+
if annots.instance_type
|
369
|
+
instance_type = annots.instance_type
|
370
|
+
end
|
371
|
+
|
372
|
+
if annots.module_type
|
373
|
+
module_type = annots.module_type
|
419
374
|
end
|
420
375
|
|
421
376
|
const_context = if new_namespace.empty?
|
@@ -423,7 +378,7 @@ module Steep
|
|
423
378
|
else
|
424
379
|
Names::Module.new(name: new_namespace.path.last, namespace: new_namespace.parent)
|
425
380
|
end
|
426
|
-
class_const_env = TypeInference::ConstantEnv.new(
|
381
|
+
class_const_env = TypeInference::ConstantEnv.new(factory: checker.factory, context: const_context)
|
427
382
|
|
428
383
|
module_context = ModuleContext.new(
|
429
384
|
instance_type: annots.instance_type || instance_type,
|
@@ -431,15 +386,16 @@ module Steep
|
|
431
386
|
implement_name: implement_module_name,
|
432
387
|
current_namespace: new_namespace,
|
433
388
|
const_env: class_const_env,
|
434
|
-
class_name: absolute_name(new_class_name)
|
389
|
+
class_name: absolute_name(new_class_name),
|
390
|
+
module_definition: module_def,
|
391
|
+
instance_definition: instance_def
|
435
392
|
)
|
436
393
|
|
437
|
-
class_type_env = TypeInference::TypeEnv.build(
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
)
|
394
|
+
class_type_env = TypeInference::TypeEnv.build(annotations: annots,
|
395
|
+
subtyping: checker,
|
396
|
+
const_env: class_const_env,
|
397
|
+
signatures: checker.factory.env)
|
398
|
+
|
443
399
|
|
444
400
|
self.class.new(
|
445
401
|
checker: checker,
|
@@ -456,7 +412,7 @@ module Steep
|
|
456
412
|
end
|
457
413
|
|
458
414
|
def for_branch(node, truthy_vars: Set.new, type_case_override: nil)
|
459
|
-
annots = source.annotations(block: node,
|
415
|
+
annots = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
|
460
416
|
|
461
417
|
type_env = self.type_env
|
462
418
|
|
@@ -467,12 +423,12 @@ module Steep
|
|
467
423
|
env[var] = type
|
468
424
|
end
|
469
425
|
end
|
470
|
-
type_env = type_env.with_annotations(lvar_types: lvar_types) do |var, relation, result|
|
426
|
+
type_env = type_env.with_annotations(lvar_types: lvar_types, self_type: self_type) do |var, relation, result|
|
471
427
|
raise "Unexpected annotate failure: #{relation}"
|
472
428
|
end
|
473
429
|
|
474
430
|
if type_case_override
|
475
|
-
type_env = type_env.with_annotations(lvar_types: type_case_override) do |var, relation, result|
|
431
|
+
type_env = type_env.with_annotations(lvar_types: type_case_override, self_type: self_type) do |var, relation, result|
|
476
432
|
typing.add_error(
|
477
433
|
Errors::IncompatibleTypeCase.new(node: node,
|
478
434
|
var_name: var,
|
@@ -486,7 +442,8 @@ module Steep
|
|
486
442
|
lvar_types: annots.lvar_types,
|
487
443
|
ivar_types: annots.ivar_types,
|
488
444
|
const_types: annots.const_types,
|
489
|
-
gvar_types: {}
|
445
|
+
gvar_types: {},
|
446
|
+
self_type: self_type
|
490
447
|
) do |var, relation, result|
|
491
448
|
typing.add_error(
|
492
449
|
Errors::IncompatibleAnnotation.new(node: node,
|
@@ -585,6 +542,7 @@ module Steep
|
|
585
542
|
else
|
586
543
|
module_type
|
587
544
|
end
|
545
|
+
|
588
546
|
typing.add_typing(node, type)
|
589
547
|
else
|
590
548
|
type_send(node, send_node: node, block_params: nil, block_body: nil)
|
@@ -640,38 +598,33 @@ module Steep
|
|
640
598
|
when !lhs_type
|
641
599
|
fallback_to_any(node)
|
642
600
|
else
|
643
|
-
lhs_interface = checker.
|
601
|
+
lhs_interface = checker.factory.interface(lhs_type, private: false)
|
644
602
|
op_method = lhs_interface.methods[op]
|
645
603
|
|
646
604
|
if op_method
|
647
605
|
args = TypeInference::SendArgs.from_nodes([rhs])
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
node: node,
|
666
|
-
lhs_type: lhs_type,
|
667
|
-
rhs_type: return_type_or_error,
|
668
|
-
result: result
|
669
|
-
)
|
606
|
+
return_type, _ = type_method_call(node,
|
607
|
+
receiver_type: lhs_type,
|
608
|
+
method_name: op,
|
609
|
+
method: op_method,
|
610
|
+
args: args,
|
611
|
+
block_params: nil,
|
612
|
+
block_body: nil,
|
613
|
+
topdown_hint: true)
|
614
|
+
|
615
|
+
result = check_relation(sub_type: return_type, super_type: lhs_type)
|
616
|
+
if result.failure?
|
617
|
+
typing.add_error(
|
618
|
+
Errors::IncompatibleAssignment.new(
|
619
|
+
node: node,
|
620
|
+
lhs_type: lhs_type,
|
621
|
+
rhs_type: return_type,
|
622
|
+
result: result
|
670
623
|
)
|
671
|
-
|
624
|
+
)
|
672
625
|
end
|
673
626
|
else
|
674
|
-
typing.add_error Errors::NoMethod.new(node: node, method: op, type: lhs_type)
|
627
|
+
typing.add_error Errors::NoMethod.new(node: node, method: op, type: expand_self(lhs_type))
|
675
628
|
end
|
676
629
|
|
677
630
|
typing.add_typing(node, lhs_type)
|
@@ -682,32 +635,35 @@ module Steep
|
|
682
635
|
yield_self do
|
683
636
|
if self_type && method_context&.method
|
684
637
|
if method_context.super_method
|
685
|
-
each_child_node(node) do |child|
|
638
|
+
each_child_node(node) do |child|
|
639
|
+
synthesize(child)
|
640
|
+
end
|
686
641
|
|
687
|
-
super_method =
|
642
|
+
super_method = Interface::Interface::Combination.overload(
|
643
|
+
method_context.super_method.method_types.map {|method_type|
|
644
|
+
checker.factory.method_type(method_type, self_type: self_type)
|
645
|
+
},
|
646
|
+
incompatible: false
|
647
|
+
)
|
688
648
|
args = TypeInference::SendArgs.from_nodes(node.children.dup)
|
689
649
|
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
650
|
+
return_type, _ = type_method_call(node,
|
651
|
+
receiver_type: self_type,
|
652
|
+
method_name: method_context.name,
|
653
|
+
method: super_method,
|
654
|
+
args: args,
|
655
|
+
block_params: nil,
|
656
|
+
block_body: nil,
|
657
|
+
topdown_hint: true)
|
696
658
|
|
697
|
-
|
698
|
-
fallback_to_any node do
|
699
|
-
return_type_or_error
|
700
|
-
end
|
701
|
-
else
|
702
|
-
typing.add_typing node, return_type_or_error
|
703
|
-
end
|
659
|
+
typing.add_typing node, return_type
|
704
660
|
else
|
705
661
|
fallback_to_any node do
|
706
662
|
Errors::UnexpectedSuper.new(node: node, method: method_context.name)
|
707
663
|
end
|
708
664
|
end
|
709
665
|
else
|
710
|
-
|
666
|
+
fallback_to_any node
|
711
667
|
end
|
712
668
|
end
|
713
669
|
|
@@ -725,7 +681,8 @@ module Steep
|
|
725
681
|
new = for_new_method(node.children[0],
|
726
682
|
node,
|
727
683
|
args: node.children[1].children,
|
728
|
-
self_type: module_context&.instance_type
|
684
|
+
self_type: module_context&.instance_type,
|
685
|
+
definition: module_context&.instance_definition)
|
729
686
|
|
730
687
|
each_child_node(node.children[1]) do |arg|
|
731
688
|
new.synthesize(arg)
|
@@ -746,17 +703,14 @@ module Steep
|
|
746
703
|
else
|
747
704
|
return_type = expand_alias(new.method_context&.return_type)
|
748
705
|
if return_type && !return_type.is_a?(AST::Types::Void)
|
749
|
-
result =
|
750
|
-
Subtyping::Relation.new(sub_type: AST::Builtin.nil_type, super_type: return_type),
|
751
|
-
constraints: Subtyping::Constraints.empty
|
752
|
-
)
|
706
|
+
result = check_relation(sub_type: AST::Builtin.nil_type, super_type: return_type)
|
753
707
|
if result.failure?
|
754
708
|
typing.add_error(Errors::MethodBodyTypeMismatch.new(node: node,
|
755
709
|
expected: new.method_context&.return_type,
|
756
710
|
actual: AST::Builtin.nil_type,
|
757
711
|
result: result))
|
758
712
|
end
|
759
|
-
end
|
713
|
+
end
|
760
714
|
end
|
761
715
|
|
762
716
|
if module_context
|
@@ -767,10 +721,21 @@ module Steep
|
|
767
721
|
|
768
722
|
when :defs
|
769
723
|
synthesize(node.children[0]).tap do |self_type|
|
724
|
+
self_type = expand_self(self_type)
|
725
|
+
definition = case self_type
|
726
|
+
when AST::Types::Name::Instance
|
727
|
+
name = checker.factory.type_name_1(self_type.name)
|
728
|
+
checker.factory.definition_builder.build_singleton(name)
|
729
|
+
when AST::Types::Name::Module, AST::Types::Name::Class
|
730
|
+
name = checker.factory.type_name_1(self_type.name)
|
731
|
+
checker.factory.definition_builder.build_singleton(name)
|
732
|
+
end
|
733
|
+
|
770
734
|
new = for_new_method(node.children[1],
|
771
735
|
node,
|
772
736
|
args: node.children[2].children,
|
773
|
-
self_type: self_type
|
737
|
+
self_type: self_type,
|
738
|
+
definition: definition)
|
774
739
|
|
775
740
|
each_child_node(node.children[2]) do |arg|
|
776
741
|
new.synthesize(arg)
|
@@ -814,11 +779,7 @@ module Steep
|
|
814
779
|
|
815
780
|
if (ret_type = expand_alias(method_context&.return_type))
|
816
781
|
unless ret_type.is_a?(AST::Types::Void)
|
817
|
-
result =
|
818
|
-
Subtyping::Relation.new(sub_type: value_type,
|
819
|
-
super_type: ret_type),
|
820
|
-
constraints: Subtyping::Constraints.empty
|
821
|
-
)
|
782
|
+
result = check_relation(sub_type: value_type, super_type: ret_type)
|
822
783
|
|
823
784
|
if result.failure?
|
824
785
|
typing.add_error(Errors::ReturnTypeMismatch.new(node: node,
|
@@ -935,7 +896,7 @@ module Steep
|
|
935
896
|
|
936
897
|
when :int
|
937
898
|
yield_self do
|
938
|
-
literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)
|
899
|
+
literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)}
|
939
900
|
|
940
901
|
if literal_type
|
941
902
|
typing.add_typing(node, literal_type)
|
@@ -946,7 +907,7 @@ module Steep
|
|
946
907
|
|
947
908
|
when :sym
|
948
909
|
yield_self do
|
949
|
-
literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)
|
910
|
+
literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)}
|
950
911
|
|
951
912
|
if literal_type
|
952
913
|
typing.add_typing(node, literal_type)
|
@@ -957,7 +918,7 @@ module Steep
|
|
957
918
|
|
958
919
|
when :str
|
959
920
|
yield_self do
|
960
|
-
literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)
|
921
|
+
literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)}
|
961
922
|
|
962
923
|
if literal_type
|
963
924
|
typing.add_typing(node, literal_type)
|
@@ -1058,11 +1019,7 @@ module Steep
|
|
1058
1019
|
end
|
1059
1020
|
|
1060
1021
|
when :self
|
1061
|
-
|
1062
|
-
typing.add_typing(node, self_type)
|
1063
|
-
else
|
1064
|
-
fallback_to_any node
|
1065
|
-
end
|
1022
|
+
typing.add_typing node, AST::Types::Self.new
|
1066
1023
|
|
1067
1024
|
when :const
|
1068
1025
|
const_name = Names::Module.from_node(node)
|
@@ -1080,7 +1037,7 @@ module Steep
|
|
1080
1037
|
const_name = Names::Module.from_node(node)
|
1081
1038
|
if const_name
|
1082
1039
|
value_type = synthesize(node.children.last)
|
1083
|
-
type = type_env.assign(const: const_name, type: value_type) do |error|
|
1040
|
+
type = type_env.assign(const: const_name, type: value_type, self_type: self_type) do |error|
|
1084
1041
|
case error
|
1085
1042
|
when Subtyping::Result::Failure
|
1086
1043
|
const_type = type_env.get(const: const_name)
|
@@ -1128,13 +1085,17 @@ module Steep
|
|
1128
1085
|
yield_self do
|
1129
1086
|
if method_context&.method
|
1130
1087
|
if method_context.super_method
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1088
|
+
types = method_context.super_method.method_types.map {|method_type|
|
1089
|
+
case method_type
|
1090
|
+
when Ruby::Signature::MethodType
|
1091
|
+
checker.factory.method_type(method_type, self_type: self_type).return_type
|
1092
|
+
when :any
|
1093
|
+
AST::Builtin.any_type
|
1094
|
+
else
|
1095
|
+
raise "Unexpected method_type: #{method_type.inspect}"
|
1096
|
+
end
|
1097
|
+
}
|
1098
|
+
typing.add_typing(node, union_type(*types))
|
1138
1099
|
else
|
1139
1100
|
typing.add_error(Errors::UnexpectedSuper.new(node: node, method: method_context.name))
|
1140
1101
|
fallback_to_any node
|
@@ -1150,11 +1111,8 @@ module Steep
|
|
1150
1111
|
typing.add_error Errors::FallbackAny.new(node: node) unless hint
|
1151
1112
|
|
1152
1113
|
array_type = if hint
|
1153
|
-
|
1154
|
-
|
1155
|
-
super_type: hint
|
1156
|
-
)
|
1157
|
-
if checker.check(relation, constraints: Subtyping::Constraints.empty).success?
|
1114
|
+
if check_relation(sub_type: AST::Builtin::Array.instance_type(AST::Builtin.any_type),
|
1115
|
+
super_type: hint).success?
|
1158
1116
|
hint
|
1159
1117
|
end
|
1160
1118
|
end
|
@@ -1165,14 +1123,13 @@ module Steep
|
|
1165
1123
|
|
1166
1124
|
expand_alias(hint) do |hint|
|
1167
1125
|
is_tuple = hint.is_a?(AST::Types::Tuple)
|
1168
|
-
is_tuple &&= node.children.all? {|child| child.type != :splat
|
1126
|
+
is_tuple &&= node.children.all? {|child| child.type != :splat}
|
1169
1127
|
is_tuple &&= node.children.size >= hint.types.size
|
1170
1128
|
is_tuple &&= hint.types.map.with_index do |child_type, index|
|
1171
1129
|
child_node = node.children[index]
|
1172
1130
|
[synthesize(child_node, hint: child_type), child_type]
|
1173
1131
|
end.all? do |node_type, hint_type|
|
1174
|
-
|
1175
|
-
result = checker.check(relation, constraints: Subtyping::Constraints.empty)
|
1132
|
+
result = check_relation(sub_type: node_type, super_type: hint_type)
|
1176
1133
|
result.success?
|
1177
1134
|
end
|
1178
1135
|
end
|
@@ -1288,9 +1245,9 @@ module Steep
|
|
1288
1245
|
end
|
1289
1246
|
|
1290
1247
|
if (body = clause.children.last)
|
1291
|
-
if var_names && var_types && test_types.all? {|type| type.is_a?(AST::Types::Name::Class)
|
1248
|
+
if var_names && var_types && test_types.all? {|type| type.is_a?(AST::Types::Name::Class)}
|
1292
1249
|
var_types_in_body = test_types.flat_map {|test_type|
|
1293
|
-
filtered_types = var_types.select {|var_type| var_type.is_a?(AST::Types::Name::Base) && var_type.name == test_type.name
|
1250
|
+
filtered_types = var_types.select {|var_type| var_type.is_a?(AST::Types::Name::Base) && var_type.name == test_type.name}
|
1294
1251
|
if filtered_types.empty?
|
1295
1252
|
to_instance_type(test_type)
|
1296
1253
|
else
|
@@ -1344,10 +1301,8 @@ module Steep
|
|
1344
1301
|
types = pairs.map(&:first)
|
1345
1302
|
envs = pairs.map(&:last)
|
1346
1303
|
|
1347
|
-
|
1348
|
-
|
1349
|
-
types.push AST::Builtin.nil_type
|
1350
|
-
end
|
1304
|
+
unless var_types&.empty? || whens.last
|
1305
|
+
types.push AST::Builtin.nil_type
|
1351
1306
|
end
|
1352
1307
|
|
1353
1308
|
type_env.join!(envs.compact)
|
@@ -1365,7 +1320,7 @@ module Steep
|
|
1365
1320
|
if exn_classes
|
1366
1321
|
case exn_classes.type
|
1367
1322
|
when :array
|
1368
|
-
exn_types = exn_classes.children.map {|child| synthesize(child)
|
1323
|
+
exn_types = exn_classes.children.map {|child| synthesize(child)}
|
1369
1324
|
else
|
1370
1325
|
Steep.logger.error "Unexpected exception list: #{exn_classes.type}"
|
1371
1326
|
end
|
@@ -1458,7 +1413,7 @@ module Steep
|
|
1458
1413
|
end
|
1459
1414
|
|
1460
1415
|
when :irange, :erange
|
1461
|
-
types = node.children.map {|n| synthesize(n)
|
1416
|
+
types = node.children.map {|n| synthesize(n)}
|
1462
1417
|
type = AST::Builtin::Range.instance_type(union_type(*types))
|
1463
1418
|
typing.add_typing(node, type)
|
1464
1419
|
|
@@ -1493,20 +1448,18 @@ module Steep
|
|
1493
1448
|
when :gvasgn
|
1494
1449
|
yield_self do
|
1495
1450
|
name, rhs = node.children
|
1496
|
-
type =
|
1497
|
-
current: AST::Namespace.root)
|
1498
|
-
|
1499
|
-
if type
|
1500
|
-
check(rhs, type) do |_, rhs_type, result|
|
1501
|
-
typing.add_error(Errors::IncompatibleAssignment.new(node: node,
|
1502
|
-
lhs_type: type,
|
1503
|
-
rhs_type: rhs_type,
|
1504
|
-
result: result))
|
1505
|
-
end
|
1506
|
-
else
|
1507
|
-
synthesize(rhs)
|
1451
|
+
type = type_env.get(gvar: name) do
|
1508
1452
|
fallback_to_any node
|
1509
1453
|
end
|
1454
|
+
|
1455
|
+
check(rhs, type) do |_, rhs_type, result|
|
1456
|
+
typing.add_error(Errors::IncompatibleAssignment.new(
|
1457
|
+
node: node,
|
1458
|
+
lhs_type: type,
|
1459
|
+
rhs_type: rhs_type,
|
1460
|
+
result: result)
|
1461
|
+
)
|
1462
|
+
end
|
1510
1463
|
end
|
1511
1464
|
|
1512
1465
|
when :gvar
|
@@ -1527,16 +1480,14 @@ module Steep
|
|
1527
1480
|
if hint.one_arg?
|
1528
1481
|
# Assumes Symbol#to_proc implementation
|
1529
1482
|
param_type = hint.params.required[0]
|
1530
|
-
interface = checker.
|
1483
|
+
interface = checker.factory.interface(param_type, private: true)
|
1531
1484
|
method = interface.methods[value.children[0]]
|
1532
|
-
if method
|
1533
|
-
return_types = method.types.
|
1534
|
-
|
1535
|
-
|
1536
|
-
end
|
1537
|
-
end
|
1485
|
+
if method&.overload?
|
1486
|
+
return_types = method.types.select {|method_type|
|
1487
|
+
method_type.params.each_type.count == 0
|
1488
|
+
}.map(&:return_type)
|
1538
1489
|
|
1539
|
-
|
1490
|
+
unless return_types.empty?
|
1540
1491
|
type = AST::Types::Proc.new(params: Interface::Params.empty.update(required: [param_type]),
|
1541
1492
|
return_type: AST::Types::Union.build(types: return_types))
|
1542
1493
|
end
|
@@ -1547,6 +1498,7 @@ module Steep
|
|
1547
1498
|
end
|
1548
1499
|
|
1549
1500
|
type ||= synthesize(node.children[0], hint: hint)
|
1501
|
+
|
1550
1502
|
typing.add_typing node, type
|
1551
1503
|
end
|
1552
1504
|
|
@@ -1579,11 +1531,7 @@ module Steep
|
|
1579
1531
|
def check(node, type, constraints: Subtyping::Constraints.empty)
|
1580
1532
|
type_ = synthesize(node, hint: type)
|
1581
1533
|
|
1582
|
-
result =
|
1583
|
-
Subtyping::Relation.new(sub_type: type_,
|
1584
|
-
super_type: type),
|
1585
|
-
constraints: constraints
|
1586
|
-
)
|
1534
|
+
result = check_relation(sub_type: type_, super_type: type, constraints: constraints)
|
1587
1535
|
if result.failure?
|
1588
1536
|
yield(type, type_, result)
|
1589
1537
|
end
|
@@ -1609,7 +1557,7 @@ module Steep
|
|
1609
1557
|
|
1610
1558
|
def assign_type_to_variable(var, type, node)
|
1611
1559
|
name = var.name
|
1612
|
-
type_env.assign(lvar: name, type: type) do |result|
|
1560
|
+
type_env.assign(lvar: name, type: type, self_type: self_type) do |result|
|
1613
1561
|
var_type = type_env.get(lvar: name)
|
1614
1562
|
typing.add_error(Errors::IncompatibleAssignment.new(node: node,
|
1615
1563
|
lhs_type: var_type,
|
@@ -1620,7 +1568,7 @@ module Steep
|
|
1620
1568
|
|
1621
1569
|
def type_ivasgn(name, rhs, node)
|
1622
1570
|
rhs_type = synthesize(rhs, hint: type_env.get(ivar: name) { fallback_to_any(node) })
|
1623
|
-
ivar_type = type_env.assign(ivar: name, type: rhs_type) do |error|
|
1571
|
+
ivar_type = type_env.assign(ivar: name, type: rhs_type, self_type: self_type) do |error|
|
1624
1572
|
case error
|
1625
1573
|
when Subtyping::Result::Failure
|
1626
1574
|
type = type_env.get(ivar: name)
|
@@ -1641,7 +1589,7 @@ module Steep
|
|
1641
1589
|
rhs_type = expand_alias(rhs_original)
|
1642
1590
|
|
1643
1591
|
case
|
1644
|
-
when rhs.type == :array && lhs.children.all? {|a| a.type == :lvasgn || a.type == :ivasgn
|
1592
|
+
when rhs.type == :array && lhs.children.all? {|a| a.type == :lvasgn || a.type == :ivasgn} && lhs.children.size == rhs.children.size
|
1645
1593
|
pairs = lhs.children.zip(rhs.children)
|
1646
1594
|
pairs.each do |(l, r)|
|
1647
1595
|
case
|
@@ -1654,14 +1602,14 @@ module Steep
|
|
1654
1602
|
|
1655
1603
|
typing.add_typing(node, rhs_type)
|
1656
1604
|
|
1657
|
-
when rhs_type.is_a?(AST::Types::Tuple) && lhs.children.all? {|a| a.type == :lvasgn || a.type == :ivasgn
|
1605
|
+
when rhs_type.is_a?(AST::Types::Tuple) && lhs.children.all? {|a| a.type == :lvasgn || a.type == :ivasgn}
|
1658
1606
|
lhs.children.each.with_index do |asgn, index|
|
1659
1607
|
type = rhs_type.types[index]
|
1660
1608
|
|
1661
1609
|
case
|
1662
1610
|
when asgn.type == :lvasgn && asgn.children[0].name != :_
|
1663
1611
|
type ||= AST::Builtin.nil_type
|
1664
|
-
type_env.assign(lvar: asgn.children[0].name, type: type) do |result|
|
1612
|
+
type_env.assign(lvar: asgn.children[0].name, type: type, self_type: self_type) do |result|
|
1665
1613
|
var_type = type_env.get(lvar: asgn.children[0].name)
|
1666
1614
|
typing.add_error(Errors::IncompatibleAssignment.new(node: node,
|
1667
1615
|
lhs_type: var_type,
|
@@ -1694,7 +1642,7 @@ module Steep
|
|
1694
1642
|
assign_type_to_variable(assignment.children.first, element_type, assignment)
|
1695
1643
|
when :ivasgn
|
1696
1644
|
assignment.children.first.yield_self do |ivar|
|
1697
|
-
type_env.assign(ivar: ivar, type: element_type) do |error|
|
1645
|
+
type_env.assign(ivar: ivar, type: element_type, self_type: self_type) do |error|
|
1698
1646
|
case error
|
1699
1647
|
when Subtyping::Result::Failure
|
1700
1648
|
type = type_env.get(ivar: ivar)
|
@@ -1713,7 +1661,7 @@ module Steep
|
|
1713
1661
|
typing.add_typing node, rhs_type
|
1714
1662
|
|
1715
1663
|
when rhs_type.is_a?(AST::Types::Union) &&
|
1716
|
-
rhs_type.types.all? {|type| AST::Builtin::Array.instance_type?(type)
|
1664
|
+
rhs_type.types.all? {|type| AST::Builtin::Array.instance_type?(type)}
|
1717
1665
|
|
1718
1666
|
types = rhs_type.types.flat_map do |type|
|
1719
1667
|
type.args.first
|
@@ -1752,7 +1700,7 @@ module Steep
|
|
1752
1700
|
end
|
1753
1701
|
|
1754
1702
|
def type_lambda(node, block_params:, block_body:, type_hint:)
|
1755
|
-
block_annotations = source.annotations(block: node,
|
1703
|
+
block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
|
1756
1704
|
params = TypeInference::BlockParams.from_node(block_params, annotations: block_annotations)
|
1757
1705
|
|
1758
1706
|
case type_hint
|
@@ -1766,57 +1714,76 @@ module Steep
|
|
1766
1714
|
node_type_hint: nil,
|
1767
1715
|
block_params: params,
|
1768
1716
|
block_body: block_body,
|
1769
|
-
block_annotations: block_annotations
|
1717
|
+
block_annotations: block_annotations,
|
1718
|
+
topdown_hint: true)
|
1770
1719
|
|
1771
1720
|
typing.add_typing node, block_type
|
1772
1721
|
end
|
1773
1722
|
|
1774
1723
|
def type_send(node, send_node:, block_params:, block_body:, unwrap: false)
|
1775
1724
|
receiver, method_name, *arguments = send_node.children
|
1776
|
-
receiver_type = receiver ? synthesize(receiver) :
|
1725
|
+
receiver_type = receiver ? synthesize(receiver) : AST::Types::Self.new
|
1777
1726
|
|
1778
1727
|
if unwrap
|
1779
1728
|
receiver_type = unwrap(receiver_type)
|
1780
1729
|
end
|
1781
1730
|
|
1782
|
-
|
1731
|
+
receiver_type = expand_alias(receiver_type)
|
1732
|
+
|
1733
|
+
return_type = case receiver_type
|
1783
1734
|
when AST::Types::Any
|
1784
1735
|
typing.add_typing node, AST::Builtin.any_type
|
1785
1736
|
|
1786
1737
|
when nil
|
1787
1738
|
fallback_to_any node
|
1788
1739
|
|
1789
|
-
|
1790
|
-
|
1791
|
-
|
1792
|
-
|
1793
|
-
method = interface.methods[method_name]
|
1794
|
-
|
1795
|
-
if method
|
1796
|
-
args = TypeInference::SendArgs.from_nodes(arguments)
|
1797
|
-
return_type_or_error = type_method_call(node,
|
1798
|
-
method: method,
|
1799
|
-
args: args,
|
1800
|
-
block_params: block_params,
|
1801
|
-
block_body: block_body,
|
1802
|
-
receiver_type: receiver_type)
|
1740
|
+
when AST::Types::Void, AST::Types::Bot, AST::Types::Top
|
1741
|
+
fallback_to_any node do
|
1742
|
+
Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
|
1743
|
+
end
|
1803
1744
|
|
1804
|
-
|
1745
|
+
else
|
1746
|
+
case expanded_receiver_type = expand_self(receiver_type)
|
1747
|
+
when AST::Types::Self
|
1748
|
+
Steep.logger.error "`self` type cannot be resolved to concrete type"
|
1749
|
+
fallback_to_any node do
|
1750
|
+
Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
|
1751
|
+
end
|
1752
|
+
else
|
1753
|
+
begin
|
1754
|
+
interface = checker.factory.interface(receiver_type,
|
1755
|
+
private: !receiver,
|
1756
|
+
self_type: expanded_receiver_type)
|
1757
|
+
|
1758
|
+
method = interface.methods[method_name]
|
1759
|
+
|
1760
|
+
if method
|
1761
|
+
args = TypeInference::SendArgs.from_nodes(arguments)
|
1762
|
+
return_type, _ = type_method_call(node,
|
1763
|
+
method: method,
|
1764
|
+
method_name: method_name,
|
1765
|
+
args: args,
|
1766
|
+
block_params: block_params,
|
1767
|
+
block_body: block_body,
|
1768
|
+
receiver_type: receiver_type,
|
1769
|
+
topdown_hint: true)
|
1770
|
+
|
1771
|
+
typing.add_typing node, return_type
|
1772
|
+
else
|
1805
1773
|
fallback_to_any node do
|
1806
|
-
|
1774
|
+
Errors::NoMethod.new(node: node, method: method_name, type: expanded_receiver_type)
|
1807
1775
|
end
|
1808
|
-
else
|
1809
|
-
typing.add_typing node, return_type_or_error
|
1810
1776
|
end
|
1811
|
-
|
1777
|
+
rescue => exn
|
1778
|
+
$stderr.puts exn.inspect
|
1779
|
+
exn.backtrace.each do |t|
|
1780
|
+
$stderr.puts t
|
1781
|
+
end
|
1782
|
+
|
1812
1783
|
fallback_to_any node do
|
1813
|
-
Errors::NoMethod.new(node: node, method: method_name, type:
|
1784
|
+
Errors::NoMethod.new(node: node, method: method_name, type: expanded_receiver_type)
|
1814
1785
|
end
|
1815
1786
|
end
|
1816
|
-
rescue Subtyping::Check::CannotResolveError
|
1817
|
-
fallback_to_any node do
|
1818
|
-
Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
|
1819
|
-
end
|
1820
1787
|
end
|
1821
1788
|
end
|
1822
1789
|
|
@@ -1837,7 +1804,7 @@ module Steep
|
|
1837
1804
|
unless typing.has_type?(block_body)
|
1838
1805
|
block_annotations = source.annotations(block: node, builder: checker.builder, current_module: current_namespace)
|
1839
1806
|
params = TypeInference::BlockParams.from_node(block_params, annotations: block_annotations)
|
1840
|
-
pairs = params.each.map {|param| [param, AST::Builtin.any_type]
|
1807
|
+
pairs = params.each.map {|param| [param, AST::Builtin.any_type]}
|
1841
1808
|
|
1842
1809
|
for_block, _ = for_block(block_annotations: block_annotations,
|
1843
1810
|
param_pairs: pairs,
|
@@ -1899,58 +1866,158 @@ module Steep
|
|
1899
1866
|
), return_type]
|
1900
1867
|
end
|
1901
1868
|
|
1902
|
-
def
|
1903
|
-
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
type_or_error, child_typing = if zips.any?
|
1908
|
-
zips.map do |arg_pairs|
|
1909
|
-
child_typing = typing.new_child
|
1910
|
-
|
1911
|
-
result = self.with_new_typing(child_typing).try_method_type(
|
1912
|
-
node,
|
1913
|
-
receiver_type: receiver_type,
|
1914
|
-
method_type: method_type,
|
1915
|
-
args: args,
|
1916
|
-
arg_pairs: arg_pairs,
|
1917
|
-
block_params: block_params,
|
1918
|
-
block_body: block_body,
|
1919
|
-
child_typing: child_typing
|
1920
|
-
)
|
1921
|
-
|
1922
|
-
unless result.is_a?(Errors::Base)
|
1923
|
-
break [[result, child_typing]]
|
1924
|
-
end
|
1925
|
-
|
1926
|
-
[result, child_typing]
|
1927
|
-
end.first
|
1928
|
-
else
|
1929
|
-
Steep.logger.debug(node.inspect)
|
1930
|
-
[
|
1931
|
-
Errors::IncompatibleArguments.new(node: node, receiver_type: receiver_type, method_type: method_type),
|
1932
|
-
typing.new_child
|
1933
|
-
]
|
1934
|
-
end
|
1935
|
-
|
1936
|
-
[child_typing, type_or_error, method_type]
|
1937
|
-
end
|
1869
|
+
def expand_self(type)
|
1870
|
+
if type.is_a?(AST::Types::Self) && self_type
|
1871
|
+
self_type
|
1872
|
+
else
|
1873
|
+
type
|
1938
1874
|
end
|
1875
|
+
end
|
1939
1876
|
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
1946
|
-
|
1947
|
-
|
1877
|
+
def type_method_call(node, method_name:, receiver_type:, method:, args:, block_params:, block_body:, topdown_hint:)
|
1878
|
+
case
|
1879
|
+
when method.union?
|
1880
|
+
yield_self do
|
1881
|
+
results = method.types.map do |method|
|
1882
|
+
typing.new_child do |child_typing|
|
1883
|
+
type, error = with_new_typing(child_typing).type_method_call(node,
|
1884
|
+
method_name: method_name,
|
1885
|
+
receiver_type: receiver_type,
|
1886
|
+
method: method,
|
1887
|
+
args: args,
|
1888
|
+
block_params: block_params,
|
1889
|
+
block_body: block_body,
|
1890
|
+
topdown_hint: false)
|
1891
|
+
[
|
1892
|
+
type,
|
1893
|
+
child_typing,
|
1894
|
+
error
|
1895
|
+
]
|
1896
|
+
end
|
1897
|
+
end
|
1948
1898
|
|
1949
|
-
|
1950
|
-
|
1951
|
-
|
1952
|
-
|
1953
|
-
|
1899
|
+
if (type, typing, error = results.find {|_, _, error| error })
|
1900
|
+
typing.save!
|
1901
|
+
[type, error]
|
1902
|
+
else
|
1903
|
+
_, typing, _ = results.first
|
1904
|
+
typing.save!
|
1905
|
+
|
1906
|
+
[union_type(*results.map(&:first)), nil]
|
1907
|
+
end
|
1908
|
+
end
|
1909
|
+
|
1910
|
+
when method.intersection?
|
1911
|
+
yield_self do
|
1912
|
+
results = method.types.map do |method|
|
1913
|
+
typing.new_child do |child_typing|
|
1914
|
+
type, error = with_new_typing(child_typing).type_method_call(node,
|
1915
|
+
method_name: method_name,
|
1916
|
+
receiver_type: receiver_type,
|
1917
|
+
method: method,
|
1918
|
+
args: args,
|
1919
|
+
block_params: block_params,
|
1920
|
+
block_body: block_body,
|
1921
|
+
topdown_hint: false)
|
1922
|
+
[
|
1923
|
+
type,
|
1924
|
+
child_typing,
|
1925
|
+
error
|
1926
|
+
]
|
1927
|
+
end
|
1928
|
+
end
|
1929
|
+
|
1930
|
+
successes = results.select {|_, _, error| !error }
|
1931
|
+
unless successes.empty?
|
1932
|
+
types = successes.map {|type, typing, _| type }
|
1933
|
+
typing = successes[0][1]
|
1934
|
+
typing.save!
|
1935
|
+
|
1936
|
+
[AST::Types::Intersection.build(types: types), nil]
|
1937
|
+
else
|
1938
|
+
type, typing, error = results.first
|
1939
|
+
typing.save!
|
1940
|
+
|
1941
|
+
[type, error]
|
1942
|
+
end
|
1943
|
+
end
|
1944
|
+
|
1945
|
+
when method.overload?
|
1946
|
+
yield_self do
|
1947
|
+
results = method.types.flat_map do |method_type|
|
1948
|
+
Steep.logger.tagged method_type.to_s do
|
1949
|
+
case method_type
|
1950
|
+
when Interface::MethodType
|
1951
|
+
zips = args.zips(method_type.params, method_type.block&.type)
|
1952
|
+
|
1953
|
+
zips.map do |arg_pairs|
|
1954
|
+
typing.new_child do |child_typing|
|
1955
|
+
result = self.with_new_typing(child_typing).try_method_type(
|
1956
|
+
node,
|
1957
|
+
receiver_type: receiver_type,
|
1958
|
+
method_type: method_type,
|
1959
|
+
args: args,
|
1960
|
+
arg_pairs: arg_pairs,
|
1961
|
+
block_params: block_params,
|
1962
|
+
block_body: block_body,
|
1963
|
+
child_typing: child_typing,
|
1964
|
+
topdown_hint: topdown_hint
|
1965
|
+
)
|
1966
|
+
|
1967
|
+
[result, child_typing, method_type]
|
1968
|
+
end
|
1969
|
+
end
|
1970
|
+
when :any
|
1971
|
+
typing.new_child do |child_typing|
|
1972
|
+
this = self.with_new_typing(child_typing)
|
1973
|
+
|
1974
|
+
args.args.each do |arg|
|
1975
|
+
this.synthesize(arg)
|
1976
|
+
end
|
1977
|
+
|
1978
|
+
if block_body
|
1979
|
+
this.synthesize(block_body)
|
1980
|
+
end
|
1981
|
+
|
1982
|
+
child_typing.add_typing node, AST::Builtin.any_type
|
1983
|
+
|
1984
|
+
[[AST::Builtin.any_type, child_typing, :any]]
|
1985
|
+
end
|
1986
|
+
end
|
1987
|
+
end
|
1988
|
+
end
|
1989
|
+
|
1990
|
+
unless results.empty?
|
1991
|
+
result, call_typing, method_type = results.find {|result, _, _| !result.is_a?(Errors::Base) } || results.last
|
1992
|
+
else
|
1993
|
+
method_type = method.types.last
|
1994
|
+
result = Errors::IncompatibleArguments.new(node: node, receiver_type: receiver_type, method_type: method_type)
|
1995
|
+
call_typing = typing.new_child
|
1996
|
+
end
|
1997
|
+
call_typing.save!
|
1998
|
+
|
1999
|
+
case result
|
2000
|
+
when Errors::Base
|
2001
|
+
if method.types.size == 1
|
2002
|
+
typing.add_error result
|
2003
|
+
type = case method_type.return_type
|
2004
|
+
when AST::Types::Var
|
2005
|
+
AST::Builtin.any_type
|
2006
|
+
else
|
2007
|
+
method_type.return_type
|
2008
|
+
end
|
2009
|
+
else
|
2010
|
+
typing.add_error Errors::UnresolvedOverloading.new(node: node,
|
2011
|
+
receiver_type: expand_self(receiver_type),
|
2012
|
+
method_name: method_name,
|
2013
|
+
method_types: method.types)
|
2014
|
+
type = AST::Builtin.any_type
|
2015
|
+
end
|
2016
|
+
|
2017
|
+
[type, result]
|
2018
|
+
else # Type
|
2019
|
+
[result, nil]
|
2020
|
+
end
|
1954
2021
|
end
|
1955
2022
|
end
|
1956
2023
|
end
|
@@ -2049,7 +2116,7 @@ module Steep
|
|
2049
2116
|
Steep.logger.warn("Method call with rest keywords type is detected. Rough approximation to be improved.")
|
2050
2117
|
|
2051
2118
|
value_types = params.required_keywords.values +
|
2052
|
-
params.optional_keywords.values.map {|type| AST::Types::Union.build(types: [type, AST::Builtin.nil_type])
|
2119
|
+
params.optional_keywords.values.map {|type| AST::Types::Union.build(types: [type, AST::Builtin.nil_type])} +
|
2053
2120
|
[params.rest_keywords]
|
2054
2121
|
|
2055
2122
|
hash_type = AST::Builtin::Hash.instance_type(
|
@@ -2070,17 +2137,12 @@ module Steep
|
|
2070
2137
|
|
2071
2138
|
node_type = synthesize(node, hint: hash_type)
|
2072
2139
|
|
2073
|
-
|
2074
|
-
sub_type: node_type,
|
2075
|
-
super_type: hash_type
|
2076
|
-
)
|
2077
|
-
|
2078
|
-
checker.check(relation, constraints: constraints).else do
|
2140
|
+
check_relation(sub_type: node_type, super_type: hash_type).else do
|
2079
2141
|
return Errors::ArgumentTypeMismatch.new(
|
2080
2142
|
node: node,
|
2081
2143
|
receiver_type: receiver_type,
|
2082
|
-
expected:
|
2083
|
-
actual:
|
2144
|
+
expected: hash_type,
|
2145
|
+
actual: node_type
|
2084
2146
|
)
|
2085
2147
|
end
|
2086
2148
|
end
|
@@ -2088,8 +2150,8 @@ module Steep
|
|
2088
2150
|
nil
|
2089
2151
|
end
|
2090
2152
|
|
2091
|
-
def try_method_type(node, receiver_type:, method_type:, args:, arg_pairs:, block_params:, block_body:, child_typing:)
|
2092
|
-
fresh_types = method_type.type_params.map {|x| AST::Types::Var.fresh(x)
|
2153
|
+
def try_method_type(node, receiver_type:, method_type:, args:, arg_pairs:, block_params:, block_body:, child_typing:, topdown_hint:)
|
2154
|
+
fresh_types = method_type.type_params.map {|x| AST::Types::Var.fresh(x)}
|
2093
2155
|
fresh_vars = Set.new(fresh_types.map(&:name))
|
2094
2156
|
instantiation = Interface::Substitution.build(method_type.type_params, fresh_types)
|
2095
2157
|
|
@@ -2122,20 +2184,15 @@ module Steep
|
|
2122
2184
|
type = construction.synthesize(arg_node.children[0])
|
2123
2185
|
child_typing.add_typing(arg_node, type)
|
2124
2186
|
else
|
2125
|
-
construction.synthesize(arg_node, hint: param_type)
|
2187
|
+
construction.synthesize(arg_node, hint: topdown_hint ? param_type : nil)
|
2126
2188
|
end
|
2127
2189
|
|
2128
|
-
|
2129
|
-
sub_type: arg_type,
|
2130
|
-
super_type: param_type
|
2131
|
-
)
|
2132
|
-
|
2133
|
-
checker.check(relation, constraints: constraints).else do |result|
|
2190
|
+
check_relation(sub_type: arg_type, super_type: param_type, constraints: constraints).else do |result|
|
2134
2191
|
return Errors::ArgumentTypeMismatch.new(
|
2135
2192
|
node: arg_node,
|
2136
2193
|
receiver_type: receiver_type,
|
2137
|
-
expected:
|
2138
|
-
actual:
|
2194
|
+
expected: param_type,
|
2195
|
+
actual: arg_type
|
2139
2196
|
)
|
2140
2197
|
end
|
2141
2198
|
else
|
@@ -2152,16 +2209,15 @@ module Steep
|
|
2152
2209
|
end
|
2153
2210
|
|
2154
2211
|
if block_params && method_type.block
|
2155
|
-
block_annotations = source.annotations(block: node,
|
2212
|
+
block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
|
2156
2213
|
block_params_ = TypeInference::BlockParams.from_node(block_params, annotations: block_annotations)
|
2157
|
-
block_param_hint = block_params_.params_type(
|
2158
|
-
|
2159
|
-
relation = Subtyping::Relation.new(
|
2160
|
-
sub_type: AST::Types::Proc.new(params: block_param_hint, return_type: AST::Types::Any.new),
|
2161
|
-
super_type: method_type.block.type
|
2214
|
+
block_param_hint = block_params_.params_type(
|
2215
|
+
hint: topdown_hint ? method_type.block.type.params : nil
|
2162
2216
|
)
|
2163
2217
|
|
2164
|
-
|
2218
|
+
check_relation(sub_type: AST::Types::Proc.new(params: block_param_hint, return_type: AST::Types::Any.new),
|
2219
|
+
super_type: method_type.block.type,
|
2220
|
+
constraints: constraints).else do |result|
|
2165
2221
|
return Errors::IncompatibleBlockParameters.new(
|
2166
2222
|
node: node,
|
2167
2223
|
method_type: method_type
|
@@ -2175,22 +2231,22 @@ module Steep
|
|
2175
2231
|
Steep.logger.debug "Constraints = #{constraints}"
|
2176
2232
|
|
2177
2233
|
begin
|
2178
|
-
method_type.subst(constraints.solution(checker, variance: variance, variables: occurence.params)).yield_self do |method_type|
|
2234
|
+
method_type.subst(constraints.solution(checker, self_type: self_type, variance: variance, variables: occurence.params)).yield_self do |method_type|
|
2179
2235
|
block_type = construction.type_block(block_param_hint: method_type.block.type.params,
|
2180
2236
|
block_type_hint: method_type.block.type.return_type,
|
2181
2237
|
node_type_hint: method_type.return_type,
|
2182
2238
|
block_params: block_params_,
|
2183
2239
|
block_body: block_body,
|
2184
|
-
block_annotations: block_annotations
|
2185
|
-
|
2186
|
-
relation = Subtyping::Relation.new(sub_type: block_type.return_type,
|
2187
|
-
super_type: method_type.block.type.return_type)
|
2240
|
+
block_annotations: block_annotations,
|
2241
|
+
topdown_hint: topdown_hint)
|
2188
2242
|
|
2189
|
-
result =
|
2243
|
+
result = check_relation(sub_type: block_type.return_type,
|
2244
|
+
super_type: method_type.block.type.return_type,
|
2245
|
+
constraints: constraints)
|
2190
2246
|
|
2191
2247
|
case result
|
2192
2248
|
when Subtyping::Result::Success
|
2193
|
-
method_type.return_type.subst(constraints.solution(checker, variance: variance, variables: fresh_vars)).yield_self do |ret_type|
|
2249
|
+
method_type.return_type.subst(constraints.solution(checker, self_type: self_type, variance: variance, variables: fresh_vars)).yield_self do |ret_type|
|
2194
2250
|
if block_annotations.break_type
|
2195
2251
|
AST::Types::Union.new(types: [block_annotations.break_type, ret_type])
|
2196
2252
|
else
|
@@ -2217,21 +2273,24 @@ module Steep
|
|
2217
2273
|
|
2218
2274
|
when method_type.block && args.block_pass_arg
|
2219
2275
|
begin
|
2220
|
-
method_type.subst(constraints.solution(checker, variance: variance, variables: occurence.params)).yield_self do |method_type|
|
2221
|
-
block_type = synthesize(args.block_pass_arg,
|
2222
|
-
|
2223
|
-
|
2224
|
-
|
2225
|
-
|
2226
|
-
|
2227
|
-
|
2228
|
-
|
2229
|
-
|
2230
|
-
|
2276
|
+
method_type.subst(constraints.solution(checker, self_type: self_type, variance: variance, variables: occurence.params)).yield_self do |method_type|
|
2277
|
+
block_type = synthesize(args.block_pass_arg,
|
2278
|
+
hint: topdown_hint ? method_type.block.type : nil)
|
2279
|
+
result = check_relation(
|
2280
|
+
sub_type: block_type,
|
2281
|
+
super_type: method_type.block.yield_self {|expected_block|
|
2282
|
+
if expected_block.optional?
|
2283
|
+
AST::Builtin.optional(expected_block.type)
|
2284
|
+
else
|
2285
|
+
expected_block.type
|
2286
|
+
end
|
2287
|
+
},
|
2288
|
+
constraints: constraints
|
2289
|
+
)
|
2231
2290
|
|
2232
2291
|
case result
|
2233
2292
|
when Subtyping::Result::Success
|
2234
|
-
method_type.return_type.subst(constraints.solution(checker, variance: variance, variables: fresh_vars))
|
2293
|
+
method_type.return_type.subst(constraints.solution(checker, self_type: self_type, variance: variance, variables: fresh_vars))
|
2235
2294
|
|
2236
2295
|
when Subtyping::Result::Failure
|
2237
2296
|
Errors::BlockTypeMismatch.new(node: node,
|
@@ -2252,7 +2311,7 @@ module Steep
|
|
2252
2311
|
|
2253
2312
|
when (!method_type.block || method_type.block.optional?) && !block_params && !block_body && !args.block_pass_arg
|
2254
2313
|
# OK, without block
|
2255
|
-
method_type.subst(constraints.solution(checker, variance: variance, variables: fresh_vars)).return_type
|
2314
|
+
method_type.subst(constraints.solution(checker, variance: variance, variables: fresh_vars, self_type: self_type)).return_type
|
2256
2315
|
|
2257
2316
|
when !method_type.block && (block_params || args.block_pass_arg)
|
2258
2317
|
Errors::UnexpectedBlockGiven.new(
|
@@ -2272,7 +2331,7 @@ module Steep
|
|
2272
2331
|
end
|
2273
2332
|
end
|
2274
2333
|
|
2275
|
-
def type_block(block_param_hint:, block_type_hint:, node_type_hint:, block_params:, block_body:, block_annotations:)
|
2334
|
+
def type_block(block_param_hint:, block_type_hint:, node_type_hint:, block_params:, block_body:, block_annotations:, topdown_hint:)
|
2276
2335
|
block_param_pairs = block_param_hint && block_params.zip(block_param_hint)
|
2277
2336
|
|
2278
2337
|
param_types_hash = {}
|
@@ -2299,10 +2358,10 @@ module Steep
|
|
2299
2358
|
end
|
2300
2359
|
|
2301
2360
|
break_type = if block_annotations.break_type
|
2302
|
-
|
2303
|
-
|
2304
|
-
|
2305
|
-
|
2361
|
+
union_type(node_type_hint, block_annotations.break_type)
|
2362
|
+
else
|
2363
|
+
node_type_hint
|
2364
|
+
end
|
2306
2365
|
Steep.logger.debug("return_type = #{break_type}")
|
2307
2366
|
|
2308
2367
|
block_context = BlockContext.new(body_type: block_annotations.block_type)
|
@@ -2338,7 +2397,7 @@ module Steep
|
|
2338
2397
|
end
|
2339
2398
|
body_type
|
2340
2399
|
else
|
2341
|
-
for_block_body.synthesize(block_body, hint: block_type_hint)
|
2400
|
+
for_block_body.synthesize(block_body, hint: topdown_hint ? block_type_hint : nil)
|
2342
2401
|
end
|
2343
2402
|
else
|
2344
2403
|
return_type = AST::Builtin.any_type
|
@@ -2457,22 +2516,14 @@ module Steep
|
|
2457
2516
|
end
|
2458
2517
|
|
2459
2518
|
def validate_method_definitions(node, module_name)
|
2460
|
-
|
2461
|
-
|
2462
|
-
|
2463
|
-
|
2464
|
-
|
2465
|
-
|
2466
|
-
|
2467
|
-
|
2468
|
-
expected_instance_method_names << member.name
|
2469
|
-
end
|
2470
|
-
if member.module_method?
|
2471
|
-
expected_module_method_names << member.name
|
2472
|
-
end
|
2473
|
-
when AST::Signature::Members::Attr
|
2474
|
-
expected_instance_method_names << member.name
|
2475
|
-
expected_instance_method_names << "#{member.name}=".to_sym if member.accessor?
|
2519
|
+
expected_instance_method_names = (module_context.instance_definition&.methods || {}).each.with_object(Set[]) do |(name, method), set|
|
2520
|
+
if method.implemented_in == module_context.instance_definition.declaration
|
2521
|
+
set << name
|
2522
|
+
end
|
2523
|
+
end
|
2524
|
+
expected_module_method_names = (module_context.module_definition&.methods || {}).each.with_object(Set[]) do |(name, method), set|
|
2525
|
+
if method.implemented_in == module_context.module_definition.declaration
|
2526
|
+
set << name
|
2476
2527
|
end
|
2477
2528
|
end
|
2478
2529
|
|
@@ -2570,7 +2621,7 @@ module Steep
|
|
2570
2621
|
return false
|
2571
2622
|
end
|
2572
2623
|
|
2573
|
-
!nodes.empty? && nodes.all? {|child| child.type == :class || child.type == :module
|
2624
|
+
!nodes.empty? && nodes.all? {|child| child.type == :class || child.type == :module}
|
2574
2625
|
end
|
2575
2626
|
|
2576
2627
|
def fallback_any_rec(node)
|
@@ -2587,7 +2638,7 @@ module Steep
|
|
2587
2638
|
expand_alias(type) do |expanded|
|
2588
2639
|
case
|
2589
2640
|
when expanded.is_a?(AST::Types::Union)
|
2590
|
-
types = expanded.types.reject {|type| type.is_a?(AST::Types::Nil)
|
2641
|
+
types = expanded.types.reject {|type| type.is_a?(AST::Types::Nil)}
|
2591
2642
|
AST::Types::Union.build(types: types)
|
2592
2643
|
else
|
2593
2644
|
type
|
@@ -2623,18 +2674,27 @@ module Steep
|
|
2623
2674
|
end
|
2624
2675
|
end
|
2625
2676
|
|
2626
|
-
def
|
2627
|
-
if type
|
2628
|
-
|
2629
|
-
|
2677
|
+
def deep_expand_alias(type, recursive: Set.new, &block)
|
2678
|
+
raise "Recursive type definition: #{type}" if recursive.member?(type)
|
2679
|
+
|
2680
|
+
ty = case type
|
2681
|
+
when AST::Types::Name::Alias
|
2682
|
+
deep_expand_alias(expand_alias(type), recursive: recursive << type)
|
2683
|
+
else
|
2684
|
+
type
|
2685
|
+
end
|
2630
2686
|
|
2631
2687
|
if block_given?
|
2632
|
-
yield
|
2688
|
+
yield ty
|
2633
2689
|
else
|
2634
|
-
|
2690
|
+
ty
|
2635
2691
|
end
|
2636
2692
|
end
|
2637
2693
|
|
2694
|
+
def expand_alias(type, &block)
|
2695
|
+
checker.factory.expand_alias(type, &block)
|
2696
|
+
end
|
2697
|
+
|
2638
2698
|
def test_literal_type(literal, hint)
|
2639
2699
|
case hint
|
2640
2700
|
when AST::Types::Literal
|
@@ -2642,7 +2702,7 @@ module Steep
|
|
2642
2702
|
hint
|
2643
2703
|
end
|
2644
2704
|
when AST::Types::Union
|
2645
|
-
if hint.types.any? {|ty| ty.is_a?(AST::Types::Literal) && ty.value == literal
|
2705
|
+
if hint.types.any? {|ty| ty.is_a?(AST::Types::Literal) && ty.value == literal}
|
2646
2706
|
hint
|
2647
2707
|
end
|
2648
2708
|
end
|
@@ -2650,10 +2710,7 @@ module Steep
|
|
2650
2710
|
|
2651
2711
|
def select_super_type(sub_type, super_type)
|
2652
2712
|
if super_type
|
2653
|
-
result =
|
2654
|
-
Subtyping::Relation.new(sub_type: sub_type, super_type: super_type),
|
2655
|
-
constraints: Subtyping::Constraints.empty
|
2656
|
-
)
|
2713
|
+
result = check_relation(sub_type: sub_type, super_type: super_type)
|
2657
2714
|
|
2658
2715
|
if result.success?
|
2659
2716
|
super_type
|
@@ -2671,10 +2728,10 @@ module Steep
|
|
2671
2728
|
|
2672
2729
|
def to_instance_type(type, args: nil)
|
2673
2730
|
args = args || case type
|
2674
|
-
when AST::Types::Name::Class
|
2675
|
-
checker.
|
2676
|
-
|
2677
|
-
|
2731
|
+
when AST::Types::Name::Class, AST::Types::Name::Module
|
2732
|
+
checker.factory.env.find_class(checker.factory.type_name_1(type.name)).type_params.each.map { AST::Builtin.any_type }
|
2733
|
+
else
|
2734
|
+
raise "unexpected type to to_instance_type: #{type}"
|
2678
2735
|
end
|
2679
2736
|
|
2680
2737
|
AST::Types::Name::Instance.new(name: type.name, args: args)
|
@@ -2699,14 +2756,11 @@ module Steep
|
|
2699
2756
|
return nil
|
2700
2757
|
end
|
2701
2758
|
|
2702
|
-
key_hint = AST::Types::Literal.new(value: key_value)
|
2703
2759
|
value_hint = hint.elements[key_value]
|
2704
|
-
|
2705
2760
|
value_type = new_construction.synthesize(value, hint: value_hint)
|
2706
2761
|
|
2707
2762
|
if value_hint
|
2708
|
-
|
2709
|
-
if checker.check(relation, constraints: Subtyping::Constraints.empty).success?
|
2763
|
+
if check_relation(sub_type: value_type, super_type: value_hint).success?
|
2710
2764
|
value_type = value_hint
|
2711
2765
|
end
|
2712
2766
|
end
|