steep 1.4.0.dev.3 → 1.4.0.dev.4
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/Gemfile.lock +3 -3
- data/Gemfile.steep.lock +5 -7
- data/lib/steep/diagnostic/ruby.rb +1 -2
- data/lib/steep/interface/builder.rb +3 -3
- data/lib/steep/method_name.rb +8 -0
- data/lib/steep/server/interaction_worker.rb +131 -177
- data/lib/steep/server/lsp_formatter.rb +308 -154
- data/lib/steep/server/master.rb +4 -1
- data/lib/steep/services/completion_provider.rb +140 -103
- data/lib/steep/services/hover_provider/rbs.rb +37 -32
- data/lib/steep/services/signature_help_provider.rb +108 -0
- data/lib/steep/services/type_name_completion.rb +9 -1
- data/lib/steep/type_construction.rb +61 -40
- data/lib/steep/type_inference/method_call.rb +1 -1
- data/lib/steep/type_inference/send_args.rb +3 -3
- data/lib/steep/type_inference/type_env.rb +5 -3
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +1 -0
- data/sample/Steepfile +2 -0
- data/sig/shims/language-server_protocol.rbs +265 -0
- data/sig/shims/parser.rbs +3 -0
- data/sig/steep/method_name.rbs +5 -1
- data/sig/steep/server/interaction_worker.rbs +18 -12
- data/sig/steep/server/lsp_formatter.rbs +43 -18
- data/sig/steep/services/completion_provider.rbs +105 -29
- data/sig/steep/services/hover_provider/rbs.rbs +13 -9
- data/sig/steep/services/signature_help_provider.rbs +39 -0
- data/sig/steep/type_inference/method_call.rbs +1 -1
- data/sig/steep/type_inference/send_args.rbs +6 -2
- data/sig/steep/typing.rbs +1 -1
- metadata +4 -2
@@ -26,43 +26,78 @@ module Steep
|
|
26
26
|
def comments
|
27
27
|
case entry = env.constant_entry(full_name)
|
28
28
|
when RBS::Environment::ConstantEntry
|
29
|
-
[entry.decl.comment]
|
29
|
+
[entry.decl.comment]
|
30
30
|
when RBS::Environment::ClassEntry, RBS::Environment::ModuleEntry
|
31
|
-
entry.decls.
|
31
|
+
entry.decls.map {|d| d.decl.comment }
|
32
32
|
when RBS::Environment::ClassAliasEntry, RBS::Environment::ModuleAliasEntry
|
33
|
-
[entry.decl.comment]
|
33
|
+
[entry.decl.comment]
|
34
|
+
else
|
35
|
+
raise
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def decl
|
40
|
+
case entry = env.constant_entry(full_name)
|
41
|
+
when RBS::Environment::ConstantEntry
|
42
|
+
entry.decl
|
43
|
+
when RBS::Environment::ClassEntry, RBS::Environment::ModuleEntry
|
44
|
+
entry.primary.decl
|
45
|
+
when RBS::Environment::ClassAliasEntry, RBS::Environment::ModuleAliasEntry
|
46
|
+
entry.decl
|
34
47
|
else
|
35
48
|
raise
|
36
49
|
end
|
37
50
|
end
|
38
51
|
end
|
39
|
-
|
40
|
-
|
52
|
+
|
53
|
+
SimpleMethodNameItem = _ = Struct.new(:identifier, :range, :receiver_type, :method_types, :method_member, :method_name, keyword_init: true) do
|
54
|
+
# @implements SimpleMethodNameItem
|
41
55
|
|
42
56
|
def comment
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
57
|
+
method_member.comment
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
ComplexMethodNameItem = _ = Struct.new(:identifier, :range, :receiver_type, :method_types, :method_decls, keyword_init: true) do
|
62
|
+
# @implements ComplexMethodNameItem
|
63
|
+
|
64
|
+
def method_names
|
65
|
+
method_definitions.keys
|
66
|
+
end
|
67
|
+
|
68
|
+
def method_definitions
|
69
|
+
method_decls.each.with_object({}) do |decl, hash| #$ Hash[method_name, RBS::Definition::Method::method_member]
|
70
|
+
method_name = defining_method_name(
|
71
|
+
decl.method_def.defined_in,
|
72
|
+
decl.method_name.method_name,
|
73
|
+
decl.method_def.member
|
74
|
+
)
|
75
|
+
hash[method_name] = decl.method_def.member
|
51
76
|
end
|
52
77
|
end
|
53
78
|
|
54
|
-
def
|
55
|
-
case
|
56
|
-
when
|
57
|
-
|
58
|
-
|
79
|
+
def defining_method_name(type_name, name, member)
|
80
|
+
case member
|
81
|
+
when RBS::AST::Members::MethodDefinition
|
82
|
+
if member.instance?
|
83
|
+
InstanceMethodName.new(type_name: type_name, method_name: name)
|
84
|
+
else
|
85
|
+
SingletonMethodName.new(type_name: type_name, method_name: name)
|
86
|
+
end
|
87
|
+
when RBS::AST::Members::Attribute
|
88
|
+
if member.kind == :instance
|
89
|
+
InstanceMethodName.new(type_name: type_name, method_name: name)
|
90
|
+
else
|
91
|
+
SingletonMethodName.new(type_name: type_name, method_name: name)
|
59
92
|
end
|
60
|
-
else
|
61
|
-
false
|
62
93
|
end
|
63
94
|
end
|
64
95
|
end
|
65
96
|
|
97
|
+
GeneratedMethodNameItem = _ = Struct.new(:identifier, :range, :receiver_type, :method_types, keyword_init: true) do
|
98
|
+
# @implements GeneratedMethodNameItem
|
99
|
+
end
|
100
|
+
|
66
101
|
attr_reader :source_text
|
67
102
|
attr_reader :path
|
68
103
|
attr_reader :subtyping
|
@@ -168,51 +203,40 @@ module Steep
|
|
168
203
|
|
169
204
|
return [] unless node
|
170
205
|
|
171
|
-
items = []
|
206
|
+
items = [] #: Array[item]
|
172
207
|
|
173
208
|
context = typing.context_at(line: position.line, column: position.column)
|
174
209
|
|
175
210
|
case
|
176
|
-
when node.type == :send && node.children[0] == nil && at_end?(position, of: node.loc.selector)
|
211
|
+
when node.type == :send && node.children[0] == nil && at_end?(position, of: (_ = node.loc).selector)
|
177
212
|
# foo ←
|
178
213
|
prefix = node.children[1].to_s
|
179
214
|
|
180
|
-
method_items_for_receiver_type(context.self_type,
|
181
|
-
include_private: true,
|
182
|
-
prefix: prefix,
|
183
|
-
position: position,
|
184
|
-
items: items)
|
215
|
+
method_items_for_receiver_type(context.self_type, include_private: true, prefix: prefix, position: position, items: items)
|
185
216
|
local_variable_items_for_context(context, position: position, prefix: prefix, items: items)
|
186
217
|
|
187
218
|
when node.type == :lvar && at_end?(position, of: node.loc)
|
188
219
|
# foo ← (lvar)
|
189
220
|
local_variable_items_for_context(context, position: position, prefix: node.children[0].to_s, items: items)
|
190
221
|
|
191
|
-
when node.type == :send && node.children[0] && at_end?(position, of: node.loc.selector)
|
222
|
+
when node.type == :send && node.children[0] && at_end?(position, of: (_ = node.loc).selector)
|
192
223
|
# foo.ba ←
|
193
|
-
receiver_type =
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
224
|
+
receiver_type =
|
225
|
+
case (type = typing.type_of(node: node.children[0]))
|
226
|
+
when AST::Types::Self
|
227
|
+
context.self_type
|
228
|
+
else
|
229
|
+
type
|
230
|
+
end
|
199
231
|
prefix = node.children[1].to_s
|
200
232
|
|
201
|
-
method_items_for_receiver_type(receiver_type,
|
202
|
-
include_private: false,
|
203
|
-
prefix: prefix,
|
204
|
-
position: position,
|
205
|
-
items: items)
|
233
|
+
method_items_for_receiver_type(receiver_type, include_private: false, prefix: prefix, position: position, items: items)
|
206
234
|
|
207
235
|
when node.type == :const && node.children[0] == nil && at_end?(position, of: node.loc)
|
208
236
|
# Foo ← (const)
|
209
237
|
prefix = node.children[1].to_s
|
210
238
|
|
211
|
-
method_items_for_receiver_type(context.self_type,
|
212
|
-
include_private: false,
|
213
|
-
prefix: prefix,
|
214
|
-
position: position,
|
215
|
-
items: items)
|
239
|
+
method_items_for_receiver_type(context.self_type, include_private: false, prefix: prefix, position: position, items: items)
|
216
240
|
constant_items_for_context(context, prefix: prefix, position: position, items: items)
|
217
241
|
|
218
242
|
when node.type == :const && node.children[0] && at_end?(position, of: node.loc)
|
@@ -223,30 +247,23 @@ module Steep
|
|
223
247
|
if parent_type
|
224
248
|
prefix = node.children[1].to_s
|
225
249
|
|
226
|
-
method_items_for_receiver_type(parent_type,
|
227
|
-
include_private: false,
|
228
|
-
prefix: prefix,
|
229
|
-
position: position,
|
230
|
-
items: items)
|
250
|
+
method_items_for_receiver_type(parent_type, include_private: false, prefix: prefix, position: position, items: items)
|
231
251
|
constant_items_for_context(context, parent: parent_node, prefix: prefix, position: position, items: items)
|
232
252
|
end
|
233
253
|
|
234
|
-
when node.type == :send && at_end?(position, of: node.loc.dot) && node.loc.dot.source == "."
|
254
|
+
when node.type == :send && at_end?(position, of: (_ = node.loc).dot) && (_ = node.loc).dot.source == "."
|
235
255
|
# foo.← ba
|
236
|
-
receiver_type =
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
items: items)
|
248
|
-
|
249
|
-
when node.type == :send && at_end?(position, of: node.loc.dot) && node.loc.dot.source == "::"
|
256
|
+
receiver_type =
|
257
|
+
case (type = typing.type_of(node: node.children[0]))
|
258
|
+
when AST::Types::Self
|
259
|
+
context.self_type
|
260
|
+
else
|
261
|
+
type
|
262
|
+
end
|
263
|
+
|
264
|
+
method_items_for_receiver_type(receiver_type, include_private: false, prefix: "", position: position, items: items)
|
265
|
+
|
266
|
+
when node.type == :send && at_end?(position, of: (_ = node.loc).dot) && (_ = node.loc).dot.source == "::"
|
250
267
|
# foo::← ba
|
251
268
|
items.push(*items_for_colon2(position: position))
|
252
269
|
|
@@ -255,11 +272,7 @@ module Steep
|
|
255
272
|
instance_variable_items_for_context(context, position: position, prefix: node.children[0].to_s, items: items)
|
256
273
|
|
257
274
|
else
|
258
|
-
method_items_for_receiver_type(context.self_type,
|
259
|
-
include_private: true,
|
260
|
-
prefix: "",
|
261
|
-
position: position,
|
262
|
-
items: items)
|
275
|
+
method_items_for_receiver_type(context.self_type, include_private: true, prefix: "", position: position, items: items)
|
263
276
|
local_variable_items_for_context(context, position: position, prefix: "", items: items)
|
264
277
|
instance_variable_items_for_context(context, position: position, prefix: "", items: items)
|
265
278
|
constant_items_for_context(context, position: position, prefix: "", items: items)
|
@@ -279,19 +292,16 @@ module Steep
|
|
279
292
|
if at_end?(shift_pos, of: node.loc)
|
280
293
|
begin
|
281
294
|
context = typing.context_at(line: position.line, column: position.column)
|
282
|
-
receiver_type =
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
prefix: "",
|
293
|
-
position: position,
|
294
|
-
items: items)
|
295
|
+
receiver_type =
|
296
|
+
case (type = typing.type_of(node: node))
|
297
|
+
when AST::Types::Self
|
298
|
+
context.self_type
|
299
|
+
else
|
300
|
+
type
|
301
|
+
end
|
302
|
+
|
303
|
+
items = [] #: Array[item]
|
304
|
+
method_items_for_receiver_type(receiver_type, include_private: false, prefix: "", position: position, items: items)
|
295
305
|
items
|
296
306
|
rescue Typing::UnknownNodeError
|
297
307
|
[]
|
@@ -307,7 +317,7 @@ module Steep
|
|
307
317
|
node, *_ = source.find_nodes(line: shift_pos.line, column: shift_pos.column)
|
308
318
|
node ||= source.node
|
309
319
|
|
310
|
-
items = []
|
320
|
+
items = [] #: Array[item]
|
311
321
|
case node&.type
|
312
322
|
when :const
|
313
323
|
# Constant:: ←
|
@@ -335,7 +345,7 @@ module Steep
|
|
335
345
|
return [] unless node
|
336
346
|
|
337
347
|
context = typing.context_at(line: position.line, column: position.column)
|
338
|
-
items = []
|
348
|
+
items = [] #: Array[item]
|
339
349
|
instance_variable_items_for_context(context, prefix: "@", position: position, items: items)
|
340
350
|
items
|
341
351
|
end
|
@@ -354,31 +364,60 @@ module Steep
|
|
354
364
|
variable_bounds: context.variable_context.upper_bounds
|
355
365
|
)
|
356
366
|
)
|
357
|
-
# factory.shape(type, self_type: type, private: include_private)
|
358
367
|
|
359
|
-
shape
|
360
|
-
|
368
|
+
if shape
|
369
|
+
shape.methods.each do |name, method_entry|
|
370
|
+
next if disallowed_method?(name)
|
361
371
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
+
if name.to_s.start_with?(prefix)
|
373
|
+
if word_name?(name.to_s)
|
374
|
+
case type
|
375
|
+
when AST::Types::Name::Instance, AST::Types::Name::Interface, AST::Types::Name::Singleton
|
376
|
+
# Simple method type
|
377
|
+
all_decls = Set.new(method_entry.method_types.flat_map {|method_type| method_type.method_decls.to_a }).sort_by {|decl| decl.method_name.to_s }
|
378
|
+
all_members = Set.new(all_decls.flat_map {|decl| decl.method_def.member })
|
379
|
+
all_members.each do |member|
|
380
|
+
associated_decl = all_decls.find {|decl| decl.method_def.member == member } or next
|
381
|
+
method_types = method_entry.method_types.select {|method_type| method_type.method_decls.any? {|decl| decl.method_def.member == member }}
|
382
|
+
items << SimpleMethodNameItem.new(
|
383
|
+
identifier: name,
|
384
|
+
range: range,
|
385
|
+
receiver_type: type,
|
386
|
+
method_name: associated_decl.method_name,
|
387
|
+
method_types: method_types.map {|type| subtyping.factory.method_type_1(type) },
|
388
|
+
method_member: member
|
389
|
+
)
|
390
|
+
end
|
391
|
+
else
|
392
|
+
generated_method_types, defined_method_types = method_entry.method_types.partition {|method_type| method_type.method_decls.empty? }
|
393
|
+
|
394
|
+
unless defined_method_types.empty?
|
395
|
+
items << ComplexMethodNameItem.new(
|
396
|
+
identifier: name,
|
397
|
+
range: range,
|
398
|
+
receiver_type: type,
|
399
|
+
method_types: defined_method_types.map {|type| subtyping.factory.method_type_1(type) },
|
400
|
+
method_decls: defined_method_types.flat_map {|type| type.method_decls.to_a }.sort_by {|decl| decl.method_name.to_s }
|
401
|
+
)
|
402
|
+
end
|
403
|
+
|
404
|
+
unless generated_method_types.empty?
|
405
|
+
items << GeneratedMethodNameItem.new(
|
406
|
+
identifier: name,
|
407
|
+
range: range,
|
408
|
+
receiver_type: type,
|
409
|
+
method_types: generated_method_types.map {|type| subtyping.factory.method_type_1(type) }
|
410
|
+
)
|
411
|
+
end
|
412
|
+
end
|
372
413
|
end
|
373
414
|
end
|
374
415
|
end
|
375
416
|
end
|
376
|
-
rescue RuntimeError => _exn
|
377
|
-
# nop
|
378
417
|
end
|
379
418
|
|
380
419
|
def word_name?(name)
|
381
|
-
name =~ /\w/
|
420
|
+
name =~ /\w/ ? true : false
|
382
421
|
end
|
383
422
|
|
384
423
|
def local_variable_items_for_context(context, position:, prefix:, items:)
|
@@ -420,9 +459,7 @@ module Steep
|
|
420
459
|
range = range_for(position, prefix: prefix)
|
421
460
|
context.type_env.instance_variable_types.each do |name, type|
|
422
461
|
if name.to_s.start_with?(prefix)
|
423
|
-
items << InstanceVariableItem.new(identifier: name,
|
424
|
-
range: range,
|
425
|
-
type: type)
|
462
|
+
items << InstanceVariableItem.new(identifier: name, range: range, type: type)
|
426
463
|
end
|
427
464
|
end
|
428
465
|
end
|
@@ -29,54 +29,59 @@ module Steep
|
|
29
29
|
|
30
30
|
case head
|
31
31
|
when ::RBS::Types::Alias
|
32
|
-
|
32
|
+
content_for_type_name(head.name, env: env, location: head.location || raise)
|
33
33
|
|
34
|
-
TypeAliasContent.new(
|
35
|
-
location: head.location || raise,
|
36
|
-
decl: alias_decl
|
37
|
-
)
|
38
34
|
when ::RBS::Types::ClassInstance, ::RBS::Types::ClassSingleton
|
39
35
|
if loc_key == :name
|
40
36
|
location = head.location&.[](:name) or raise
|
41
|
-
|
42
|
-
class_entry = service.latest_env.module_class_entry(head.name) or raise
|
43
|
-
case class_entry
|
44
|
-
when ::RBS::Environment::ClassEntry, ::RBS::Environment::ModuleEntry
|
45
|
-
class_decl = class_entry.primary.decl
|
46
|
-
when ::RBS::Environment::ClassAliasEntry, ::RBS::Environment::ModuleAliasEntry
|
47
|
-
class_decl = class_entry.decl
|
48
|
-
end
|
49
|
-
|
50
|
-
ClassContent.new(
|
51
|
-
location: location,
|
52
|
-
decl: class_decl
|
53
|
-
)
|
37
|
+
content_for_type_name(head.name, env: env, location: location)
|
54
38
|
end
|
39
|
+
|
55
40
|
when ::RBS::Types::Interface
|
56
|
-
env = service.latest_env
|
57
|
-
interface_decl = env.interface_decls[head.name]&.decl or raise
|
58
41
|
location = head.location&.[](:name) or raise
|
42
|
+
content_for_type_name(head.name, env: env, location: location)
|
59
43
|
|
60
|
-
InterfaceContent.new(
|
61
|
-
location: location,
|
62
|
-
decl: interface_decl
|
63
|
-
)
|
64
44
|
when ::RBS::AST::Declarations::ClassAlias, ::RBS::AST::Declarations::ModuleAlias
|
65
45
|
if loc_key == :old_name
|
66
46
|
location = head.location&.[](:old_name) or raise
|
47
|
+
content_for_type_name(head.old_name, env: env, location: location)
|
48
|
+
end
|
67
49
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
class_decl = class_entry.decl
|
74
|
-
end
|
50
|
+
when ::RBS::AST::Directives::Use::SingleClause
|
51
|
+
if loc_key == :type_name
|
52
|
+
location = head.location&.[](:type_name) or raise
|
53
|
+
content_for_type_name(head.type_name.absolute!, env: env, location: location)
|
54
|
+
end
|
75
55
|
|
76
|
-
|
56
|
+
when ::RBS::AST::Directives::Use::WildcardClause
|
57
|
+
if loc_key == :namespace
|
58
|
+
location = head.location&.[](:namespace) or raise
|
59
|
+
content_for_type_name(head.namespace.to_type_name.absolute!, env: env, location: location)
|
77
60
|
end
|
78
61
|
end
|
79
62
|
end
|
63
|
+
|
64
|
+
def content_for_type_name(type_name, env:, location:)
|
65
|
+
case
|
66
|
+
when type_name.alias?
|
67
|
+
alias_decl = env.type_alias_decls[type_name]&.decl or return
|
68
|
+
TypeAliasContent.new(location: location, decl: alias_decl)
|
69
|
+
when type_name.interface?
|
70
|
+
interface_decl = env.interface_decls[type_name]&.decl or return
|
71
|
+
InterfaceContent.new(location: location, decl: interface_decl)
|
72
|
+
when type_name.class?
|
73
|
+
class_entry = env.module_class_entry(type_name) or return
|
74
|
+
|
75
|
+
case class_entry
|
76
|
+
when ::RBS::Environment::ClassEntry, ::RBS::Environment::ModuleEntry
|
77
|
+
class_decl = class_entry.primary.decl
|
78
|
+
when ::RBS::Environment::ClassAliasEntry, ::RBS::Environment::ModuleAliasEntry
|
79
|
+
class_decl = class_entry.decl
|
80
|
+
end
|
81
|
+
|
82
|
+
ClassContent.new(location: location, decl: class_decl)
|
83
|
+
end
|
84
|
+
end
|
80
85
|
end
|
81
86
|
end
|
82
87
|
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module Steep
|
2
|
+
module Services
|
3
|
+
class SignatureHelpProvider
|
4
|
+
MethodCall = TypeInference::MethodCall
|
5
|
+
|
6
|
+
Item = _ = Struct.new(:method_type, :comment)
|
7
|
+
|
8
|
+
attr_reader :source, :path, :subtyping, :typing, :buffer
|
9
|
+
|
10
|
+
def env
|
11
|
+
subtyping.factory.env
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(source:, subtyping:)
|
15
|
+
@source = source
|
16
|
+
@subtyping = subtyping
|
17
|
+
|
18
|
+
text =
|
19
|
+
if source.node
|
20
|
+
source.node.loc.expression.source
|
21
|
+
end
|
22
|
+
@buffer = RBS::Buffer.new(name: source.path, content: text || "")
|
23
|
+
end
|
24
|
+
|
25
|
+
def run(line:, column:)
|
26
|
+
nodes = source.find_nodes(line: line, column: column)
|
27
|
+
|
28
|
+
return unless nodes
|
29
|
+
|
30
|
+
typing = type_check!(line: line, column: column)
|
31
|
+
|
32
|
+
while true
|
33
|
+
node = nodes.shift()
|
34
|
+
parent = nodes.first
|
35
|
+
|
36
|
+
node or return
|
37
|
+
|
38
|
+
if node.type == :send
|
39
|
+
pos = buffer.loc_to_pos([line, column])
|
40
|
+
begin_loc = (_ = node.loc).begin #: Parser::Source::Range?
|
41
|
+
end_loc = (_ = node.loc).end #: Parser::Source::Range?
|
42
|
+
|
43
|
+
if begin_loc && end_loc
|
44
|
+
if begin_loc.end_pos <= pos && pos <= end_loc.begin_pos
|
45
|
+
# Given position is between open/close parens of args of send node
|
46
|
+
|
47
|
+
if parent && (parent.type == :block || parent.type == :numblock)
|
48
|
+
send_node = parent.children[0]
|
49
|
+
else
|
50
|
+
send_node = node
|
51
|
+
end
|
52
|
+
|
53
|
+
return signature_help_for(send_node, typing)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def type_check!(line:, column:)
|
61
|
+
source = self.source.without_unrelated_defs(line: line, column: column)
|
62
|
+
resolver = RBS::Resolver::ConstantResolver.new(builder: subtyping.factory.definition_builder)
|
63
|
+
TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver)
|
64
|
+
end
|
65
|
+
|
66
|
+
def signature_help_for(node, typing)
|
67
|
+
call = typing.call_of(node: node)
|
68
|
+
context = typing.context_at(line: node.loc.expression.line, column: node.loc.expression.column)
|
69
|
+
|
70
|
+
items = [] #: Array[Item]
|
71
|
+
index = nil #: Integer?
|
72
|
+
|
73
|
+
case call
|
74
|
+
when MethodCall::Typed, MethodCall::Error
|
75
|
+
type = call.receiver_type
|
76
|
+
if type.is_a?(AST::Types::Self)
|
77
|
+
type = context.self_type
|
78
|
+
end
|
79
|
+
|
80
|
+
shape = subtyping.builder.shape(
|
81
|
+
type,
|
82
|
+
public_only: !node.children[0].nil?,
|
83
|
+
config: Interface::Builder::Config.new(self_type: type, class_type: nil, instance_type: nil, variable_bounds: {})
|
84
|
+
)
|
85
|
+
if shape
|
86
|
+
if method = shape.methods[call.method_name]
|
87
|
+
method.method_types.each.with_index do |method_type, i|
|
88
|
+
defn = method_type.method_decls.to_a[0]&.method_def
|
89
|
+
|
90
|
+
items << Item.new(subtyping.factory.method_type_1(method_type), defn&.comment)
|
91
|
+
|
92
|
+
if call.is_a?(MethodCall::Typed)
|
93
|
+
if method_type.method_decls.intersect?(call.method_decls)
|
94
|
+
index = i
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
when MethodCall::Untyped, MethodCall::NoMethodError
|
101
|
+
return
|
102
|
+
end
|
103
|
+
|
104
|
+
[items, index]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -90,9 +90,17 @@ module Steep
|
|
90
90
|
|
91
91
|
def each_type_name(&block)
|
92
92
|
if block
|
93
|
+
env = self.env
|
94
|
+
|
93
95
|
map.instance_eval do
|
94
96
|
@map.each_key do |name|
|
95
|
-
|
97
|
+
relative_name = RBS::TypeName.new(name: name, namespace: RBS::Namespace.empty)
|
98
|
+
if absolute_name = resolve?(relative_name)
|
99
|
+
if env.type_name?(absolute_name)
|
100
|
+
# Yields only if the relative type name resolves to existing absolute type name
|
101
|
+
yield relative_name
|
102
|
+
end
|
103
|
+
end
|
96
104
|
end
|
97
105
|
end
|
98
106
|
env.class_decls.each_key(&block)
|