rbs 3.10.4 → 4.0.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 (267) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +7 -5
  5. data/.github/workflows/comments.yml +2 -2
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +16 -26
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +1 -1
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +2 -2
  12. data/.vscode/extensions.json +5 -0
  13. data/.vscode/settings.json +19 -0
  14. data/CHANGELOG.md +202 -2
  15. data/Rakefile +9 -23
  16. data/Steepfile +2 -0
  17. data/config.yml +457 -13
  18. data/core/array.rbs +218 -188
  19. data/core/basic_object.rbs +9 -8
  20. data/core/binding.rbs +0 -2
  21. data/core/builtin.rbs +2 -2
  22. data/core/class.rbs +6 -5
  23. data/core/comparable.rbs +45 -31
  24. data/core/complex.rbs +66 -55
  25. data/core/dir.rbs +57 -45
  26. data/core/encoding.rbs +6 -6
  27. data/core/enumerable.rbs +105 -91
  28. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  29. data/core/enumerator.rbs +24 -3
  30. data/core/errno.rbs +3 -2
  31. data/core/errors.rbs +31 -29
  32. data/core/exception.rbs +12 -12
  33. data/core/fiber.rbs +47 -36
  34. data/core/file.rbs +242 -169
  35. data/core/file_test.rbs +2 -2
  36. data/core/float.rbs +42 -68
  37. data/core/gc.rbs +78 -70
  38. data/core/hash.rbs +70 -60
  39. data/core/integer.rbs +32 -75
  40. data/core/io/buffer.rbs +36 -36
  41. data/core/io/wait.rbs +7 -7
  42. data/core/io.rbs +192 -146
  43. data/core/kernel.rbs +198 -147
  44. data/core/marshal.rbs +3 -3
  45. data/core/match_data.rbs +14 -12
  46. data/core/math.rbs +69 -67
  47. data/core/method.rbs +6 -8
  48. data/core/module.rbs +148 -88
  49. data/core/nil_class.rbs +4 -3
  50. data/core/numeric.rbs +53 -50
  51. data/core/object.rbs +6 -8
  52. data/core/object_space.rbs +11 -10
  53. data/core/pathname.rbs +131 -81
  54. data/core/proc.rbs +65 -34
  55. data/core/process.rbs +221 -201
  56. data/core/ractor.rbs +15 -11
  57. data/core/random.rbs +21 -3
  58. data/core/range.rbs +152 -49
  59. data/core/rational.rbs +5 -56
  60. data/core/rbs/unnamed/argf.rbs +58 -51
  61. data/core/rbs/unnamed/env_class.rbs +18 -13
  62. data/core/rbs/unnamed/main_class.rbs +123 -0
  63. data/core/rbs/unnamed/random.rbs +7 -116
  64. data/core/regexp.rbs +236 -197
  65. data/core/ruby.rbs +1 -1
  66. data/core/ruby_vm.rbs +32 -30
  67. data/core/rubygems/config_file.rbs +5 -5
  68. data/core/rubygems/errors.rbs +1 -1
  69. data/core/rubygems/requirement.rbs +5 -5
  70. data/core/rubygems/rubygems.rbs +5 -3
  71. data/core/set.rbs +17 -16
  72. data/core/signal.rbs +2 -2
  73. data/core/string.rbs +318 -298
  74. data/core/struct.rbs +26 -25
  75. data/core/symbol.rbs +25 -24
  76. data/core/thread.rbs +40 -41
  77. data/core/time.rbs +47 -42
  78. data/core/trace_point.rbs +34 -31
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +10 -10
  81. data/core/warning.rbs +7 -7
  82. data/docs/collection.md +1 -1
  83. data/docs/config.md +171 -0
  84. data/docs/inline.md +576 -0
  85. data/docs/syntax.md +46 -16
  86. data/docs/type_fingerprint.md +21 -0
  87. data/exe/rbs +1 -1
  88. data/ext/rbs_extension/ast_translation.c +595 -98
  89. data/ext/rbs_extension/class_constants.c +30 -0
  90. data/ext/rbs_extension/class_constants.h +15 -0
  91. data/ext/rbs_extension/legacy_location.c +30 -53
  92. data/ext/rbs_extension/legacy_location.h +37 -0
  93. data/ext/rbs_extension/main.c +125 -24
  94. data/include/rbs/ast.h +485 -150
  95. data/include/rbs/lexer.h +11 -4
  96. data/include/rbs/location.h +25 -44
  97. data/include/rbs/parser.h +20 -2
  98. data/include/rbs/util/rbs_constant_pool.h +0 -3
  99. data/include/rbs.h +8 -0
  100. data/lib/rbs/ast/annotation.rb +1 -1
  101. data/lib/rbs/ast/comment.rb +1 -1
  102. data/lib/rbs/ast/declarations.rb +10 -10
  103. data/lib/rbs/ast/members.rb +14 -14
  104. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  105. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  106. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  107. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  108. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  109. data/lib/rbs/ast/ruby/members.rb +723 -0
  110. data/lib/rbs/ast/type_param.rb +24 -4
  111. data/lib/rbs/buffer.rb +105 -20
  112. data/lib/rbs/cli/diff.rb +16 -15
  113. data/lib/rbs/cli/validate.rb +62 -125
  114. data/lib/rbs/cli.rb +55 -23
  115. data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
  116. data/lib/rbs/collection/sources/git.rb +1 -0
  117. data/lib/rbs/collection.rb +0 -1
  118. data/lib/rbs/definition.rb +6 -1
  119. data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
  120. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  121. data/lib/rbs/definition_builder.rb +177 -20
  122. data/lib/rbs/diff.rb +7 -1
  123. data/lib/rbs/environment/class_entry.rb +69 -0
  124. data/lib/rbs/environment/module_entry.rb +66 -0
  125. data/lib/rbs/environment.rb +338 -155
  126. data/lib/rbs/environment_loader.rb +2 -2
  127. data/lib/rbs/errors.rb +30 -20
  128. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  129. data/lib/rbs/inline_parser.rb +542 -0
  130. data/lib/rbs/location_aux.rb +36 -4
  131. data/lib/rbs/locator.rb +5 -1
  132. data/lib/rbs/method_type.rb +5 -3
  133. data/lib/rbs/namespace.rb +0 -7
  134. data/lib/rbs/parser_aux.rb +31 -8
  135. data/lib/rbs/prototype/helpers.rb +57 -0
  136. data/lib/rbs/prototype/rb.rb +3 -28
  137. data/lib/rbs/prototype/rbi.rb +3 -20
  138. data/lib/rbs/prototype/runtime.rb +10 -2
  139. data/lib/rbs/resolver/type_name_resolver.rb +0 -8
  140. data/lib/rbs/source.rb +99 -0
  141. data/lib/rbs/subtractor.rb +4 -3
  142. data/lib/rbs/test/type_check.rb +5 -2
  143. data/lib/rbs/type_name.rb +1 -8
  144. data/lib/rbs/types.rb +88 -78
  145. data/lib/rbs/unit_test/convertibles.rb +1 -0
  146. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  147. data/lib/rbs/validator.rb +2 -2
  148. data/lib/rbs/version.rb +1 -1
  149. data/lib/rbs.rb +12 -1
  150. data/rbs.gemspec +3 -2
  151. data/rust/.gitignore +1 -0
  152. data/rust/Cargo.lock +378 -0
  153. data/rust/Cargo.toml +7 -0
  154. data/rust/ruby-rbs/Cargo.toml +22 -0
  155. data/rust/ruby-rbs/build.rs +764 -0
  156. data/rust/ruby-rbs/examples/locations.rs +60 -0
  157. data/rust/ruby-rbs/src/lib.rs +1 -0
  158. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  159. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  160. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  161. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  162. data/rust/ruby-rbs-sys/build.rs +204 -0
  163. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  164. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  165. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  166. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  167. data/schema/typeParam.json +17 -1
  168. data/sig/ancestor_builder.rbs +1 -1
  169. data/sig/ast/ruby/annotations.rbs +421 -0
  170. data/sig/ast/ruby/comment_block.rbs +127 -0
  171. data/sig/ast/ruby/declarations.rbs +158 -0
  172. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  173. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  174. data/sig/ast/ruby/members.rbs +178 -0
  175. data/sig/buffer.rbs +63 -5
  176. data/sig/cli/diff.rbs +5 -11
  177. data/sig/cli/validate.rbs +12 -8
  178. data/sig/cli.rbs +18 -18
  179. data/sig/definition.rbs +6 -0
  180. data/sig/definition_builder.rbs +3 -1
  181. data/sig/environment/class_entry.rbs +50 -0
  182. data/sig/environment/module_entry.rbs +50 -0
  183. data/sig/environment.rbs +37 -81
  184. data/sig/errors.rbs +26 -20
  185. data/sig/inline_parser/comment_association.rbs +71 -0
  186. data/sig/inline_parser.rbs +124 -0
  187. data/sig/location.rbs +32 -7
  188. data/sig/locator.rbs +0 -2
  189. data/sig/method_builder.rbs +9 -4
  190. data/sig/namespace.rbs +0 -5
  191. data/sig/parser.rbs +47 -13
  192. data/sig/prototype/helpers.rbs +2 -0
  193. data/sig/resolver/type_name_resolver.rbs +0 -3
  194. data/sig/source.rbs +48 -0
  195. data/sig/type_param.rbs +13 -8
  196. data/sig/typename.rbs +0 -5
  197. data/sig/types.rbs +6 -7
  198. data/sig/unit_test/spy.rbs +0 -8
  199. data/sig/unit_test/type_assertions.rbs +11 -0
  200. data/src/ast.c +491 -143
  201. data/src/lexer.c +1552 -1314
  202. data/src/lexer.re +7 -0
  203. data/src/lexstate.c +8 -1
  204. data/src/location.c +8 -48
  205. data/src/parser.c +1107 -409
  206. data/src/util/rbs_constant_pool.c +0 -4
  207. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
  208. data/stdlib/cgi-escape/0/escape.rbs +4 -4
  209. data/stdlib/coverage/0/coverage.rbs +4 -3
  210. data/stdlib/date/0/date.rbs +33 -28
  211. data/stdlib/date/0/date_time.rbs +24 -23
  212. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  213. data/stdlib/digest/0/digest.rbs +110 -0
  214. data/stdlib/erb/0/erb.rbs +64 -53
  215. data/stdlib/etc/0/etc.rbs +55 -50
  216. data/stdlib/fileutils/0/fileutils.rbs +140 -126
  217. data/stdlib/forwardable/0/forwardable.rbs +10 -10
  218. data/stdlib/io-console/0/io-console.rbs +2 -2
  219. data/stdlib/json/0/json.rbs +158 -131
  220. data/stdlib/monitor/0/monitor.rbs +3 -3
  221. data/stdlib/net-http/0/net-http.rbs +159 -134
  222. data/stdlib/objspace/0/objspace.rbs +8 -30
  223. data/stdlib/open-uri/0/open-uri.rbs +8 -8
  224. data/stdlib/open3/0/open3.rbs +469 -10
  225. data/stdlib/openssl/0/openssl.rbs +144 -129
  226. data/stdlib/optparse/0/optparse.rbs +23 -14
  227. data/stdlib/pathname/0/pathname.rbs +2 -2
  228. data/stdlib/pp/0/pp.rbs +9 -8
  229. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  230. data/stdlib/pstore/0/pstore.rbs +35 -30
  231. data/stdlib/psych/0/psych.rbs +62 -9
  232. data/stdlib/psych/0/store.rbs +2 -4
  233. data/stdlib/pty/0/pty.rbs +9 -6
  234. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  235. data/stdlib/rdoc/0/code_object.rbs +2 -1
  236. data/stdlib/rdoc/0/parser.rbs +1 -1
  237. data/stdlib/rdoc/0/store.rbs +1 -1
  238. data/stdlib/ripper/0/ripper.rbs +20 -17
  239. data/stdlib/securerandom/0/manifest.yaml +2 -0
  240. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  241. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  242. data/stdlib/socket/0/addrinfo.rbs +9 -9
  243. data/stdlib/socket/0/basic_socket.rbs +3 -3
  244. data/stdlib/socket/0/ip_socket.rbs +10 -8
  245. data/stdlib/socket/0/socket.rbs +10 -9
  246. data/stdlib/socket/0/tcp_server.rbs +1 -1
  247. data/stdlib/socket/0/tcp_socket.rbs +1 -1
  248. data/stdlib/socket/0/udp_socket.rbs +1 -1
  249. data/stdlib/socket/0/unix_server.rbs +1 -1
  250. data/stdlib/stringio/0/stringio.rbs +55 -54
  251. data/stdlib/strscan/0/string_scanner.rbs +46 -44
  252. data/stdlib/tempfile/0/tempfile.rbs +24 -20
  253. data/stdlib/time/0/time.rbs +7 -5
  254. data/stdlib/tsort/0/tsort.rbs +7 -6
  255. data/stdlib/uri/0/common.rbs +31 -18
  256. data/stdlib/uri/0/file.rbs +2 -2
  257. data/stdlib/uri/0/generic.rbs +9 -2
  258. data/stdlib/uri/0/http.rbs +2 -2
  259. data/stdlib/uri/0/ldap.rbs +2 -2
  260. data/stdlib/uri/0/mailto.rbs +3 -3
  261. data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
  262. data/stdlib/zlib/0/deflate.rbs +4 -3
  263. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  264. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  265. data/stdlib/zlib/0/inflate.rbs +1 -1
  266. data/stdlib/zlib/0/need_dict.rbs +1 -1
  267. metadata +66 -3
