steep 0.1.0.pre2 → 0.1.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.
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