steep 0.1.0.pre2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +1 -1
  3. data/README.md +146 -33
  4. data/bin/smoke_runner.rb +43 -10
  5. data/lib/steep/ast/annotation/collection.rb +93 -0
  6. data/lib/steep/ast/annotation.rb +131 -0
  7. data/lib/steep/ast/buffer.rb +47 -0
  8. data/lib/steep/ast/location.rb +82 -0
  9. data/lib/steep/ast/method_type.rb +116 -0
  10. data/lib/steep/ast/signature/class.rb +33 -0
  11. data/lib/steep/ast/signature/const.rb +17 -0
  12. data/lib/steep/ast/signature/env.rb +123 -0
  13. data/lib/steep/ast/signature/extension.rb +21 -0
  14. data/lib/steep/ast/signature/gvar.rb +17 -0
  15. data/lib/steep/ast/signature/interface.rb +31 -0
  16. data/lib/steep/ast/signature/members.rb +71 -0
  17. data/lib/steep/ast/signature/module.rb +21 -0
  18. data/lib/steep/ast/type_params.rb +13 -0
  19. data/lib/steep/ast/types/any.rb +39 -0
  20. data/lib/steep/ast/types/bot.rb +39 -0
  21. data/lib/steep/ast/types/class.rb +35 -0
  22. data/lib/steep/ast/types/helper.rb +21 -0
  23. data/lib/steep/ast/types/instance.rb +39 -0
  24. data/lib/steep/ast/types/intersection.rb +74 -0
  25. data/lib/steep/ast/types/name.rb +124 -0
  26. data/lib/steep/ast/types/self.rb +39 -0
  27. data/lib/steep/ast/types/top.rb +39 -0
  28. data/lib/steep/ast/types/union.rb +74 -0
  29. data/lib/steep/ast/types/var.rb +57 -0
  30. data/lib/steep/ast/types/void.rb +35 -0
  31. data/lib/steep/cli.rb +28 -1
  32. data/lib/steep/drivers/annotations.rb +32 -0
  33. data/lib/steep/drivers/check.rb +53 -77
  34. data/lib/steep/drivers/scaffold.rb +303 -0
  35. data/lib/steep/drivers/utils/each_signature.rb +66 -0
  36. data/lib/steep/drivers/utils/validator.rb +115 -0
  37. data/lib/steep/drivers/validate.rb +39 -0
  38. data/lib/steep/errors.rb +291 -19
  39. data/lib/steep/interface/abstract.rb +44 -0
  40. data/lib/steep/interface/builder.rb +470 -0
  41. data/lib/steep/interface/instantiated.rb +126 -0
  42. data/lib/steep/interface/ivar_chain.rb +26 -0
  43. data/lib/steep/interface/method.rb +60 -0
  44. data/lib/steep/{interface.rb → interface/method_type.rb} +111 -100
  45. data/lib/steep/interface/substitution.rb +65 -0
  46. data/lib/steep/module_name.rb +116 -0
  47. data/lib/steep/parser.rb +1314 -814
  48. data/lib/steep/parser.y +536 -175
  49. data/lib/steep/source.rb +220 -25
  50. data/lib/steep/subtyping/check.rb +673 -0
  51. data/lib/steep/subtyping/constraints.rb +275 -0
  52. data/lib/steep/subtyping/relation.rb +41 -0
  53. data/lib/steep/subtyping/result.rb +126 -0
  54. data/lib/steep/subtyping/trace.rb +48 -0
  55. data/lib/steep/subtyping/variable_occurrence.rb +49 -0
  56. data/lib/steep/subtyping/variable_variance.rb +69 -0
  57. data/lib/steep/type_construction.rb +1630 -524
  58. data/lib/steep/type_inference/block_params.rb +100 -0
  59. data/lib/steep/type_inference/constant_env.rb +55 -0
  60. data/lib/steep/type_inference/send_args.rb +222 -0
  61. data/lib/steep/type_inference/type_env.rb +226 -0
  62. data/lib/steep/type_name.rb +27 -7
  63. data/lib/steep/typing.rb +4 -0
  64. data/lib/steep/version.rb +1 -1
  65. data/lib/steep.rb +71 -16
  66. data/smoke/and/a.rb +4 -2
  67. data/smoke/array/a.rb +4 -5
  68. data/smoke/array/b.rb +4 -4
  69. data/smoke/block/a.rb +2 -2
  70. data/smoke/block/a.rbi +2 -0
  71. data/smoke/block/b.rb +15 -0
  72. data/smoke/case/a.rb +3 -3
  73. data/smoke/class/a.rb +3 -3
  74. data/smoke/class/b.rb +0 -2
  75. data/smoke/class/d.rb +2 -2
  76. data/smoke/class/e.rb +1 -1
  77. data/smoke/class/f.rb +2 -2
  78. data/smoke/class/g.rb +8 -0
  79. data/smoke/const/a.rb +3 -3
  80. data/smoke/dstr/a.rb +1 -1
  81. data/smoke/ensure/a.rb +22 -0
  82. data/smoke/enumerator/a.rb +6 -6
  83. data/smoke/enumerator/b.rb +22 -0
  84. data/smoke/extension/a.rb +2 -2
  85. data/smoke/extension/b.rb +3 -3
  86. data/smoke/extension/c.rb +1 -1
  87. data/smoke/hello/hello.rb +2 -2
  88. data/smoke/if/a.rb +4 -2
  89. data/smoke/kwbegin/a.rb +8 -0
  90. data/smoke/literal/a.rb +5 -5
  91. data/smoke/method/a.rb +5 -5
  92. data/smoke/method/a.rbi +4 -0
  93. data/smoke/method/b.rb +29 -0
  94. data/smoke/module/a.rb +3 -3
  95. data/smoke/module/a.rbi +9 -0
  96. data/smoke/module/b.rb +2 -2
  97. data/smoke/module/c.rb +1 -1
  98. data/smoke/module/d.rb +5 -0
  99. data/smoke/module/e.rb +13 -0
  100. data/smoke/module/f.rb +13 -0
  101. data/smoke/rescue/a.rb +62 -0
  102. data/smoke/super/a.rb +2 -2
  103. data/smoke/type_case/a.rb +35 -0
  104. data/smoke/yield/a.rb +2 -2
  105. data/stdlib/builtin.rbi +463 -24
  106. data/steep.gemspec +3 -2
  107. metadata +91 -29
  108. data/lib/steep/annotation.rb +0 -223
  109. data/lib/steep/signature/class.rb +0 -450
  110. data/lib/steep/signature/extension.rb +0 -51
  111. data/lib/steep/signature/interface.rb +0 -49
  112. data/lib/steep/types/any.rb +0 -31
  113. data/lib/steep/types/class.rb +0 -27
  114. data/lib/steep/types/instance.rb +0 -27
  115. data/lib/steep/types/merge.rb +0 -32
  116. data/lib/steep/types/name.rb +0 -57
  117. data/lib/steep/types/union.rb +0 -42
  118. data/lib/steep/types/var.rb +0 -38
  119. data/lib/steep/types.rb +0 -4
