steep 0.1.0.pre

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.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +4 -0
  5. data/README.md +95 -0
  6. data/Rakefile +23 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/bin/smoke_runner.rb +106 -0
  10. data/exe/steep +18 -0
  11. data/lib/steep.rb +33 -0
  12. data/lib/steep/annotation.rb +223 -0
  13. data/lib/steep/cli.rb +79 -0
  14. data/lib/steep/drivers/check.rb +141 -0
  15. data/lib/steep/errors.rb +207 -0
  16. data/lib/steep/interface.rb +280 -0
  17. data/lib/steep/parser.y +311 -0
  18. data/lib/steep/signature/class.rb +358 -0
  19. data/lib/steep/signature/errors.rb +78 -0
  20. data/lib/steep/signature/extension.rb +51 -0
  21. data/lib/steep/signature/interface.rb +48 -0
  22. data/lib/steep/source.rb +98 -0
  23. data/lib/steep/type_assignability.rb +362 -0
  24. data/lib/steep/type_construction.rb +993 -0
  25. data/lib/steep/type_name.rb +37 -0
  26. data/lib/steep/types.rb +4 -0
  27. data/lib/steep/types/any.rb +31 -0
  28. data/lib/steep/types/class.rb +27 -0
  29. data/lib/steep/types/instance.rb +27 -0
  30. data/lib/steep/types/merge.rb +32 -0
  31. data/lib/steep/types/name.rb +57 -0
  32. data/lib/steep/types/union.rb +42 -0
  33. data/lib/steep/types/var.rb +38 -0
  34. data/lib/steep/typing.rb +70 -0
  35. data/lib/steep/version.rb +3 -0
  36. data/manual/annotations.md +144 -0
  37. data/sig/signature.rbi +54 -0
  38. data/sig/types.rbi +43 -0
  39. data/smoke/and/a.rb +9 -0
  40. data/smoke/array/a.rb +22 -0
  41. data/smoke/block/a.rb +12 -0
  42. data/smoke/block/a.rbi +4 -0
  43. data/smoke/case/a.rb +20 -0
  44. data/smoke/class/a.rb +31 -0
  45. data/smoke/class/a.rbi +9 -0
  46. data/smoke/class/b.rb +7 -0
  47. data/smoke/class/c.rb +10 -0
  48. data/smoke/const/a.rb +30 -0
  49. data/smoke/dstr/a.rb +6 -0
  50. data/smoke/extension/a.rb +11 -0
  51. data/smoke/extension/a.rbi +8 -0
  52. data/smoke/extension/b.rb +12 -0
  53. data/smoke/extension/c.rb +9 -0
  54. data/smoke/hello/hello.rb +13 -0
  55. data/smoke/hello/hello.rbi +7 -0
  56. data/smoke/if/a.rb +20 -0
  57. data/smoke/implements/a.rb +14 -0
  58. data/smoke/implements/a.rbi +6 -0
  59. data/smoke/literal/a.rb +16 -0
  60. data/smoke/map/a.rb +5 -0
  61. data/smoke/method/a.rb +26 -0
  62. data/smoke/method/a.rbi +0 -0
  63. data/smoke/module/a.rb +21 -0
  64. data/smoke/module/a.rbi +7 -0
  65. data/smoke/module/b.rb +8 -0
  66. data/smoke/self/a.rb +23 -0
  67. data/smoke/self/a.rbi +4 -0
  68. data/smoke/super/a.rb +34 -0
  69. data/smoke/super/a.rbi +10 -0
  70. data/smoke/yield/a.rb +18 -0
  71. data/stdlib/builtin.rbi +89 -0
  72. data/steep.gemspec +32 -0
  73. metadata +214 -0
