rbs 4.0.0.dev.4 → 4.1.0.pre.2

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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +1 -0
  3. data/.github/dependabot.yml +16 -14
  4. data/.github/workflows/bundle-update.yml +63 -0
  5. data/.github/workflows/c-check.yml +21 -11
  6. data/.github/workflows/comments.yml +5 -3
  7. data/.github/workflows/dependabot.yml +2 -2
  8. data/.github/workflows/jruby.yml +67 -0
  9. data/.github/workflows/milestone.yml +83 -0
  10. data/.github/workflows/ruby.yml +63 -24
  11. data/.github/workflows/rust.yml +184 -0
  12. data/.github/workflows/truffleruby.yml +54 -0
  13. data/.github/workflows/typecheck.yml +5 -2
  14. data/.github/workflows/wasm.yml +53 -0
  15. data/.github/workflows/windows.yml +8 -2
  16. data/.gitignore +11 -0
  17. data/.rubocop.yml +1 -1
  18. data/CHANGELOG.md +357 -0
  19. data/README.md +4 -4
  20. data/Rakefile +365 -33
  21. data/Steepfile +8 -0
  22. data/config.yml +450 -24
  23. data/core/array.rbs +443 -363
  24. data/core/basic_object.rbs +9 -8
  25. data/core/binding.rbs +0 -2
  26. data/core/builtin.rbs +9 -8
  27. data/core/class.rbs +11 -8
  28. data/core/comparable.rbs +55 -34
  29. data/core/complex.rbs +104 -78
  30. data/core/dir.rbs +61 -49
  31. data/core/encoding.rbs +12 -15
  32. data/core/enumerable.rbs +288 -196
  33. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  34. data/core/enumerator/product.rbs +5 -5
  35. data/core/enumerator.rbs +91 -28
  36. data/core/errno.rbs +11 -2
  37. data/core/errors.rbs +58 -29
  38. data/core/exception.rbs +13 -13
  39. data/core/fiber.rbs +74 -54
  40. data/core/file.rbs +260 -1151
  41. data/core/file_constants.rbs +463 -0
  42. data/core/file_stat.rbs +534 -0
  43. data/core/file_test.rbs +3 -3
  44. data/core/float.rbs +257 -92
  45. data/core/gc.rbs +425 -281
  46. data/core/hash.rbs +1151 -829
  47. data/core/integer.rbs +156 -195
  48. data/core/io/buffer.rbs +53 -42
  49. data/core/io/wait.rbs +13 -35
  50. data/core/io.rbs +216 -150
  51. data/core/kernel.rbs +239 -163
  52. data/core/marshal.rbs +4 -4
  53. data/core/match_data.rbs +15 -13
  54. data/core/math.rbs +107 -66
  55. data/core/method.rbs +69 -33
  56. data/core/module.rbs +302 -150
  57. data/core/nil_class.rbs +7 -6
  58. data/core/numeric.rbs +77 -63
  59. data/core/object.rbs +9 -11
  60. data/core/object_space/weak_key_map.rbs +7 -7
  61. data/core/object_space.rbs +30 -23
  62. data/core/pathname.rbs +1322 -0
  63. data/core/proc.rbs +95 -58
  64. data/core/process.rbs +222 -202
  65. data/core/ractor.rbs +371 -515
  66. data/core/random.rbs +21 -3
  67. data/core/range.rbs +181 -79
  68. data/core/rational.rbs +60 -89
  69. data/core/rbs/ops.rbs +154 -0
  70. data/core/rbs/unnamed/argf.rbs +63 -56
  71. data/core/rbs/unnamed/env_class.rbs +19 -14
  72. data/core/rbs/unnamed/main_class.rbs +123 -0
  73. data/core/rbs/unnamed/random.rbs +11 -118
  74. data/core/regexp.rbs +258 -214
  75. data/core/ruby.rbs +53 -0
  76. data/core/ruby_vm.rbs +78 -34
  77. data/core/rubygems/config_file.rbs +5 -5
  78. data/core/rubygems/errors.rbs +4 -71
  79. data/core/rubygems/requirement.rbs +5 -5
  80. data/core/rubygems/rubygems.rbs +16 -82
  81. data/core/rubygems/version.rbs +2 -3
  82. data/core/set.rbs +493 -363
  83. data/core/signal.rbs +26 -16
  84. data/core/string.rbs +3234 -1285
  85. data/core/struct.rbs +43 -42
  86. data/core/symbol.rbs +41 -34
  87. data/core/thread.rbs +141 -73
  88. data/core/time.rbs +81 -50
  89. data/core/trace_point.rbs +41 -35
  90. data/core/true_class.rbs +2 -2
  91. data/core/unbound_method.rbs +24 -16
  92. data/core/warning.rbs +7 -7
  93. data/docs/CONTRIBUTING.md +2 -1
  94. data/docs/aliases.md +79 -0
  95. data/docs/collection.md +3 -3
  96. data/docs/config.md +171 -0
  97. data/docs/encoding.md +56 -0
  98. data/docs/gem.md +0 -1
  99. data/docs/inline.md +634 -0
  100. data/docs/rbs_by_example.md +20 -20
  101. data/docs/rust.md +96 -0
  102. data/docs/sigs.md +3 -3
  103. data/docs/syntax.md +48 -18
  104. data/docs/type_fingerprint.md +21 -0
  105. data/docs/wasm_serialization.md +80 -0
  106. data/exe/rbs +1 -1
  107. data/ext/rbs_extension/ast_translation.c +1441 -671
  108. data/ext/rbs_extension/ast_translation.h +7 -0
  109. data/ext/rbs_extension/class_constants.c +18 -2
  110. data/ext/rbs_extension/class_constants.h +9 -0
  111. data/ext/rbs_extension/extconf.rb +6 -1
  112. data/ext/rbs_extension/legacy_location.c +33 -56
  113. data/ext/rbs_extension/legacy_location.h +37 -0
  114. data/ext/rbs_extension/main.c +183 -39
  115. data/include/rbs/ast.h +597 -297
  116. data/include/rbs/defines.h +40 -0
  117. data/include/rbs/lexer.h +31 -11
  118. data/include/rbs/location.h +25 -44
  119. data/include/rbs/parser.h +6 -6
  120. data/include/rbs/serialize.h +39 -0
  121. data/include/rbs/string.h +0 -2
  122. data/include/rbs/util/rbs_allocator.h +34 -13
  123. data/include/rbs/util/rbs_assert.h +12 -1
  124. data/include/rbs/util/rbs_constant_pool.h +0 -3
  125. data/include/rbs/util/rbs_encoding.h +2 -0
  126. data/include/rbs/util/rbs_unescape.h +2 -1
  127. data/include/rbs.h +8 -0
  128. data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
  129. data/lib/rbs/ast/annotation.rb +1 -1
  130. data/lib/rbs/ast/comment.rb +1 -1
  131. data/lib/rbs/ast/declarations.rb +10 -10
  132. data/lib/rbs/ast/members.rb +14 -14
  133. data/lib/rbs/ast/ruby/annotations.rb +335 -3
  134. data/lib/rbs/ast/ruby/comment_block.rb +30 -4
  135. data/lib/rbs/ast/ruby/declarations.rb +209 -4
  136. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  137. data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
  138. data/lib/rbs/ast/ruby/members.rb +571 -22
  139. data/lib/rbs/ast/type_param.rb +24 -4
  140. data/lib/rbs/buffer.rb +66 -24
  141. data/lib/rbs/cli/diff.rb +16 -15
  142. data/lib/rbs/cli/validate.rb +38 -106
  143. data/lib/rbs/cli.rb +55 -24
  144. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  145. data/lib/rbs/collection/sources/git.rb +7 -0
  146. data/lib/rbs/definition.rb +1 -1
  147. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  148. data/lib/rbs/definition_builder/method_builder.rb +32 -6
  149. data/lib/rbs/definition_builder.rb +147 -25
  150. data/lib/rbs/diff.rb +7 -1
  151. data/lib/rbs/environment.rb +235 -75
  152. data/lib/rbs/environment_loader.rb +0 -6
  153. data/lib/rbs/errors.rb +27 -18
  154. data/lib/rbs/inline_parser.rb +377 -15
  155. data/lib/rbs/location_aux.rb +1 -1
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +47 -11
  159. data/lib/rbs/parser_aux.rb +20 -7
  160. data/lib/rbs/prototype/helpers.rb +57 -0
  161. data/lib/rbs/prototype/rb.rb +3 -28
  162. data/lib/rbs/prototype/rbi.rb +3 -20
  163. data/lib/rbs/prototype/runtime.rb +10 -0
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  166. data/lib/rbs/rewriter.rb +70 -0
  167. data/lib/rbs/subtractor.rb +3 -1
  168. data/lib/rbs/test/type_check.rb +25 -3
  169. data/lib/rbs/type_name.rb +34 -14
  170. data/lib/rbs/types.rb +88 -78
  171. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  172. data/lib/rbs/validator.rb +2 -2
  173. data/lib/rbs/version.rb +1 -1
  174. data/lib/rbs/wasm/deserializer.rb +213 -0
  175. data/lib/rbs/wasm/location.rb +61 -0
  176. data/lib/rbs/wasm/parser.rb +137 -0
  177. data/lib/rbs/wasm/runtime.rb +217 -0
  178. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  179. data/lib/rbs.rb +13 -2
  180. data/lib/rdoc/discover.rb +1 -1
  181. data/lib/rdoc_plugin/parser.rb +1 -1
  182. data/rbs.gemspec +24 -6
  183. data/schema/typeParam.json +17 -1
  184. data/sig/annotate/rdoc_annotater.rbs +12 -9
  185. data/sig/ast/ruby/annotations.rbs +364 -4
  186. data/sig/ast/ruby/comment_block.rbs +8 -0
  187. data/sig/ast/ruby/declarations.rbs +102 -4
  188. data/sig/ast/ruby/members.rbs +128 -2
  189. data/sig/buffer.rbs +19 -1
  190. data/sig/cli/diff.rbs +5 -11
  191. data/sig/cli/validate.rbs +12 -8
  192. data/sig/cli.rbs +18 -18
  193. data/sig/collection/config/lockfile_generator.rbs +2 -0
  194. data/sig/definition.rbs +6 -1
  195. data/sig/definition_builder.rbs +2 -0
  196. data/sig/environment.rbs +70 -12
  197. data/sig/errors.rbs +13 -14
  198. data/sig/inline_parser.rbs +41 -2
  199. data/sig/locator.rbs +0 -2
  200. data/sig/manifest.yaml +0 -2
  201. data/sig/method_builder.rbs +3 -1
  202. data/sig/namespace.rbs +20 -0
  203. data/sig/parser.rbs +41 -13
  204. data/sig/prototype/helpers.rbs +2 -0
  205. data/sig/resolver/type_name_resolver.rbs +36 -10
  206. data/sig/rewriter.rbs +45 -0
  207. data/sig/source.rbs +3 -3
  208. data/sig/type_param.rbs +13 -8
  209. data/sig/typename.rbs +15 -0
  210. data/sig/types.rbs +6 -7
  211. data/sig/unit_test/spy.rbs +0 -8
  212. data/sig/unit_test/type_assertions.rbs +15 -0
  213. data/sig/wasm/deserializer.rbs +66 -0
  214. data/sig/wasm/serialization_schema.rbs +13 -0
  215. data/src/ast.c +443 -162
  216. data/src/lexer.c +1415 -1313
  217. data/src/lexer.re +4 -0
  218. data/src/lexstate.c +63 -37
  219. data/src/location.c +7 -47
  220. data/src/parser.c +1032 -521
  221. data/src/serialize.c +958 -0
  222. data/src/string.c +0 -48
  223. data/src/util/rbs_allocator.c +89 -74
  224. data/src/util/rbs_assert.c +1 -1
  225. data/src/util/rbs_buffer.c +2 -2
  226. data/src/util/rbs_constant_pool.c +10 -14
  227. data/src/util/rbs_encoding.c +4 -8
  228. data/src/util/rbs_unescape.c +56 -20
  229. data/stdlib/abbrev/0/array.rbs +1 -1
  230. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  231. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  232. data/stdlib/cgi/0/core.rbs +9 -393
  233. data/stdlib/cgi/0/manifest.yaml +1 -0
  234. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  235. data/stdlib/coverage/0/coverage.rbs +7 -4
  236. data/stdlib/csv/0/csv.rbs +5 -5
  237. data/stdlib/date/0/date.rbs +92 -79
  238. data/stdlib/date/0/date_time.rbs +25 -24
  239. data/stdlib/delegate/0/delegator.rbs +10 -7
  240. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  241. data/stdlib/digest/0/digest.rbs +111 -1
  242. data/stdlib/erb/0/erb.rbs +748 -347
  243. data/stdlib/etc/0/etc.rbs +73 -54
  244. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  245. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  246. data/stdlib/io-console/0/io-console.rbs +2 -2
  247. data/stdlib/json/0/json.rbs +223 -142
  248. data/stdlib/monitor/0/monitor.rbs +3 -3
  249. data/stdlib/net-http/0/net-http.rbs +162 -134
  250. data/stdlib/objspace/0/objspace.rbs +17 -34
  251. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  252. data/stdlib/open3/0/open3.rbs +469 -10
  253. data/stdlib/openssl/0/openssl.rbs +482 -364
  254. data/stdlib/optparse/0/optparse.rbs +26 -17
  255. data/stdlib/pathname/0/pathname.rbs +11 -1381
  256. data/stdlib/pp/0/pp.rbs +9 -8
  257. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  258. data/stdlib/pstore/0/pstore.rbs +35 -30
  259. data/stdlib/psych/0/psych.rbs +65 -12
  260. data/stdlib/psych/0/store.rbs +2 -4
  261. data/stdlib/pty/0/pty.rbs +9 -6
  262. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  263. data/stdlib/rdoc/0/code_object.rbs +2 -1
  264. data/stdlib/rdoc/0/parser.rbs +1 -1
  265. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  266. data/stdlib/rdoc/0/store.rbs +1 -1
  267. data/stdlib/resolv/0/resolv.rbs +26 -69
  268. data/stdlib/ripper/0/ripper.rbs +22 -19
  269. data/stdlib/securerandom/0/manifest.yaml +2 -0
  270. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  271. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  272. data/stdlib/singleton/0/singleton.rbs +3 -0
  273. data/stdlib/socket/0/addrinfo.rbs +7 -7
  274. data/stdlib/socket/0/basic_socket.rbs +3 -3
  275. data/stdlib/socket/0/ip_socket.rbs +10 -8
  276. data/stdlib/socket/0/socket.rbs +23 -10
  277. data/stdlib/socket/0/tcp_server.rbs +1 -1
  278. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  279. data/stdlib/socket/0/udp_socket.rbs +1 -1
  280. data/stdlib/socket/0/unix_server.rbs +1 -1
  281. data/stdlib/stringio/0/stringio.rbs +1209 -95
  282. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  283. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  284. data/stdlib/time/0/time.rbs +8 -6
  285. data/stdlib/timeout/0/timeout.rbs +63 -7
  286. data/stdlib/tsort/0/cyclic.rbs +4 -1
  287. data/stdlib/tsort/0/interfaces.rbs +8 -8
  288. data/stdlib/tsort/0/tsort.rbs +16 -15
  289. data/stdlib/uri/0/common.rbs +42 -20
  290. data/stdlib/uri/0/file.rbs +3 -3
  291. data/stdlib/uri/0/generic.rbs +26 -18
  292. data/stdlib/uri/0/http.rbs +2 -2
  293. data/stdlib/uri/0/ldap.rbs +2 -2
  294. data/stdlib/uri/0/mailto.rbs +3 -3
  295. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  296. data/stdlib/zlib/0/deflate.rbs +4 -3
  297. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  298. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  299. data/stdlib/zlib/0/inflate.rbs +1 -1
  300. data/stdlib/zlib/0/need_dict.rbs +1 -1
  301. data/stdlib/zlib/0/zstream.rbs +1 -0
  302. data/wasm/README.md +59 -0
  303. data/wasm/rbs_wasm.c +411 -0
  304. metadata +56 -8
  305. data/.vscode/extensions.json +0 -5
  306. data/.vscode/settings.json +0 -19
