steep 0.28.0 → 0.32.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/CHANGELOG.md +27 -0
- data/bin/steep-prof +1 -2
- data/lib/steep.rb +5 -3
- data/lib/steep/annotation_parser.rb +2 -4
- data/lib/steep/ast/builtin.rb +9 -1
- data/lib/steep/ast/types/factory.rb +177 -53
- data/lib/steep/ast/types/logic.rb +63 -0
- data/lib/steep/interface/method_type.rb +14 -4
- data/lib/steep/module_helper.rb +25 -0
- data/lib/steep/project.rb +25 -0
- data/lib/steep/project/completion_provider.rb +57 -58
- data/lib/steep/project/file_loader.rb +7 -2
- data/lib/steep/project/hover_content.rb +92 -83
- data/lib/steep/project/signature_file.rb +33 -0
- data/lib/steep/project/{file.rb → source_file.rb} +24 -54
- data/lib/steep/project/target.rb +31 -12
- data/lib/steep/server/code_worker.rb +30 -46
- data/lib/steep/server/interaction_worker.rb +42 -38
- data/lib/steep/server/master.rb +13 -30
- data/lib/steep/server/utils.rb +46 -13
- data/lib/steep/server/worker_process.rb +4 -2
- data/lib/steep/signature/validator.rb +3 -3
- data/lib/steep/source.rb +58 -1
- data/lib/steep/subtyping/check.rb +5 -7
- data/lib/steep/subtyping/constraints.rb +8 -0
- data/lib/steep/type_construction.rb +204 -207
- data/lib/steep/type_inference/constant_env.rb +2 -5
- data/lib/steep/type_inference/logic_type_interpreter.rb +225 -0
- data/lib/steep/type_inference/type_env.rb +2 -2
- data/lib/steep/version.rb +1 -1
- data/smoke/toplevel/Steepfile +5 -0
- data/smoke/toplevel/a.rb +4 -0
- data/smoke/toplevel/a.rbs +3 -0
- data/smoke/type_case/a.rb +0 -7
- data/steep.gemspec +2 -2
- metadata +18 -14
- data/lib/steep/ast/method_type.rb +0 -126
- data/lib/steep/ast/namespace.rb +0 -80
- data/lib/steep/names.rb +0 -86
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5aa3a8e2257e84d0ed22ede78f6ddc038a43bada5127863bf308ec00e5cb2ca6
|
4
|
+
data.tar.gz: fc29cc0b62e9a9c0bfdf3e1a2093e50bb6a53c474ca5de9472a7297694f6f020
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 827e7bf852501b156d0f77b4120401ad02a5ed070335342d7b316f37c286f347cc183e2f1a68849c9f0d2f78cdd53d64a0a8151f2958d8b7562fda0afb256ccc
|
7
|
+
data.tar.gz: 72444df723fe5ffaf552e6e5e92e7318c71d5ed9b2d77048faa928368626423b59ed9046b4a16cc916819f4fef8343b5e1866f9715ed95c701770dc49ec6a47d
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,33 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.32.0 (2020-10-09)
|
6
|
+
|
7
|
+
* Let type-case support interface types ([#237](https://github.com/soutaro/steep/pull/237))
|
8
|
+
|
9
|
+
## 0.31.1 (2020-10-07)
|
10
|
+
|
11
|
+
* Fix `if-then-else` parsing ([#236](https://github.com/soutaro/steep/pull/236))
|
12
|
+
|
13
|
+
## 0.31.0 (2020-10-04)
|
14
|
+
|
15
|
+
* Fix type checking performance ([#230](https://github.com/soutaro/steep/pull/230))
|
16
|
+
* Improve LSP completion/hover performance ([#232](https://github.com/soutaro/steep/pull/232))
|
17
|
+
* Fix instance variable completion ([#234](https://github.com/soutaro/steep/pull/234))
|
18
|
+
* Relax version requirements on Listen to allow installing on Ruby 3 ([#235](https://github.com/soutaro/steep/pull/235))
|
19
|
+
|
20
|
+
## 0.30.0 (2020-10-03)
|
21
|
+
|
22
|
+
* Let top-level defs be methods of Object ([#227](https://github.com/soutaro/steep/pull/227))
|
23
|
+
* Fix error caused by attribute definitions ([#228](https://github.com/soutaro/steep/pull/228))
|
24
|
+
* LSP worker improvements ([#222](https://github.com/soutaro/steep/pull/222), [#223](https://github.com/soutaro/steep/pull/223), [#226](https://github.com/soutaro/steep/pull/226), [#229](https://github.com/soutaro/steep/pull/229))
|
25
|
+
|
26
|
+
## 0.29.0 (2020-09-28)
|
27
|
+
|
28
|
+
* Implement reasoning on `is_a?`, `nil?`, and `===` methods. ([#218](https://github.com/soutaro/steep/pull/218))
|
29
|
+
* Better completion based on interface ([#215](https://github.com/soutaro/steep/pull/215))
|
30
|
+
* Fix begin-rescue typing ([#221](https://github.com/soutaro/steep/pull/221))
|
31
|
+
|
5
32
|
## 0.28.0 (2020-09-17)
|
6
33
|
|
7
34
|
* Fix typing case-when with empty body ([#200](https://github.com/soutaro/steep/pull/200))
|
data/bin/steep-prof
CHANGED
data/lib/steep.rb
CHANGED
@@ -16,8 +16,6 @@ require 'uri'
|
|
16
16
|
|
17
17
|
require "rbs"
|
18
18
|
|
19
|
-
require "steep/ast/namespace"
|
20
|
-
require "steep/names"
|
21
19
|
require "steep/ast/location"
|
22
20
|
require "steep/ast/types/helper"
|
23
21
|
require "steep/ast/types/any"
|
@@ -37,6 +35,7 @@ require "steep/ast/types/boolean"
|
|
37
35
|
require "steep/ast/types/tuple"
|
38
36
|
require "steep/ast/types/proc"
|
39
37
|
require "steep/ast/types/record"
|
38
|
+
require "steep/ast/types/logic"
|
40
39
|
require "steep/ast/type_params"
|
41
40
|
require "steep/ast/annotation"
|
42
41
|
require "steep/ast/annotation/collection"
|
@@ -62,6 +61,7 @@ require "steep/source"
|
|
62
61
|
require "steep/annotation_parser"
|
63
62
|
require "steep/typing"
|
64
63
|
require "steep/errors"
|
64
|
+
require "steep/module_helper"
|
65
65
|
require "steep/type_construction"
|
66
66
|
require "steep/type_inference/context"
|
67
67
|
require "steep/type_inference/context_array"
|
@@ -71,6 +71,7 @@ require "steep/type_inference/constant_env"
|
|
71
71
|
require "steep/type_inference/type_env"
|
72
72
|
require "steep/type_inference/local_variable_type_env"
|
73
73
|
require "steep/type_inference/logic"
|
74
|
+
require "steep/type_inference/logic_type_interpreter"
|
74
75
|
require "steep/ast/types"
|
75
76
|
|
76
77
|
require "steep/server/utils"
|
@@ -82,7 +83,8 @@ require "steep/server/interaction_worker"
|
|
82
83
|
require "steep/server/master"
|
83
84
|
|
84
85
|
require "steep/project"
|
85
|
-
require "steep/project/
|
86
|
+
require "steep/project/signature_file"
|
87
|
+
require "steep/project/source_file"
|
86
88
|
require "steep/project/options"
|
87
89
|
require "steep/project/target"
|
88
90
|
require "steep/project/dsl"
|
@@ -80,9 +80,7 @@ module Steep
|
|
80
80
|
name = match[:name]
|
81
81
|
type = parse_type(match[:type])
|
82
82
|
|
83
|
-
AST::Annotation::ConstType.new(name:
|
84
|
-
type: type,
|
85
|
-
location: location)
|
83
|
+
AST::Annotation::ConstType.new(name: TypeName(name), type: type, location: location)
|
86
84
|
end
|
87
85
|
|
88
86
|
when keyword_subject_type("ivar", IVAR_NAME)
|
@@ -152,7 +150,7 @@ module Steep
|
|
152
150
|
|
153
151
|
when /@implements\s+(?<name>#{CONST_NAME})#{TYPE_PARAMS}$/
|
154
152
|
Regexp.last_match.yield_self do |match|
|
155
|
-
type_name =
|
153
|
+
type_name = TypeName(match[:name])
|
156
154
|
params = match[:params]&.yield_self {|params| params.split(/,/).map {|param| param.strip.to_sym } } || []
|
157
155
|
|
158
156
|
name = AST::Annotation::Implements::Module.new(name: type_name, args: params)
|
data/lib/steep/ast/builtin.rb
CHANGED
@@ -6,7 +6,7 @@ module Steep
|
|
6
6
|
attr_reader :arity
|
7
7
|
|
8
8
|
def initialize(module_name, arity: 0)
|
9
|
-
@module_name =
|
9
|
+
@module_name = TypeName(module_name)
|
10
10
|
@arity = arity
|
11
11
|
end
|
12
12
|
|
@@ -81,6 +81,14 @@ module Steep
|
|
81
81
|
def self.optional(type)
|
82
82
|
AST::Types::Union.build(types: [type, nil_type])
|
83
83
|
end
|
84
|
+
|
85
|
+
def self.true_type
|
86
|
+
AST::Types::Literal.new(value: true)
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.false_type
|
90
|
+
AST::Types::Literal.new(value: false)
|
91
|
+
end
|
84
92
|
end
|
85
93
|
end
|
86
94
|
end
|
@@ -7,11 +7,14 @@ module Steep
|
|
7
7
|
attr_reader :type_name_cache
|
8
8
|
attr_reader :type_cache
|
9
9
|
|
10
|
+
attr_reader :type_interface_cache
|
11
|
+
|
10
12
|
def initialize(builder:)
|
11
13
|
@definition_builder = builder
|
12
14
|
|
13
15
|
@type_name_cache = {}
|
14
16
|
@type_cache = {}
|
17
|
+
@type_interface_cache = {}
|
15
18
|
end
|
16
19
|
|
17
20
|
def type_name_resolver
|
@@ -43,18 +46,18 @@ module Steep
|
|
43
46
|
when RBS::Types::Variable
|
44
47
|
Var.new(name: type.name, location: nil)
|
45
48
|
when RBS::Types::ClassSingleton
|
46
|
-
type_name =
|
49
|
+
type_name = type.name
|
47
50
|
Name::Singleton.new(name: type_name, location: nil)
|
48
51
|
when RBS::Types::ClassInstance
|
49
|
-
type_name =
|
52
|
+
type_name = type.name
|
50
53
|
args = type.args.map {|arg| type(arg) }
|
51
54
|
Name::Instance.new(name: type_name, args: args, location: nil)
|
52
55
|
when RBS::Types::Interface
|
53
|
-
type_name =
|
56
|
+
type_name = type.name
|
54
57
|
args = type.args.map {|arg| type(arg) }
|
55
58
|
Name::Interface.new(name: type_name, args: args, location: nil)
|
56
59
|
when RBS::Types::Alias
|
57
|
-
type_name =
|
60
|
+
type_name = type.name
|
58
61
|
Name::Alias.new(name: type_name, args: [], location: nil)
|
59
62
|
when RBS::Types::Union
|
60
63
|
Union.build(types: type.types.map {|ty| type(ty) }, location: nil)
|
@@ -103,22 +106,22 @@ module Steep
|
|
103
106
|
when Var
|
104
107
|
RBS::Types::Variable.new(name: type.name, location: nil)
|
105
108
|
when Name::Singleton
|
106
|
-
RBS::Types::ClassSingleton.new(name:
|
109
|
+
RBS::Types::ClassSingleton.new(name: type.name, location: nil)
|
107
110
|
when Name::Instance
|
108
111
|
RBS::Types::ClassInstance.new(
|
109
|
-
name:
|
112
|
+
name: type.name,
|
110
113
|
args: type.args.map {|arg| type_1(arg) },
|
111
114
|
location: nil
|
112
115
|
)
|
113
116
|
when Name::Interface
|
114
117
|
RBS::Types::Interface.new(
|
115
|
-
name:
|
118
|
+
name: type.name,
|
116
119
|
args: type.args.map {|arg| type_1(arg) },
|
117
120
|
location: nil
|
118
121
|
)
|
119
122
|
when Name::Alias
|
120
123
|
type.args.empty? or raise "alias type with args is not supported"
|
121
|
-
RBS::Types::Alias.new(name:
|
124
|
+
RBS::Types::Alias.new(name: type.name, location: nil)
|
122
125
|
when Union
|
123
126
|
RBS::Types::Union.new(
|
124
127
|
types: type.types.map {|ty| type_1(ty) },
|
@@ -151,32 +154,6 @@ module Steep
|
|
151
154
|
end
|
152
155
|
end
|
153
156
|
|
154
|
-
def type_name(name)
|
155
|
-
n = type_name_cache[name] and return n
|
156
|
-
|
157
|
-
type_name_cache[name] =
|
158
|
-
(case
|
159
|
-
when name.class?
|
160
|
-
Names::Module.new(name: name.name, namespace: namespace(name.namespace), location: nil)
|
161
|
-
when name.interface?
|
162
|
-
Names::Interface.new(name: name.name, namespace: namespace(name.namespace), location: nil)
|
163
|
-
when name.alias?
|
164
|
-
Names::Alias.new(name: name.name, namespace: namespace(name.namespace), location: nil)
|
165
|
-
end)
|
166
|
-
end
|
167
|
-
|
168
|
-
def type_name_1(name)
|
169
|
-
RBS::TypeName.new(name: name.name, namespace: namespace_1(name.namespace))
|
170
|
-
end
|
171
|
-
|
172
|
-
def namespace(namespace)
|
173
|
-
Namespace.parse(namespace.to_s)
|
174
|
-
end
|
175
|
-
|
176
|
-
def namespace_1(namespace)
|
177
|
-
RBS::Namespace.parse(namespace.to_s)
|
178
|
-
end
|
179
|
-
|
180
157
|
def function_1(params, return_type)
|
181
158
|
RBS::Types::Function.new(
|
182
159
|
required_positionals: params.required.map {|type| RBS::Types::Function::Param.new(name: nil, type: type_1(type)) },
|
@@ -201,7 +178,7 @@ module Steep
|
|
201
178
|
)
|
202
179
|
end
|
203
180
|
|
204
|
-
def method_type(method_type, self_type:, subst2: nil)
|
181
|
+
def method_type(method_type, self_type:, subst2: nil, method_def: nil)
|
205
182
|
fvs = self_type.free_variables()
|
206
183
|
|
207
184
|
type_params = []
|
@@ -225,14 +202,15 @@ module Steep
|
|
225
202
|
type_params: type_params,
|
226
203
|
return_type: type(method_type.type.return_type).subst(subst),
|
227
204
|
params: params(method_type.type).subst(subst),
|
228
|
-
location: nil,
|
229
205
|
block: method_type.block&.yield_self do |block|
|
230
206
|
Interface::Block.new(
|
231
207
|
optional: !block.required,
|
232
208
|
type: Proc.new(params: params(block.type).subst(subst),
|
233
209
|
return_type: type(block.type.return_type).subst(subst), location: nil)
|
234
210
|
)
|
235
|
-
end
|
211
|
+
end,
|
212
|
+
method_def: method_def,
|
213
|
+
location: method_def&.member&.location
|
236
214
|
)
|
237
215
|
|
238
216
|
if block_given?
|
@@ -292,7 +270,7 @@ module Steep
|
|
292
270
|
end
|
293
271
|
|
294
272
|
def unfold(type_name)
|
295
|
-
|
273
|
+
type_name.yield_self do |type_name|
|
296
274
|
type(definition_builder.expand_alias(type_name))
|
297
275
|
end
|
298
276
|
end
|
@@ -312,20 +290,129 @@ module Steep
|
|
312
290
|
end
|
313
291
|
end
|
314
292
|
|
293
|
+
def deep_expand_alias(type, recursive: Set.new, &block)
|
294
|
+
raise "Recursive type definition: #{type}" if recursive.member?(type)
|
295
|
+
|
296
|
+
ty = case type
|
297
|
+
when AST::Types::Name::Alias
|
298
|
+
deep_expand_alias(expand_alias(type), recursive: recursive.union([type]))
|
299
|
+
when AST::Types::Union
|
300
|
+
AST::Types::Union.build(
|
301
|
+
types: type.types.map {|ty| deep_expand_alias(ty, recursive: recursive, &block) },
|
302
|
+
location: type.location
|
303
|
+
)
|
304
|
+
else
|
305
|
+
type
|
306
|
+
end
|
307
|
+
|
308
|
+
if block_given?
|
309
|
+
yield ty
|
310
|
+
else
|
311
|
+
ty
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
def flatten_union(type, acc = [])
|
316
|
+
case type
|
317
|
+
when AST::Types::Union
|
318
|
+
type.types.each {|ty| flatten_union(ty, acc) }
|
319
|
+
else
|
320
|
+
acc << type
|
321
|
+
end
|
322
|
+
|
323
|
+
acc
|
324
|
+
end
|
325
|
+
|
326
|
+
def unwrap_optional(type)
|
327
|
+
case type
|
328
|
+
when AST::Types::Union
|
329
|
+
falsy_types, truthy_types = type.types.partition do |type|
|
330
|
+
(type.is_a?(AST::Types::Literal) && type.value == false) ||
|
331
|
+
type.is_a?(AST::Types::Nil)
|
332
|
+
end
|
333
|
+
|
334
|
+
[
|
335
|
+
AST::Types::Union.build(types: truthy_types),
|
336
|
+
AST::Types::Union.build(types: falsy_types)
|
337
|
+
]
|
338
|
+
when AST::Types::Name::Alias
|
339
|
+
unwrap_optional(expand_alias(type))
|
340
|
+
else
|
341
|
+
[type, nil]
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
def setup_primitives(method_name, method_type)
|
346
|
+
if method_def = method_type.method_def
|
347
|
+
defined_in = method_def.defined_in
|
348
|
+
member = method_def.member
|
349
|
+
|
350
|
+
if member.is_a?(RBS::AST::Members::MethodDefinition)
|
351
|
+
case
|
352
|
+
when defined_in == RBS::BuiltinNames::Object.name && member.instance?
|
353
|
+
case method_name
|
354
|
+
when :is_a?, :kind_of?, :instance_of?
|
355
|
+
return method_type.with(
|
356
|
+
return_type: AST::Types::Logic::ReceiverIsArg.new(location: method_type.return_type.location)
|
357
|
+
)
|
358
|
+
when :nil?
|
359
|
+
return method_type.with(
|
360
|
+
return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
|
361
|
+
)
|
362
|
+
end
|
363
|
+
|
364
|
+
when defined_in == AST::Builtin::NilClass.module_name && member.instance?
|
365
|
+
case method_name
|
366
|
+
when :nil?
|
367
|
+
return method_type.with(
|
368
|
+
return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
|
369
|
+
)
|
370
|
+
end
|
371
|
+
|
372
|
+
when defined_in == RBS::BuiltinNames::BasicObject.name && member.instance?
|
373
|
+
case method_name
|
374
|
+
when :!
|
375
|
+
return method_type.with(
|
376
|
+
return_type: AST::Types::Logic::Not.new(location: method_type.return_type.location)
|
377
|
+
)
|
378
|
+
end
|
379
|
+
|
380
|
+
when defined_in == RBS::BuiltinNames::Module.name && member.instance?
|
381
|
+
case method_name
|
382
|
+
when :===
|
383
|
+
return method_type.with(
|
384
|
+
return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.return_type.location)
|
385
|
+
)
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
method_type
|
392
|
+
end
|
393
|
+
|
315
394
|
def interface(type, private:, self_type: type)
|
316
395
|
Steep.logger.debug { "Factory#interface: #{type}, private=#{private}, self_type=#{self_type}" }
|
317
|
-
|
396
|
+
|
397
|
+
cache_key = [type, self_type, private]
|
398
|
+
if type_interface_cache.key?(cache_key)
|
399
|
+
return type_interface_cache[cache_key]
|
400
|
+
end
|
318
401
|
|
319
402
|
case type
|
403
|
+
when Name::Alias
|
404
|
+
interface(expand_alias(type), private: private, self_type: self_type)
|
405
|
+
|
320
406
|
when Self
|
321
407
|
if self_type != type
|
322
408
|
interface self_type, private: private, self_type: Self.new
|
323
409
|
else
|
324
410
|
raise "Unexpected `self` type interface"
|
325
411
|
end
|
412
|
+
|
326
413
|
when Name::Instance
|
327
414
|
Interface::Interface.new(type: self_type, private: private).tap do |interface|
|
328
|
-
definition = definition_builder.build_instance(
|
415
|
+
definition = definition_builder.build_instance(type.name)
|
329
416
|
|
330
417
|
instance_type = Name::Instance.new(name: type.name,
|
331
418
|
args: type.args.map { Any.new(location: nil) },
|
@@ -345,8 +432,14 @@ module Steep
|
|
345
432
|
next if method.private? && !private
|
346
433
|
|
347
434
|
interface.methods[name] = Interface::Interface::Entry.new(
|
348
|
-
method_types: method.
|
349
|
-
|
435
|
+
method_types: method.defs.map do |type_def|
|
436
|
+
setup_primitives(
|
437
|
+
name,
|
438
|
+
method_type(type_def.type,
|
439
|
+
method_def: type_def,
|
440
|
+
self_type: self_type,
|
441
|
+
subst2: subst)
|
442
|
+
)
|
350
443
|
end
|
351
444
|
)
|
352
445
|
end
|
@@ -355,7 +448,7 @@ module Steep
|
|
355
448
|
|
356
449
|
when Name::Interface
|
357
450
|
Interface::Interface.new(type: self_type, private: private).tap do |interface|
|
358
|
-
type_name =
|
451
|
+
type_name = type.name
|
359
452
|
definition = definition_builder.build_interface(type_name)
|
360
453
|
|
361
454
|
subst = Interface::Substitution.build(
|
@@ -366,8 +459,8 @@ module Steep
|
|
366
459
|
|
367
460
|
definition.methods.each do |name, method|
|
368
461
|
interface.methods[name] = Interface::Interface::Entry.new(
|
369
|
-
method_types: method.
|
370
|
-
method_type(type, self_type: self_type, subst2: subst)
|
462
|
+
method_types: method.defs.map do |type_def|
|
463
|
+
method_type(type_def.type, method_def: type_def, self_type: self_type, subst2: subst)
|
371
464
|
end
|
372
465
|
)
|
373
466
|
end
|
@@ -375,7 +468,7 @@ module Steep
|
|
375
468
|
|
376
469
|
when Name::Singleton
|
377
470
|
Interface::Interface.new(type: self_type, private: private).tap do |interface|
|
378
|
-
definition = definition_builder.build_singleton(
|
471
|
+
definition = definition_builder.build_singleton(type.name)
|
379
472
|
|
380
473
|
instance_type = Name::Instance.new(name: type.name,
|
381
474
|
args: definition.type_params.map {Any.new(location: nil)},
|
@@ -391,8 +484,14 @@ module Steep
|
|
391
484
|
next if !private && method.private?
|
392
485
|
|
393
486
|
interface.methods[name] = Interface::Interface::Entry.new(
|
394
|
-
method_types: method.
|
395
|
-
|
487
|
+
method_types: method.defs.map do |type_def|
|
488
|
+
setup_primitives(
|
489
|
+
name,
|
490
|
+
method_type(type_def.type,
|
491
|
+
method_def: type_def,
|
492
|
+
self_type: self_type,
|
493
|
+
subst2: subst)
|
494
|
+
)
|
396
495
|
end
|
397
496
|
)
|
398
497
|
end
|
@@ -469,6 +568,7 @@ module Steep
|
|
469
568
|
rest_keywords: nil),
|
470
569
|
block: nil,
|
471
570
|
return_type: elem_type,
|
571
|
+
method_def: nil,
|
472
572
|
location: nil
|
473
573
|
)
|
474
574
|
} + aref.method_types
|
@@ -488,6 +588,7 @@ module Steep
|
|
488
588
|
rest_keywords: nil),
|
489
589
|
block: nil,
|
490
590
|
return_type: elem_type,
|
591
|
+
method_def: nil,
|
491
592
|
location: nil
|
492
593
|
)
|
493
594
|
} + update.method_types
|
@@ -502,6 +603,7 @@ module Steep
|
|
502
603
|
params: Interface::Params.empty,
|
503
604
|
block: nil,
|
504
605
|
return_type: type.types[0] || AST::Builtin.nil_type,
|
606
|
+
method_def: nil,
|
505
607
|
location: nil
|
506
608
|
)
|
507
609
|
]
|
@@ -516,6 +618,7 @@ module Steep
|
|
516
618
|
params: Interface::Params.empty,
|
517
619
|
block: nil,
|
518
620
|
return_type: type.types.last || AST::Builtin.nil_type,
|
621
|
+
method_def: nil,
|
519
622
|
location: nil
|
520
623
|
)
|
521
624
|
]
|
@@ -547,6 +650,7 @@ module Steep
|
|
547
650
|
rest_keywords: nil),
|
548
651
|
block: nil,
|
549
652
|
return_type: value_type,
|
653
|
+
method_def: nil,
|
550
654
|
location: nil
|
551
655
|
)
|
552
656
|
} + ref.method_types
|
@@ -567,6 +671,7 @@ module Steep
|
|
567
671
|
rest_keywords: nil),
|
568
672
|
block: nil,
|
569
673
|
return_type: value_type,
|
674
|
+
method_def: nil,
|
570
675
|
location: nil
|
571
676
|
)
|
572
677
|
} + update.method_types
|
@@ -582,6 +687,7 @@ module Steep
|
|
582
687
|
params: type.params,
|
583
688
|
return_type: type.return_type,
|
584
689
|
block: nil,
|
690
|
+
method_def: nil,
|
585
691
|
location: nil
|
586
692
|
)
|
587
693
|
|
@@ -589,19 +695,22 @@ module Steep
|
|
589
695
|
interface.methods[:call] = Interface::Interface::Entry.new(method_types: [method_type])
|
590
696
|
end
|
591
697
|
|
698
|
+
when Logic::Base
|
699
|
+
interface(AST::Builtin.bool_type, private: private, self_type: self_type)
|
700
|
+
|
592
701
|
else
|
593
702
|
raise "Unexpected type for interface: #{type}"
|
703
|
+
end.tap do |interface|
|
704
|
+
type_interface_cache[cache_key] = interface
|
594
705
|
end
|
595
706
|
end
|
596
707
|
|
597
708
|
def module_name?(type_name)
|
598
|
-
|
599
|
-
entry = env.class_decls[name] and entry.is_a?(RBS::Environment::ModuleEntry)
|
709
|
+
entry = env.class_decls[type_name] and entry.is_a?(RBS::Environment::ModuleEntry)
|
600
710
|
end
|
601
711
|
|
602
712
|
def class_name?(type_name)
|
603
|
-
|
604
|
-
entry = env.class_decls[name] and entry.is_a?(RBS::Environment::ClassEntry)
|
713
|
+
entry = env.class_decls[type_name] and entry.is_a?(RBS::Environment::ClassEntry)
|
605
714
|
end
|
606
715
|
|
607
716
|
def env
|
@@ -616,7 +725,22 @@ module Steep
|
|
616
725
|
end
|
617
726
|
|
618
727
|
def absolute_type_name(type_name, namespace:)
|
619
|
-
type_name_resolver.resolve(type_name, context:
|
728
|
+
type_name_resolver.resolve(type_name, context: namespace.ascend)
|
729
|
+
end
|
730
|
+
|
731
|
+
def instance_type(type_name, args: nil, location: nil)
|
732
|
+
raise unless type_name.class?
|
733
|
+
|
734
|
+
definition = definition_builder.build_singleton(type_name)
|
735
|
+
def_args = definition.type_params.map { Any.new(location: nil) }
|
736
|
+
|
737
|
+
if args
|
738
|
+
raise if def_args.size != args.size
|
739
|
+
else
|
740
|
+
args = def_args
|
741
|
+
end
|
742
|
+
|
743
|
+
AST::Types::Name::Instance.new(location: location, name: type_name, args: args)
|
620
744
|
end
|
621
745
|
end
|
622
746
|
end
|