steep 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/exe/rbs +1 -1
  4. data/lib/steep/annotation_parser.rb +4 -4
  5. data/lib/steep/ast/buffer.rb +11 -7
  6. data/lib/steep/ast/builtin.rb +8 -0
  7. data/lib/steep/ast/types/factory.rb +55 -55
  8. data/lib/steep/drivers/check.rb +20 -4
  9. data/lib/steep/drivers/langserver.rb +6 -1
  10. data/lib/steep/drivers/vendor.rb +2 -2
  11. data/lib/steep/project/completion_provider.rb +5 -11
  12. data/lib/steep/project/dsl.rb +14 -0
  13. data/lib/steep/project/file.rb +42 -46
  14. data/lib/steep/project/hover_content.rb +11 -5
  15. data/lib/steep/project/options.rb +25 -3
  16. data/lib/steep/project/target.rb +10 -4
  17. data/lib/steep/signature/errors.rb +1 -1
  18. data/lib/steep/signature/validator.rb +8 -8
  19. data/lib/steep/source.rb +1 -1
  20. data/lib/steep/type_construction.rb +987 -711
  21. data/lib/steep/type_inference/constant_env.rb +1 -1
  22. data/lib/steep/type_inference/context.rb +7 -3
  23. data/lib/steep/type_inference/context_array.rb +111 -0
  24. data/lib/steep/type_inference/local_variable_type_env.rb +226 -0
  25. data/lib/steep/type_inference/logic.rb +130 -0
  26. data/lib/steep/type_inference/type_env.rb +5 -69
  27. data/lib/steep/typing.rb +79 -22
  28. data/lib/steep/version.rb +1 -1
  29. data/lib/steep.rb +6 -1
  30. data/smoke/alias/Steepfile +1 -0
  31. data/smoke/and/Steepfile +1 -0
  32. data/smoke/array/Steepfile +1 -0
  33. data/smoke/array/b.rb +0 -2
  34. data/smoke/block/Steepfile +1 -0
  35. data/smoke/case/Steepfile +1 -0
  36. data/smoke/class/Steepfile +1 -0
  37. data/smoke/const/Steepfile +1 -0
  38. data/smoke/dstr/Steepfile +1 -0
  39. data/smoke/ensure/Steepfile +1 -0
  40. data/smoke/enumerator/Steepfile +1 -0
  41. data/smoke/extension/Steepfile +1 -0
  42. data/smoke/extension/c.rb +1 -0
  43. data/smoke/hash/Steepfile +1 -0
  44. data/smoke/hello/Steepfile +1 -0
  45. data/smoke/if/Steepfile +1 -0
  46. data/smoke/if/a.rb +1 -1
  47. data/smoke/implements/Steepfile +1 -0
  48. data/smoke/initialize/Steepfile +1 -0
  49. data/smoke/integer/Steepfile +1 -0
  50. data/smoke/interface/Steepfile +1 -0
  51. data/smoke/kwbegin/Steepfile +1 -0
  52. data/smoke/lambda/Steepfile +1 -0
  53. data/smoke/literal/Steepfile +1 -0
  54. data/smoke/map/Steepfile +1 -0
  55. data/smoke/method/Steepfile +1 -0
  56. data/smoke/module/Steepfile +1 -0
  57. data/smoke/regexp/Steepfile +1 -0
  58. data/smoke/regression/Steepfile +1 -0
  59. data/smoke/rescue/Steepfile +1 -0
  60. data/smoke/rescue/a.rb +1 -1
  61. data/smoke/self/Steepfile +1 -0
  62. data/smoke/skip/Steepfile +1 -0
  63. data/smoke/stdout/Steepfile +1 -0
  64. data/smoke/super/Steepfile +1 -0
  65. data/smoke/type_case/Steepfile +1 -0
  66. data/smoke/yield/Steepfile +1 -0
  67. data/steep.gemspec +1 -1
  68. data/vendor/ruby-signature/.gitignore +2 -2
  69. data/vendor/ruby-signature/README.md +2 -2
  70. data/vendor/ruby-signature/Rakefile +2 -2
  71. data/vendor/ruby-signature/bin/annotate-with-rdoc +14 -13
  72. data/vendor/ruby-signature/bin/console +1 -1
  73. data/vendor/ruby-signature/bin/sort +7 -6
  74. data/vendor/ruby-signature/bin/test_runner.rb +0 -1
  75. data/vendor/ruby-signature/docs/CONTRIBUTING.md +1 -1
  76. data/vendor/ruby-signature/docs/sigs.md +3 -3
  77. data/vendor/ruby-signature/docs/stdlib.md +1 -1
  78. data/vendor/ruby-signature/docs/syntax.md +9 -9
  79. data/vendor/ruby-signature/exe/rbs +5 -1
  80. data/vendor/ruby-signature/lib/rbs/ast/annotation.rb +27 -0
  81. data/vendor/ruby-signature/lib/rbs/ast/comment.rb +27 -0
  82. data/vendor/ruby-signature/lib/rbs/ast/declarations.rb +395 -0
  83. data/vendor/ruby-signature/lib/rbs/ast/members.rb +362 -0
  84. data/vendor/ruby-signature/lib/rbs/buffer.rb +50 -0
  85. data/vendor/ruby-signature/lib/rbs/builtin_names.rb +55 -0
  86. data/vendor/ruby-signature/lib/rbs/cli.rb +558 -0
  87. data/vendor/ruby-signature/lib/rbs/constant.rb +26 -0
  88. data/vendor/ruby-signature/lib/rbs/constant_table.rb +150 -0
  89. data/vendor/ruby-signature/lib/rbs/definition.rb +170 -0
  90. data/vendor/ruby-signature/lib/rbs/definition_builder.rb +919 -0
  91. data/vendor/ruby-signature/lib/rbs/environment.rb +281 -0
  92. data/vendor/ruby-signature/lib/rbs/environment_loader.rb +136 -0
  93. data/vendor/ruby-signature/lib/rbs/environment_walker.rb +124 -0
  94. data/vendor/ruby-signature/lib/rbs/errors.rb +187 -0
  95. data/vendor/ruby-signature/lib/rbs/location.rb +102 -0
  96. data/vendor/ruby-signature/lib/rbs/method_type.rb +123 -0
  97. data/vendor/ruby-signature/lib/rbs/namespace.rb +91 -0
  98. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.rb +21 -23
  99. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.y +18 -18
  100. data/vendor/ruby-signature/lib/rbs/prototype/rb.rb +553 -0
  101. data/vendor/ruby-signature/lib/rbs/prototype/rbi.rb +587 -0
  102. data/vendor/ruby-signature/lib/rbs/prototype/runtime.rb +381 -0
  103. data/vendor/ruby-signature/lib/rbs/substitution.rb +46 -0
  104. data/vendor/ruby-signature/lib/rbs/test/errors.rb +61 -0
  105. data/vendor/ruby-signature/lib/rbs/test/hook.rb +294 -0
  106. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/test/setup.rb +7 -7
  107. data/vendor/ruby-signature/lib/rbs/test/spy.rb +325 -0
  108. data/vendor/ruby-signature/lib/rbs/test/test_helper.rb +183 -0
  109. data/vendor/ruby-signature/lib/rbs/test/type_check.rb +254 -0
  110. data/vendor/ruby-signature/lib/rbs/test.rb +26 -0
  111. data/vendor/ruby-signature/lib/rbs/type_name.rb +70 -0
  112. data/vendor/ruby-signature/lib/rbs/types.rb +936 -0
  113. data/vendor/ruby-signature/lib/rbs/variance_calculator.rb +138 -0
  114. data/vendor/ruby-signature/lib/rbs/vendorer.rb +47 -0
  115. data/vendor/ruby-signature/lib/rbs/version.rb +3 -0
  116. data/vendor/ruby-signature/lib/rbs/writer.rb +269 -0
  117. data/vendor/ruby-signature/lib/rbs.rb +64 -0
  118. data/vendor/ruby-signature/lib/ruby/signature.rb +4 -61
  119. data/vendor/ruby-signature/{ruby-signature.gemspec → rbs.gemspec} +4 -4
  120. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +58 -1
  121. data/vendor/ruby-signature/stdlib/base64/base64.rbs +69 -13
  122. data/vendor/ruby-signature/stdlib/benchmark/benchmark.rbs +372 -0
  123. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +9 -0
  124. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +1 -7
  125. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +2 -1
  126. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +3 -2
  127. data/vendor/ruby-signature/stdlib/builtin/file.rbs +902 -302
  128. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +190 -68
  129. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +3 -6
  130. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +6 -4
  131. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +146 -120
  132. data/vendor/ruby-signature/stdlib/builtin/math.rbs +310 -7
  133. data/vendor/ruby-signature/stdlib/builtin/method.rbs +11 -8
  134. data/vendor/ruby-signature/stdlib/builtin/module.rbs +959 -103
  135. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +3 -0
  136. data/vendor/ruby-signature/stdlib/builtin/process.rbs +981 -108
  137. data/vendor/ruby-signature/stdlib/builtin/random.rbs +215 -41
  138. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +47 -0
  139. data/vendor/ruby-signature/stdlib/builtin/string.rbs +9 -2
  140. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +282 -11
  141. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +11 -13
  142. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +25 -29
  143. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +1 -1
  144. data/vendor/ruby-signature/stdlib/builtin/time.rbs +875 -567
  145. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +243 -44
  146. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +103 -109
  147. data/vendor/ruby-signature/stdlib/coverage/coverage.rbs +62 -0
  148. data/vendor/ruby-signature/stdlib/csv/csv.rbs +773 -0
  149. data/vendor/ruby-signature/stdlib/erb/erb.rbs +375 -1
  150. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -4
  151. data/vendor/ruby-signature/stdlib/ipaddr/ipaddr.rbs +247 -0
  152. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +1088 -16
  153. data/vendor/ruby-signature/stdlib/set/set.rbs +251 -27
  154. metadata +49 -44
  155. data/exe/ruby-signature +0 -3
  156. data/vendor/ruby-signature/exe/ruby-signature +0 -7
  157. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +0 -29
  158. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +0 -29
  159. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +0 -391
  160. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +0 -364
  161. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +0 -52
  162. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +0 -54
  163. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +0 -555
  164. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +0 -28
  165. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +0 -152
  166. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +0 -172
  167. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +0 -921
  168. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +0 -283
  169. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +0 -138
  170. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +0 -126
  171. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +0 -189
  172. data/vendor/ruby-signature/lib/ruby/signature/location.rb +0 -104
  173. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +0 -125
  174. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +0 -93
  175. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +0 -444
  176. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +0 -579
  177. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +0 -383
  178. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +0 -48
  179. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +0 -63
  180. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +0 -290
  181. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +0 -327
  182. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +0 -185
  183. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +0 -256
  184. data/vendor/ruby-signature/lib/ruby/signature/test.rb +0 -28
  185. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +0 -72
  186. data/vendor/ruby-signature/lib/ruby/signature/types.rb +0 -932
  187. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +0 -140
  188. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +0 -49
  189. data/vendor/ruby-signature/lib/ruby/signature/version.rb +0 -5
  190. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +0 -271
