steep 1.4.0.dev.3 → 1.4.0.dev.4
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|