steep 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|