data/steep.gemspec CHANGED
@@ -21,14 +21,15 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.required_ruby_version = '>= 2.4.0'
24
+ spec.required_ruby_version = '>= 2.5.0'
25
25
 
26
26
  spec.add_development_dependency "bundler", "~> 1.13"
27
27
  spec.add_development_dependency "rake", "~> 10.0"
28
28
  spec.add_development_dependency "minitest", "~> 5.0"
29
29
  spec.add_development_dependency "racc", "~> 1.4"
30
- spec.add_development_dependency "rainbow", "~> 2.2.2"
31
30
 
32
31
  spec.add_runtime_dependency "parser", "~> 2.4"
33
32
  spec.add_runtime_dependency "ast_utils", "~> 0.1.0"
33
+ spec.add_runtime_dependency "activesupport", "~> 5.1.0"
34
+ spec.add_runtime_dependency "rainbow", "~> 2.2.2"
34
35
  end
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.1.0.pre2
4
+ version: 0.1.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: 2017-11-16 00:00:00.000000000 Z
11
+ date: 2018-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -67,47 +67,61 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.4'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rainbow
70
+ name: parser
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 2.2.2
76
- type: :development
75
+ version: '2.4'
76
+ type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 2.2.2
82
+ version: '2.4'
83
83
  - !ruby/object:Gem::Dependency