@@ -1,921 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class DefinitionBuilder
4
- attr_reader :env
5
- attr_reader :instance_cache
6
- attr_reader :singleton_cache
7
-
8
- def initialize(env:)
9
- @env = env
10
- @instance_cache = {}
11
- @singleton_cache = {}
12
- end
13
-
14
- def build_ancestors(self_ancestor, ancestors: [], building_ancestors: [], location: nil)
15
- decl = env.find_class(self_ancestor.name)
16
- namespace = self_ancestor.name.absolute!.to_namespace
17
-
18
- RecursiveAncestorError.check!(self_ancestor,
19
- ancestors: building_ancestors,
20
- location: location || decl.location)
21
- building_ancestors.push self_ancestor
22
-
23
- case self_ancestor
24
- when Definition::Ancestor::Instance
25
- args = self_ancestor.args
26
- param_names = decl.type_params.each.map(&:name)
27
-
28
- InvalidTypeApplicationError.check!(
29
- type_name: self_ancestor.name,
30
- args: args,
31
- params: decl.type_params,
32
- location: location || decl.location
33
- )
34
-
35
- sub = Substitution.build(param_names, args)
36
-
37
- case decl
38
- when AST::Declarations::Class
39
- unless self_ancestor.name == BuiltinNames::BasicObject.name
40
- super_ancestor = decl.super_class&.yield_self do |super_class|
41
- Definition::Ancestor::Instance.new(
42
- name: absolute_type_name(super_class.name, namespace: namespace, location: location || decl.location),
43
- args: super_class.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
44
- )
45
- end || Definition::Ancestor::Instance.new(name: BuiltinNames::Object.name, args: [])
46
-
47
- build_ancestors(super_ancestor, ancestors: ancestors, building_ancestors: building_ancestors)
48
- end
49
- end
50
-
51
- decl.members.each do |member|
52
- case member
53
- when AST::Members::Include
54
- if member.name.class?
55
- ancestor = Definition::Ancestor::Instance.new(
56
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
57
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
58
- )
59
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
60
- end
61
- end
62
- end
63
-
64
- ancestors.unshift(self_ancestor)
65
-
66
- env.each_extension(self_ancestor.name).sort_by {|e| e.extension_name.to_s }.each do |extension|
67
- InvalidExtensionParameterError.check!(
68
- type_name: self_ancestor.name,
69
- extension_name: extension.extension_name,
70
- extension_params: extension.type_params,
71
- class_params: self_ancestor.args.map(&:name),
72
- location: extension.location
73
- )
74
-
75
- sub = Substitution.build(extension.type_params, self_ancestor.args)
76
-
77
- extension.members.each do |member|
78
- case member
79
- when AST::Members::Include
80
- if member.name.class?
81
- ancestor = Definition::Ancestor::Instance.new(
82
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
83
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
84
- )
85
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
86
- end
87
- end
88
- end
89
-
90
- extension_ancestor = Definition::Ancestor::ExtensionInstance.new(
91
- name: extension.name.absolute!,
92
- extension_name: extension.extension_name,
93
- args: self_ancestor.args,
94
- )
95
- ancestors.unshift(extension_ancestor)
96
-
97
- extension.members.each do |member|
98
- case member
99
- when AST::Members::Prepend
100
- if member.name.class?
101
- ancestor = Definition::Ancestor::Instance.new(
102
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
103
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
104
- )
105
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
106
- end
107
- end
108
- end
109
- end
110
-
111
- decl.members.each do |member|
112
- case member
113
- when AST::Members::Prepend
114
- ancestor = Definition::Ancestor::Instance.new(
115
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
116
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
117
- )
118
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
119
- end
120
- end
121
- when Definition::Ancestor::Singleton
122
- case decl
123
- when AST::Declarations::Class
124
- if self_ancestor.name == BuiltinNames::BasicObject.name
125
- class_ancestor = Definition::Ancestor::Instance.new(
126
- name: BuiltinNames::Class.name,
127
- args: []
128
- )
129
- build_ancestors class_ancestor, ancestors: ancestors, building_ancestors: building_ancestors
130
- else
131
- super_ancestor = decl.super_class&.yield_self do |super_class|
132
- Definition::Ancestor::Singleton.new(
133
- name: absolute_type_name(super_class.name, namespace: namespace, location: location || decl.location)
134
- )
135
- end || Definition::Ancestor::Singleton.new(name: BuiltinNames::Object.name)
136
-
137
- build_ancestors(super_ancestor, ancestors: ancestors, building_ancestors: building_ancestors)
138
- end
139
- when AST::Declarations::Module
140
- module_ancestor = Definition::Ancestor::Instance.new(
141
- name: BuiltinNames::Module.name,
142
- args: []
143
- )
144
- build_ancestors module_ancestor, ancestors: ancestors, building_ancestors: building_ancestors
145
- end
146
-
147
- decl.members.each do |member|
148
- case member
149
- when AST::Members::Extend
150
- if member.name.class?
151
- ancestor = Definition::Ancestor::Instance.new(
152
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
153
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
154
- )
155
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
156
- end
157
- end
158
- end
159
-
160
- ancestors.unshift(self_ancestor)
161
-
162
- env.each_extension(self_ancestor.name).sort_by {|e| e.extension_name.to_s }.each do |extension|
163
- extension.members.each do |member|
164
- case member
165
- when AST::Members::Extend
166
- if member.name.class?
167
- ancestor = Definition::Ancestor::Instance.new(
168
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
169
- args: member.args.map {|ty| absolute_type(ty, namespace: namespace) }
170
- )
171
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
172
- end
173
- end
174
- end
175
-
176
- extension_ancestor = Definition::Ancestor::ExtensionSingleton.new(
177
- name: extension.name.absolute!,
178
- extension_name: extension.extension_name
179
- )
180
- ancestors.unshift(extension_ancestor)
181
- end
182
- end
183
-
184
- building_ancestors.pop
185
-
186
- ancestors
187
- end
188
-
189
- def each_member_with_accessibility(members, accessibility: :public)
190
- members.each do |member|
191
- case member
192
- when AST::Members::Public
193
- accessibility = :public
194
- when AST::Members::Private
195
- accessibility = :private
196
- else
197
- yield member, accessibility
198
- end
199
- end
200
- end
201
-
202
- def build_instance(type_name)
203
- try_cache type_name, cache: instance_cache do
204
- decl = env.find_class(type_name)
205
- self_ancestor = Definition::Ancestor::Instance.new(name: type_name,
206
- args: Types::Variable.build(decl.type_params.each.map(&:name)))
207
- self_type = Types::ClassInstance.new(name: type_name, args: self_ancestor.args, location: nil)
208
-
209
- case decl
210
- when AST::Declarations::Class, AST::Declarations::Module
211
- ancestors = build_ancestors(self_ancestor)
212
- definition_pairs = ancestors.map do |ancestor|
213
- case ancestor
214
- when Definition::Ancestor::Instance
215
- [ancestor, build_one_instance(ancestor.name)]
216
- when Definition::Ancestor::Singleton
217
- [ancestor, build_one_singleton(ancestor.name)]
218
- when Definition::Ancestor::ExtensionInstance
219
- [ancestor, build_one_instance(ancestor.name, extension_name: ancestor.extension_name)]
220
- when Definition::Ancestor::ExtensionSingleton
221
- [ancestor, build_one_extension_singleton(ancestor.name, extension_name: ancestor.extension_name)]
222
- end
223
- end
224
-
225
- if decl.is_a?(AST::Declarations::Module)
226
- if decl.self_type
227
- self_interface = absolute_type(decl.self_type, namespace: type_name.to_namespace)
228
- ancestor = Definition::Ancestor::Instance.new(name: self_interface.name,
229
- args: self_interface.args)
230
-
231
- definition_pairs.push [ancestor, build_one_instance(ancestor.name)]
232
- end
233
- end
234
-
235
- merge_definitions(definition_pairs, decl: decl, self_type: self_type, ancestors: ancestors)
236
- end
237
- end
238
- end
239
-
240
- def build_singleton(type_name)
241
- try_cache type_name, cache: singleton_cache do
242
- decl = env.find_class(type_name)
243
- self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
244
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
245
-
246
- case decl
247
- when AST::Declarations::Class, AST::Declarations::Module
248
- ancestors = build_ancestors(self_ancestor)
249
- definition_pairs = ancestors.map do |ancestor|
250
- case ancestor
251
- when Definition::Ancestor::Instance
252
- [ancestor, build_one_instance(ancestor.name)]
253
- when Definition::Ancestor::Singleton
254
- [ancestor, build_one_singleton(ancestor.name)]
255
- when Definition::Ancestor::ExtensionInstance
256
- [ancestor, build_one_instance(ancestor.name, extension_name: ancestor.extension_name)]
257
- when Definition::Ancestor::ExtensionSingleton
258
- [ancestor, build_one_singleton(ancestor.name, extension_name: ancestor.extension_name)]
259
- end
260
- end
261
-
262
- if decl.is_a?(AST::Declarations::Class)
263
- definition_pairs.find {|ancestor, _| ancestor == self_ancestor }.tap do |_, definition|
264
- unless definition.methods[:new]&.implemented_in == decl
265
- instance_definition = build_instance(type_name)
266
- class_params = decl.type_params.each.map(&:name)
267
- initialize_method = instance_definition.methods[:initialize]
268
- method_types = initialize_method.method_types.map do |method_type|
269
- case method_type
270
- when MethodType
271
- fvs = method_type.free_variables + class_params
272
- unless fvs.empty?
273
- param_name_set = Set.new(class_params)
274
- bound_variables = method_type.type_params
275
- renamed_types = bound_variables.map do |x|
276
- if param_name_set.member?(x)
277
- Types::Variable.fresh(x)
278
- else
279
- Types::Variable.new(name: x, location: nil)
280
- end
281
- end
282
- sub = Substitution.build(bound_variables, renamed_types)
283
- method_type_params = renamed_types.unshift(*class_params)
284
- else
285
- sub = Substitution.build([], [])
286
- method_type_params = method_type.type_params
287
- end
288
-
289
- MethodType.new(
290
- type_params: method_type_params,
291
- type: method_type.type.sub(sub).with_return_type(instance_definition.self_type),
292
- block: method_type.block&.yield_self {|ty| ty.sub(sub) },
293
- location: method_type.location
294
- )
295
- end
296
- end.compact
297
-
298
- definition.methods[:new] = Definition::Method.new(
299
- super_method: nil,
300
- defined_in: nil,
301
- implemented_in: env.find_class(Ruby::Signature::BuiltinNames::Class.name),
302
- method_types: method_types,
303
- accessibility: :public,
304
- attributes: [:incompatible],
305
- annotations: [],
306
- comment: nil
307
- )
308
- end
309
- end
310
- end
311
-
312
- merge_definitions(definition_pairs, decl: decl, self_type: self_type, ancestors: ancestors)
313
- end
314
- end
315
- end
316
-
317
- def build_one_instance(type_name, extension_name: nil)
318
- decl = if extension_name
319
- env.each_extension(type_name).find {|ext| ext.extension_name == extension_name } or
320
- raise "Unknown extension: #{type_name} (#{extension_name})"
321
- else
322
- env.find_class(type_name)
323
- end
324
-
325
- case decl
326
- when AST::Declarations::Interface
327
- build_interface type_name, decl
328
- else
329
- namespace = type_name.to_namespace
330
-
331
- case decl
332
- when AST::Declarations::Class, AST::Declarations::Module
333
- self_type = Types::ClassInstance.new(name: type_name,
334
- args: Types::Variable.build(decl.type_params.each.map(&:name)),
335
- location: nil)
336
- ancestors = [Definition::Ancestor::Instance.new(name: type_name, args: self_type.args)]
337
- when AST::Declarations::Extension
338
- self_type = Types::ClassInstance.new(name: type_name, args: Types::Variable.build(decl.type_params), location: nil)
339
- ancestors = [Definition::Ancestor::ExtensionInstance.new(name: type_name,
340
- extension_name: extension_name,
341
- args: self_type.args)]
342
- end
343
-
344
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
345
- alias_members = []
346
-
347
- each_member_with_accessibility(decl.members) do |member, accessibility|
348
- case member
349
- when AST::Members::MethodDefinition
350
- if member.instance?
351
- name = member.name
352
- method_types = member.types.map do |method_type|
353
- case method_type
354
- when MethodType
355
- method_type.map_type do |type|
356
- absolute_type(type, namespace: namespace)
357
- end
358
- when :super
359
- :super
360
- end
361
- end
362
-
363
- DuplicatedMethodDefinitionError.check!(
364
- decl: decl,
365
- methods: definition.methods,
366
- name: name,
367
- location: member.location
368
- )
369
-
370
- attrs = if name == :initialize
371
- (member.attributes + [:incompatible]).uniq
372
- else
373
- member.attributes
374
- end
375
-
376
- definition.methods[name] = Definition::Method.new(super_method: nil,
377
- method_types: method_types,
378
- defined_in: decl,
379
- implemented_in: decl,
380
- accessibility: accessibility,
381
- attributes: attrs,
382
- annotations: member.annotations,
383
- comment: member.comment)
384
- end
385
- when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
386
- name = member.name
387
- type = absolute_type(member.type, namespace: namespace)
388
- ivar_name = case member.ivar_name
389
- when false
390
- nil
391
- else
392
- member.ivar_name || :"@#{member.name}"
393
- end
394
-
395
- if member.is_a?(AST::Members::AttrReader) || member.is_a?(AST::Members::AttrAccessor)
396
- definition.methods[name] = Definition::Method.new(
397
- super_method: nil,
398
- method_types: [
399
- MethodType.new(
400
- type_params: [],
401
- type: Types::Function.empty(type),
402
- block: nil,
403
- location: nil
404
- )
405
- ],
406
- defined_in: decl,
407
- implemented_in: decl,
408
- accessibility: accessibility,
409
- attributes: [],
410
- annotations: member.annotations,
411
- comment: member.comment
412
- )
413
- end
414
-
415
- if member.is_a?(AST::Members::AttrWriter) || member.is_a?(AST::Members::AttrAccessor)
416
- definition.methods[:"#{name}="] = Definition::Method.new(
417
- super_method: nil,
418
- method_types: [
419
- MethodType.new(
420
- type_params: [],
421
- type: Types::Function.new(required_positionals: [Types::Function::Param.new(name: name, type: type)],
422
- optional_positionals: [],
423
- rest_positionals: nil,
424
- trailing_positionals: [],
425
- required_keywords: {},
426
- optional_keywords: {},
427
- rest_keywords: nil,
428
- return_type: type),
429
- block: nil,
430
- location: nil
431
- )
432
- ],
433
- defined_in: decl,
434
- implemented_in: decl,
435
- accessibility: accessibility,
436
- attributes: [],
437
- annotations: member.annotations,
438
- comment: member.comment
439
- )
440
- end
441
-
442
- if ivar_name
443
- definition.instance_variables[ivar_name] = Definition::Variable.new(
444
- parent_variable: nil,
445
- type: type,
446
- declared_in: decl
447
- )
448
- end
449
-
450
- when AST::Members::Alias
451
- if member.instance?
452
- alias_members << member
453
- end
454
- when AST::Members::Include
455
- if member.name.interface?
456
- absolute_name = absolute_type_name(member.name, namespace: namespace, location: member.location)
457
- interface_definition = build_one_instance(absolute_name)
458
- absolute_args = member.args.map {|ty| absolute_type(ty, namespace: namespace) }
459
-
460
- InvalidTypeApplicationError.check!(
461
- type_name: absolute_name,
462
- args: absolute_args,
463
- params: interface_definition.type_params_decl,
464
- location: member.location
465
- )
466
-
467
- sub = Substitution.build(interface_definition.type_params, absolute_args)
468
- interface_definition.methods.each do |name, method|
469
- method_types = method.method_types.map do |method_type|
470
- method_type.sub(sub).map_type do |type|
471
- absolute_type(type, namespace: namespace)
472
- end
473
- end
474
-
475
- DuplicatedMethodDefinitionError.check!(
476
- decl: decl,
477
- methods: definition.methods,
478
- name: name,
479
- location: member.location
480
- )
481
-
482
- definition.methods[name] = Definition::Method.new(
483
- super_method: nil,
484
- method_types: method_types,
485
- defined_in: method.defined_in,
486
- implemented_in: decl,
487
- accessibility: method.accessibility,
488
- attributes: [],
489
- annotations: method.annotations,
490
- comment: member.comment
491
- )
492
- end
493
- end
494
- when AST::Members::InstanceVariable
495
- definition.instance_variables[member.name] = Definition::Variable.new(
496
- type: absolute_type(member.type, namespace: namespace),
497
- parent_variable: nil,
498
- declared_in: decl
499
- )
500
- when AST::Members::ClassVariable
501
- definition.class_variables[member.name] = Definition::Variable.new(
502
- type: absolute_type(member.type, namespace: namespace),
503
- parent_variable: nil,
504
- declared_in: decl
505
- )
506
- end
507
- end
508
-
509
- alias_members.each do |member|
510
- UnknownMethodAliasError.check!(
511
- methods: definition.methods,
512
- original_name: member.old_name,
513
- aliased_name: member.new_name,
514
- location: member.location
515
- )
516
-
517
- DuplicatedMethodDefinitionError.check!(
518
- decl: decl,
519
- methods: definition.methods,
520
- name: member.new_name,
521
- location: member.location
522
- )
523
-
524
- # FIXME: may cause a problem if #old_name has super type
525
- definition.methods[member.new_name] = definition.methods[member.old_name]
526
- end
527
-
528
- validate_parameter_variance(
529
- decl: decl,
530
- methods: definition.methods
531
- )
532
- end
533
- end
534
- end
535
-
536
- def validate_params_with(type_params, result:)
537
- type_params.each do |param|
538
- unless param.skip_validation
539
- unless result.compatible?(param.name, with_annotation: param.variance)
540
- yield param
541
- end
542
- end
543
- end
544
- end
545
-
546
- def validate_parameter_variance(decl:, methods:)
547
- type_params = case decl
548
- when AST::Declarations::Extension
549
- env.find_class(decl.name.absolute!).type_params.rename_to(decl.type_params)
550
- else
551
- decl.type_params
552
- end
553
-
554
- namespace = decl.name.absolute!.to_namespace
555
- calculator = VarianceCalculator.new(builder: self)
556
- param_names = type_params.each.map(&:name)
557
-
558
- errors = []
559
-
560
- if decl.is_a?(AST::Declarations::Class)
561
- if decl.super_class
562
- absolute_super_name = absolute_type_name(decl.super_class.name, namespace: namespace, location: decl.location)
563
- absolute_args = decl.super_class.args.map {|type| absolute_type(type, namespace: namespace) }
564
- result = calculator.in_inherit(name: absolute_super_name, args: absolute_args, variables: param_names)
565
-
566
- validate_params_with type_params, result: result do |param|
567
- errors.push InvalidVarianceAnnotationError::InheritanceError.new(
568
- param: param
569
- )
570
- end
571
- end
572
- end
573
-
574
- decl.members.each do |member|
575
- case member
576
- when AST::Members::Include
577
- if member.name.class?
578
- absolute_module_name = absolute_type_name(member.name, namespace: namespace, location: decl.location)
579
- absolute_args = member.args.map {|type| absolute_type(type, namespace: namespace) }
580
- result = calculator.in_inherit(name: absolute_module_name, args: absolute_args, variables: param_names)
581
-
582
- validate_params_with type_params, result: result do |param|
583
- errors.push InvalidVarianceAnnotationError::MixinError.new(
584
- include_member: member,
585
- param: param
586
- )
587
- end
588
- end
589
- end
590
- end
591
-
592
- methods.each do |name, method|
593
- method.method_types.each do |method_type|
594
- case method_type
595
- when MethodType
596
- result = calculator.in_method_type(method_type: method_type, variables: param_names)
597
-
598
- validate_params_with type_params, result: result do |param|
599
- errors.push InvalidVarianceAnnotationError::MethodTypeError.new(
600
- method_name: name,
601
- method_type: method_type,
602
- param: param
603
- )
604
- end
605
- end
606
- end
607
- end
608
-
609
- unless errors.empty?
610
- raise InvalidVarianceAnnotationError.new(decl: decl, errors: errors)
611
- end
612
- end
613
-
614
- def build_one_singleton(type_name, extension_name: nil)
615
- decl = if extension_name
616
- env.each_extension(type_name).find {|ext| ext.extension_name == extension_name } or
617
- raise "Unknown extension: #{type_name} (#{extension_name})"
618
- else
619
- env.find_class(type_name)
620
- end
621
-
622
- namespace = type_name.to_namespace
623
-
624
- case decl
625
- when AST::Declarations::Module, AST::Declarations::Class
626
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
627
- ancestors = [Definition::Ancestor::Singleton.new(name: type_name)]
628
- when AST::Declarations::Extension
629
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
630
- ancestors = [Definition::Ancestor::ExtensionSingleton.new(name: type_name, extension_name: extension_name)]
631
- end
632
-
633
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
634
- alias_members = []
635
-
636
- each_member_with_accessibility(decl.members) do |member, accessibility|
637
- case member
638
- when AST::Members::MethodDefinition
639
- if member.singleton?
640
- name = member.name
641
- method_types = member.types.map do |method_type|
642
- method_type.map_type do |type|
643
- absolute_type(type, namespace: namespace)
644
- end
645
- end
646
-
647
- DuplicatedMethodDefinitionError.check!(
648
- decl: decl,
649
- methods: definition.methods,
650
- name: name,
651
- location: member.location
652
- )
653
-
654
- definition.methods[name] = Definition::Method.new(super_method: nil,
655
- method_types: method_types,
656
- defined_in: decl,
657
- implemented_in: decl,
658
- accessibility: accessibility,
659
- attributes: member.attributes,
660
- annotations: member.annotations,
661
- comment: member.comment)
662
- end
663
- when AST::Members::Alias
664
- if member.singleton?
665
- alias_members << member
666
- end
667
- when AST::Members::Extend
668
- if member.name.interface?
669
- absolute_name = absolute_type_name(member.name, namespace: namespace, location: member.location)
670
- interface_definition = build_one_instance(absolute_name)
671
- absolute_args = member.args.map {|ty| absolute_type(ty, namespace: namespace) }
672
-
673
- InvalidTypeApplicationError.check!(
674
- type_name: absolute_name,
675
- args: absolute_args,
676
- params: interface_definition.type_params_decl,
677
- location: member.location
678
- )
679
-
680
- sub = Substitution.build(interface_definition.type_params, absolute_args)
681
- interface_definition.methods.each do |name, method|
682
- method_types = method.method_types.map do |method_type|
683
- method_type.sub(sub).map_type do |type|
684
- absolute_type(type, namespace: namespace)
685
- end
686
- end
687
-
688
- DuplicatedMethodDefinitionError.check!(
689
- decl: decl,
690
- methods: definition.methods,
691
- name: name,
692
- location: member.location
693
- )
694
-
695
- definition.methods[name] = Definition::Method.new(
696
- super_method: nil,
697
- method_types: method_types,
698
- defined_in: method.defined_in,
699
- implemented_in: decl,
700
- accessibility: method.accessibility,
701
- attributes: method.attributes,
702
- annotations: method.annotations,
703
- comment: member.comment
704
- )
705
- end
706
- end
707
- when AST::Members::ClassInstanceVariable
708
- definition.instance_variables[member.name] = Definition::Variable.new(
709
- type: absolute_type(member.type, namespace: namespace),
710
- parent_variable: nil,
711
- declared_in: decl
712
- )
713
- when AST::Members::ClassVariable
714
- definition.class_variables[member.name] = Definition::Variable.new(
715
- type: absolute_type(member.type, namespace: namespace),
716
- parent_variable: nil,
717
- declared_in: decl
718
- )
719
- end
720
- end
721
-
722
- alias_members.each do |member|
723
- UnknownMethodAliasError.check!(
724
- methods: definition.methods,
725
- original_name: member.old_name,
726
- aliased_name: member.new_name,
727
- location: member.location
728
- )
729
-
730
- DuplicatedMethodDefinitionError.check!(
731
- decl: decl,
732
- methods: definition.methods,
733
- name: member.new_name,
734
- location: member.location
735
- )
736
-
737
- # FIXME: may cause a problem if #old_name has super type
738
- definition.methods[member.new_name] = definition.methods[member.old_name]
739
- end
740
- end
741
- end
742
-
743
- def merge_definitions(pairs, decl:, self_type:, ancestors:)
744
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
745
- pairs.reverse_each do |(ancestor, current_definition)|
746
- sub = case ancestor
747
- when Definition::Ancestor::Instance, Definition::Ancestor::ExtensionInstance
748
- Substitution.build(current_definition.type_params, ancestor.args)
749
- when Definition::Ancestor::Singleton, Definition::Ancestor::ExtensionSingleton
750
- Substitution.build([], [])
751
- end
752
- namespace = current_definition.name.absolute!.to_namespace
753
-
754
- current_definition.methods.each do |name, method|
755
- merge_method definition.methods, name, method, sub, namespace
756
- end
757
-
758
- current_definition.instance_variables.each do |name, variable|
759
- merge_variable definition.instance_variables, name, variable
760
- end
761
-
762
- current_definition.class_variables.each do |name, variable|
763
- merge_variable definition.class_variables, name, variable
764
- end
765
- end
766
- end
767
- end
768
-
769
- def merge_variable(variables, name, variable)
770
- super_variable = variables[name]
771
-
772
- variables[name] = Definition::Variable.new(
773
- parent_variable: super_variable,
774
- type: variable.type,
775
- declared_in: variable.declared_in
776
- )
777
- end
778
-
779
- def merge_method(methods, name, method, sub, namespace)
780
- super_method = methods[name]
781
-
782
- methods[name] = Definition::Method.new(
783
- method_types: method.method_types.flat_map do |method_type|
784
- case method_type
785
- when MethodType
786
- [absolute_type(method_type.sub(sub), namespace: namespace)]
787
- when :super
788
- super_method.method_types
789
- end
790
- end,
791
- super_method: super_method,
792
- defined_in: method.defined_in,
793
- implemented_in: method.implemented_in,
794
- accessibility: method.accessibility,
795
- attributes: method.attributes,
796
- annotations: method.annotations,
797
- comment: method.comment
798
- )
799
- end
800
-
801
- def try_cache(type_name, cache:)
802
- cached = cache[type_name]
803
-
804
- case cached
805
- when Definition
806
- cached
807
- when false
808
- raise
809
- when nil
810
- cache[type_name] = false
811
- begin
812
- cache[type_name] = yield
813
- rescue => ex
814
- cache[type_name] = nil
815
- raise ex
816
- end
817
- end
818
- end
819
-
820
- def build_interface(type_name, declaration)
821
- self_type = Types::Interface.new(
822
- name: type_name,
823
- args: declaration.type_params.each.map {|p| Types::Variable.new(name: p.name, location: nil) },
824
- location: nil
825
- )
826
-
827
- namespace = type_name.to_namespace
828
-
829
- Definition.new(declaration: declaration, self_type: self_type, ancestors: []).tap do |definition|
830
- alias_members = []
831
-
832
- declaration.members.each do |member|
833
- case member
834
- when AST::Members::Include
835
- mixin_name = env.absolute_interface_name(member.name, namespace: namespace) || member.name.absolute!
836
- mixin = build_one_instance(mixin_name)
837
-
838
- args = member.args.map {|type| absolute_type(type, namespace: namespace) }
839
- type_params = mixin.declaration.type_params
840
-
841
- InvalidTypeApplicationError.check!(
842
- type_name: type_name,
843
- args: args,
844
- params: type_params,
845
- location: member.location
846
- )
847
-
848
- sub = Substitution.build(type_params.each.map(&:name), args)
849
- mixin.methods.each do |name, method|
850
- definition.methods[name] = method.sub(sub)
851
- end
852
- end
853
- end
854
-
855
- declaration.members.each do |member|
856
- case member
857
- when AST::Members::MethodDefinition
858
- DuplicatedMethodDefinitionError.check!(
859
- decl: declaration,
860
- methods: definition.methods,
861
- name: member.name,
862
- location: member.location
863
- )
864
-
865
- method = Definition::Method.new(
866
- super_method: nil,
867
- method_types: member.types.map do |method_type|
868
- method_type.map_type {|ty| absolute_type(ty, namespace: namespace) }
869
- end,
870
- defined_in: declaration,
871
- implemented_in: nil,
872
- accessibility: :public,
873
- attributes: member.attributes,
874
- annotations: member.annotations,
875
- comment: member.comment
876
- )
877
- definition.methods[member.name] = method
878
- when AST::Members::Alias
879
- alias_members << member
880
- end
881
- end
882
-
883
- alias_members.each do |member|
884
- UnknownMethodAliasError.check!(
885
- methods: definition.methods,
886
- original_name: member.old_name,
887
- aliased_name: member.new_name,
888
- location: member.location
889
- )
890
-
891
- DuplicatedMethodDefinitionError.check!(
892
- decl: declaration,
893
- methods: definition.methods,
894
- name: member.new_name,
895
- location: member.location
896
- )
897
-
898
- # FIXME: may cause a problem if #old_name has super type
899
- definition.methods[member.new_name] = definition.methods[member.old_name]
900
- end
901
- end
902
- end
903
-
904
- def absolute_type(type, namespace:)
905
- env.absolute_type(type, namespace: namespace) do |type|
906
- NoTypeFoundError.check!(type.name.absolute!, env: env, location: type.location)
907
- end
908
- end
909
-
910
- def absolute_type_name(type_name, namespace:, location:)
911
- env.absolute_type_name(type_name, namespace: namespace) do |type_name|
912
- NoTypeFoundError.check!(type_name.absolute!, env: env, location: location)
913
- end
914
- end
915
-
916
- def expand_alias(type_name)
917
- absolute_type(env.find_alias(type_name).type, namespace: type_name.namespace)
918
- end
919
- end
920
- end
921
- end