steep 0.28.0 → 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/steep.rb +3 -2
- data/lib/steep/annotation_parser.rb +2 -4
- data/lib/steep/ast/builtin.rb +9 -1
- data/lib/steep/ast/types/factory.rb +161 -52
- 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/completion_provider.rb +48 -51
- data/lib/steep/project/file.rb +3 -3
- data/lib/steep/project/hover_content.rb +3 -5
- data/lib/steep/signature/validator.rb +3 -3
- 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 +219 -0
- data/lib/steep/type_inference/type_env.rb +2 -2
- data/lib/steep/version.rb +1 -1
- data/smoke/type_case/a.rb +0 -7
- data/steep.gemspec +1 -1
- metadata +7 -7
- 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: 5d09c66d40509db4956625f6be82477c4cda1b375d4cc37ebc2b4fdfdfdd971f
|
4
|
+
data.tar.gz: bfe074e9fc6e833faa4442f718e2bade7e54a5b6921fd8cf63465972ec39ced5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05d54b1565ccf9189d335163d952d075bd6f7b3a08c26362efb815c3d19cfd2ffa2eb13e124a5dc7a4a5f1343a6fbbe5694ed3d6000a4fe37f3ace4cb2d7c1d5
|
7
|
+
data.tar.gz: 2661d5a8a5273e5c4341b27fd78a5f57c296c31663f16d46bf8de39ea1af40b827bfdf48f9266e071a37b1fe395a58ec716149d88656cf983587ecbe89fa24e6
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.29.0 (2020-09-28)
|
6
|
+
|
7
|
+
* Implement reasoning on `is_a?`, `nil?`, and `===` methods. ([#218](https://github.com/soutaro/steep/pull/218))
|
8
|
+
* Better completion based on interface ([#215](https://github.com/soutaro/steep/pull/215))
|
9
|
+
* Fix begin-rescue typing ([#221](https://github.com/soutaro/steep/pull/221))
|
10
|
+
|
5
11
|
## 0.28.0 (2020-09-17)
|
6
12
|
|
7
13
|
* Fix typing case-when with empty body ([#200](https://github.com/soutaro/steep/pull/200))
|
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"
|
@@ -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
|
@@ -43,18 +43,18 @@ module Steep
|
|
43
43
|
when RBS::Types::Variable
|
44
44
|
Var.new(name: type.name, location: nil)
|
45
45
|
when RBS::Types::ClassSingleton
|
46
|
-
type_name =
|
46
|
+
type_name = type.name
|
47
47
|
Name::Singleton.new(name: type_name, location: nil)
|
48
48
|
when RBS::Types::ClassInstance
|
49
|
-
type_name =
|
49
|
+
type_name = type.name
|
50
50
|
args = type.args.map {|arg| type(arg) }
|
51
51
|
Name::Instance.new(name: type_name, args: args, location: nil)
|
52
52
|
when RBS::Types::Interface
|
53
|
-
type_name =
|
53
|
+
type_name = type.name
|
54
54
|
args = type.args.map {|arg| type(arg) }
|
55
55
|
Name::Interface.new(name: type_name, args: args, location: nil)
|
56
56
|
when RBS::Types::Alias
|
57
|
-
type_name =
|
57
|
+
type_name = type.name
|
58
58
|
Name::Alias.new(name: type_name, args: [], location: nil)
|
59
59
|
when RBS::Types::Union
|
60
60
|
Union.build(types: type.types.map {|ty| type(ty) }, location: nil)
|
@@ -103,22 +103,22 @@ module Steep
|
|
103
103
|
when Var
|
104
104
|
RBS::Types::Variable.new(name: type.name, location: nil)
|
105
105
|
when Name::Singleton
|
106
|
-
RBS::Types::ClassSingleton.new(name:
|
106
|
+
RBS::Types::ClassSingleton.new(name: type.name, location: nil)
|
107
107
|
when Name::Instance
|
108
108
|
RBS::Types::ClassInstance.new(
|
109
|
-
name:
|
109
|
+
name: type.name,
|
110
110
|
args: type.args.map {|arg| type_1(arg) },
|
111
111
|
location: nil
|
112
112
|
)
|
113
113
|
when Name::Interface
|
114
114
|
RBS::Types::Interface.new(
|
115
|
-
name:
|
115
|
+
name: type.name,
|
116
116
|
args: type.args.map {|arg| type_1(arg) },
|
117
117
|
location: nil
|
118
118
|
)
|
119
119
|
when Name::Alias
|
120
120
|
type.args.empty? or raise "alias type with args is not supported"
|
121
|
-
RBS::Types::Alias.new(name:
|
121
|
+
RBS::Types::Alias.new(name: type.name, location: nil)
|
122
122
|
when Union
|
123
123
|
RBS::Types::Union.new(
|
124
124
|
types: type.types.map {|ty| type_1(ty) },
|
@@ -151,32 +151,6 @@ module Steep
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
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
154
|
def function_1(params, return_type)
|
181
155
|
RBS::Types::Function.new(
|
182
156
|
required_positionals: params.required.map {|type| RBS::Types::Function::Param.new(name: nil, type: type_1(type)) },
|
@@ -201,7 +175,7 @@ module Steep
|
|
201
175
|
)
|
202
176
|
end
|
203
177
|
|
204
|
-
def method_type(method_type, self_type:, subst2: nil)
|
178
|
+
def method_type(method_type, self_type:, subst2: nil, method_def: nil)
|
205
179
|
fvs = self_type.free_variables()
|
206
180
|
|
207
181
|
type_params = []
|
@@ -225,14 +199,15 @@ module Steep
|
|
225
199
|
type_params: type_params,
|
226
200
|
return_type: type(method_type.type.return_type).subst(subst),
|
227
201
|
params: params(method_type.type).subst(subst),
|
228
|
-
location: nil,
|
229
202
|
block: method_type.block&.yield_self do |block|
|
230
203
|
Interface::Block.new(
|
231
204
|
optional: !block.required,
|
232
205
|
type: Proc.new(params: params(block.type).subst(subst),
|
233
206
|
return_type: type(block.type.return_type).subst(subst), location: nil)
|
234
207
|
)
|
235
|
-
end
|
208
|
+
end,
|
209
|
+
method_def: method_def,
|
210
|
+
location: method_def&.member&.location
|
236
211
|
)
|
237
212
|
|
238
213
|
if block_given?
|
@@ -292,7 +267,7 @@ module Steep
|
|
292
267
|
end
|
293
268
|
|
294
269
|
def unfold(type_name)
|
295
|
-
|
270
|
+
type_name.yield_self do |type_name|
|
296
271
|
type(definition_builder.expand_alias(type_name))
|
297
272
|
end
|
298
273
|
end
|
@@ -312,6 +287,105 @@ module Steep
|
|
312
287
|
end
|
313
288
|
end
|
314
289
|
|
290
|
+
def deep_expand_alias(type, recursive: Set.new, &block)
|
291
|
+
raise "Recursive type definition: #{type}" if recursive.member?(type)
|
292
|
+
|
293
|
+
ty = case type
|
294
|
+
when AST::Types::Name::Alias
|
295
|
+
deep_expand_alias(expand_alias(type), recursive: recursive.union([type]))
|
296
|
+
when AST::Types::Union
|
297
|
+
AST::Types::Union.build(
|
298
|
+
types: type.types.map {|ty| deep_expand_alias(ty, recursive: recursive, &block) },
|
299
|
+
location: type.location
|
300
|
+
)
|
301
|
+
else
|
302
|
+
type
|
303
|
+
end
|
304
|
+
|
305
|
+
if block_given?
|
306
|
+
yield ty
|
307
|
+
else
|
308
|
+
ty
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
def flatten_union(type, acc = [])
|
313
|
+
case type
|
314
|
+
when AST::Types::Union
|
315
|
+
type.types.each {|ty| flatten_union(ty, acc) }
|
316
|
+
else
|
317
|
+
acc << type
|
318
|
+
end
|
319
|
+
|
320
|
+
acc
|
321
|
+
end
|
322
|
+
|
323
|
+
def unwrap_optional(type)
|
324
|
+
case type
|
325
|
+
when AST::Types::Union
|
326
|
+
falsy_types, truthy_types = type.types.partition do |type|
|
327
|
+
(type.is_a?(AST::Types::Literal) && type.value == false) ||
|
328
|
+
type.is_a?(AST::Types::Nil)
|
329
|
+
end
|
330
|
+
|
331
|
+
[
|
332
|
+
AST::Types::Union.build(types: truthy_types),
|
333
|
+
AST::Types::Union.build(types: falsy_types)
|
334
|
+
]
|
335
|
+
when AST::Types::Name::Alias
|
336
|
+
unwrap_optional(expand_alias(type))
|
337
|
+
else
|
338
|
+
[type, nil]
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
def setup_primitives(method_name, method_type)
|
343
|
+
if method_def = method_type.method_def
|
344
|
+
defined_in = method_def.defined_in
|
345
|
+
member = method_def.member
|
346
|
+
|
347
|
+
case
|
348
|
+
when defined_in == RBS::BuiltinNames::Object.name && member.instance?
|
349
|
+
case method_name
|
350
|
+
when :is_a?, :kind_of?, :instance_of?
|
351
|
+
return method_type.with(
|
352
|
+
return_type: AST::Types::Logic::ReceiverIsArg.new(location: method_type.return_type.location)
|
353
|
+
)
|
354
|
+
when :nil?
|
355
|
+
return method_type.with(
|
356
|
+
return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
|
357
|
+
)
|
358
|
+
end
|
359
|
+
|
360
|
+
when defined_in == AST::Builtin::NilClass.module_name && member.instance?
|
361
|
+
case method_name
|
362
|
+
when :nil?
|
363
|
+
return method_type.with(
|
364
|
+
return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
|
365
|
+
)
|
366
|
+
end
|
367
|
+
|
368
|
+
when defined_in == RBS::BuiltinNames::BasicObject.name && member.instance?
|
369
|
+
case method_name
|
370
|
+
when :!
|
371
|
+
return method_type.with(
|
372
|
+
return_type: AST::Types::Logic::Not.new(location: method_type.return_type.location)
|
373
|
+
)
|
374
|
+
end
|
375
|
+
|
376
|
+
when defined_in == RBS::BuiltinNames::Module.name && member.instance?
|
377
|
+
case method_name
|
378
|
+
when :===
|
379
|
+
return method_type.with(
|
380
|
+
return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.return_type.location)
|
381
|
+
)
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
method_type
|
387
|
+
end
|
388
|
+
|
315
389
|
def interface(type, private:, self_type: type)
|
316
390
|
Steep.logger.debug { "Factory#interface: #{type}, private=#{private}, self_type=#{self_type}" }
|
317
391
|
type = expand_alias(type)
|
@@ -325,7 +399,7 @@ module Steep
|
|
325
399
|
end
|
326
400
|
when Name::Instance
|
327
401
|
Interface::Interface.new(type: self_type, private: private).tap do |interface|
|
328
|
-
definition = definition_builder.build_instance(
|
402
|
+
definition = definition_builder.build_instance(type.name)
|
329
403
|
|
330
404
|
instance_type = Name::Instance.new(name: type.name,
|
331
405
|
args: type.args.map { Any.new(location: nil) },
|
@@ -345,8 +419,14 @@ module Steep
|
|
345
419
|
next if method.private? && !private
|
346
420
|
|
347
421
|
interface.methods[name] = Interface::Interface::Entry.new(
|
348
|
-
method_types: method.
|
349
|
-
|
422
|
+
method_types: method.defs.map do |type_def|
|
423
|
+
setup_primitives(
|
424
|
+
name,
|
425
|
+
method_type(type_def.type,
|
426
|
+
method_def: type_def,
|
427
|
+
self_type: self_type,
|
428
|
+
subst2: subst)
|
429
|
+
)
|
350
430
|
end
|
351
431
|
)
|
352
432
|
end
|
@@ -355,7 +435,7 @@ module Steep
|
|
355
435
|
|
356
436
|
when Name::Interface
|
357
437
|
Interface::Interface.new(type: self_type, private: private).tap do |interface|
|
358
|
-
type_name =
|
438
|
+
type_name = type.name
|
359
439
|
definition = definition_builder.build_interface(type_name)
|
360
440
|
|
361
441
|
subst = Interface::Substitution.build(
|
@@ -366,8 +446,8 @@ module Steep
|
|
366
446
|
|
367
447
|
definition.methods.each do |name, method|
|
368
448
|
interface.methods[name] = Interface::Interface::Entry.new(
|
369
|
-
method_types: method.
|
370
|
-
method_type(type, self_type: self_type, subst2: subst)
|
449
|
+
method_types: method.defs.map do |type_def|
|
450
|
+
method_type(type_def.type, method_def: type_def, self_type: self_type, subst2: subst)
|
371
451
|
end
|
372
452
|
)
|
373
453
|
end
|
@@ -375,7 +455,7 @@ module Steep
|
|
375
455
|
|
376
456
|
when Name::Singleton
|
377
457
|
Interface::Interface.new(type: self_type, private: private).tap do |interface|
|
378
|
-
definition = definition_builder.build_singleton(
|
458
|
+
definition = definition_builder.build_singleton(type.name)
|
379
459
|
|
380
460
|
instance_type = Name::Instance.new(name: type.name,
|
381
461
|
args: definition.type_params.map {Any.new(location: nil)},
|
@@ -391,8 +471,14 @@ module Steep
|
|
391
471
|
next if !private && method.private?
|
392
472
|
|
393
473
|
interface.methods[name] = Interface::Interface::Entry.new(
|
394
|
-
method_types: method.
|
395
|
-
|
474
|
+
method_types: method.defs.map do |type_def|
|
475
|
+
setup_primitives(
|
476
|
+
name,
|
477
|
+
method_type(type_def.type,
|
478
|
+
method_def: type_def,
|
479
|
+
self_type: self_type,
|
480
|
+
subst2: subst)
|
481
|
+
)
|
396
482
|
end
|
397
483
|
)
|
398
484
|
end
|
@@ -469,6 +555,7 @@ module Steep
|
|
469
555
|
rest_keywords: nil),
|
470
556
|
block: nil,
|
471
557
|
return_type: elem_type,
|
558
|
+
method_def: nil,
|
472
559
|
location: nil
|
473
560
|
)
|
474
561
|
} + aref.method_types
|
@@ -488,6 +575,7 @@ module Steep
|
|
488
575
|
rest_keywords: nil),
|
489
576
|
block: nil,
|
490
577
|
return_type: elem_type,
|
578
|
+
method_def: nil,
|
491
579
|
location: nil
|
492
580
|
)
|
493
581
|
} + update.method_types
|
@@ -502,6 +590,7 @@ module Steep
|
|
502
590
|
params: Interface::Params.empty,
|
503
591
|
block: nil,
|
504
592
|
return_type: type.types[0] || AST::Builtin.nil_type,
|
593
|
+
method_def: nil,
|
505
594
|
location: nil
|
506
595
|
)
|
507
596
|
]
|
@@ -516,6 +605,7 @@ module Steep
|
|
516
605
|
params: Interface::Params.empty,
|
517
606
|
block: nil,
|
518
607
|
return_type: type.types.last || AST::Builtin.nil_type,
|
608
|
+
method_def: nil,
|
519
609
|
location: nil
|
520
610
|
)
|
521
611
|
]
|
@@ -547,6 +637,7 @@ module Steep
|
|
547
637
|
rest_keywords: nil),
|
548
638
|
block: nil,
|
549
639
|
return_type: value_type,
|
640
|
+
method_def: nil,
|
550
641
|
location: nil
|
551
642
|
)
|
552
643
|
} + ref.method_types
|
@@ -567,6 +658,7 @@ module Steep
|
|
567
658
|
rest_keywords: nil),
|
568
659
|
block: nil,
|
569
660
|
return_type: value_type,
|
661
|
+
method_def: nil,
|
570
662
|
location: nil
|
571
663
|
)
|
572
664
|
} + update.method_types
|
@@ -582,6 +674,7 @@ module Steep
|
|
582
674
|
params: type.params,
|
583
675
|
return_type: type.return_type,
|
584
676
|
block: nil,
|
677
|
+
method_def: nil,
|
585
678
|
location: nil
|
586
679
|
)
|
587
680
|
|
@@ -589,19 +682,20 @@ module Steep
|
|
589
682
|
interface.methods[:call] = Interface::Interface::Entry.new(method_types: [method_type])
|
590
683
|
end
|
591
684
|
|
685
|
+
when Logic::Base
|
686
|
+
interface(AST::Builtin.bool_type, private: private, self_type: self_type)
|
687
|
+
|
592
688
|
else
|
593
689
|
raise "Unexpected type for interface: #{type}"
|
594
690
|
end
|
595
691
|
end
|
596
692
|
|
597
693
|
def module_name?(type_name)
|
598
|
-
|
599
|
-
entry = env.class_decls[name] and entry.is_a?(RBS::Environment::ModuleEntry)
|
694
|
+
entry = env.class_decls[type_name] and entry.is_a?(RBS::Environment::ModuleEntry)
|
600
695
|
end
|
601
696
|
|
602
697
|
def class_name?(type_name)
|
603
|
-
|
604
|
-
entry = env.class_decls[name] and entry.is_a?(RBS::Environment::ClassEntry)
|
698
|
+
entry = env.class_decls[type_name] and entry.is_a?(RBS::Environment::ClassEntry)
|
605
699
|
end
|
606
700
|
|
607
701
|
def env
|
@@ -616,7 +710,22 @@ module Steep
|
|
616
710
|
end
|
617
711
|
|
618
712
|
def absolute_type_name(type_name, namespace:)
|
619
|
-
type_name_resolver.resolve(type_name, context:
|
713
|
+
type_name_resolver.resolve(type_name, context: namespace.ascend)
|
714
|
+
end
|
715
|
+
|
716
|
+
def instance_type(type_name, args: nil, location: nil)
|
717
|
+
raise unless type_name.class?
|
718
|
+
|
719
|
+
definition = definition_builder.build_singleton(type_name)
|
720
|
+
def_args = definition.type_params.map { Any.new(location: nil) }
|
721
|
+
|
722
|
+
if args
|
723
|
+
raise if def_args.size != args.size
|
724
|
+
else
|
725
|
+
args = def_args
|
726
|
+
end
|
727
|
+
|
728
|
+
AST::Types::Name::Instance.new(location: location, name: type_name, args: args)
|
620
729
|
end
|
621
730
|
end
|
622
731
|
end
|