84
- name: parser
84
+ name: ast_utils
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.4'
89
+ version: 0.1.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.4'
96
+ version: 0.1.0
97
97
  - !ruby/object:Gem::Dependency
98
- name: ast_utils
98
+ name: activesupport
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.1.0
103
+ version: 5.1.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 0.1.0
110
+ version: 5.1.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rainbow
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 2.2.2
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 2.2.2
111
125
  description: Gradual Typing for Ruby
112
126
  email:
113
127
  - matsumoto@soutaro.com
@@ -126,29 +140,66 @@ files:
126
140
  - bin/smoke_runner.rb
127
141
  - exe/steep
128
142
  - lib/steep.rb
129
- - lib/steep/annotation.rb
143
+ - lib/steep/ast/annotation.rb
144
+ - lib/steep/ast/annotation/collection.rb
145
+ - lib/steep/ast/buffer.rb
146
+ - lib/steep/ast/location.rb
147
+ - lib/steep/ast/method_type.rb
148
+ - lib/steep/ast/signature/class.rb
149
+ - lib/steep/ast/signature/const.rb
150
+ - lib/steep/ast/signature/env.rb
151
+ - lib/steep/ast/signature/extension.rb
152
+ - lib/steep/ast/signature/gvar.rb
153
+ - lib/steep/ast/signature/interface.rb
154
+ - lib/steep/ast/signature/members.rb
155
+ - lib/steep/ast/signature/module.rb
156
+ - lib/steep/ast/type_params.rb
157
+ - lib/steep/ast/types/any.rb
158
+ - lib/steep/ast/types/bot.rb
159
+ - lib/steep/ast/types/class.rb
160
+ - lib/steep/ast/types/helper.rb
161
+ - lib/steep/ast/types/instance.rb
162
+ - lib/steep/ast/types/intersection.rb
163
+ - lib/steep/ast/types/name.rb
164
+ - lib/steep/ast/types/self.rb
165
+ - lib/steep/ast/types/top.rb
166
+ - lib/steep/ast/types/union.rb
167
+ - lib/steep/ast/types/var.rb
168
+ - lib/steep/ast/types/void.rb
130
169
  - lib/steep/cli.rb
170
+ - lib/steep/drivers/annotations.rb
131
171
  - lib/steep/drivers/check.rb
172
+ - lib/steep/drivers/scaffold.rb
173
+ - lib/steep/drivers/utils/each_signature.rb
174
+ - lib/steep/drivers/utils/validator.rb
175
+ - lib/steep/drivers/validate.rb
132
176
  - lib/steep/errors.rb
133
- - lib/steep/interface.rb
177
+ - lib/steep/interface/abstract.rb
178
+ - lib/steep/interface/builder.rb
179
+ - lib/steep/interface/instantiated.rb
180
+ - lib/steep/interface/ivar_chain.rb
181
+ - lib/steep/interface/method.rb
182
+ - lib/steep/interface/method_type.rb
183
+ - lib/steep/interface/substitution.rb
184
+ - lib/steep/module_name.rb
134
185
  - lib/steep/parser.rb
135
186
  - lib/steep/parser.y
136
- - lib/steep/signature/class.rb
137
187
  - lib/steep/signature/errors.rb
138
- - lib/steep/signature/extension.rb
139
- - lib/steep/signature/interface.rb
140
188
  - lib/steep/source.rb
189
+ - lib/steep/subtyping/check.rb
190
+ - lib/steep/subtyping/constraints.rb
191
+ - lib/steep/subtyping/relation.rb
192
+ - lib/steep/subtyping/result.rb
193
+ - lib/steep/subtyping/trace.rb
194
+ - lib/steep/subtyping/variable_occurrence.rb
195
+ - lib/steep/subtyping/variable_variance.rb
141
196
  - lib/steep/type_assignability.rb
142
197
  - lib/steep/type_construction.rb
198
+ - lib/steep/type_inference/block_params.rb
199
+ - lib/steep/type_inference/constant_env.rb
200
+ - lib/steep/type_inference/send_args.rb
201
+ - lib/steep/type_inference/type_env.rb
143
202
  - 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
