steep 0.8.2 → 0.9.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 +8 -0
- data/lib/steep/ast/method_type.rb +8 -0
- data/lib/steep/ast/namespace.rb +1 -1
- data/lib/steep/ast/signature/members.rb +16 -0
- data/lib/steep/drivers/utils/validator.rb +2 -2
- data/lib/steep/interface/abstract.rb +24 -0
- data/lib/steep/interface/builder.rb +42 -17
- data/lib/steep/interface/instantiated.rb +32 -3
- data/lib/steep/interface/method.rb +4 -0
- data/lib/steep/names.rb +1 -1
- data/lib/steep/parser.y +29 -2
- data/lib/steep/subtyping/check.rb +24 -13
- data/lib/steep/type_construction.rb +7 -4
- data/lib/steep/version.rb +1 -1
- data/smoke/extension/e.rb +2 -0
- data/smoke/extension/e.rbi +8 -0
- data/smoke/initialize/a.rb +1 -1
- data/smoke/skip/skip.rb +15 -0
- data/stdlib/builtin.rbi +4 -5
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05a765d5cdc7792406c32f581e041ee9e47b41c1b70dfb0d43e8db5400fbe172
|
4
|
+
data.tar.gz: 71e35e1516a261d82082e1278774ff0a8d36c5ffecdd8511ba8de312b93a16f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b721b3ac5bb01d3296071025ef72a7e2ab76f4900bdfb0909ee8a715642d371812185c4adc74585344a156c43af742e0e35782b8dc9f89966da6d558e7f87f83
|
7
|
+
data.tar.gz: 3849077a1ea0d7109eb3b148be3dc2e8260f9cc63df17cb1864235fa2137faa984947a64d95343524c1b34d75fcf4ff9ada215488e15977bcc657359da3cac4c
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.8.3 (2018-11-11)
|
6
|
+
|
7
|
+
* Private methods (#72)
|
8
|
+
* `__skip__` to skip type checking (#73)
|
9
|
+
* Add `alias` for method types (#75)
|
10
|
+
* Fix `Names::Base#hash` (#69 @hanachin)
|
11
|
+
* Add `super` in method types (#76)
|
12
|
+
|
5
13
|
## 0.8.2 (2018-11-09)
|
6
14
|
|
7
15
|
* Fix ElseOnExhaustiveCase error implementation
|
data/lib/steep/ast/namespace.rb
CHANGED
@@ -56,6 +56,10 @@ module Steep
|
|
56
56
|
def incompatible?
|
57
57
|
attributes.include?(:incompatible)
|
58
58
|
end
|
59
|
+
|
60
|
+
def private?
|
61
|
+
attributes.include?(:private)
|
62
|
+
end
|
59
63
|
end
|
60
64
|
|
61
65
|
class Ivar
|
@@ -93,6 +97,18 @@ module Steep
|
|
93
97
|
kind == :accessor
|
94
98
|
end
|
95
99
|
end
|
100
|
+
|
101
|
+
class MethodAlias
|
102
|
+
attr_reader :location
|
103
|
+
attr_reader :new_name
|
104
|
+
attr_reader :original_name
|
105
|
+
|
106
|
+
def initialize(location:, new_name:, original_name:)
|
107
|
+
@location = location
|
108
|
+
@new_name = new_name
|
109
|
+
@original_name = original_name
|
110
|
+
end
|
111
|
+
end
|
96
112
|
end
|
97
113
|
end
|
98
114
|
end
|
@@ -34,7 +34,7 @@ module Steep
|
|
34
34
|
|
35
35
|
when AST::Signature::Module
|
36
36
|
yield_self do
|
37
|
-
instance_interface = builder.build_instance(sig.name
|
37
|
+
instance_interface = builder.build_instance(sig.name)
|
38
38
|
instance_args = instance_interface.params.map {|var| AST::Types::Var.fresh(var) }
|
39
39
|
|
40
40
|
module_interface = builder.build_module(sig.name)
|
@@ -58,7 +58,7 @@ module Steep
|
|
58
58
|
|
59
59
|
when AST::Signature::Class
|
60
60
|
yield_self do
|
61
|
-
instance_interface = builder.build_instance(sig.name
|
61
|
+
instance_interface = builder.build_instance(sig.name)
|
62
62
|
instance_args = instance_interface.params.map {|var| AST::Types::Var.fresh(var) }
|
63
63
|
|
64
64
|
module_interface = builder.build_class(sig.name, constructor: true)
|
@@ -39,6 +39,30 @@ module Steep
|
|
39
39
|
ivar_chains: ivar_chains.transform_values {|chain| chain.subst(subst) }
|
40
40
|
)
|
41
41
|
end
|
42
|
+
|
43
|
+
def without_private(option)
|
44
|
+
if option
|
45
|
+
self.class.new(
|
46
|
+
name: name,
|
47
|
+
params: params,
|
48
|
+
methods: methods.reject {|_, method| method.private? },
|
49
|
+
supers: supers,
|
50
|
+
ivar_chains: ivar_chains
|
51
|
+
)
|
52
|
+
else
|
53
|
+
self
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def without_initialize
|
58
|
+
self.class.new(
|
59
|
+
name: name,
|
60
|
+
params: params,
|
61
|
+
methods: methods.reject {|_, method| method.name == :initialize },
|
62
|
+
supers: supers,
|
63
|
+
ivar_chains: ivar_chains
|
64
|
+
)
|
65
|
+
end
|
42
66
|
end
|
43
67
|
end
|
44
68
|
end
|
@@ -132,11 +132,11 @@ module Steep
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
-
def build_instance(module_name
|
135
|
+
def build_instance(module_name)
|
136
136
|
assert_absolute_name! module_name
|
137
137
|
signature = signatures.find_class_or_module(module_name, current_module: AST::Namespace.root)
|
138
|
-
cache_interface(instance_cache, key:
|
139
|
-
instance_to_interface(signature
|
138
|
+
cache_interface(instance_cache, key: signature.name) do
|
139
|
+
instance_to_interface(signature)
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
@@ -173,8 +173,18 @@ module Steep
|
|
173
173
|
new_method = Method.new(
|
174
174
|
type_name: type_name,
|
175
175
|
name: method.name,
|
176
|
-
types: method.types.
|
177
|
-
|
176
|
+
types: method.types.flat_map do |method_type|
|
177
|
+
case method_type
|
178
|
+
when AST::MethodType
|
179
|
+
[method_type_to_method_type(method_type, current: current)]
|
180
|
+
when AST::MethodType::Super
|
181
|
+
if super_method
|
182
|
+
super_method.types
|
183
|
+
else
|
184
|
+
Steep.logger.error "`super` specified in method type, but cannot find super method of `#{method.name}` in `#{type_name}` (#{method.location.name || "-"}:#{method.location})"
|
185
|
+
[]
|
186
|
+
end
|
187
|
+
end
|
178
188
|
end,
|
179
189
|
super_method: super_method,
|
180
190
|
attributes: method.attributes + extra_attributes
|
@@ -209,7 +219,7 @@ module Steep
|
|
209
219
|
)
|
210
220
|
}
|
211
221
|
|
212
|
-
klass = build_instance(AST::Builtin::Class.module_name
|
222
|
+
klass = build_instance(AST::Builtin::Class.module_name)
|
213
223
|
instantiated = klass.instantiate(
|
214
224
|
type: AST::Types::Self.new,
|
215
225
|
args: [],
|
@@ -238,7 +248,7 @@ module Steep
|
|
238
248
|
end
|
239
249
|
when AST::Signature::Members::Extend
|
240
250
|
member_name = signatures.find_module(member.name, current_module: namespace).name
|
241
|
-
build_instance(member_name
|
251
|
+
build_instance(member_name).yield_self do |module_interface|
|
242
252
|
merge_mixin(module_interface,
|
243
253
|
member.args.map {|type| absolute_type(type, current: namespace) },
|
244
254
|
methods: methods,
|
@@ -318,7 +328,7 @@ module Steep
|
|
318
328
|
methods = {}
|
319
329
|
ivar_chains = {}
|
320
330
|
|
321
|
-
module_instance = build_instance(AST::Builtin::Module.module_name
|
331
|
+
module_instance = build_instance(AST::Builtin::Module.module_name)
|
322
332
|
instantiated = module_instance.instantiate(
|
323
333
|
type: AST::Types::Self.new,
|
324
334
|
args: [],
|
@@ -341,7 +351,7 @@ module Steep
|
|
341
351
|
end
|
342
352
|
when AST::Signature::Members::Extend
|
343
353
|
member_name = signatures.find_module(member.name, current_module: namespace).name
|
344
|
-
build_instance(member_name
|
354
|
+
build_instance(member_name).yield_self do |module_interface|
|
345
355
|
merge_mixin(module_interface,
|
346
356
|
member.args.map {|type| absolute_type(type, current: namespace) },
|
347
357
|
methods: methods,
|
@@ -387,7 +397,7 @@ module Steep
|
|
387
397
|
)
|
388
398
|
end
|
389
399
|
|
390
|
-
def instance_to_interface(sig
|
400
|
+
def instance_to_interface(sig)
|
391
401
|
module_name = sig.name
|
392
402
|
namespace = module_name.namespace.append(module_name.name)
|
393
403
|
|
@@ -402,8 +412,7 @@ module Steep
|
|
402
412
|
if super_class_name.relative?
|
403
413
|
super_class_name = signatures.find_class(super_class_name, current_module: namespace).name
|
404
414
|
end
|
405
|
-
super_class_interface = build_instance(super_class_name
|
406
|
-
with_initialize: with_initialize)
|
415
|
+
super_class_interface = build_instance(super_class_name)
|
407
416
|
|
408
417
|
supers.push(*super_class_interface.supers)
|
409
418
|
instantiated = super_class_interface.instantiate(
|
@@ -428,7 +437,7 @@ module Steep
|
|
428
437
|
case member
|
429
438
|
when AST::Signature::Members::Include
|
430
439
|
member_name = signatures.find_module(member.name, current_module: namespace).name
|
431
|
-
build_instance(member_name
|
440
|
+
build_instance(member_name).yield_self do |module_interface|
|
432
441
|
merge_mixin(module_interface,
|
433
442
|
member.args.map {|type| absolute_type(type, current: namespace) },
|
434
443
|
methods: methods,
|
@@ -443,10 +452,8 @@ module Steep
|
|
443
452
|
case member
|
444
453
|
when AST::Signature::Members::Method
|
445
454
|
if member.instance_method?
|
446
|
-
|
447
|
-
|
448
|
-
add_method(module_name, member, methods: methods, extra_attributes: extra_attrs, current: namespace)
|
449
|
-
end
|
455
|
+
extra_attrs = member.name == :initialize ? [:incompatible, :private] : []
|
456
|
+
add_method(module_name, member, methods: methods, extra_attributes: extra_attrs, current: namespace)
|
450
457
|
end
|
451
458
|
when AST::Signature::Members::Ivar
|
452
459
|
merge_ivars(ivar_chains,
|
@@ -456,6 +463,24 @@ module Steep
|
|
456
463
|
end
|
457
464
|
end
|
458
465
|
|
466
|
+
sig.members.each do |member|
|
467
|
+
case member
|
468
|
+
when AST::Signature::Members::MethodAlias
|
469
|
+
method = methods[member.original_name]
|
470
|
+
if method
|
471
|
+
methods[member.new_name] = Method.new(
|
472
|
+
type_name: module_name,
|
473
|
+
name: member.new_name,
|
474
|
+
types: method.types,
|
475
|
+
super_method: nil,
|
476
|
+
attributes: method.attributes
|
477
|
+
)
|
478
|
+
else
|
479
|
+
Steep.logger.error "Cannot alias find original method `#{member.original_name}` for `#{member.new_name}` in #{module_name} (#{member.location.name || '-'}:#{member.location})"
|
480
|
+
end
|
481
|
+
end
|
482
|
+
end
|
483
|
+
|
459
484
|
signatures.find_extensions(sig.name).each do |ext|
|
460
485
|
ext.members.each do |member|
|
461
486
|
case member
|
@@ -59,9 +59,24 @@ module Steep
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
class PrivateOverrideError < StandardError
|
63
|
+
attr_reader :child_type
|
64
|
+
attr_reader :super_type
|
65
|
+
attr_reader :method_name
|
66
|
+
|
67
|
+
def initialize(child_type:, super_type:, method_name:)
|
68
|
+
@child_type = child_type
|
69
|
+
@super_type = super_type
|
70
|
+
@method_name = method_name
|
71
|
+
|
72
|
+
super "Public method `#{method_name}` cannot overriden to private: #{child_type} <: #{super_type}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
62
76
|
def validate(check)
|
63
77
|
methods.each do |_, method|
|
64
|
-
|
78
|
+
validate_method_type(check, method)
|
79
|
+
validate_method_visibility method
|
65
80
|
end
|
66
81
|
|
67
82
|
ivar_chains.each do |name, chain|
|
@@ -92,7 +107,7 @@ module Steep
|
|
92
107
|
validate_chain(check, name, chain.parent)
|
93
108
|
end
|
94
109
|
|
95
|
-
def
|
110
|
+
def validate_method_type(check, method)
|
96
111
|
if method.super_method && !method.incompatible?
|
97
112
|
result = check.check_method(method.name,
|
98
113
|
method,
|
@@ -102,7 +117,7 @@ module Steep
|
|
102
117
|
constraints: Subtyping::Constraints.empty)
|
103
118
|
|
104
119
|
if result.success?
|
105
|
-
|
120
|
+
validate_method_type(check, method.super_method)
|
106
121
|
else
|
107
122
|
raise InvalidMethodOverrideError.new(type: type,
|
108
123
|
current_method: method,
|
@@ -112,6 +127,20 @@ module Steep
|
|
112
127
|
end
|
113
128
|
end
|
114
129
|
|
130
|
+
def validate_method_visibility(method)
|
131
|
+
if (super_method = method.super_method)
|
132
|
+
if method.private? && !super_method.private?
|
133
|
+
raise PrivateOverrideError.new(
|
134
|
+
child_type: method.type_name,
|
135
|
+
super_type: super_method.type_name,
|
136
|
+
method_name: method.name
|
137
|
+
)
|
138
|
+
end
|
139
|
+
|
140
|
+
validate_method_visibility(super_method)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
115
144
|
def select_method_type(&block)
|
116
145
|
self.class.new(
|
117
146
|
type: type,
|
data/lib/steep/names.rb
CHANGED
data/lib/steep/parser.y
CHANGED
@@ -3,7 +3,8 @@ class Steep::Parser
|
|
3
3
|
token kCLASS kMODULE kINTERFACE kDEF kEND kNIL kBOOL kANY kVOID kTYPE
|
4
4
|
kINCOMPATIBLE kAT_TYPE kAT_IMPLEMENTS kAT_DYNAMIC kCONST kVAR kRETURN
|
5
5
|
kBLOCK kBREAK kMETHOD kSELF kSELFQ kATTR_READER kATTR_ACCESSOR kINSTANCE
|
6
|
-
kINCLUDE kEXTEND kINSTANCE kIVAR kCONSTRUCTOR kNOCONSTRUCTOR kEXTENSION
|
6
|
+
kINCLUDE kEXTEND kINSTANCE kIVAR kCONSTRUCTOR kNOCONSTRUCTOR kEXTENSION kPRIVATE kALIAS
|
7
|
+
kSUPER
|
7
8
|
tARROW tBANG tBAR tCOLON tCOMMA tDOT tEQ tGT tGVAR tHAT tINT
|
8
9
|
tINTERFACE_NAME tIVAR_NAME tLBRACE tLBRACKET tIDENT tLPAREN tLT tROCKET
|
9
10
|
tMINUS tOPERATOR tPERCENT tPLUS tQUESTION tRBRACE tRBRACKET
|
@@ -11,7 +12,7 @@ token kCLASS kMODULE kINTERFACE kDEF kEND kNIL kBOOL kANY kVOID kTYPE
|
|
11
12
|
type_METHOD type_SIGNATURE type_ANNOTATION type_TYPE
|
12
13
|
tQUALIFIED_MODULE_NAME tQUALIFIED_INTERFACE_NAME tQUALIFIED_ALIAS_NAME
|
13
14
|
|
14
|
-
expect
|
15
|
+
expect 3
|
15
16
|
|
16
17
|
rule
|
17
18
|
|
@@ -657,6 +658,7 @@ rule
|
|
657
658
|
| ivar_member
|
658
659
|
| attr_reader_member
|
659
660
|
| attr_accessor_member
|
661
|
+
| alias_member
|
660
662
|
|
661
663
|
ivar_member: tIVAR_NAME tCOLON type
|
662
664
|
{
|
@@ -751,6 +753,15 @@ rule
|
|
751
753
|
result = AST::Signature::Members::Attr.new(location: loc, name: val[1].value, kind: :accessor, ivar: val[2], type: val[4])
|
752
754
|
}
|
753
755
|
|
756
|
+
alias_member: kALIAS method_name method_name {
|
757
|
+
loc = val[0].location + val[2].location
|
758
|
+
result = AST::Signature::Members::MethodAlias.new(
|
759
|
+
location: loc,
|
760
|
+
new_name: val[1].value,
|
761
|
+
original_name: val[2].value
|
762
|
+
)
|
763
|
+
}
|
764
|
+
|
754
765
|
attr_ivar_opt: # nothing
|
755
766
|
{
|
756
767
|
result = nil
|
@@ -790,6 +801,10 @@ rule
|
|
790
801
|
{
|
791
802
|
result = val[0].value
|
792
803
|
}
|
804
|
+
| kPRIVATE
|
805
|
+
{
|
806
|
+
result = val[0].value
|
807
|
+
}
|
793
808
|
|
794
809
|
super_class: module_name
|
795
810
|
{
|
@@ -840,6 +855,10 @@ rule
|
|
840
855
|
{
|
841
856
|
result = [val[0]]
|
842
857
|
}
|
858
|
+
| kSUPER
|
859
|
+
{
|
860
|
+
result = [AST::MethodType::Super.new(location: val[0].location)]
|
861
|
+
}
|
843
862
|
| method_type tBAR method_type_union
|
844
863
|
{
|
845
864
|
result = [val[0]] + val[2]
|
@@ -908,6 +927,7 @@ rule
|
|
908
927
|
| kMETHOD
|
909
928
|
| kBOOL
|
910
929
|
| kTYPE
|
930
|
+
| kALIAS
|
911
931
|
| kCONSTRUCTOR
|
912
932
|
{
|
913
933
|
result = LocatedValue.new(location: val[0].location, value: :constructor)
|
@@ -919,6 +939,7 @@ rule
|
|
919
939
|
| kATTR_READER
|
920
940
|
| kATTR_ACCESSOR
|
921
941
|
| kINCOMPATIBLE
|
942
|
+
| kPRIVATE
|
922
943
|
|
923
944
|
annotation: kAT_TYPE kVAR subject tCOLON type
|
924
945
|
{
|
@@ -1203,6 +1224,12 @@ def next_token
|
|
1203
1224
|
new_token(:kINSTANCE, :instance)
|
1204
1225
|
when input.scan(/ivar\b/)
|
1205
1226
|
new_token(:kIVAR, :ivar)
|
1227
|
+
when input.scan(/private\b/)
|
1228
|
+
new_token(:kPRIVATE, :private)
|
1229
|
+
when input.scan(/alias\b/)
|
1230
|
+
new_token(:kALIAS, :alias)
|
1231
|
+
when input.scan(/super\b/)
|
1232
|
+
new_token(:kSUPER, :super)
|
1206
1233
|
when input.scan(/%/)
|
1207
1234
|
new_token(:tPERCENT, :%)
|
1208
1235
|
when input.scan(/-/)
|
@@ -603,8 +603,8 @@ module Steep
|
|
603
603
|
end
|
604
604
|
end
|
605
605
|
|
606
|
-
def resolve_instance(type, self_type:, instance_type:, module_type:,
|
607
|
-
abstract_interface = builder.build_instance(type.name
|
606
|
+
def resolve_instance(type, self_type:, instance_type:, module_type:, with_private: false)
|
607
|
+
abstract_interface = builder.build_instance(type.name).without_private(!with_private)
|
608
608
|
|
609
609
|
module_type = module_type || case builder.signatures.find_class_or_module(type.name)
|
610
610
|
when AST::Signature::Class
|
@@ -621,7 +621,7 @@ module Steep
|
|
621
621
|
)
|
622
622
|
end
|
623
623
|
|
624
|
-
def resolve(type, self_type: type, instance_type: nil, module_type: nil)
|
624
|
+
def resolve(type, self_type: type, instance_type: nil, module_type: nil, with_private: false)
|
625
625
|
Steep.logger.debug("Check#resolve: type=#{type}")
|
626
626
|
case type
|
627
627
|
when AST::Types::Any, AST::Types::Var, AST::Types::Class, AST::Types::Instance
|
@@ -631,14 +631,19 @@ module Steep
|
|
631
631
|
resolve(type.back_type,
|
632
632
|
self_type: self_type,
|
633
633
|
instance_type: instance_type,
|
634
|
-
module_type: module_type
|
634
|
+
module_type: module_type,
|
635
|
+
with_private: with_private)
|
635
636
|
|
636
637
|
when AST::Types::Name::Instance
|
637
|
-
resolve_instance(type,
|
638
|
+
resolve_instance(type,
|
639
|
+
self_type: self_type,
|
640
|
+
instance_type: instance_type,
|
641
|
+
module_type: module_type,
|
642
|
+
with_private: with_private)
|
638
643
|
|
639
644
|
when AST::Types::Name::Class
|
640
645
|
yield_self do
|
641
|
-
abstract_interface = builder.build_class(type.name, constructor: type.constructor)
|
646
|
+
abstract_interface = builder.build_class(type.name, constructor: type.constructor).without_private(!with_private)
|
642
647
|
|
643
648
|
unless instance_type
|
644
649
|
type_params = builder.signatures.find_class(type.name).params&.variables || []
|
@@ -662,7 +667,7 @@ module Steep
|
|
662
667
|
|
663
668
|
when AST::Types::Name::Module
|
664
669
|
yield_self do
|
665
|
-
abstract_interface = builder.build_module(type.name)
|
670
|
+
abstract_interface = builder.build_module(type.name).without_private(!with_private)
|
666
671
|
|
667
672
|
unless instance_type
|
668
673
|
type_params = builder.signatures.find_module(type.name).params&.variables || []
|
@@ -697,13 +702,17 @@ module Steep
|
|
697
702
|
end
|
698
703
|
|
699
704
|
when AST::Types::Name::Alias
|
700
|
-
resolve(expand_alias(type),
|
705
|
+
resolve(expand_alias(type),
|
706
|
+
self_type: self_type,
|
707
|
+
instance_type: instance_type,
|
708
|
+
module_type: module_type,
|
709
|
+
with_private: with_private)
|
701
710
|
|
702
711
|
when AST::Types::Union
|
703
712
|
interfaces = type.types.map do |member_type|
|
704
713
|
fresh = AST::Types::Var.fresh(:___)
|
705
714
|
|
706
|
-
resolve(member_type, self_type: type, instance_type: fresh, module_type: fresh).select_method_type do |method_type|
|
715
|
+
resolve(member_type, self_type: type, instance_type: fresh, module_type: fresh, with_private: with_private).select_method_type do |method_type|
|
707
716
|
!method_type.each_type.include?(fresh)
|
708
717
|
end
|
709
718
|
end
|
@@ -772,7 +781,9 @@ module Steep
|
|
772
781
|
ivar_chains: {})
|
773
782
|
|
774
783
|
when AST::Types::Intersection
|
775
|
-
interfaces = type.types.map do |type|
|
784
|
+
interfaces = type.types.map do |type|
|
785
|
+
resolve(type, with_private: with_private)
|
786
|
+
end
|
776
787
|
|
777
788
|
methods = interfaces.inject(nil) do |methods, i|
|
778
789
|
if methods
|
@@ -825,7 +836,7 @@ module Steep
|
|
825
836
|
yield_self do
|
826
837
|
element_type = AST::Types::Union.build(types: type.types)
|
827
838
|
array_type = AST::Builtin::Array.instance_type(element_type)
|
828
|
-
array_interface = resolve(array_type, self_type: self_type)
|
839
|
+
array_interface = resolve(array_type, self_type: self_type, with_private: with_private)
|
829
840
|
|
830
841
|
array_interface.methods[:[]] = array_interface.methods[:[]].yield_self do |aref|
|
831
842
|
types = type.types.map.with_index {|elem_type, index|
|
@@ -870,7 +881,7 @@ module Steep
|
|
870
881
|
yield_self do
|
871
882
|
key_type = AST::Types::Union.build(types: type.elements.keys.map {|val| AST::Types::Literal.new(value: val) })
|
872
883
|
value_type = AST::Types::Union.build(types: type.elements.values)
|
873
|
-
hash_interface = resolve(AST::Builtin::Hash.instance_type(key_type, value_type), self_type: self_type)
|
884
|
+
hash_interface = resolve(AST::Builtin::Hash.instance_type(key_type, value_type), self_type: self_type, with_private: with_private)
|
874
885
|
|
875
886
|
hash_interface.methods[:[]] = hash_interface.methods[:[]].yield_self do |ref|
|
876
887
|
types = type.elements.map do |key, value_type|
|
@@ -915,7 +926,7 @@ module Steep
|
|
915
926
|
|
916
927
|
when AST::Types::Proc
|
917
928
|
yield_self do
|
918
|
-
proc_interface = resolve(type.back_type, self_type: self_type)
|
929
|
+
proc_interface = resolve(type.back_type, self_type: self_type, with_private: with_private)
|
919
930
|
apply_type = Interface::MethodType.new(
|
920
931
|
type_params: [],
|
921
932
|
params: type.params,
|
@@ -124,7 +124,7 @@ module Steep
|
|
124
124
|
self_type: self_type,
|
125
125
|
instance_type: self_type,
|
126
126
|
module_type: class_type,
|
127
|
-
|
127
|
+
with_private: true)
|
128
128
|
end
|
129
129
|
else
|
130
130
|
checker.resolve(self_type)
|
@@ -398,7 +398,7 @@ module Steep
|
|
398
398
|
class_name = implement_module_name.name
|
399
399
|
class_args = implement_module_name.args.map {|x| AST::Types::Var.new(name: x) }
|
400
400
|
|
401
|
-
_ = checker.builder.build_instance(class_name
|
401
|
+
_ = checker.builder.build_instance(class_name)
|
402
402
|
|
403
403
|
instance_type = AST::Types::Name::Instance.new(name: class_name, args: class_args)
|
404
404
|
module_type = AST::Types::Name::Class.new(name: class_name, constructor: true)
|
@@ -525,9 +525,12 @@ module Steep
|
|
525
525
|
var = node.children[0]
|
526
526
|
rhs = node.children[1]
|
527
527
|
|
528
|
-
|
528
|
+
case var.name
|
529
|
+
when :_, :__any__
|
529
530
|
synthesize(rhs, hint: AST::Builtin.any_type)
|
530
531
|
typing.add_typing(node, AST::Builtin.any_type)
|
532
|
+
when :__skip__
|
533
|
+
typing.add_typing(node, AST::Builtin.any_type)
|
531
534
|
else
|
532
535
|
type_assignment(var, rhs, node, hint: hint)
|
533
536
|
end
|
@@ -1767,7 +1770,7 @@ module Steep
|
|
1767
1770
|
|
1768
1771
|
else
|
1769
1772
|
begin
|
1770
|
-
interface = checker.resolve(receiver_type)
|
1773
|
+
interface = checker.resolve(receiver_type, with_private: !receiver)
|
1771
1774
|
|
1772
1775
|
method = interface.methods[method_name]
|
1773
1776
|
|
data/lib/steep/version.rb
CHANGED
data/smoke/initialize/a.rb
CHANGED
data/smoke/skip/skip.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
__skip__ = begin
|
2
|
+
self.no_such_method
|
3
|
+
end
|
4
|
+
|
5
|
+
# @type var foo: String
|
6
|
+
|
7
|
+
foo = _ = begin
|
8
|
+
# !expects NoMethodError: type=::Object, method=no_such_method
|
9
|
+
self.no_such_method
|
10
|
+
end
|
11
|
+
|
12
|
+
foo = __any__ = begin
|
13
|
+
# !expects NoMethodError: type=::Object, method=no_such_method
|
14
|
+
self.no_such_method
|
15
|
+
end
|
data/stdlib/builtin.rbi
CHANGED
@@ -413,9 +413,8 @@ module Enumerable<'a, 'b> : _Iteratable<'a, 'b>
|
|
413
413
|
def collect: <'x> { ('a) -> 'x } -> Array<'x>
|
414
414
|
| <'x> -> Enumerator<'a, Array<'x>>
|
415
415
|
|
416
|
-
|
417
|
-
|
418
|
-
|
416
|
+
alias map collect
|
417
|
+
|
419
418
|
def flat_map: <'x> { ('a) -> Array<'x> } -> Array<'x>
|
420
419
|
| <'x> -> Enumerator<'a, Array<'x>>
|
421
420
|
|
@@ -737,7 +736,7 @@ class Set<'a>
|
|
737
736
|
def clear: -> self
|
738
737
|
|
739
738
|
def collect!: { ('a) -> 'a } -> self
|
740
|
-
|
739
|
+
alias map! collect!
|
741
740
|
|
742
741
|
def delete: (any) -> self
|
743
742
|
def delete?: (any) -> self?
|
@@ -761,7 +760,7 @@ class Set<'a>
|
|
761
760
|
def keep_if: { ('a) -> any } -> self
|
762
761
|
|
763
762
|
def size: -> Integer
|
764
|
-
|
763
|
+
alias length size
|
765
764
|
|
766
765
|
def merge: (_Iteratable<'a, any>) -> self
|
767
766
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -259,6 +259,8 @@ files:
|
|
259
259
|
- smoke/extension/b.rb
|
260
260
|
- smoke/extension/c.rb
|
261
261
|
- smoke/extension/d.rb
|
262
|
+
- smoke/extension/e.rb
|
263
|
+
- smoke/extension/e.rbi
|
262
264
|
- smoke/hash/a.rb
|
263
265
|
- smoke/hash/a.rbi
|
264
266
|
- smoke/hash/b.rb
|
@@ -301,6 +303,7 @@ files:
|
|
301
303
|
- smoke/rescue/a.rb
|
302
304
|
- smoke/self/a.rb
|
303
305
|
- smoke/self/a.rbi
|
306
|
+
- smoke/skip/skip.rb
|
304
307
|
- smoke/stdout/a.rb
|
305
308
|
- smoke/stdout/a.rbi
|
306
309
|
- smoke/super/a.rb
|