rbs 4.0.0.dev.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 (281) 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 +18 -11
  5. data/.github/workflows/comments.yml +5 -3
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +27 -34
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +2 -2
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +1 -1
  12. data/CHANGELOG.md +323 -0
  13. data/README.md +1 -1
  14. data/Rakefile +43 -33
  15. data/Steepfile +1 -0
  16. data/config.yml +426 -24
  17. data/core/array.rbs +307 -227
  18. data/core/basic_object.rbs +9 -8
  19. data/core/binding.rbs +0 -2
  20. data/core/builtin.rbs +2 -2
  21. data/core/class.rbs +6 -5
  22. data/core/comparable.rbs +55 -34
  23. data/core/complex.rbs +104 -78
  24. data/core/dir.rbs +61 -49
  25. data/core/encoding.rbs +12 -15
  26. data/core/enumerable.rbs +179 -87
  27. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  28. data/core/enumerator.rbs +65 -2
  29. data/core/errno.rbs +11 -2
  30. data/core/errors.rbs +58 -29
  31. data/core/exception.rbs +13 -13
  32. data/core/fiber.rbs +74 -54
  33. data/core/file.rbs +280 -177
  34. data/core/file_test.rbs +3 -3
  35. data/core/float.rbs +257 -92
  36. data/core/gc.rbs +425 -281
  37. data/core/hash.rbs +1045 -739
  38. data/core/integer.rbs +135 -137
  39. data/core/io/buffer.rbs +53 -42
  40. data/core/io/wait.rbs +13 -35
  41. data/core/io.rbs +192 -144
  42. data/core/kernel.rbs +216 -155
  43. data/core/marshal.rbs +4 -4
  44. data/core/match_data.rbs +15 -13
  45. data/core/math.rbs +107 -66
  46. data/core/method.rbs +69 -33
  47. data/core/module.rbs +244 -106
  48. data/core/nil_class.rbs +7 -6
  49. data/core/numeric.rbs +74 -63
  50. data/core/object.rbs +9 -11
  51. data/core/object_space.rbs +30 -23
  52. data/core/pathname.rbs +1322 -0
  53. data/core/proc.rbs +95 -58
  54. data/core/process.rbs +222 -202
  55. data/core/ractor.rbs +371 -515
  56. data/core/random.rbs +21 -3
  57. data/core/range.rbs +159 -57
  58. data/core/rational.rbs +60 -89
  59. data/core/rbs/unnamed/argf.rbs +60 -53
  60. data/core/rbs/unnamed/env_class.rbs +19 -14
  61. data/core/rbs/unnamed/main_class.rbs +123 -0
  62. data/core/rbs/unnamed/random.rbs +11 -118
  63. data/core/regexp.rbs +258 -214
  64. data/core/ruby.rbs +53 -0
  65. data/core/ruby_vm.rbs +38 -34
  66. data/core/rubygems/config_file.rbs +5 -5
  67. data/core/rubygems/errors.rbs +4 -71
  68. data/core/rubygems/requirement.rbs +5 -5
  69. data/core/rubygems/rubygems.rbs +16 -82
  70. data/core/rubygems/version.rbs +2 -3
  71. data/core/set.rbs +490 -360
  72. data/core/signal.rbs +26 -16
  73. data/core/string.rbs +3234 -1285
  74. data/core/struct.rbs +27 -26
  75. data/core/symbol.rbs +41 -34
  76. data/core/thread.rbs +135 -67
  77. data/core/time.rbs +81 -50
  78. data/core/trace_point.rbs +41 -35
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +24 -16
  81. data/core/warning.rbs +7 -7
  82. data/docs/aliases.md +79 -0
  83. data/docs/collection.md +3 -3
  84. data/docs/config.md +171 -0
  85. data/docs/encoding.md +56 -0
  86. data/docs/gem.md +0 -1
  87. data/docs/inline.md +576 -0
  88. data/docs/sigs.md +3 -3
  89. data/docs/syntax.md +46 -16
  90. data/docs/type_fingerprint.md +21 -0
  91. data/exe/rbs +1 -1
  92. data/ext/rbs_extension/ast_translation.c +544 -116
  93. data/ext/rbs_extension/ast_translation.h +3 -0
  94. data/ext/rbs_extension/class_constants.c +16 -2
  95. data/ext/rbs_extension/class_constants.h +8 -0
  96. data/ext/rbs_extension/extconf.rb +5 -1
  97. data/ext/rbs_extension/legacy_location.c +33 -56
  98. data/ext/rbs_extension/legacy_location.h +37 -0
  99. data/ext/rbs_extension/main.c +44 -35
  100. data/include/rbs/ast.h +448 -173
  101. data/include/rbs/defines.h +27 -0
  102. data/include/rbs/lexer.h +30 -11
  103. data/include/rbs/location.h +25 -44
  104. data/include/rbs/parser.h +6 -6
  105. data/include/rbs/string.h +0 -2
  106. data/include/rbs/util/rbs_allocator.h +34 -13
  107. data/include/rbs/util/rbs_assert.h +12 -1
  108. data/include/rbs/util/rbs_constant_pool.h +0 -3
  109. data/include/rbs/util/rbs_encoding.h +2 -0
  110. data/include/rbs/util/rbs_unescape.h +2 -1
  111. data/include/rbs.h +8 -0
  112. data/lib/rbs/ast/annotation.rb +1 -1
  113. data/lib/rbs/ast/comment.rb +1 -1
  114. data/lib/rbs/ast/declarations.rb +10 -10
  115. data/lib/rbs/ast/members.rb +14 -14
  116. data/lib/rbs/ast/ruby/annotations.rb +293 -3
  117. data/lib/rbs/ast/ruby/comment_block.rb +24 -0
  118. data/lib/rbs/ast/ruby/declarations.rb +198 -3
  119. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  120. data/lib/rbs/ast/ruby/members.rb +532 -22
  121. data/lib/rbs/ast/type_param.rb +24 -4
  122. data/lib/rbs/buffer.rb +20 -15
  123. data/lib/rbs/cli/diff.rb +16 -15
  124. data/lib/rbs/cli/validate.rb +38 -106
  125. data/lib/rbs/cli.rb +52 -19
  126. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  127. data/lib/rbs/collection/sources/git.rb +1 -0
  128. data/lib/rbs/definition.rb +1 -1
  129. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  130. data/lib/rbs/definition_builder/method_builder.rb +20 -0
  131. data/lib/rbs/definition_builder.rb +147 -25
  132. data/lib/rbs/diff.rb +7 -1
  133. data/lib/rbs/environment.rb +227 -74
  134. data/lib/rbs/environment_loader.rb +0 -6
  135. data/lib/rbs/errors.rb +27 -18
  136. data/lib/rbs/inline_parser.rb +342 -6
  137. data/lib/rbs/location_aux.rb +1 -1
  138. data/lib/rbs/locator.rb +5 -1
  139. data/lib/rbs/method_type.rb +5 -3
  140. data/lib/rbs/parser_aux.rb +20 -7
  141. data/lib/rbs/prototype/helpers.rb +57 -0
  142. data/lib/rbs/prototype/rb.rb +3 -28
  143. data/lib/rbs/prototype/rbi.rb +3 -20
  144. data/lib/rbs/prototype/runtime.rb +8 -0
  145. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  146. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  147. data/lib/rbs/subtractor.rb +3 -1
  148. data/lib/rbs/test/type_check.rb +19 -2
  149. data/lib/rbs/type_name.rb +1 -1
  150. data/lib/rbs/types.rb +88 -78
  151. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  152. data/lib/rbs/validator.rb +2 -2
  153. data/lib/rbs/version.rb +1 -1
  154. data/lib/rbs.rb +1 -2
  155. data/lib/rdoc/discover.rb +1 -1
  156. data/lib/rdoc_plugin/parser.rb +1 -1
  157. data/rbs.gemspec +4 -3
  158. data/rust/.gitignore +1 -0
  159. data/rust/Cargo.lock +378 -0
  160. data/rust/Cargo.toml +7 -0
  161. data/rust/ruby-rbs/Cargo.toml +22 -0
  162. data/rust/ruby-rbs/build.rs +764 -0
  163. data/rust/ruby-rbs/examples/locations.rs +60 -0
  164. data/rust/ruby-rbs/src/lib.rs +1 -0
  165. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  166. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  167. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  168. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  169. data/rust/ruby-rbs-sys/build.rs +204 -0
  170. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  171. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  172. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  173. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  174. data/schema/typeParam.json +17 -1
  175. data/sig/ast/ruby/annotations.rbs +315 -4
  176. data/sig/ast/ruby/comment_block.rbs +8 -0
  177. data/sig/ast/ruby/declarations.rbs +102 -4
  178. data/sig/ast/ruby/members.rbs +108 -2
  179. data/sig/cli/diff.rbs +5 -11
  180. data/sig/cli/validate.rbs +12 -8
  181. data/sig/cli.rbs +18 -18
  182. data/sig/definition.rbs +6 -1
  183. data/sig/definition_builder.rbs +2 -0
  184. data/sig/environment.rbs +70 -12
  185. data/sig/errors.rbs +13 -14
  186. data/sig/inline_parser.rbs +39 -2
  187. data/sig/locator.rbs +0 -2
  188. data/sig/manifest.yaml +0 -1
  189. data/sig/method_builder.rbs +3 -1
  190. data/sig/parser.rbs +31 -13
  191. data/sig/prototype/helpers.rbs +2 -0
  192. data/sig/resolver/type_name_resolver.rbs +35 -7
  193. data/sig/source.rbs +3 -3
  194. data/sig/type_param.rbs +13 -8
  195. data/sig/types.rbs +6 -7
  196. data/sig/unit_test/spy.rbs +0 -8
  197. data/sig/unit_test/type_assertions.rbs +11 -0
  198. data/src/ast.c +410 -153
  199. data/src/lexer.c +1392 -1313
  200. data/src/lexer.re +3 -0
  201. data/src/lexstate.c +58 -37
  202. data/src/location.c +8 -48
  203. data/src/parser.c +977 -516
  204. data/src/string.c +0 -48
  205. data/src/util/rbs_allocator.c +89 -71
  206. data/src/util/rbs_assert.c +1 -1
  207. data/src/util/rbs_buffer.c +2 -2
  208. data/src/util/rbs_constant_pool.c +10 -14
  209. data/src/util/rbs_encoding.c +4 -8
  210. data/src/util/rbs_unescape.c +56 -20
  211. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  212. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  213. data/stdlib/cgi/0/core.rbs +9 -393
  214. data/stdlib/cgi/0/manifest.yaml +1 -0
  215. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  216. data/stdlib/coverage/0/coverage.rbs +7 -4
  217. data/stdlib/date/0/date.rbs +92 -79
  218. data/stdlib/date/0/date_time.rbs +25 -24
  219. data/stdlib/delegate/0/delegator.rbs +10 -7
  220. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  221. data/stdlib/digest/0/digest.rbs +110 -0
  222. data/stdlib/erb/0/erb.rbs +748 -347
  223. data/stdlib/etc/0/etc.rbs +55 -50
  224. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  225. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  226. data/stdlib/io-console/0/io-console.rbs +2 -2
  227. data/stdlib/json/0/json.rbs +217 -136
  228. data/stdlib/monitor/0/monitor.rbs +3 -3
  229. data/stdlib/net-http/0/net-http.rbs +162 -134
  230. data/stdlib/objspace/0/objspace.rbs +17 -34
  231. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  232. data/stdlib/open3/0/open3.rbs +469 -10
  233. data/stdlib/openssl/0/openssl.rbs +475 -357
  234. data/stdlib/optparse/0/optparse.rbs +26 -17
  235. data/stdlib/pathname/0/pathname.rbs +11 -1381
  236. data/stdlib/pp/0/pp.rbs +9 -8
  237. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  238. data/stdlib/pstore/0/pstore.rbs +35 -30
  239. data/stdlib/psych/0/psych.rbs +65 -12
  240. data/stdlib/psych/0/store.rbs +2 -4
  241. data/stdlib/pty/0/pty.rbs +9 -6
  242. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  243. data/stdlib/rdoc/0/code_object.rbs +2 -1
  244. data/stdlib/rdoc/0/parser.rbs +1 -1
  245. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  246. data/stdlib/rdoc/0/store.rbs +1 -1
  247. data/stdlib/resolv/0/resolv.rbs +25 -68
  248. data/stdlib/ripper/0/ripper.rbs +22 -19
  249. data/stdlib/securerandom/0/manifest.yaml +2 -0
  250. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  251. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  252. data/stdlib/singleton/0/singleton.rbs +3 -0
  253. data/stdlib/socket/0/addrinfo.rbs +7 -7
  254. data/stdlib/socket/0/basic_socket.rbs +3 -3
  255. data/stdlib/socket/0/ip_socket.rbs +10 -8
  256. data/stdlib/socket/0/socket.rbs +23 -10
  257. data/stdlib/socket/0/tcp_server.rbs +1 -1
  258. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  259. data/stdlib/socket/0/udp_socket.rbs +1 -1
  260. data/stdlib/socket/0/unix_server.rbs +1 -1
  261. data/stdlib/stringio/0/stringio.rbs +1177 -85
  262. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  263. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  264. data/stdlib/time/0/time.rbs +8 -6
  265. data/stdlib/timeout/0/timeout.rbs +63 -7
  266. data/stdlib/tsort/0/cyclic.rbs +3 -0
  267. data/stdlib/tsort/0/tsort.rbs +7 -6
  268. data/stdlib/uri/0/common.rbs +42 -20
  269. data/stdlib/uri/0/file.rbs +3 -3
  270. data/stdlib/uri/0/generic.rbs +26 -18
  271. data/stdlib/uri/0/http.rbs +2 -2
  272. data/stdlib/uri/0/ldap.rbs +2 -2
  273. data/stdlib/uri/0/mailto.rbs +3 -3
  274. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  275. data/stdlib/zlib/0/deflate.rbs +4 -3
  276. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  277. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  278. data/stdlib/zlib/0/inflate.rbs +1 -1
  279. data/stdlib/zlib/0/need_dict.rbs +1 -1
  280. data/stdlib/zlib/0/zstream.rbs +1 -0
  281. metadata +50 -6