203
  - lib/steep/typing.rb
153
204
  - lib/steep/version.rb
154
205
  - manual/annotations.md
@@ -159,6 +210,7 @@ files:
159
210
  - smoke/array/b.rb
160
211
  - smoke/block/a.rb
161
212
  - smoke/block/a.rbi
213
+ - smoke/block/b.rb
162
214
  - smoke/case/a.rb
163
215
  - smoke/class/a.rb
164
216
  - smoke/class/a.rbi
@@ -167,9 +219,12 @@ files:
167
219
  - smoke/class/d.rb
168
220
  - smoke/class/e.rb
169
221
  - smoke/class/f.rb
222
+ - smoke/class/g.rb
170
223
  - smoke/const/a.rb
171
224
  - smoke/dstr/a.rb
225
+ - smoke/ensure/a.rb
172
226
  - smoke/enumerator/a.rb
227
+ - smoke/enumerator/b.rb
173
228
  - smoke/extension/a.rb
174
229
  - smoke/extension/a.rbi
175
230
  - smoke/extension/b.rb
@@ -181,18 +236,25 @@ files:
181
236
  - smoke/implements/a.rbi
182
237
  - smoke/initialize/a.rb
183
238
  - smoke/initialize/a.rbi
239
+ - smoke/kwbegin/a.rb
184
240
  - smoke/literal/a.rb
185
241
  - smoke/map/a.rb
186
242
  - smoke/method/a.rb
187
243
  - smoke/method/a.rbi
244
+ - smoke/method/b.rb
188
245
  - smoke/module/a.rb
189
246
  - smoke/module/a.rbi
190
247
  - smoke/module/b.rb
191
248
  - smoke/module/c.rb
249
+ - smoke/module/d.rb
250
+ - smoke/module/e.rb
251
+ - smoke/module/f.rb
252
+ - smoke/rescue/a.rb
192
253
  - smoke/self/a.rb
193
254
  - smoke/self/a.rbi
194
255
  - smoke/super/a.rb
195
256
  - smoke/super/a.rbi
257
+ - smoke/type_case/a.rb
196
258
  - smoke/yield/a.rb
197
259
  - stdlib/builtin.rbi
198
260
  - steep.gemspec
@@ -207,15 +269,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
207
269
  requirements:
208
270
  - - ">="
209
271
  - !ruby/object:Gem::Version
210
- version: 2.4.0
272
+ version: 2.5.0
211
273
  required_rubygems_version: !ruby/object:Gem::Requirement
212
274
  requirements:
213
- - - ">"
275
+ - - ">="
214
276
  - !ruby/object:Gem::Version
215
- version: 1.3.1
277
+ version: '0'
216
278
  requirements: []
217
279
  rubyforge_project:
218
- rubygems_version: 2.6.13
280
+ rubygems_version: 2.7.6
219
281
  signing_key:
220
282
  specification_version: 4
221
283
  summary: Gradual Typing for Ruby