@@ -0,0 +1,723 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module AST
5
+ module Ruby
6
+ module Members
7
+ class Base
8
+ attr_reader :buffer
9
+
10
+ def initialize(buffer)
11
+ @buffer = buffer
12
+ end
13
+
14
+ include Helpers::LocationHelper
15
+ end
16
+
17
+ class MethodTypeAnnotation
18
+ class DocStyle
19
+ attr_accessor :return_type_annotation
20
+ attr_reader :required_positionals
21
+ attr_reader :optional_positionals
22
+ attr_accessor :rest_positionals
23
+ attr_reader :trailing_positionals
24
+ attr_reader :required_keywords
25
+ attr_reader :optional_keywords
26
+ attr_accessor :rest_keywords
27
+ attr_accessor :block
28
+
29
+ def initialize
30
+ @return_type_annotation = nil
31
+ @required_positionals = []
32
+ @optional_positionals = []
33
+ @rest_positionals = nil
34
+ @trailing_positionals = []
35
+ @required_keywords = {}
36
+ @optional_keywords = {}
37
+ @rest_keywords = nil
38
+ @block = nil
39
+ end
40
+
41
+ def self.build(param_type_annotations, return_type_annotation, node)
42
+ doc = DocStyle.new
43
+ doc.return_type_annotation = return_type_annotation
44
+
45
+ splat_annotation = nil #: Annotations::SplatParamTypeAnnotation?
46
+ double_splat_annotation = nil #: Annotations::DoubleSplatParamTypeAnnotation?
47
+ block_annotation = nil #: Annotations::BlockParamTypeAnnotation?
48
+ param_annotations = {} #: Hash[Symbol, Annotations::ParamTypeAnnotation]
49
+ unused = [] #: Array[Annotations::ParamTypeAnnotation | Annotations::SplatParamTypeAnnotation | Annotations::DoubleSplatParamTypeAnnotation | Annotations::BlockParamTypeAnnotation]
50
+
51
+ param_type_annotations.each do |annot|
52
+ case annot
53
+ when Annotations::SplatParamTypeAnnotation
54
+ if splat_annotation
55
+ unused << annot
56
+ else
57
+ splat_annotation = annot
58
+ end
59
+ when Annotations::DoubleSplatParamTypeAnnotation
60
+ if double_splat_annotation
61
+ unused << annot
62
+ else
63
+ double_splat_annotation = annot
64
+ end
65
+ when Annotations::BlockParamTypeAnnotation
66
+ if block_annotation
67
+ unused << annot
68
+ else
69
+ block_annotation = annot
70
+ end
71
+ when Annotations::ParamTypeAnnotation
72
+ name = annot.name_location.source.to_sym
73
+ if param_annotations.key?(name)
74
+ unused << annot
75
+ else
76
+ param_annotations[name] = annot
77
+ end
78
+ end
79
+ end
80
+
81
+ if node.parameters
82
+ params = node.parameters #: Prism::ParametersNode
83
+
84
+ params.requireds.each do |param|
85
+ if param.is_a?(Prism::RequiredParameterNode)
86
+ annotation = param_annotations.delete(param.name)
87
+ if annotation
88
+ doc.required_positionals << annotation
89
+ else
90
+ doc.required_positionals << param.name
91
+ end
92
+ end
93
+ end
94
+
95
+ params.optionals.each do |param|
96
+ if param.is_a?(Prism::OptionalParameterNode)
97
+ annotation = param_annotations.delete(param.name)
98
+ if annotation
99
+ doc.optional_positionals << annotation
100
+ else
101
+ doc.optional_positionals << param.name
102
+ end
103
+ end
104
+ end
105
+
106
+ if (rest = params.rest) && rest.is_a?(Prism::RestParameterNode)
107
+ if splat_annotation && (splat_annotation.name_location.nil? || rest.name.nil? || splat_annotation.name_location.source.to_sym == rest.name)
108
+ doc.rest_positionals = splat_annotation
109
+ splat_annotation = nil
110
+ else
111
+ doc.rest_positionals = rest.name || true
112
+ end
113
+ end
114
+
115
+ params.posts.each do |param|
116
+ if param.is_a?(Prism::RequiredParameterNode)
117
+ annotation = param_annotations.delete(param.name)
118
+ if annotation
119
+ doc.trailing_positionals << annotation
120
+ else
121
+ doc.trailing_positionals << param.name
122
+ end
123
+ end
124
+ end
125
+
126
+ params.keywords.each do |param|
127
+ case param
128
+ when Prism::RequiredKeywordParameterNode
129
+ annotation = param_annotations.delete(param.name)
130
+ if annotation
131
+ doc.required_keywords[param.name] = annotation
132
+ else
133
+ doc.required_keywords[param.name] = param.name
134
+ end
135
+ when Prism::OptionalKeywordParameterNode
136
+ annotation = param_annotations.delete(param.name)
137
+ if annotation
138
+ doc.optional_keywords[param.name] = annotation
139
+ else
140
+ doc.optional_keywords[param.name] = param.name
141
+ end
142
+ end
143
+ end
144
+
145
+ if (kw_rest = params.keyword_rest) && kw_rest.is_a?(Prism::KeywordRestParameterNode)
146
+ if double_splat_annotation && (double_splat_annotation.name_location.nil? || kw_rest.name.nil? || double_splat_annotation.name_location.source.to_sym == kw_rest.name)
147
+ doc.rest_keywords = double_splat_annotation
148
+ double_splat_annotation = nil
149
+ else
150
+ doc.rest_keywords = kw_rest.name || true
151
+ end
152
+ end
153
+
154
+ if (blk = params.block) && blk.is_a?(Prism::BlockParameterNode)
155
+ if block_annotation && (block_annotation.name_location.nil? || blk.name.nil? || block_annotation.name == blk.name)
156
+ doc.block = block_annotation
157
+ block_annotation = nil
158
+ else
159
+ doc.block = blk.name || true
160
+ end
161
+ end
162
+ end
163
+
164
+ if block_annotation
165
+ if node.parameters&.block
166
+ # Block parameter exists but name didn't match -- treat as unused
167
+ else
168
+ doc.block = block_annotation
169
+ block_annotation = nil
170
+ end
171
+ end
172
+
173
+ unused.concat(param_annotations.values)
174
+ unused << splat_annotation if splat_annotation
175
+ unused << double_splat_annotation if double_splat_annotation
176
+ unused << block_annotation if block_annotation
177
+
178
+ [doc, unused]
179
+ end
180
+
181
+ def all_param_annotations
182
+ annotations = [] #: Array[param_type_annotation | Symbol | true | nil]
183
+
184
+ required_positionals.each { |a| annotations << a }
185
+ optional_positionals.each { |a| annotations << a }
186
+ annotations << rest_positionals
187
+ trailing_positionals.each { |a| annotations << a }
188
+ required_keywords.each_value { |a| annotations << a }
189
+ optional_keywords.each_value { |a| annotations << a }
190
+ annotations << rest_keywords
191
+ annotations << block
192
+
193
+ annotations
194
+ end
195
+
196
+ def map_type_name(&block)
197
+ DocStyle.new.tap do |new|
198
+ new.return_type_annotation = return_type_annotation&.map_type_name(&block)
199
+ new.required_positionals.replace(
200
+ required_positionals.map do |a|
201
+ case a
202
+ when Annotations::ParamTypeAnnotation
203
+ a.map_type_name(&block)
204
+ else
205
+ a
206
+ end
207
+ end
208
+ )
209
+ new.optional_positionals.replace(
210
+ optional_positionals.map do |a|
211
+ case a
212
+ when Annotations::ParamTypeAnnotation
213
+ a.map_type_name(&block)
214
+ else
215
+ a
216
+ end
217
+ end
218
+ )
219
+ new.rest_positionals =
220
+ case rest_positionals
221
+ when Annotations::SplatParamTypeAnnotation
222
+ rest_positionals.map_type_name(&block)
223
+ else
224
+ rest_positionals
225
+ end
226
+ new.trailing_positionals.replace(
227
+ trailing_positionals.map do |a|
228
+ case a
229
+ when Annotations::ParamTypeAnnotation
230
+ a.map_type_name(&block)
231
+ else
232
+ a
233
+ end
234
+ end
235
+ )
236
+ new.required_keywords.replace(
237
+ required_keywords.transform_values do |a|
238
+ case a
239
+ when Annotations::ParamTypeAnnotation
240
+ a.map_type_name(&block)
241
+ else
242
+ a
243
+ end
244
+ end
245
+ )
246
+ new.optional_keywords.replace(
247
+ optional_keywords.transform_values do |a|
248
+ case a
249
+ when Annotations::ParamTypeAnnotation
250
+ a.map_type_name(&block)
251
+ else
252
+ a
253
+ end
254
+ end
255
+ )
256
+ new.rest_keywords =
257
+ case rest_keywords
258
+ when Annotations::DoubleSplatParamTypeAnnotation
259
+ rest_keywords.map_type_name(&block)
260
+ else
261
+ rest_keywords
262
+ end
263
+ new.block =
264
+ case self.block
265
+ when Annotations::BlockParamTypeAnnotation
266
+ self.block.map_type_name(&block)
267
+ else
268
+ self.block
269
+ end
270
+ end #: self
271
+ end
272
+
273
+ def type_fingerprint
274
+ [
275
+ return_type_annotation&.type_fingerprint,
276
+ all_param_annotations.map do |param|
277
+ case param
278
+ when Annotations::Base
279
+ param.type_fingerprint
280
+ else
281
+ param
282
+ end
283
+ end
284
+ ]
285
+ end
286
+
287
+ def method_type
288
+ return_type =
289
+ case return_type_annotation
290
+ when Annotations::NodeTypeAssertion
291
+ return_type_annotation.type
292
+ when Annotations::ReturnTypeAnnotation
293
+ return_type_annotation.return_type
294
+ else
295
+ Types::Bases::Any.new(location: nil)
296
+ end
297
+
298
+ any = -> { Types::Bases::Any.new(location: nil) }
299
+
300
+ req_pos = required_positionals.map do |a|
301
+ case a
302
+ when Annotations::ParamTypeAnnotation
303
+ Types::Function::Param.new(type: a.param_type, name: a.name_location.source.to_sym)
304
+ else
305
+ Types::Function::Param.new(type: any.call, name: a)
306
+ end
307
+ end
308
+ opt_pos = optional_positionals.map do |a|
309
+ case a
310
+ when Annotations::ParamTypeAnnotation
311
+ Types::Function::Param.new(type: a.param_type, name: a.name_location.source.to_sym)
312
+ else
313
+ Types::Function::Param.new(type: any.call, name: a)
314
+ end
315
+ end
316
+ rest_pos =
317
+ case rest_positionals
318
+ when Annotations::SplatParamTypeAnnotation
319
+ Types::Function::Param.new(type: rest_positionals.param_type, name: rest_positionals.name_location&.source&.to_sym)
320
+ when Symbol
321
+ Types::Function::Param.new(type: any.call, name: rest_positionals)
322
+ when true
323
+ Types::Function::Param.new(type: any.call, name: nil)
324
+ else
325
+ nil
326
+ end
327
+ trail_pos = trailing_positionals.map do |a|
328
+ case a
329
+ when Annotations::ParamTypeAnnotation
330
+ Types::Function::Param.new(type: a.param_type, name: a.name_location.source.to_sym)
331
+ else
332
+ Types::Function::Param.new(type: any.call, name: a)
333
+ end
334
+ end
335
+
336
+ req_kw = required_keywords.transform_values do |a|
337
+ case a
338
+ when Annotations::ParamTypeAnnotation
339
+ Types::Function::Param.new(type: a.param_type, name: nil)
340
+ else
341
+ Types::Function::Param.new(type: any.call, name: nil)
342
+ end
343
+ end
344
+ opt_kw = optional_keywords.transform_values do |a|
345
+ case a
346
+ when Annotations::ParamTypeAnnotation
347
+ Types::Function::Param.new(type: a.param_type, name: nil)
348
+ else
349
+ Types::Function::Param.new(type: any.call, name: nil)
350
+ end
351
+ end
352
+
353
+ rest_kw =
354
+ case rest_keywords
355
+ when Annotations::DoubleSplatParamTypeAnnotation
356
+ Types::Function::Param.new(type: rest_keywords.param_type, name: rest_keywords.name_location&.source&.to_sym)
357
+ when Symbol
358
+ Types::Function::Param.new(type: any.call, name: rest_keywords)
359
+ when true
360
+ Types::Function::Param.new(type: any.call, name: nil)
361
+ else
362
+ nil
363
+ end
364
+
365
+ type = Types::Function.new(
366
+ required_positionals: req_pos,
367
+ optional_positionals: opt_pos,
368
+ rest_positionals: rest_pos,
369
+ trailing_positionals: trail_pos,
370
+ required_keywords: req_kw,
371
+ optional_keywords: opt_kw,
372
+ rest_keywords: rest_kw,
373
+ return_type: return_type
374
+ )
375
+
376
+ method_block =
377
+ case self.block
378
+ when Annotations::BlockParamTypeAnnotation
379
+ Types::Block.new(
380
+ type: self.block.type,
381
+ required: self.block.required?
382
+ )
383
+ when Symbol, true
384
+ Types::Block.new(
385
+ type: Types::UntypedFunction.new(return_type: Types::Bases::Any.new(location: nil)),
386
+ required: false
387
+ )
388
+ else
389
+ nil
390
+ end
391
+
392
+ MethodType.new(
393
+ type_params: [],
394
+ type: type,
395
+ block: method_block,
396
+ location: nil
397
+ )
398
+ end
399
+ end
400
+
401
+ attr_reader :type_annotations
402
+
403
+ def initialize(type_annotations:)
404
+ @type_annotations = type_annotations
405
+ end
406
+
407
+ def map_type_name(&block)
408
+ case type_annotations
409
+ when Array
410
+ updated_annots = type_annotations.map do |annotation|
411
+ annotation.map_type_name(&block)
412
+ end
413
+ when DocStyle
414
+ updated_annots = type_annotations.map_type_name(&block)
415
+ end
416
+
417
+ MethodTypeAnnotation.new(type_annotations: updated_annots) #: self
418
+ end
419
+
420
+ def self.build(leading_block, trailing_block, variables, node)
421
+ unused_annotations = [] #: Array[Annotations::leading_annotation | CommentBlock::AnnotationSyntaxError]
422
+ unused_trailing_annotation = nil #: Annotations::trailing_annotation | CommentBlock::AnnotationSyntaxError | nil
423
+
424
+ type_annotations = nil #: type_annotations
425
+ return_annotation = nil #: Annotations::ReturnTypeAnnotation | Annotations::NodeTypeAssertion | nil
426
+ param_annotations = [] #: Array[Annotations::ParamTypeAnnotation | Annotations::SplatParamTypeAnnotation | Annotations::DoubleSplatParamTypeAnnotation | Annotations::BlockParamTypeAnnotation]
427
+
428
+ if trailing_block
429
+ case annotation = trailing_block.trailing_annotation(variables)
430
+ when Annotations::NodeTypeAssertion
431
+ return_annotation = annotation
432
+ else
433
+ unused_trailing_annotation = annotation
434
+ end
435
+ end
436
+
437
+ if leading_block
438
+ leading_block.each_paragraph(variables) do |paragraph|
439
+ next if paragraph.is_a?(Location)
440
+
441
+ if paragraph.is_a?(CommentBlock::AnnotationSyntaxError)
442
+ unused_annotations << paragraph
443
+ next
444
+ end
445
+
446
+ case paragraph
447
+ when Annotations::MethodTypesAnnotation, Annotations::ColonMethodTypeAnnotation
448
+ type_annotations = [] unless type_annotations
449
+ if type_annotations.is_a?(Array)
450
+ type_annotations << paragraph
451
+ next
452
+ end
453
+ when Annotations::ReturnTypeAnnotation
454
+ unless type_annotations
455
+ unless return_annotation
456
+ return_annotation = paragraph
457
+ next
458
+ end
459
+ end
460
+ when Annotations::ParamTypeAnnotation, Annotations::SplatParamTypeAnnotation, Annotations::DoubleSplatParamTypeAnnotation, Annotations::BlockParamTypeAnnotation
461
+ unless type_annotations
462
+ param_annotations << paragraph
463
+ next
464
+ end
465
+ end
466
+
467
+ unused_annotations << paragraph
468
+ end
469
+ end
470
+
471
+ if !type_annotations && (return_annotation || !param_annotations.empty?)
472
+ doc_style, unused_params = DocStyle.build(param_annotations, return_annotation, node)
473
+ type_annotations = doc_style
474
+ unused_annotations.concat(unused_params)
475
+ end
476
+
477
+ [
478
+ MethodTypeAnnotation.new(type_annotations: type_annotations),
479
+ unused_annotations,
480
+ unused_trailing_annotation
481
+ ]
482
+ end
483
+
484
+ def empty?
485
+ type_annotations.nil?
486
+ end
487
+
488
+ def overloads
489
+ case type_annotations
490
+ when DocStyle
491
+ method_type = type_annotations.method_type
492
+
493
+ [
494
+ AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: method_type)
495
+ ]
496
+ when Array
497
+ type_annotations.flat_map do |annotation|
498
+ case annotation
499
+ when Annotations::ColonMethodTypeAnnotation
500
+ [
501
+ AST::Members::MethodDefinition::Overload.new(
502
+ annotations: annotation.annotations,
503
+ method_type: annotation.method_type
504
+ )
505
+ ]
506
+ when Annotations::MethodTypesAnnotation
507
+ annotation.overloads
508
+ end
509
+ end
510
+ when nil
511
+ method_type = MethodType.new(
512
+ type_params: [],
513
+ type: Types::UntypedFunction.new(return_type: Types::Bases::Any.new(location: nil)),
514
+ block: nil,
515
+ location: nil
516
+ )
517
+
518
+ [
519
+ AST::Members::MethodDefinition::Overload.new(method_type: method_type, annotations: [])
520
+ ]
521
+ end
522
+ end
523
+
524
+ def overloading?
525
+ case type_annotations
526
+ when Array
527
+ type_annotations.any? do |annotation|
528
+ annotation.is_a?(Annotations::MethodTypesAnnotation) && annotation.dot3_location
529
+ end
530
+ else
531
+ false
532
+ end
533
+ end
534
+
535
+ def type_fingerprint
536
+ case type_annotations
537
+ when DocStyle
538
+ type_annotations.type_fingerprint
539
+ when Array
540
+ type_annotations.map(&:type_fingerprint)
541
+ when nil
542
+ nil
543
+ end
544
+ end
545
+ end
546
+
547
+ class DefMember < Base
548
+ Overload = AST::Members::MethodDefinition::Overload
549
+
550
+ attr_reader :name
551
+ attr_reader :node
552
+ attr_reader :method_type
553
+ attr_reader :leading_comment
554
+
555
+ def initialize(buffer, name, node, method_type, leading_comment)
556
+ super(buffer)
557
+ @name = name
558
+ @node = node
559
+ @method_type = method_type
560
+ @leading_comment = leading_comment
561
+ end
562
+
563
+ def location
564
+ rbs_location(node.location)
565
+ end
566
+
567
+ def overloads
568
+ method_type.overloads
569
+ end
570
+
571
+ def overloading?
572
+ method_type.overloading?
573
+ end
574
+
575
+ def annotations
576
+ []
577
+ end
578
+
579
+ def name_location
580
+ rbs_location(node.name_loc)
581
+ end
582
+
583
+ def type_fingerprint
584
+ [
585
+ "members/def",
586
+ name.to_s,
587
+ method_type.type_fingerprint,
588
+ leading_comment&.as_comment&.string
589
+ ]
590
+ end
591
+ end
592
+
593
+ class MixinMember < Base
594
+ attr_reader :node
595
+ attr_reader :module_name
596
+ attr_reader :annotation
597
+
598
+ def initialize(buffer, node, module_name, annotation)
599
+ super(buffer)
600
+ @node = node
601
+ @module_name = module_name
602
+ @annotation = annotation
603
+ end
604
+
605
+ def location
606
+ rbs_location(node.location)
607
+ end
608
+
609
+ def name_location
610
+ args = node.arguments or raise
611
+ first_arg = args.arguments.first or raise
612
+
613
+ rbs_location(first_arg.location)
614
+ end
615
+
616
+ def type_args
617
+ annotation&.type_args || []
618
+ end
619
+
620
+ def type_fingerprint
621
+ [
622
+ "members/mixin",
623
+ self.class.name,
624
+ module_name.to_s,
625
+ annotation&.type_fingerprint
626
+ ]
627
+ end
628
+ end
629
+
630
+ class IncludeMember < MixinMember
631
+ end
632
+
633
+ class ExtendMember < MixinMember
634
+ end
635
+
636
+ class PrependMember < MixinMember
637
+ end
638
+
639
+ class AttributeMember < Base
640
+ attr_reader :node
641
+ attr_reader :name_nodes
642
+ attr_reader :type_annotation
643
+ attr_reader :leading_comment
644
+
645
+ def initialize(buffer, node, name_nodes, leading_comment, type_annotation)
646
+ super(buffer)
647
+ @node = node
648
+ @name_nodes = name_nodes
649
+ @leading_comment = leading_comment
650
+ @type_annotation = type_annotation
651
+ end
652
+
653
+ def names
654
+ name_nodes.map do |node|
655
+ node.unescaped.to_sym
656
+ end
657
+ end
658
+
659
+ def location
660
+ rbs_location(node.location)
661
+ end
662
+
663
+ def name_locations
664
+ name_nodes.map do |name_node|
665
+ rbs_location(name_node.location)
666
+ end
667
+ end
668
+
669
+ def type
670
+ type_annotation&.type
671
+ end
672
+
673
+ def type_fingerprint
674
+ [
675
+ "members/attribute",
676
+ self.class.name,
677
+ names.map(&:to_s),
678
+ type_annotation&.type_fingerprint,
679
+ leading_comment&.as_comment&.string
680
+ ]
681
+ end
682
+ end
683
+
684
+ class AttrReaderMember < AttributeMember
685
+ end
686
+
687
+ class AttrWriterMember < AttributeMember
688
+ end
689
+
690
+ class AttrAccessorMember < AttributeMember
691
+ end
692
+
693
+ class InstanceVariableMember < Base
694
+ attr_reader :annotation
695
+
696
+ def initialize(buffer, annotation)
697
+ super(buffer)
698
+ @annotation = annotation
699
+ end
700
+
701
+ def name
702
+ annotation.ivar_name
703
+ end
704
+
705
+ def type
706
+ annotation.type
707
+ end
708
+
709
+ def location
710
+ annotation.location
711
+ end
712
+
713
+ def type_fingerprint
714
+ [
715
+ "members/instance_variable",
716
+ annotation.type_fingerprint
717
+ ]
718
+ end
719
+ end
720
+ end
721
+ end
722
+ end
723
+ end