@@ -17,17 +17,273 @@ module RBS
17
17
  class MethodTypeAnnotation
18
18
  class DocStyle
19
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
20
28
 
21
29
  def initialize
22
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
23
194
  end
24
195
 
25
196
  def map_type_name(&block)
26
197
  DocStyle.new.tap do |new|
27
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
28
270
  end #: self
29
271
  end
30
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
+
31
287
  def method_type
32
288
  return_type =
33
289
  case return_type_annotation
@@ -39,21 +295,104 @@ module RBS
39
295
  Types::Bases::Any.new(location: nil)
40
296
  end
41
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
+
42
365
  type = Types::Function.new(
43
- required_positionals: [],
44
- optional_positionals: [],
45
- rest_positionals: nil,
46
- trailing_positionals: [],
47
- required_keywords: {},
48
- optional_keywords: {},
49
- rest_keywords: nil,
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,
50
373
  return_type: return_type
51
374
  )
52
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
+
53
392
  MethodType.new(
54
393
  type_params: [],
55
394
  type: type,
56
- block: nil,
395
+ block: method_block,
57
396
  location: nil
58
397
  )
59
398
  end
@@ -78,17 +417,18 @@ module RBS
78
417
  MethodTypeAnnotation.new(type_annotations: updated_annots) #: self