@@ -1,223 +0,0 @@
1
- module Steep
2
- module Annotation
3
- class Base; end
4
-
5
- class VarType < Base
6
- attr_reader :var
7
- attr_reader :type
8
-
9
- def initialize(var:, type:)
10
- @var = var
11
- @type = type
12
- end
13
-
14
- def ==(other)
15
- other.is_a?(VarType) &&
16
- other.var == var &&
17
- other.type == type
18
- end
19
- end
20
-
21
- class MethodType < Base
22
- attr_reader :method
23
- attr_reader :type
24
-
25
- def initialize(method:, type:)
26
- @method = method
27
- @type = type
28
- end
29
-
30
- def ==(other)
31
- other.is_a?(MethodType) &&
32
- other.method == method &&
33
- other.type == type
34
- end
35
- end
36
-
37
- class ReturnType < Base
38
- attr_reader :type
39
-
40
- def initialize(type:)
41
- @type = type
42
- end
43
-
44
- def ==(other)
45
- other.is_a?(ReturnType) && other.type == type
46
- end
47
- end
48
-
49
- class BlockType < Base
50
- attr_reader :type
51
-
52
- def initialize(type:)
53
- @type = type
54
- end
55
-
56
- def ==(other)
57
- other.is_a?(BlockType) && other.type == type
58
- end
59
- end
60
-
61
- class SelfType < Base
62
- attr_reader :type
63
-
64
- def initialize(type:)
65
- @type = type
66
- end
67
-
68
- def ==(other)
69
- other.is_a?(SelfType) && other.type == type
70
- end
71
- end
72
-
73
- class InstanceType < Base
74
- attr_reader :type
75
-
76
- def initialize(type:)
77
- @type = type
78
- end
79
-
80
- def ==(other)
81
- other.is_a?(InstanceType) && other.type == type
82
- end
83
- end
84
-
85
- class ModuleType < Base
86
- attr_reader :type
87
-
88
- def initialize(type:)
89
- @type = type
90
- end
91
-
92
- def ==(other)
93
- other.is_a?(ModuleType) && other.type == type
94
- end
95
- end
96
-
97
- class Implements < Base
98
- attr_reader :module_name
99
-
100
- def initialize(module_name:)
101
- @module_name = module_name
102
- end
103
-
104
- def ==(other)
105
- other.is_a?(Implements) && other.module_name == module_name
106
- end
107
- end
108
-
109
- class NameType < Base
110
- attr_reader :name
111
- attr_reader :type
112
-
113
- def initialize(name:, type:)
114
- @name = name
115
- @type = type
116
- end
117
-
118
- def ==(other)
119
- other.is_a?(self.class) && other.name == name && other.type == type
120
- end
121
- end
122
-
123
- class ConstType < NameType
124
- end
125
-
126
- class IvarType < NameType
127
- end
128
-
129
- class Dynamic < Base
130
- attr_reader :name
131
-
132
- def initialize(name:)
133
- @name = name
134
- end
135
-
136
- def ==(other)
137
- other.is_a?(Dynamic) && other.name == name
138
- end
139
- end
140
-
141
- class Collection
142
- attr_reader :var_types
143
- attr_reader :method_types
144
- attr_reader :annotations
145
- attr_reader :block_type
146
- attr_reader :return_type
147
- attr_reader :self_type
148
- attr_reader :const_types
149
- attr_reader :instance_type
150
- attr_reader :module_type
151
- attr_reader :implement_module
152
- attr_reader :ivar_types
153
- attr_reader :dynamics
154
-
155
- def initialize(annotations:)
156
- @var_types = {}
157
- @method_types = {}
158
- @const_types = {}
159
- @ivar_types = {}
160
- @dynamics = Set.new
161
-
162
- annotations.each do |annotation|
163
- case annotation
164
- when VarType
165
- var_types[annotation.var] = annotation
166
- when MethodType
167
- method_types[annotation.method] = annotation
168
- when BlockType
169
- @block_type = annotation.type
170
- when ReturnType
171
- @return_type = annotation.type
172
- when SelfType
173
- @self_type = annotation.type
174
- when ConstType
175
- @const_types[annotation.name] = annotation.type
176
- when InstanceType
177
- @instance_type = annotation.type
178
- when ModuleType
179
- @module_type = annotation.type
180
- when Implements
181
- @implement_module = annotation.module_name
182
- when IvarType
183
- ivar_types[annotation.name] = annotation.type
184
- when Dynamic
185
- dynamics << annotation.name
186
- else
187
- raise "Unexpected annotation: #{annotation.inspect}"
188
- end
189
- end
190
-
191
- @annotations = annotations
192
- end
193
-
194
- def lookup_var_type(name)
195
- var_types[name]&.type
196
- end
197
-
198
- def lookup_method_type(name)
199
- method_types[name]&.type
200
- end
201
-
202
- def lookup_const_type(node)
203
- const_types[node]
204
- end
205
-
206
- def +(other)
207
- self.class.new(annotations: annotations.reject {|a| a.is_a?(BlockType) } + other.annotations)
208
- end
209
-
210
- def any?(&block)
211
- annotations.any?(&block)
212
- end
213
-
214
- def size
215
- annotations.size
216
- end
217
-
218
- def include?(obj)
219
- annotations.include?(obj)
220
- end
221
- end
222
- end
223
- end