File without changes
data/smoke/module/a.rb ADDED
@@ -0,0 +1,21 @@
1
+ module A
2
+ # @implements A
3
+
4
+ def count
5
+ # @type var n: Integer
6
+ n = 0
7
+
8
+ each do |_|
9
+ n = n + 1
10
+ end
11
+
12
+ # @type var s: String
13
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
14
+ s = n
15
+
16
+ # !expects NoMethodError: type=_Each<Integer> + A, method=foo
17
+ foo()
18
+
19
+ n
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ interface _Each<'a>
2
+ def each: { ('a) -> any } -> instance
3
+ end
4
+
5
+ module A : _Each<Integer>
6
+ def count: () -> Integer
7
+ end
data/smoke/module/b.rb ADDED
@@ -0,0 +1,8 @@
1
+ # @type var klass: Class<any>
2
+ # @type var mod: Module
3
+
4
+ 3.is_a?(3.class)
5
+ klass = 3.class
6
+ mod = "".class
7
+
8
+
data/smoke/self/a.rb ADDED
@@ -0,0 +1,23 @@
1
+ def foo
2
+ # @type self: A
3
+
4
+ self.bar()
5
+
6
+ tap do
7
+ # @type self: A
8
+
9
+ bar
10
+ end
11
+ end
12
+
13
+ def bar
14
+ # @type self: Object
15
+
16
+ # !expects NoMethodError: type=Object, method=baz
17
+ baz
18
+
19
+ tap do
20
+ # !expects NoMethodError: type=Object, method=baz
21
+ baz
22
+ end
23
+ end
data/smoke/self/a.rbi ADDED
@@ -0,0 +1,4 @@
1
+ class A
2
+ def foo: -> any
3
+ def bar: -> any
4
+ end
data/smoke/super/a.rb ADDED
@@ -0,0 +1,34 @@
1
+ class A
2
+ def foo(x)
3
+ # @type self: A
4
+
5
+ # @type var a: Integer
6
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=Object
7
+ a = super(x)
8
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=Object
9
+ a = super
10
+
11
+ # @type var b: Object
12
+ b = super(x)
13
+
14
+ # @type var c: Integer
15
+ c = foo(x)
16
+ end
17
+
18
+ def bar()
19
+ # @type self: A
20
+
21
+ super()
22
+ super
23
+ end
24
+
25
+ def baz
26
+ # @type self: A
27
+
28
+ # !expects UnexpectedSuper: method=baz
29
+ super()
30
+
31
+ # !expects UnexpectedSuper: method=baz
32
+ super
33
+ end
34
+ end
data/smoke/super/a.rbi ADDED
@@ -0,0 +1,10 @@
1
+ class A
2
+ def foo: (any) -> Integer
3
+ include M
4
+
5
+ def baz: () -> any
6
+ end
7
+
8
+ module M
9
+ def foo: (any) -> Object
10
+ end
data/smoke/yield/a.rb ADDED
@@ -0,0 +1,18 @@
1
+ class A
2
+ # @type method foo: () { (Integer) -> Integer } -> any
3
+ def foo()
4
+ # @type var x: String
5
+
6
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
7
+ x = yield(3)
8
+
9
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=String
10
+ yield(x)
11
+ end
12
+
13
+ # @type method bar: () -> any
14
+ def bar()
15
+ # !expects UnexpectedYield
16
+ yield 4
17
+ end
18
+ end
@@ -0,0 +1,89 @@
1
+ class BasicObject
2
+ def __id__: -> Integer
3
+ end
4
+
5
+ class Object <: BasicObject
6
+ include Kernel
7
+ def tap: { (instance) -> any } -> instance
8
+ def to_s: -> String
9
+ def hash: -> Integer
10
+ def eql?: (any) -> _Boolean
11
+ def ==: (any) -> _Boolean
12
+ def ===: (any) -> _Boolean
13
+ def !=: (any) -> _Boolean
14
+ def class: -> class
15
+ def to_i: -> Integer
16
+ def is_a?: (Module) -> _Boolean
17
+ end
18
+
19
+ class Module
20
+ def attr_reader: (*any) -> any
21
+ def class: -> Class<Module>
22
+ def tap: { (Module) -> any } -> Module
23
+ end
24
+
25
+ class Class<'instance> <: Module
26
+ def new: -> 'instance
27
+ def allocate: -> 'instance
28
+ end
29
+
30
+ module Kernel
31
+ def raise: () -> any
32
+ | (String) -> any
33
+ end
34
+
35
+ class Array<'a>
36
+ def []: (Integer) -> 'a
37
+ def []=: (Integer, 'a) -> 'a
38
+ def empty?: -> _Boolean
39
+ def size: -> Integer
40
+ def map: <'b> { ('a) -> 'b } -> Array<'b>
41
+ def join: (any) -> String
42
+ def all?: { (any) -> any } -> _Boolean
43
+ def sort_by: { ('a) -> any } -> Array<'a>
44
+ def zip: <'b> (Array<'b>) -> Array<Array<'a, 'b> >
45
+ def each: { ('a) -> any } -> instance
46
+ def select: { ('a) -> any } -> Array<'a>
47
+ def <<: ('a) -> instance
48
+ def filter: { ('a) -> any } -> Array<'a>
49
+ end
50
+
51
+ class Hash<'key, 'value>
52
+ def []: ('key) -> 'value
53
+ def size: -> Integer
54
+ def transform_values: <'a> { ('value) -> 'a } -> Hash<'key, 'a>
55
+
56
+ def self.[]: (Array<any>) -> Hash<'key, 'value>
57
+ end
58
+
59
+ class Symbol
60
+ end
61
+
62
+ interface _Boolean
63
+ end
64
+
65
+ class NilClass
66
+ end
67
+
68
+ class Numeric
69
+ def +: (Numeric) -> Numeric
70
+ end
71
+
72
+ class Integer <: Numeric
73
+ def to_int: -> Integer
74
+ def +: (Integer) -> Integer
75
+ | (Numeric) -> Numeric
76
+ def ^: (Numeric) -> Integer
77
+ end
78
+
79
+ class Float <: Numeric
80
+ end
81
+
82
+ class Range<'a>
83
+ end
84
+
85
+ class String
86
+ def +: (String) -> String
87
+ def to_str: -> String
88
+ def size: -> Integer
89
+ end
data/steep.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'steep/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "steep"
8
+ spec.version = Steep::VERSION
9
+ spec.authors = ["Soutaro Matsumoto"]
10
+ spec.email = ["matsumoto@soutaro.com"]
11
+
12
+ spec.summary = %q{Gradual Typing for Ruby}
13
+ spec.description = %q{Gradual Typing for Ruby}
14
+ spec.homepage = "https://github.com/soutaro/steep"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.files << "lib/steep/parser.rb"
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.13"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "minitest", "~> 5.0"
27
+ spec.add_development_dependency "racc", "~> 1.4"
28
+ spec.add_development_dependency "rainbow", "~> 2.2.2"
29
+
30
+ spec.add_runtime_dependency "parser", "~> 2.4"
31
+ spec.add_runtime_dependency "ast_utils", "~> 0.1.0"
32
+ end
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: steep
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre
5
+ platform: ruby
6
+ authors:
7
+ - Soutaro Matsumoto
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-09-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: racc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rainbow
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.2.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.2.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: parser
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.4'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.4'
97
+ - !ruby/object:Gem::Dependency
98
+ name: ast_utils
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.1.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.1.0
111
+ description: Gradual Typing for Ruby
112
+ email:
113
+ - matsumoto@soutaro.com
114
+ executables:
115
+ - steep
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - README.md
123
+ - Rakefile
124
+ - bin/console
125
+ - bin/setup
126
+ - bin/smoke_runner.rb
127
+ - exe/steep
128
+ - lib/steep.rb
129
+ - lib/steep/annotation.rb
130
+ - lib/steep/cli.rb
131
+ - lib/steep/drivers/check.rb
132
+ - lib/steep/errors.rb
133
+ - lib/steep/interface.rb
134
+ - lib/steep/parser.rb
135
+ - lib/steep/parser.y
136
+ - lib/steep/signature/class.rb
137
+ - lib/steep/signature/errors.rb
138
+ - lib/steep/signature/extension.rb
139
+ - lib/steep/signature/interface.rb
140
+ - lib/steep/source.rb
141
+ - lib/steep/type_assignability.rb
142
+ - lib/steep/type_construction.rb
143
+ - lib/steep/type_name.rb
144
+ - lib/steep/types.rb
145
+ - lib/steep/types/any.rb
146
+ - lib/steep/types/class.rb
147
+ - lib/steep/types/instance.rb
148
+ - lib/steep/types/merge.rb
149
+ - lib/steep/types/name.rb
150
+ - lib/steep/types/union.rb
151
+ - lib/steep/types/var.rb
152
+ - lib/steep/typing.rb
153
+ - lib/steep/version.rb
154
+ - manual/annotations.md
155
+ - sig/signature.rbi
156
+ - sig/types.rbi
157
+ - smoke/and/a.rb
158
+ - smoke/array/a.rb
159
+ - smoke/block/a.rb
160
+ - smoke/block/a.rbi
161
+ - smoke/case/a.rb
162
+ - smoke/class/a.rb
163
+ - smoke/class/a.rbi
164
+ - smoke/class/b.rb
165
+ - smoke/class/c.rb
166
+ - smoke/const/a.rb
167
+ - smoke/dstr/a.rb
168
+ - smoke/extension/a.rb
169
+ - smoke/extension/a.rbi
170
+ - smoke/extension/b.rb
171
+ - smoke/extension/c.rb
172
+ - smoke/hello/hello.rb
173
+ - smoke/hello/hello.rbi
174
+ - smoke/if/a.rb
175
+ - smoke/implements/a.rb
176
+ - smoke/implements/a.rbi
177
+ - smoke/literal/a.rb
178
+ - smoke/map/a.rb
179
+ - smoke/method/a.rb
180
+ - smoke/method/a.rbi
181
+ - smoke/module/a.rb
182
+ - smoke/module/a.rbi
183
+ - smoke/module/b.rb
184
+ - smoke/self/a.rb
185
+ - smoke/self/a.rbi
186
+ - smoke/super/a.rb
187
+ - smoke/super/a.rbi
188
+ - smoke/yield/a.rb
189
+ - stdlib/builtin.rbi
190
+ - steep.gemspec
191
+ homepage: https://github.com/soutaro/steep
192
+ licenses: []
193
+ metadata: {}
194
+ post_install_message:
195
+ rdoc_options: []
196
+ require_paths:
197
+ - lib
198
+ required_ruby_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">"
206
+ - !ruby/object:Gem::Version
207
+ version: 1.3.1
208
+ requirements: []
209
+ rubyforge_project:
210
+ rubygems_version: 2.6.8
211
+ signing_key:
212
+ specification_version: 4
213
+ summary: Gradual Typing for Ruby
214
+ test_files: []