79
418
  end
80
419
 
81
- def self.build(leading_block, trailing_block, variables)
420
+ def self.build(leading_block, trailing_block, variables, node)
82
421
  unused_annotations = [] #: Array[Annotations::leading_annotation | CommentBlock::AnnotationSyntaxError]
83
422
  unused_trailing_annotation = nil #: Annotations::trailing_annotation | CommentBlock::AnnotationSyntaxError | nil
84
423
 
85
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]
86
427
 
87
428
  if trailing_block
88
429
  case annotation = trailing_block.trailing_annotation(variables)
89
430
  when Annotations::NodeTypeAssertion
90
- type_annotations = DocStyle.new()
91
- type_annotations.return_type_annotation = annotation
431
+ return_annotation = annotation
92
432
  else
93
433
  unused_trailing_annotation = annotation
94
434
  end
@@ -112,25 +452,30 @@ module RBS
112
452
  end
113
453
  when Annotations::ReturnTypeAnnotation
114
454
  unless type_annotations
115
- type_annotations = DocStyle.new()
116
- end
117
-
118
- if type_annotations.is_a?(DocStyle)
119
- unless type_annotations.return_type_annotation
120
- type_annotations.return_type_annotation = paragraph
455
+ unless return_annotation
456
+ return_annotation = paragraph
121
457
  next
