steep 0.4.0 → 0.5.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 +12 -0
- data/LICENSE +21 -0
- data/bin/smoke_runner.rb +3 -0
- data/lib/steep/ast/annotation/collection.rb +120 -43
- data/lib/steep/ast/annotation.rb +5 -10
- data/lib/steep/ast/location.rb +1 -1
- data/lib/steep/ast/method_type.rb +3 -1
- data/lib/steep/ast/signature/alias.rb +19 -0
- data/lib/steep/ast/signature/env.rb +9 -0
- data/lib/steep/ast/signature/members.rb +4 -0
- data/lib/steep/ast/types/proc.rb +79 -0
- data/lib/steep/ast/types/void.rb +4 -0
- data/lib/steep/cli.rb +2 -1
- data/lib/steep/drivers/check.rb +4 -1
- data/lib/steep/errors.rb +13 -0
- data/lib/steep/interface/builder.rb +90 -47
- data/lib/steep/interface/instantiated.rb +1 -1
- data/lib/steep/interface/method.rb +8 -0
- data/lib/steep/interface/method_type.rb +40 -13
- data/lib/steep/parser.rb +1098 -1043
- data/lib/steep/parser.y +94 -36
- data/lib/steep/source.rb +5 -6
- data/lib/steep/subtyping/check.rb +162 -47
- data/lib/steep/subtyping/variable_occurrence.rb +2 -2
- data/lib/steep/subtyping/variable_variance.rb +3 -3
- data/lib/steep/type_construction.rb +630 -300
- data/lib/steep/type_inference/block_params.rb +186 -35
- data/lib/steep/type_inference/send_args.rb +12 -3
- data/lib/steep/type_inference/type_env.rb +10 -4
- data/lib/steep/type_name.rb +6 -0
- data/lib/steep/typing.rb +21 -2
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +2 -0
- data/smoke/alias/a.rb +19 -0
- data/smoke/alias/a.rbi +10 -0
- data/smoke/alias/b.rb +7 -0
- data/smoke/alias/c.rb +10 -0
- data/smoke/array/c.rb +7 -0
- data/smoke/block/c.rb +10 -0
- data/smoke/block/c.rbi +3 -0
- data/smoke/block/d.rb +15 -0
- data/smoke/class/c.rb +1 -1
- data/smoke/class/e.rb +1 -1
- data/smoke/class/h.rb +15 -0
- data/smoke/class/h.rbi +7 -0
- data/smoke/class/i.rb +17 -0
- data/smoke/class/i.rbi +9 -0
- data/smoke/extension/a.rbi +4 -0
- data/smoke/extension/d.rb +2 -0
- data/smoke/hash/a.rb +17 -0
- data/smoke/hash/b.rb +7 -0
- data/smoke/implements/a.rb +2 -2
- data/smoke/initialize/a.rb +1 -1
- data/smoke/lambda/a.rb +11 -0
- data/smoke/literal/b.rb +9 -0
- data/smoke/literal/literal_methods.rbi +4 -0
- data/smoke/method/c.rb +5 -0
- data/smoke/regression/array.rb +7 -0
- data/smoke/regression/hash.rb +7 -0
- data/smoke/regression/set_divide.rb +16 -0
- data/smoke/self/a.rb +2 -2
- data/stdlib/builtin.rbi +151 -1
- data/steep.gemspec +1 -0
- metadata +30 -4
data/smoke/literal/b.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
l = LiteralMethods.new
|
2
|
+
|
3
|
+
l.foo(3)
|
4
|
+
# !expects ArgumentTypeMismatch: receiver=::LiteralMethods, expected=3, actual=::Integer
|
5
|
+
l.foo(4)
|
6
|
+
|
7
|
+
l.bar(foo: :foo)
|
8
|
+
# !expects ArgumentTypeMismatch: receiver=::LiteralMethods, expected=:foo, actual=::Symbol
|
9
|
+
l.bar(foo: :bar)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
d = Set.new([1,2,3], &:to_s)
|
2
|
+
# !expects NoMethodError: type=::Set<::String>, method=ffffffff
|
3
|
+
d.ffffffff
|
4
|
+
|
5
|
+
d.divide do |x, y|
|
6
|
+
# !expects NoMethodError: type=::String, method=ggggg
|
7
|
+
x.ggggg
|
8
|
+
|
9
|
+
# !expects NoMethodError: type=::String, method=ggggg
|
10
|
+
y.ggggg
|
11
|
+
end
|
12
|
+
|
13
|
+
d.divide do |x|
|
14
|
+
# !expects NoMethodError: type=::String, method=ggggg
|
15
|
+
x.ggggg
|
16
|
+
end
|
data/smoke/self/a.rb
CHANGED
@@ -13,11 +13,11 @@ end
|
|
13
13
|
def bar
|
14
14
|
# @type self: Object
|
15
15
|
|
16
|
-
# !expects NoMethodError: type
|
16
|
+
# !expects NoMethodError: type=::Object, method=baz
|
17
17
|
baz
|
18
18
|
|
19
19
|
tap do
|
20
|
-
# !expects NoMethodError: type
|
20
|
+
# !expects NoMethodError: type=::Object, method=baz
|
21
21
|
baz
|
22
22
|
end
|
23
23
|
end
|
data/stdlib/builtin.rbi
CHANGED
@@ -20,7 +20,12 @@ class Object <: BasicObject
|
|
20
20
|
def yield_self: <'a>{ (self) -> 'a } -> 'a
|
21
21
|
def dup: -> self
|
22
22
|
def send: (Symbol, *any) -> any
|
23
|
+
def __send__: (Symbol, *any) -> any
|
23
24
|
def instance_variable_get: (Symbol) -> any
|
25
|
+
def nil?: -> bool
|
26
|
+
def !: -> bool
|
27
|
+
def Array: (any) -> Array<any>
|
28
|
+
def Hash: (any) -> Hash<any, any>
|
24
29
|
end
|
25
30
|
|
26
31
|
class Module
|
@@ -73,6 +78,7 @@ class Array<'a>
|
|
73
78
|
|
74
79
|
def []: (Integer) -> 'a
|
75
80
|
| (Range<Integer>) -> self?
|
81
|
+
| (0, Integer) -> self
|
76
82
|
| (Integer, Integer) -> self?
|
77
83
|
def at: (Integer) -> 'a
|
78
84
|
| (Range<Integer>) -> self?
|
@@ -102,7 +108,7 @@ class Array<'a>
|
|
102
108
|
def concat: (*Array<'a>) -> self
|
103
109
|
| (*'a) -> self
|
104
110
|
def delete: ('a) -> 'a?
|
105
|
-
| <'x> ('a) { (
|
111
|
+
| <'x> ('a) { () -> 'x } -> ('a | 'x)
|
106
112
|
def delete_at: (Integer) -> 'a?
|
107
113
|
def delete_if: { ('a) -> any } -> self
|
108
114
|
| -> Enumerator<'a, self>
|
@@ -225,6 +231,12 @@ class Hash<'key, 'value>
|
|
225
231
|
| -> Enumerator<'a, self>
|
226
232
|
def self.[]: (Array<any>) -> Hash<'key, 'value>
|
227
233
|
def keys: () -> Array<'key>
|
234
|
+
def each: { (['key, 'value]) -> any } -> self
|
235
|
+
| -> Enumerator<['key, 'value], self>
|
236
|
+
def key?: ('key) -> bool
|
237
|
+
def merge: (Hash<'key, 'value>) -> Hash<'key, 'value>
|
238
|
+
|
239
|
+
include Enumerable<['key, 'value], self>
|
228
240
|
end
|
229
241
|
|
230
242
|
class Symbol
|
@@ -253,6 +265,7 @@ class Numeric
|
|
253
265
|
def >=: (any) -> bool
|
254
266
|
def < : (any) -> bool
|
255
267
|
def >: (any) -> bool
|
268
|
+
def -@: -> self
|
256
269
|
end
|
257
270
|
|
258
271
|
class Integer <: Numeric
|
@@ -321,6 +334,7 @@ end
|
|
321
334
|
|
322
335
|
class String
|
323
336
|
def []: (Range<Integer>) -> String
|
337
|
+
| (Integer, Integer) -> String
|
324
338
|
def to_sym: -> Symbol
|
325
339
|
def +: (String) -> String
|
326
340
|
def to_str: -> String
|
@@ -352,6 +366,13 @@ class String
|
|
352
366
|
def *: (Integer) -> String
|
353
367
|
def scan: (Regexp) { (Array<String>) -> void } -> String
|
354
368
|
| (Regexp) -> Array<String>
|
369
|
+
def lines: -> Array<String>
|
370
|
+
def bytesize: -> Integer
|
371
|
+
def start_with?: (String) -> bool
|
372
|
+
def byteslice: (Integer, Integer) -> String
|
373
|
+
def empty?: -> bool
|
374
|
+
def length: -> Integer
|
375
|
+
def force_encoding: (any) -> self
|
355
376
|
end
|
356
377
|
|
357
378
|
interface _Iteratable<'a, 'b>
|
@@ -507,6 +528,9 @@ module Enumerable<'a, 'b> : _Iteratable<'a, 'b>
|
|
507
528
|
def sort_by: { ('a) -> any } -> Array<'a>
|
508
529
|
| -> Enumerator<'a, Array<'a>>
|
509
530
|
|
531
|
+
def sort_by!: { ('a) -> any } -> self
|
532
|
+
| -> Enumerator<'a, self>
|
533
|
+
|
510
534
|
def sum: () -> Numeric
|
511
535
|
| (Numeric) -> Numeric
|
512
536
|
| (any) -> any
|
@@ -529,16 +553,25 @@ class Enumerator<'a, 'b>
|
|
529
553
|
def each: { ('a) -> any } -> 'b
|
530
554
|
def with_object: <'x> ('x) { ('a, 'x) -> any } -> 'x
|
531
555
|
def with_index: { ('a, Integer) -> any } -> 'b
|
556
|
+
| -> Enumerator<['a, Integer], 'b>
|
532
557
|
end
|
533
558
|
|
534
559
|
class Regexp
|
560
|
+
def self.compile: (String, *any) -> Regexp
|
561
|
+
def self.escape: (String) -> String
|
562
|
+
def source: -> String
|
535
563
|
end
|
536
564
|
|
537
565
|
class IO
|
538
566
|
def gets: -> String?
|
539
567
|
def puts: (*any) -> void
|
568
|
+
def read: (Integer) -> String
|
569
|
+
def write: (String) -> Integer
|
570
|
+
def flush: () -> void
|
540
571
|
end
|
541
572
|
|
573
|
+
File::FNM_DOTMATCH: Integer
|
574
|
+
|
542
575
|
class File <: IO
|
543
576
|
def self.binread: (String) -> String
|
544
577
|
def self.extname: (String) -> String
|
@@ -547,6 +580,25 @@ class File <: IO
|
|
547
580
|
def self.binwrite: (String, String) -> void
|
548
581
|
def self.read: (String) -> String
|
549
582
|
| (String, Integer?) -> String?
|
583
|
+
def self.fnmatch: (String, String, Integer) -> bool
|
584
|
+
def path: -> String
|
585
|
+
def self.write: (String, String) -> void
|
586
|
+
def self.chmod: (Integer, String) -> void
|
587
|
+
end
|
588
|
+
|
589
|
+
class Proc
|
590
|
+
def []: (*any) -> any
|
591
|
+
def call: (*any) -> any
|
592
|
+
def ===: (*any) -> any
|
593
|
+
def yield: (*any) -> any
|
594
|
+
def arity: -> Integer
|
595
|
+
def binding: -> any
|
596
|
+
def curry: -> Proc
|
597
|
+
| (Integer) -> Proc
|
598
|
+
def lambda?: -> bool
|
599
|
+
def parameters: -> Array<[(:req | :opt | :rest | :keyreq | :key | :keyrest | :block), Symbol]>
|
600
|
+
def source_location: -> [String, Integer]?
|
601
|
+
def to_proc: -> self
|
550
602
|
end
|
551
603
|
|
552
604
|
STDOUT: IO
|
@@ -555,3 +607,101 @@ class StringIO
|
|
555
607
|
def initialize: (?String, ?String) -> any
|
556
608
|
def puts: (*any) -> void
|
557
609
|
end
|
610
|
+
|
611
|
+
class Process::Status
|
612
|
+
def &: (Integer) -> Integer
|
613
|
+
def >>: (Integer) -> Integer
|
614
|
+
def coredump: -> bool
|
615
|
+
def exited?: -> bool
|
616
|
+
def exitstatus: -> Integer?
|
617
|
+
def pid: -> Integer
|
618
|
+
def signaled?: -> bool
|
619
|
+
def stopsig: -> Integer?
|
620
|
+
def success?: -> bool
|
621
|
+
def termsig: -> Integer?
|
622
|
+
def to_i: -> Integer
|
623
|
+
def to_int: -> Integer
|
624
|
+
end
|
625
|
+
|
626
|
+
module Marshal
|
627
|
+
def self.load: (String) -> any
|
628
|
+
def self.dump: (any) -> String
|
629
|
+
end
|
630
|
+
|
631
|
+
class Set<'a>
|
632
|
+
def self.[]: <'x> (*'x) -> Set<'x>
|
633
|
+
|
634
|
+
def initialize: (_Iteratable<'a, any>) -> any
|
635
|
+
| <'x> (_Iteratable<'x, any>) { ('x) -> 'a } -> any
|
636
|
+
| (?nil) -> any
|
637
|
+
|
638
|
+
def intersection: (_Iteratable<'a, any>) -> self
|
639
|
+
def &: (_Iteratable<'a, any>) -> self
|
640
|
+
|
641
|
+
def union: (_Iteratable<'a, any>) -> self
|
642
|
+
def +: (_Iteratable<'a, any>) -> self
|
643
|
+
def |: (_Iteratable<'a, any>) -> self
|
644
|
+
|
645
|
+
def difference: (_Iteratable<'a, any>) -> self
|
646
|
+
def -: (_Iteratable<'a, any>) -> self
|
647
|
+
|
648
|
+
def add: ('a) -> self
|
649
|
+
def <<: ('a) -> self
|
650
|
+
def add?: ('a) -> self?
|
651
|
+
|
652
|
+
def member?: (any) -> bool
|
653
|
+
def include?: (any) -> bool
|
654
|
+
|
655
|
+
def ^: (_Iteratable<'a, any>) -> self
|
656
|
+
|
657
|
+
def classify: <'x> { ('a) -> 'x } -> Hash<'x, self>
|
658
|
+
|
659
|
+
def clear: -> self
|
660
|
+
|
661
|
+
def collect!: { ('a) -> 'a } -> self
|
662
|
+
def map!: { ('a) -> 'a } -> self
|
663
|
+
|
664
|
+
def delete: (any) -> self
|
665
|
+
def delete?: (any) -> self?
|
666
|
+
|
667
|
+
def delete_if: { ('a) -> any } -> self
|
668
|
+
def reject!: { ('a) -> any } -> self
|
669
|
+
|
670
|
+
def disjoint?: (self) -> bool
|
671
|
+
|
672
|
+
def divide: { ('a, 'a) -> any } -> Set<self>
|
673
|
+
| { ('a) -> any } -> Set<self>
|
674
|
+
|
675
|
+
def each: { ('a) -> void } -> self
|
676
|
+
|
677
|
+
def empty?: -> bool
|
678
|
+
|
679
|
+
def flatten: -> Set<any>
|
680
|
+
|
681
|
+
def intersect?: -> bool
|
682
|
+
|
683
|
+
def keep_if: { ('a) -> any } -> self
|
684
|
+
|
685
|
+
def size: -> Integer
|
686
|
+
def length: -> Integer
|
687
|
+
|
688
|
+
def merge: (_Iteratable<'a, any>) -> self
|
689
|
+
|
690
|
+
def subset?: (self) -> bool
|
691
|
+
def proper_subst?: (self) -> bool
|
692
|
+
|
693
|
+
def superset?: (self) -> bool
|
694
|
+
def proper_superset?: (self) -> bool
|
695
|
+
|
696
|
+
def replace: (_Iteratable<'a, any>) -> self
|
697
|
+
|
698
|
+
def reset: -> self
|
699
|
+
|
700
|
+
def select!: { ('a) -> any } -> self?
|
701
|
+
|
702
|
+
def subtract: (_Iteratable<'a, any>) -> self
|
703
|
+
|
704
|
+
def to_a: -> Array<'a>
|
705
|
+
|
706
|
+
include Enumerable<'a, self>
|
707
|
+
end
|
data/steep.gemspec
CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.summary = %q{Gradual Typing for Ruby}
|
13
13
|
spec.description = %q{Gradual Typing for Ruby}
|
14
14
|
spec.homepage = "https://github.com/soutaro/steep"
|
15
|
+
spec.license = 'MIT'
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
18
|
f.match(%r{^(test|spec|features)/})
|
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.5.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
|
+
date: 2018-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- ".travis.yml"
|
135
135
|
- CHANGELOG.md
|
136
136
|
- Gemfile
|
137
|
+
- LICENSE
|
137
138
|
- README.md
|
138
139
|
- Rakefile
|
139
140
|
- bin/console
|
@@ -146,6 +147,7 @@ files:
|
|
146
147
|
- lib/steep/ast/buffer.rb
|
147
148
|
- lib/steep/ast/location.rb
|
148
149
|
- lib/steep/ast/method_type.rb
|
150
|
+
- lib/steep/ast/signature/alias.rb
|
149
151
|
- lib/steep/ast/signature/class.rb
|
150
152
|
- lib/steep/ast/signature/const.rb
|
151
153
|
- lib/steep/ast/signature/env.rb
|
@@ -165,6 +167,7 @@ files:
|
|
165
167
|
- lib/steep/ast/types/literal.rb
|
166
168
|
- lib/steep/ast/types/name.rb
|
167
169
|
- lib/steep/ast/types/nil.rb
|
170
|
+
- lib/steep/ast/types/proc.rb
|
168
171
|
- lib/steep/ast/types/self.rb
|
169
172
|
- lib/steep/ast/types/top.rb
|
170
173
|
- lib/steep/ast/types/tuple.rb
|
@@ -211,12 +214,20 @@ files:
|
|
211
214
|
- manual/annotations.md
|
212
215
|
- sig/signature.rbi
|
213
216
|
- sig/types.rbi
|
217
|
+
- smoke/alias/a.rb
|
218
|
+
- smoke/alias/a.rbi
|
219
|
+
- smoke/alias/b.rb
|
220
|
+
- smoke/alias/c.rb
|
214
221
|
- smoke/and/a.rb
|
215
222
|
- smoke/array/a.rb
|
216
223
|
- smoke/array/b.rb
|
224
|
+
- smoke/array/c.rb
|
217
225
|
- smoke/block/a.rb
|
218
226
|
- smoke/block/a.rbi
|
219
227
|
- smoke/block/b.rb
|
228
|
+
- smoke/block/c.rb
|
229
|
+
- smoke/block/c.rbi
|
230
|
+
- smoke/block/d.rb
|
220
231
|
- smoke/case/a.rb
|
221
232
|
- smoke/class/a.rb
|
222
233
|
- smoke/class/a.rbi
|
@@ -226,6 +237,10 @@ files:
|
|
226
237
|
- smoke/class/e.rb
|
227
238
|
- smoke/class/f.rb
|
228
239
|
- smoke/class/g.rb
|
240
|
+
- smoke/class/h.rb
|
241
|
+
- smoke/class/h.rbi
|
242
|
+
- smoke/class/i.rb
|
243
|
+
- smoke/class/i.rbi
|
229
244
|
- smoke/const/a.rb
|
230
245
|
- smoke/dstr/a.rb
|
231
246
|
- smoke/ensure/a.rb
|
@@ -235,6 +250,9 @@ files:
|
|
235
250
|
- smoke/extension/a.rbi
|
236
251
|
- smoke/extension/b.rb
|
237
252
|
- smoke/extension/c.rb
|
253
|
+
- smoke/extension/d.rb
|
254
|
+
- smoke/hash/a.rb
|
255
|
+
- smoke/hash/b.rb
|
238
256
|
- smoke/hello/hello.rb
|
239
257
|
- smoke/hello/hello.rbi
|
240
258
|
- smoke/if/a.rb
|
@@ -243,11 +261,15 @@ files:
|
|
243
261
|
- smoke/initialize/a.rb
|
244
262
|
- smoke/initialize/a.rbi
|
245
263
|
- smoke/kwbegin/a.rb
|
264
|
+
- smoke/lambda/a.rb
|
246
265
|
- smoke/literal/a.rb
|
266
|
+
- smoke/literal/b.rb
|
267
|
+
- smoke/literal/literal_methods.rbi
|
247
268
|
- smoke/map/a.rb
|
248
269
|
- smoke/method/a.rb
|
249
270
|
- smoke/method/a.rbi
|
250
271
|
- smoke/method/b.rb
|
272
|
+
- smoke/method/c.rb
|
251
273
|
- smoke/module/a.rb
|
252
274
|
- smoke/module/a.rbi
|
253
275
|
- smoke/module/b.rb
|
@@ -255,6 +277,9 @@ files:
|
|
255
277
|
- smoke/module/d.rb
|
256
278
|
- smoke/module/e.rb
|
257
279
|
- smoke/module/f.rb
|
280
|
+
- smoke/regression/array.rb
|
281
|
+
- smoke/regression/hash.rb
|
282
|
+
- smoke/regression/set_divide.rb
|
258
283
|
- smoke/rescue/a.rb
|
259
284
|
- smoke/self/a.rb
|
260
285
|
- smoke/self/a.rbi
|
@@ -267,7 +292,8 @@ files:
|
|
267
292
|
- stdlib/builtin.rbi
|
268
293
|
- steep.gemspec
|
269
294
|
homepage: https://github.com/soutaro/steep
|
270
|
-
licenses:
|
295
|
+
licenses:
|
296
|
+
- MIT
|
271
297
|
metadata: {}
|
272
298
|
post_install_message:
|
273
299
|
rdoc_options: []
|
@@ -285,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
285
311
|
version: '0'
|
286
312
|
requirements: []
|
287
313
|
rubyforge_project:
|
288
|
-
rubygems_version: 2.7.
|
314
|
+
rubygems_version: 2.7.6
|
289
315
|
signing_key:
|
290
316
|
specification_version: 4
|
291
317
|
summary: Gradual Typing for Ruby
|