@@ -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
@@ -182,13 +549,25 @@ module RBS
182
549
 
183
550
  attr_reader :name
184
551
  attr_reader :node
552
+ attr_reader :kind
185
553
  attr_reader :method_type
554
+ attr_reader :leading_comment
186
555
 
187
- def initialize(buffer, name, node, method_type)
556
+ def initialize(buffer, name, node, method_type, leading_comment, kind: :instance)
188
557
  super(buffer)
189
558
  @name = name
190
559
  @node = node
560
+ @kind = kind
191
561
  @method_type = method_type
562
+ @leading_comment = leading_comment
563
+ end
564
+
565
+ def singleton?
566
+ kind == :singleton
567
+ end
568
+
569
+ def instance?
570
+ kind == :instance
192
571
  end
193
572
 
194
573
  def location
@@ -200,12 +579,182 @@ module RBS
200
579
  end
201
580
 
202
581
  def overloading?
203
- false
582
+ method_type.overloading?
204
583
  end
205
584
 
206
585
  def annotations
207
586
  []
208
587
  end
588
+
589
+ def name_location
590
+ rbs_location(node.name_loc)
591
+ end
592
+
593
+ def type_fingerprint
594
+ [
595
+ "members/def",
596
+ kind.to_s,
597
+ name.to_s,
598
+ method_type.type_fingerprint,
599
+ leading_comment&.as_comment&.string
600
+ ]
601
+ end
602
+ end
603
+
604
+ class MixinMember < Base
605
+ attr_reader :node
606
+ attr_reader :module_name
607
+ attr_reader :annotation
608
+
609
+ def initialize(buffer, node, module_name, annotation)
610
+ super(buffer)
611
+ @node = node
612
+ @module_name = module_name
613
+ @annotation = annotation
614
+ end
615
+
616
+ def location
617
+ rbs_location(node.location)
618
+ end
619
+
620
+ def name_location
621
+ args = node.arguments or raise
622
+ first_arg = args.arguments.first or raise
623
+
624
+ rbs_location(first_arg.location)
625
+ end
626
+
627
+ def type_args
628
+ annotation&.type_args || []
629
+ end
630
+
631
+ def type_fingerprint
632
+ [
633
+ "members/mixin",
634
+ self.class.name,
635
+ module_name.to_s,
636
+ annotation&.type_fingerprint
637
+ ]
638
+ end
639
+ end
640
+
641
+ class IncludeMember < MixinMember
642
+ end
643
+
644
+ class ExtendMember < MixinMember
645
+ end
646
+
647
+ class PrependMember < MixinMember
648
+ end
649
+
650
+ class AttributeMember < Base
651
+ attr_reader :node
652
+ attr_reader :name_nodes
653
+ attr_reader :type_annotation
654
+ attr_reader :leading_comment
655
+
656
+ def initialize(buffer, node, name_nodes, leading_comment, type_annotation)
657
+ super(buffer)
658
+ @node = node
659
+ @name_nodes = name_nodes
660
+ @leading_comment = leading_comment
661
+ @type_annotation = type_annotation
662
+ end
663
+
664
+ def names
665
+ name_nodes.map do |node|
666
+ node.unescaped.to_sym
667
+ end
668
+ end
669
+
670
+ def location
671
+ rbs_location(node.location)
672
+ end
673
+
674
+ def name_locations
675
+ name_nodes.map do |name_node|
676
+ rbs_location(name_node.location)
677
+ end
678
+ end
679
+
680
+ def type
681
+ type_annotation&.type
682
+ end
683
+
684
+ def type_fingerprint
685
+ [
686
+ "members/attribute",
687
+ self.class.name,
688
+ names.map(&:to_s),
689
+ type_annotation&.type_fingerprint,
690
+ leading_comment&.as_comment&.string
691
+ ]
692
+ end
693
+ end
694
+
695
+ class AttrReaderMember < AttributeMember
696
+ end
697
+
698
+ class AttrWriterMember < AttributeMember
699
+ end
700
+
701
+ class AttrAccessorMember < AttributeMember
702
+ end
703
+
704
+ class InstanceVariableMember < Base
705
+ attr_reader :annotation
706
+
707
+ def initialize(buffer, annotation)
708
+ super(buffer)
709
+ @annotation = annotation
710
+ end
711
+
712
+ def name
713
+ annotation.ivar_name
714
+ end
715
+
716
+ def type
717
+ annotation.type
718
+ end
719
+
720
+ def location
721
+ annotation.location
722
+ end
723
+
724
+ def type_fingerprint
725
+ [
726
+ "members/instance_variable",
727
+ annotation.type_fingerprint
728
+ ]
729
+ end
730
+ end
731
+
732
+ class ModuleSelfMember < Base
733
+ attr_reader :annotation
734
+
735
+ def initialize(buffer, annotation)
736
+ super(buffer)
737
+ @annotation = annotation
738
+ end
739
+
740
+ def name
741
+ annotation.name
742
+ end
743
+
744
+ def args
745
+ annotation.args
746
+ end
747
+
748
+ def location
749
+ annotation.location
750
+ end
751
+
752
+ def type_fingerprint
753
+ [
754
+ "members/module_self",
755
+ annotation.type_fingerprint
756
+ ]
757
+ end
209
758
  end
210
759
  end
211
760
  end