122
458
  end
123
459
  end
460
+ when Annotations::ParamTypeAnnotation, Annotations::SplatParamTypeAnnotation, Annotations::DoubleSplatParamTypeAnnotation, Annotations::BlockParamTypeAnnotation
461
+ unless type_annotations
462
+ param_annotations << paragraph
463
+ next
464
+ end
124
465
  end
125
466
 
126
467
  unused_annotations << paragraph
127
468
  end
128
469
  end
129
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
+
130
477
  [
131
- MethodTypeAnnotation.new(
132
- type_annotations: type_annotations
133
- ),
478
+ MethodTypeAnnotation.new(type_annotations: type_annotations),
134
479
  unused_annotations,
135
480
  unused_trailing_annotation
136
481
  ]
@@ -175,6 +520,28 @@ module RBS
175
520
  ]
176
521
  end
177
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
178
545
  end
179
546
 
180
547
  class DefMember < Base
@@ -183,12 +550,14 @@ module RBS
183
550
  attr_reader :name
184
551
  attr_reader :node
185
552
  attr_reader :method_type
553
+ attr_reader :leading_comment
186
554
 
187
- def initialize(buffer, name, node, method_type)
555
+ def initialize(buffer, name, node, method_type, leading_comment)
188
556
  super(buffer)
189
557
  @name = name
190
558
  @node = node
191
559
  @method_type = method_type
560
+ @leading_comment = leading_comment
192
561
  end
193
562
 
194
563
  def location
@@ -200,12 +569,153 @@ module RBS
200
569
  end
201
570
 
202
571
  def overloading?
203
- false
572
+ method_type.overloading?
204
573
  end
205
574
 
206
575
  def annotations
207
576
  []
208
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
209
719
  end
210
720
  end
211
721
  end