rbs 3.9.5 → 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 (330) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +74 -0
  3. data/.clangd +2 -0
  4. data/.github/dependabot.yml +14 -14
  5. data/.github/workflows/bundle-update.yml +60 -0
  6. data/.github/workflows/c-check.yml +58 -0
  7. data/.github/workflows/comments.yml +5 -3
  8. data/.github/workflows/dependabot.yml +2 -2
  9. data/.github/workflows/ruby.yml +40 -32
  10. data/.github/workflows/rust.yml +95 -0
  11. data/.github/workflows/typecheck.yml +2 -2
  12. data/.github/workflows/windows.yml +3 -3
  13. data/.gitignore +4 -0
  14. data/.rubocop.yml +2 -2
  15. data/.vscode/extensions.json +5 -0
  16. data/.vscode/settings.json +19 -0
  17. data/CHANGELOG.md +284 -0
  18. data/README.md +38 -1
  19. data/Rakefile +144 -29
  20. data/Steepfile +2 -0
  21. data/config.yml +634 -62
  22. data/core/array.rbs +307 -227
  23. data/core/basic_object.rbs +9 -8
  24. data/core/binding.rbs +0 -2
  25. data/core/builtin.rbs +2 -2
  26. data/core/class.rbs +6 -5
  27. data/core/comparable.rbs +55 -34
  28. data/core/complex.rbs +104 -78
  29. data/core/dir.rbs +61 -49
  30. data/core/encoding.rbs +12 -15
  31. data/core/enumerable.rbs +188 -87
  32. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  33. data/core/enumerator.rbs +65 -2
  34. data/core/errno.rbs +11 -2
  35. data/core/errors.rbs +58 -29
  36. data/core/exception.rbs +13 -13
  37. data/core/fiber.rbs +74 -54
  38. data/core/file.rbs +280 -177
  39. data/core/file_test.rbs +3 -3
  40. data/core/float.rbs +257 -92
  41. data/core/gc.rbs +425 -281
  42. data/core/hash.rbs +1045 -739
  43. data/core/integer.rbs +135 -137
  44. data/core/io/buffer.rbs +53 -42
  45. data/core/io/wait.rbs +13 -35
  46. data/core/io.rbs +196 -148
  47. data/core/kernel.rbs +216 -155
  48. data/core/marshal.rbs +4 -4
  49. data/core/match_data.rbs +15 -13
  50. data/core/math.rbs +107 -66
  51. data/core/method.rbs +69 -33
  52. data/core/module.rbs +244 -106
  53. data/core/nil_class.rbs +7 -6
  54. data/core/numeric.rbs +74 -63
  55. data/core/object.rbs +9 -11
  56. data/core/object_space.rbs +30 -23
  57. data/core/pathname.rbs +1322 -0
  58. data/core/proc.rbs +95 -58
  59. data/core/process.rbs +222 -202
  60. data/core/ractor.rbs +371 -515
  61. data/core/random.rbs +21 -3
  62. data/core/range.rbs +159 -57
  63. data/core/rational.rbs +60 -89
  64. data/core/rbs/unnamed/argf.rbs +60 -53
  65. data/core/rbs/unnamed/env_class.rbs +19 -14
  66. data/core/rbs/unnamed/main_class.rbs +123 -0
  67. data/core/rbs/unnamed/random.rbs +11 -118
  68. data/core/regexp.rbs +258 -214
  69. data/core/ruby.rbs +53 -0
  70. data/core/ruby_vm.rbs +38 -34
  71. data/core/rubygems/config_file.rbs +5 -5
  72. data/core/rubygems/errors.rbs +4 -71
  73. data/core/rubygems/requirement.rbs +5 -5
  74. data/core/rubygems/rubygems.rbs +16 -82
  75. data/core/rubygems/version.rbs +2 -3
  76. data/core/set.rbs +490 -360
  77. data/core/signal.rbs +26 -16
  78. data/core/string.rbs +3303 -1365
  79. data/core/struct.rbs +27 -26
  80. data/core/symbol.rbs +41 -34
  81. data/core/thread.rbs +135 -74
  82. data/core/time.rbs +81 -50
  83. data/core/trace_point.rbs +41 -35
  84. data/core/true_class.rbs +2 -2
  85. data/core/unbound_method.rbs +24 -16
  86. data/core/warning.rbs +7 -7
  87. data/docs/aliases.md +79 -0
  88. data/docs/collection.md +3 -3
  89. data/docs/config.md +171 -0
  90. data/docs/encoding.md +56 -0
  91. data/docs/gem.md +0 -1
  92. data/docs/inline.md +576 -0
  93. data/docs/sigs.md +3 -3
  94. data/docs/syntax.md +46 -16
  95. data/docs/type_fingerprint.md +21 -0
  96. data/exe/rbs +1 -1
  97. data/ext/rbs_extension/ast_translation.c +1513 -0
  98. data/ext/rbs_extension/ast_translation.h +37 -0
  99. data/ext/rbs_extension/class_constants.c +185 -0
  100. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +22 -1
  101. data/ext/rbs_extension/compat.h +10 -0
  102. data/ext/rbs_extension/extconf.rb +25 -1
  103. data/ext/rbs_extension/legacy_location.c +294 -0
  104. data/ext/rbs_extension/legacy_location.h +82 -0
  105. data/ext/rbs_extension/main.c +468 -24
  106. data/ext/rbs_extension/rbs_extension.h +6 -21
  107. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  108. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  109. data/include/rbs/ast.h +1022 -0
  110. data/include/rbs/defines.h +86 -0
  111. data/include/rbs/lexer.h +206 -0
  112. data/include/rbs/location.h +40 -0
  113. data/include/rbs/parser.h +153 -0
  114. data/include/rbs/string.h +47 -0
  115. data/include/rbs/util/rbs_allocator.h +59 -0
  116. data/include/rbs/util/rbs_assert.h +20 -0
  117. data/include/rbs/util/rbs_buffer.h +83 -0
  118. data/include/rbs/util/rbs_constant_pool.h +6 -70
  119. data/include/rbs/util/rbs_encoding.h +282 -0
  120. data/include/rbs/util/rbs_unescape.h +24 -0
  121. data/include/rbs.h +9 -2
  122. data/lib/rbs/annotate/formatter.rb +3 -13
  123. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  124. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  125. data/lib/rbs/ast/annotation.rb +1 -1
  126. data/lib/rbs/ast/comment.rb +1 -1
  127. data/lib/rbs/ast/declarations.rb +10 -10
  128. data/lib/rbs/ast/members.rb +14 -14
  129. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  130. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  131. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  132. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  133. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  134. data/lib/rbs/ast/ruby/members.rb +723 -0
  135. data/lib/rbs/ast/type_param.rb +24 -4
  136. data/lib/rbs/buffer.rb +105 -20
  137. data/lib/rbs/cli/diff.rb +16 -15
  138. data/lib/rbs/cli/validate.rb +63 -126
  139. data/lib/rbs/cli.rb +56 -24
  140. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  141. data/lib/rbs/collection/sources/git.rb +1 -0
  142. data/lib/rbs/collection.rb +0 -1
  143. data/lib/rbs/definition.rb +6 -1
  144. data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
  145. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  146. data/lib/rbs/definition_builder.rb +177 -20
  147. data/lib/rbs/diff.rb +7 -1
  148. data/lib/rbs/environment/class_entry.rb +69 -0
  149. data/lib/rbs/environment/module_entry.rb +66 -0
  150. data/lib/rbs/environment.rb +402 -214
  151. data/lib/rbs/environment_loader.rb +2 -8
  152. data/lib/rbs/errors.rb +31 -21
  153. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  154. data/lib/rbs/inline_parser.rb +542 -0
  155. data/lib/rbs/location_aux.rb +36 -4
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +0 -7
  159. data/lib/rbs/parser_aux.rb +35 -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 -2
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  166. data/lib/rbs/source.rb +99 -0
  167. data/lib/rbs/subtractor.rb +7 -4
  168. data/lib/rbs/test/type_check.rb +19 -2
  169. data/lib/rbs/type_name.rb +1 -8
  170. data/lib/rbs/types.rb +91 -79
  171. data/lib/rbs/unit_test/convertibles.rb +1 -0
  172. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  173. data/lib/rbs/validator.rb +2 -2
  174. data/lib/rbs/version.rb +1 -1
  175. data/lib/rbs.rb +13 -2
  176. data/lib/rdoc/discover.rb +1 -1
  177. data/lib/rdoc_plugin/parser.rb +3 -3
  178. data/rbs.gemspec +4 -2
  179. data/rust/.gitignore +1 -0
  180. data/rust/Cargo.lock +378 -0
  181. data/rust/Cargo.toml +7 -0
  182. data/rust/ruby-rbs/Cargo.toml +22 -0
  183. data/rust/ruby-rbs/build.rs +764 -0
  184. data/rust/ruby-rbs/examples/locations.rs +60 -0
  185. data/rust/ruby-rbs/src/lib.rs +1 -0
  186. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  187. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  188. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  189. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  190. data/rust/ruby-rbs-sys/build.rs +204 -0
  191. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  192. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  193. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  194. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  195. data/schema/typeParam.json +17 -1
  196. data/sig/ancestor_builder.rbs +1 -1
  197. data/sig/annotate/formatter.rbs +2 -2
  198. data/sig/annotate/rdoc_annotater.rbs +1 -1
  199. data/sig/ast/ruby/annotations.rbs +421 -0
  200. data/sig/ast/ruby/comment_block.rbs +127 -0
  201. data/sig/ast/ruby/declarations.rbs +158 -0
  202. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  203. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  204. data/sig/ast/ruby/members.rbs +178 -0
  205. data/sig/buffer.rbs +63 -5
  206. data/sig/cli/diff.rbs +5 -11
  207. data/sig/cli/validate.rbs +12 -8
  208. data/sig/cli.rbs +18 -18
  209. data/sig/definition.rbs +6 -0
  210. data/sig/definition_builder.rbs +3 -1
  211. data/sig/environment/class_entry.rbs +50 -0
  212. data/sig/environment/module_entry.rbs +50 -0
  213. data/sig/environment.rbs +94 -87
  214. data/sig/errors.rbs +26 -20
  215. data/sig/inline_parser/comment_association.rbs +71 -0
  216. data/sig/inline_parser.rbs +124 -0
  217. data/sig/location.rbs +32 -7
  218. data/sig/locator.rbs +0 -2
  219. data/sig/manifest.yaml +0 -1
  220. data/sig/method_builder.rbs +9 -4
  221. data/sig/namespace.rbs +0 -5
  222. data/sig/parser.rbs +67 -13
  223. data/sig/prototype/helpers.rbs +2 -0
  224. data/sig/resolver/type_name_resolver.rbs +35 -7
  225. data/sig/source.rbs +48 -0
  226. data/sig/type_param.rbs +13 -8
  227. data/sig/typename.rbs +0 -5
  228. data/sig/types.rbs +10 -8
  229. data/sig/unit_test/spy.rbs +0 -8
  230. data/sig/unit_test/type_assertions.rbs +11 -0
  231. data/src/ast.c +1604 -0
  232. data/src/lexer.c +3194 -0
  233. data/src/lexer.re +154 -0
  234. data/src/lexstate.c +212 -0
  235. data/src/location.c +31 -0
  236. data/src/parser.c +4205 -0
  237. data/src/string.c +41 -0
  238. data/src/util/rbs_allocator.c +165 -0
  239. data/src/util/rbs_assert.c +19 -0
  240. data/src/util/rbs_buffer.c +54 -0
  241. data/src/util/rbs_constant_pool.c +18 -92
  242. data/src/util/rbs_encoding.c +21308 -0
  243. data/src/util/rbs_unescape.c +167 -0
  244. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  245. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  246. data/stdlib/cgi/0/core.rbs +9 -393
  247. data/stdlib/cgi/0/manifest.yaml +1 -0
  248. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  249. data/stdlib/coverage/0/coverage.rbs +7 -4
  250. data/stdlib/date/0/date.rbs +92 -79
  251. data/stdlib/date/0/date_time.rbs +25 -24
  252. data/stdlib/delegate/0/delegator.rbs +10 -7
  253. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  254. data/stdlib/digest/0/digest.rbs +110 -0
  255. data/stdlib/erb/0/erb.rbs +748 -347
  256. data/stdlib/etc/0/etc.rbs +55 -50
  257. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  258. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  259. data/stdlib/io-console/0/io-console.rbs +2 -2
  260. data/stdlib/json/0/json.rbs +226 -179
  261. data/stdlib/monitor/0/monitor.rbs +3 -3
  262. data/stdlib/net-http/0/net-http.rbs +162 -134
  263. data/stdlib/objspace/0/objspace.rbs +17 -34
  264. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  265. data/stdlib/open3/0/open3.rbs +469 -10
  266. data/stdlib/openssl/0/openssl.rbs +475 -357
  267. data/stdlib/optparse/0/optparse.rbs +26 -17
  268. data/stdlib/pathname/0/pathname.rbs +11 -1381
  269. data/stdlib/pp/0/pp.rbs +9 -8
  270. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  271. data/stdlib/pstore/0/pstore.rbs +35 -30
  272. data/stdlib/psych/0/psych.rbs +65 -12
  273. data/stdlib/psych/0/store.rbs +2 -4
  274. data/stdlib/pty/0/pty.rbs +9 -6
  275. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  276. data/stdlib/rdoc/0/code_object.rbs +4 -3
  277. data/stdlib/rdoc/0/comment.rbs +2 -0
  278. data/stdlib/rdoc/0/options.rbs +76 -0
  279. data/stdlib/rdoc/0/parser.rbs +1 -1
  280. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  281. data/stdlib/rdoc/0/store.rbs +2 -2
  282. data/stdlib/resolv/0/resolv.rbs +25 -68
  283. data/stdlib/ripper/0/ripper.rbs +25 -19
  284. data/stdlib/securerandom/0/manifest.yaml +2 -0
  285. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  286. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  287. data/stdlib/singleton/0/singleton.rbs +3 -0
  288. data/stdlib/socket/0/addrinfo.rbs +9 -9
  289. data/stdlib/socket/0/basic_socket.rbs +3 -3
  290. data/stdlib/socket/0/ip_socket.rbs +10 -8
  291. data/stdlib/socket/0/socket.rbs +23 -10
  292. data/stdlib/socket/0/tcp_server.rbs +1 -1
  293. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  294. data/stdlib/socket/0/udp_socket.rbs +1 -1
  295. data/stdlib/socket/0/unix_server.rbs +1 -1
  296. data/stdlib/stringio/0/stringio.rbs +1177 -85
  297. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  298. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  299. data/stdlib/time/0/time.rbs +8 -6
  300. data/stdlib/timeout/0/timeout.rbs +63 -7
  301. data/stdlib/tsort/0/cyclic.rbs +3 -0
  302. data/stdlib/tsort/0/tsort.rbs +7 -6
  303. data/stdlib/uri/0/common.rbs +42 -20
  304. data/stdlib/uri/0/file.rbs +3 -3
  305. data/stdlib/uri/0/generic.rbs +26 -18
  306. data/stdlib/uri/0/http.rbs +2 -2
  307. data/stdlib/uri/0/ldap.rbs +2 -2
  308. data/stdlib/uri/0/mailto.rbs +3 -3
  309. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  310. data/stdlib/zlib/0/deflate.rbs +4 -3
  311. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  312. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  313. data/stdlib/zlib/0/inflate.rbs +1 -1
  314. data/stdlib/zlib/0/need_dict.rbs +1 -1
  315. data/stdlib/zlib/0/zstream.rbs +1 -0
  316. metadata +121 -18
  317. data/ext/rbs_extension/lexer.c +0 -2728
  318. data/ext/rbs_extension/lexer.h +0 -179
  319. data/ext/rbs_extension/lexer.re +0 -147
  320. data/ext/rbs_extension/lexstate.c +0 -175
  321. data/ext/rbs_extension/location.c +0 -325
  322. data/ext/rbs_extension/location.h +0 -85
  323. data/ext/rbs_extension/parser.c +0 -2982
  324. data/ext/rbs_extension/parser.h +0 -18
  325. data/ext/rbs_extension/parserstate.c +0 -411
  326. data/ext/rbs_extension/parserstate.h +0 -163
  327. data/ext/rbs_extension/unescape.c +0 -32
  328. data/include/rbs/ruby_objs.h +0 -72
  329. data/src/constants.c +0 -153
  330. data/src/ruby_objs.c +0 -799
@@ -5,14 +5,16 @@ require_relative "parser/token"
5
5
 
6
6
  module RBS
7
7
  class Parser
8
- def self.parse_type(source, range: 0..., variables: [], require_eof: false)
8
+ def self.parse_type(source, range: nil, byte_range: 0..., variables: [], require_eof: false, void_allowed: true, self_allowed: true, classish_allowed: true)
9
9
  buf = buffer(source)
10
- _parse_type(buf, range.begin || 0, range.end || buf.last_position, variables, require_eof)
10
+ byte_range = byte_range(range, buf.content) if range
11
+ _parse_type(buf, byte_range.begin || 0, byte_range.end || buf.content.bytesize, variables, require_eof, void_allowed, self_allowed, classish_allowed)
11
12
  end
12
13
 
13
- def self.parse_method_type(source, range: 0..., variables: [], require_eof: false)
14
+ def self.parse_method_type(source, range: nil, byte_range: 0..., variables: [], require_eof: false)
14
15
  buf = buffer(source)
15
- _parse_method_type(buf, range.begin || 0, range.end || buf.last_position, variables, require_eof)
16
+ byte_range = byte_range(range, buf.content) if range
17
+ _parse_method_type(buf, byte_range.begin || 0, byte_range.end || buf.content.bytesize, variables, require_eof)
16
18
  end
17
19
 
18
20
  def self.parse_signature(source)
@@ -25,7 +27,8 @@ module RBS
25
27
  else
26
28
  0
27
29
  end
28
- dirs, decls = _parse_signature(buf, start_pos, buf.last_position)
30
+ content = buf.content
31
+ dirs, decls = _parse_signature(buf, start_pos, content.bytesize)
29
32
 
30
33
  if resolved
31
34
  dirs = dirs.dup if dirs.frozen?
@@ -35,6 +38,11 @@ module RBS
35
38
  [buf, dirs, decls]
36
39
  end
37
40
 
41
+ def self.parse_type_params(source, module_type_params: true)
42
+ buf = buffer(source)
43
+ _parse_type_params(buf, 0, buf.content.bytesize, module_type_params)
44
+ end
45
+
38
46
  def self.magic_comment(buf)
39
47
  start_pos = 0
40
48
 
@@ -61,7 +69,7 @@ module RBS
61
69
 
62
70
  def self.lex(source)
63
71
  buf = buffer(source)
64
- list = _lex(buf, buf.last_position)
72
+ list = _lex(buf, buf.content.bytesize)
65
73
  value = list.map do |type, location|
66
74
  Token.new(type: type, location: location)
67
75
  end
@@ -71,7 +79,7 @@ module RBS
71
79
  def self.buffer(source)
72
80
  case source
73
81
  when String
74
- Buffer.new(content: source, name: "a.rbs")
82
+ Buffer.new(content: source, name: Pathname("a.rbs"))
75
83
  when Buffer
76
84
  source
77
85
  end
@@ -110,5 +118,25 @@ module RBS
110
118
  ).each_with_object({}) do |keyword, hash| #$ Hash[String, bot]
111
119
  hash[keyword] = _ = nil
112
120
  end
121
+
122
+ def self.parse_inline_leading_annotation(source, range, variables: [])
123
+ buf = buffer(source)
124
+ _parse_inline_leading_annotation(buf, range.begin || 0, range.end || buf.last_position, variables)
125
+ end
126
+
127
+ def self.parse_inline_trailing_annotation(source, range, variables: [])
128
+ buf = buffer(source)
129
+ _parse_inline_trailing_annotation(buf, range.begin || 0, range.end || buf.last_position, variables)
130
+ end
131
+
132
+ def self.byte_range(char_range, content)
133
+ start_offset = char_range.begin
134
+ end_offset = char_range.end
135
+
136
+ start_prefix = content[0, start_offset] or raise if start_offset
137
+ end_prefix = content[0, end_offset] or raise if end_offset
138
+
139
+ start_prefix&.bytesize...end_prefix&.bytesize
140
+ end
113
141
  end
114
142
  end
@@ -5,6 +5,63 @@ module RBS
5
5
  module Helpers
6
6
  private
7
7
 
8
+ # Prism can't parse Ruby 3.2 code
9
+ if RUBY_VERSION >= "3.3"
10
+ def parse_comments(string, include_trailing:)
11
+ Prism.parse_comments(string, version: "current").yield_self do |prism_comments| # steep:ignore UnexpectedKeywordArgument
12
+ prism_comments.each_with_object({}) do |comment, hash| #$ Hash[Integer, AST::Comment]
13
+ # Skip EmbDoc comments
14
+ next unless comment.is_a?(Prism::InlineComment)
15
+ # skip like `module Foo # :nodoc:`
16
+ next if comment.trailing? && !include_trailing
17
+
18
+ line = comment.location.start_line
19
+ body = "#{comment.location.slice}\n"
20
+ body = body[2..-1] or raise
21
+ body = "\n" if body.empty?
22
+
23
+ comment = AST::Comment.new(string: body, location: nil)
24
+ if prev_comment = hash.delete(line - 1)
25
+ hash[line] = AST::Comment.new(string: prev_comment.string + comment.string,
26
+ location: nil)
27
+ else
28
+ hash[line] = comment
29
+ end
30
+ end
31
+ end
32
+ end
33
+ else
34
+ require "ripper"
35
+ def parse_comments(string, include_trailing:)
36
+ Ripper.lex(string).yield_self do |tokens|
37
+ code_lines = {} #: Hash[Integer, bool]
38
+ tokens.each.with_object({}) do |token, hash| #$ Hash[Integer, AST::Comment]
39
+ case token[1]
40
+ when :on_sp, :on_ignored_nl
41
+ # skip
42
+ when :on_comment
43
+ line = token[0][0]
44
+ # skip like `module Foo # :nodoc:`
45
+ next if code_lines[line] && !include_trailing
46
+ body = token[2][2..-1] or raise
47
+
48
+ body = "\n" if body.empty?
49
+
50
+ comment = AST::Comment.new(string: body, location: nil)
51
+ if prev_comment = hash.delete(line - 1)
52
+ hash[line] = AST::Comment.new(string: prev_comment.string + comment.string,
53
+ location: nil)
54
+ else
55
+ hash[line] = comment
56
+ end
57
+ else
58
+ code_lines[token[0][0]] = true
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
8
65
  def block_from_body(node)
9
66
  _, args_node, body_node = node.children
10
67
  _pre_num, _pre_init, _opt, _first_post, _post_num, _post_init, _rest, _kw, _kwrest, block_var = args_from_node(args_node)
@@ -74,32 +74,7 @@ module RBS
74
74
 
75
75
  def parse(string)
76
76
  # @type var comments: Hash[Integer, AST::Comment]
77
- comments = Ripper.lex(string).yield_self do |tokens|
78
- code_lines = {} #: Hash[Integer, bool]
79
- tokens.each.with_object({}) do |token, hash| #$ Hash[Integer, AST::Comment]
80
- case token[1]
81
- when :on_sp, :on_ignored_nl
82
- # skip
83
- when :on_comment
84
- line = token[0][0]
85
- # skip like `module Foo # :nodoc:`
86
- next if code_lines[line]
87
- body = token[2][2..-1] or raise
88
-
89
- body = "\n" if body.empty?
90
-
91
- comment = AST::Comment.new(string: body, location: nil)
92
- if prev_comment = hash.delete(line - 1)
93
- hash[line] = AST::Comment.new(string: prev_comment.string + comment.string,
94
- location: nil)
95
- else
96
- hash[line] = comment
97
- end
98
- else
99
- code_lines[token[0][0]] = true
100
- end
101
- end
102
- end
77
+ comments = parse_comments(string, include_trailing: false)
103
78
 
104
79
  process RubyVM::AbstractSyntaxTree.parse(string), decls: source_decls, comments: comments, context: Context.initial
105
80
  end
@@ -372,8 +347,8 @@ module RBS
372
347
  end
373
348
 
374
349
  value_node = node.children.last
375
- type = if value_node.nil?
376
- # Give up type prediction when node is MASGN.
350
+ type = if value_node.nil? || value_node.type == :SELF
351
+ # Give up type prediction when node is MASGN or SELF.
377
352
  Types::Bases::Any.new(location: nil)
378
353
  else
379
354
  literal_to_type(value_node)
@@ -16,26 +16,7 @@ module RBS
16
16
  end
17
17
 
18
18
  def parse(string)
19
- comments = Ripper.lex(string).yield_self do |tokens|
20
- tokens.each.with_object({}) do |token, hash| #$ Hash[Integer, AST::Comment]
21
- if token[1] == :on_comment
22
- line = token[0][0]
23
- body = token[2][2..-1] or raise
24
-
25
- body = "\n" if body.empty?
26
-
27
- comment = AST::Comment.new(string: body, location: nil)
28
- if (prev_comment = hash.delete(line - 1))
29
- hash[line] = AST::Comment.new(
30
- string: prev_comment.string + comment.string,
31
- location: nil
32
- )
33
- else
34
- hash[line] = comment
35
- end
36
- end
37
- end
38
- end
19
+ comments = parse_comments(string, include_trailing: true)
39
20
  process RubyVM::AbstractSyntaxTree.parse(string), comments: comments
40
21
  end
41
22
 
@@ -235,6 +216,7 @@ module RBS
235
216
  variance: variance || :invariant,
236
217
  location: nil,
237
218
  upper_bound: nil,
219
+ lower_bound: nil,
238
220
  default_type: nil
239
221
  )
240
222
  end
@@ -332,6 +314,7 @@ module RBS
332
314
  name: name,
333
315
  variance: :invariant,
334
316
  upper_bound: nil,
317
+ lower_bound: nil,
335
318
  location: nil,
336
319
  default_type: nil
337
320
  )
@@ -27,6 +27,10 @@ module RBS
27
27
  method_definition = @builder.build_singleton(module_name.absolute!).methods[method.name]
28
28
  return false unless method_definition
29
29
 
30
+ return false unless method_definition.defs.any? do |type_def|
31
+ type_def.implemented_in&.relative!.to_s == method.owner.to_s.delete_prefix("#<Class:").delete_suffix(">")
32
+ end
33
+
30
34
  method_definition.accessibility == accessibility
31
35
  end
32
36
 
@@ -36,6 +40,10 @@ module RBS
36
40
  method_definition = @builder.build_instance(module_name.absolute!).methods[method.name]
37
41
  return false unless method_definition
38
42
 
43
+ return false unless method_definition.defs.any? do |type_def|
44
+ type_def.implemented_in&.relative!.to_s == method.owner.to_s
45
+ end
46
+
39
47
  method_definition.accessibility == accessibility
40
48
  end
41
49
 
@@ -50,8 +58,8 @@ module RBS
50
58
  type_name_absolute = type_name.absolute!
51
59
  @mixin_decls_cache ||= {} #: Hash[TypeName, Array[AST::Members::Mixin]]
52
60
  @mixin_decls_cache.fetch(type_name_absolute) do
53
- @mixin_decls_cache[type_name_absolute] = @builder.env.class_decls[type_name_absolute].decls.flat_map do |d|
54
- d.decl.members.select { |m| m.kind_of?(AST::Members::Mixin) }
61
+ @mixin_decls_cache[type_name_absolute] = @builder.env.class_decls[type_name_absolute].each_decl.flat_map do |decl|
62
+ decl.members.select { |m| m.kind_of?(AST::Members::Mixin) }
55
63
  end
56
64
  end
57
65
  end
@@ -32,7 +32,7 @@ module RBS
32
32
  end
33
33
 
34
34
  environment.class_alias_decls.each do |name, entry|
35
- normalized_entry = environment.normalized_module_class_entry(name) or next
35
+ normalized_entry = environment.module_class_entry(name, normalized: true) or next
36
36
  constant = constant_of_module(name, normalized_entry)
37
37
 
38
38
  # Insert class/module aliases into `children_table` and `toplevel` table
@@ -176,7 +176,7 @@ module RBS
176
176
  end
177
177
 
178
178
  def constants_from_ancestors(module_name, constants:)
179
- entry = builder.env.normalized_module_class_entry(module_name) or raise
179
+ entry = builder.env.module_class_entry(module_name, normalized: true) or raise
180
180
 
181
181
  if entry.is_a?(Environment::ClassEntry) || entry.is_a?(Environment::ModuleEntry)
182
182
  constants.merge!(table.children(BuiltinNames::Object.name) || raise)
@@ -5,17 +5,28 @@ module RBS
5
5
  class TypeNameResolver
6
6
  attr_reader :all_names
7
7
  attr_reader :cache
8
- attr_reader :env
8
+ attr_reader :aliases
9
9
 
10
- def initialize(env)
11
- @all_names = Set[]
10
+ def initialize(all_names, aliases)
11
+ @all_names = all_names
12
+ @aliases = aliases
12
13
  @cache = {}
13
- @env = env
14
+ end
15
+
16
+ def self.build(env)
17
+ all_names = Set.new #: Set[TypeName]
14
18
 
15
19
  all_names.merge(env.class_decls.keys)
16
20
  all_names.merge(env.interface_decls.keys)
17
21
  all_names.merge(env.type_alias_decls.keys)
18
- all_names.merge(env.class_alias_decls.keys)
22
+
23
+ aliases = {} #: Hash[TypeName, [TypeName, context]]
24
+
25
+ env.class_alias_decls.each do |name, entry|
26
+ aliases[name] = [entry.decl.old_name, entry.context]
27
+ end
28
+
29
+ new(all_names, aliases)
19
30
  end
20
31
 
21
32
  def try_cache(query)
@@ -26,64 +37,131 @@ module RBS
26
37
  end
27
38
 
28
39
  def resolve(type_name, context:)
29
- if type_name.absolute?
40
+ if type_name.absolute? && has_type_name?(type_name)
30
41
  return type_name
31
42
  end
32
43
 
33
44
  try_cache([type_name, context]) do
34
- head, tail = partition(type_name)
45
+ if type_name.class?
46
+ resolve_namespace0(type_name, context, Set.new) || nil
47
+ else
48
+ namespace = type_name.namespace
35
49
 
36
- head = resolve_in(head, context)
37
-
38
- if head
39
- if tail
40
- absolute_name = tail.with_prefix(head.to_namespace)
41
- if env.normalize_type_name?(absolute_name)
42
- absolute_name
43
- end
50
+ if namespace.empty?
51
+ resolve_type_name(type_name.name, context)
44
52
  else
45
- head
53
+ if namespace = resolve_namespace0(namespace.to_type_name, context, Set.new)
54
+ type_name = TypeName.new(name: type_name.name, namespace: namespace.to_namespace)
55
+ has_type_name?(type_name)
56
+ end
46
57
  end
47
58
  end
48
59
  end
49
60
  end
50
61
 
51
- def partition(type_name)
52
- if type_name.namespace.empty?
53
- head = type_name.name
54
- tail = nil
55
- else
56
- head, *tail = type_name.namespace.path
62
+ def resolve_namespace(type_name, context:)
63
+ if type_name.absolute? && has_type_name?(type_name)
64
+ return type_name
65
+ end
57
66
 
58
- head or raise
67
+ unless type_name.class?
68
+ raise "Type name must be a class name: #{type_name}"
69
+ end
59
70
 
60
- tail = TypeName.new(
61
- name: type_name.name,
62
- namespace: Namespace.new(absolute: false, path: tail)
63
- )
71
+ try_cache([type_name, context]) do
72
+ ns = resolve_namespace0(type_name, context, Set.new) or return ns
64
73
  end
74
+ end
65
75
 
66
- [head, tail]
76
+ def has_type_name?(full_name)
77
+ if all_names.include?(full_name)
78
+ full_name
79
+ end
67
80
  end
68
81
 
69
- def resolve_in(head, context)
82
+ def aliased_name?(type_name)
83
+ if aliases.key?(type_name)
84
+ type_name
85
+ end
86
+ end
87
+
88
+ def resolve_type_name(type_name, context)
70
89
  if context
71
- parent, child = context
72
- case child
90
+ outer, inner = context
91
+ case inner
73
92
  when false
74
- resolve_in(head, parent)
93
+ resolve_type_name(type_name, outer)
94
+ else
95
+ has_type_name?(inner) or raise "Context must be normalized: #{inner.inspect}"
96
+ has_type_name?(TypeName.new(name: type_name, namespace: inner.to_namespace)) || resolve_type_name(type_name, outer)
97
+ end
98
+ else
99
+ type_name = TypeName.new(name: type_name, namespace: Namespace.root)
100
+ has_type_name?(type_name)
101
+ end
102
+ end
103
+
104
+ def resolve_head_namespace(head, context)
105
+ if context
106
+ outer, inner = context
107
+ case inner
108
+ when false
109
+ resolve_head_namespace(head, outer)
75
110
  when TypeName
76
- name = TypeName.new(name: head, namespace: child.to_namespace)
77
- has_name?(name) || resolve_in(head, parent)
111
+ has_type_name?(inner) or raise "Context must be normalized: #{inner.inspect}"
112
+ type_name = TypeName.new(name: head, namespace: inner.to_namespace)
113
+ has_type_name?(type_name) || aliased_name?(type_name) || resolve_head_namespace(head, outer)
78
114
  end
79
115
  else
80
- has_name?(TypeName.new(name: head, namespace: Namespace.root))
116
+ type_name = TypeName.new(name: head, namespace: Namespace.root)
117
+ has_type_name?(type_name) || aliased_name?(type_name)
81
118
  end
82
119
  end
83
120
 
84
- def has_name?(full_name)
85
- if all_names.include?(full_name)
86
- full_name
121
+ def normalize_namespace(type_name, rhs, context, visited)
122
+ if visited.include?(type_name)
123
+ # Cycle detected
124
+ return false
125
+ end
126
+
127
+ visited << type_name
128
+
129
+ begin
130
+ resolve_namespace0(rhs, context, visited)
131
+ ensure
132
+ visited.delete(type_name)
133
+ end
134
+ end
135
+
136
+ def resolve_namespace0(type_name, context, visited)
137
+ head, *tail = [*type_name.namespace.path, type_name.name]
138
+
139
+ head = head #: Symbol
140
+
141
+ head =
142
+ if type_name.absolute?
143
+ root_name = TypeName.new(name: head, namespace: Namespace.root)
144
+ has_type_name?(root_name) || aliased_name?(root_name)
145
+ else
146
+ resolve_head_namespace(head, context)
147
+ end
148
+
149
+ if head
150
+ if (rhs, context = aliases.fetch(head, nil))
151
+ head = normalize_namespace(head, rhs, context, visited) or return head
152
+ end
153
+
154
+ tail.inject(head) do |namespace, name|
155
+ type_name = TypeName.new(name: name, namespace: namespace.to_namespace)
156
+ case
157
+ when has_type_name?(type_name)
158
+ type_name
159
+ when (rhs, context = aliases.fetch(type_name, nil))
160
+ m = normalize_namespace(type_name, rhs, context, visited) or return m
161
+ else
162
+ return nil
163
+ end
164
+ end
87
165
  end
88
166
  end
89
167
  end
data/lib/rbs/source.rb ADDED
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Source
5
+ class RBS
6
+ attr_reader :buffer, :directives, :declarations
7
+
8
+ def initialize(buffer, directives, decls)
9
+ @buffer = buffer
10
+ @directives = directives
11
+ @declarations = decls
12
+ end
13
+
14
+ def each_type_name(&block)
15
+ if block
16
+ set = Set[] #: Set[TypeName]
17
+ declarations.each do |decl|
18
+ each_declaration_type_name(set, decl, &block)
19
+ end
20
+ else
21
+ enum_for :each_type_name
22
+ end
23
+ end
24
+
25
+ def each_declaration_type_name(names, decl, &block)
26
+ case decl
27
+ when AST::Declarations::Class
28
+ decl.each_decl { each_declaration_type_name(names, _1, &block) }
29
+ type_name = decl.name
30
+ when AST::Declarations::Module
31
+ decl.each_decl { each_declaration_type_name(names, _1, &block) }
32
+ type_name = decl.name
33
+ when AST::Declarations::Interface
34
+ type_name = decl.name
35
+ when AST::Declarations::TypeAlias
36
+ type_name = decl.name
37
+ when AST::Declarations::ModuleAlias
38
+ type_name = decl.new_name
39
+ when AST::Declarations::ClassAlias
40
+ type_name = decl.new_name
41
+ end
42
+
43
+ if type_name
44
+ unless names.include?(type_name)
45
+ yield type_name
46
+ names << type_name
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ class Ruby
53
+ attr_reader :buffer
54
+ attr_reader :prism_result
55
+ attr_reader :declarations
56
+ attr_reader :diagnostics
57
+
58
+ def initialize(buffer, prism, declarations, diagnostics)
59
+ @buffer = buffer
60
+ @prism_result = prism
61
+ @declarations = declarations
62
+ @diagnostics = diagnostics
63
+ end
64
+
65
+ def each_type_name(&block)
66
+ if block
67
+ names = Set[] #: Set[TypeName]
68
+ declarations.each do |decl|
69
+ each_declaration_type_name(names, decl, &block)
70
+ end
71
+ else
72
+ enum_for :each_type_name
73
+ end
74
+ end
75
+
76
+ def each_declaration_type_name(names, decl, &block)
77
+ case decl
78
+ when AST::Ruby::Declarations::ClassDecl
79
+ decl.each_decl do |d|
80
+ each_declaration_type_name(names, d, &block)
81
+ end
82
+ type_name = decl.class_name
83
+ when AST::Ruby::Declarations::ModuleDecl
84
+ decl.each_decl do |d|
85
+ each_declaration_type_name(names, d, &block)
86
+ end
87
+ type_name = decl.module_name
88
+ end
89
+
90
+ if type_name
91
+ unless names.include?(type_name)
92
+ yield type_name
93
+ names << type_name
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -107,7 +107,9 @@ module RBS
107
107
  each_member(owner).any? do |m|
108
108
  case m
109
109
  when AST::Members::InstanceVariable
110
- m.name == name
110
+ m.name == name && kind == :instance
111
+ when AST::Members::ClassInstanceVariable
112
+ m.name == name && kind == :singleton
111
113
  when AST::Members::Attribute
112
114
  ivar_name = m.ivar_name == false ? nil : m.ivar_name || :"@#{m.name}"
113
115
  ivar_name == name && m.kind == kind
@@ -129,9 +131,10 @@ module RBS
129
131
 
130
132
  entry = @subtrahend.class_decls[owner]
131
133
  return unless entry
132
- decls = entry.decls.map { |d| d.decl }
133
-
134
- decls.each { |d| d.members.each { |m| block.call(m) } }
134
+ entry.each_decl do |d|
135
+ next unless d.is_a?(AST::Declarations::Base)
136
+ d.members.each { |m| block.call(m) }
137
+ end
135
138
  end
136
139
 
137
140
  private def mixin_exist?(owner, mixin, context:)
@@ -245,7 +245,7 @@ module RBS
245
245
  when Types::Bases::Any
246
246
  true
247
247
  when Types::Bases::Bool
248
- val.is_a?(TrueClass) || val.is_a?(FalseClass)
248
+ Test.call(val, IS_AP, TrueClass) || Test.call(val, IS_AP, FalseClass)
249
249
  when Types::Bases::Top
250
250
  true
251
251
  when Types::Bases::Bottom
@@ -264,6 +264,9 @@ module RBS
264
264
  klass = get_class(type.name) or return false
265
265
  if params = builder.env.normalized_module_class_entry(type.name.absolute!)&.type_params
266
266
  args = AST::TypeParam.normalize_args(params, type.args)
267
+ if args.size != params.size
268
+ return false
269
+ end
267
270
  unless args == type.args
268
271
  type = Types::ClassInstance.new(name: type.name, args: args, location: type.location)
269
272
  end
@@ -288,6 +291,19 @@ module RBS
288
291
  values << args
289
292
  nil
290
293
  end
294
+ when nil
295
+ values = []
296
+ count = 10_000
297
+
298
+ ret = val.each do |*args|
299
+ count -= 1
300
+ values << args
301
+ break if count <= 0
302
+ end
303
+
304
+ if count == 0
305
+ ret = self
306
+ end
291
307
  else
292
308
  values = []
293
309
  ret = val.each do |*args|
@@ -323,7 +339,7 @@ module RBS
323
339
  rescue TypeError
324
340
  return false
325
341
  end
326
- val.is_a?(singleton_class)
342
+ Test.call(val, IS_AP, singleton_class)
327
343
  when Types::Interface
328
344
  if (definition = builder.build_interface(type.name.absolute!))
329
345
  definition.methods.each.all? do |method_name, method|
@@ -351,6 +367,7 @@ module RBS
351
367
  value(val, builder.expand_alias2(type.name.absolute!, type.args))
352
368
  when Types::Tuple
353
369
  Test.call(val, IS_AP, ::Array) &&
370
+ type.types.length == val.length &&
354
371
  type.types.map.with_index {|ty, index| value(val[index], ty) }.all?
355
372
  when Types::Record
356
373
  Test::call(val, IS_AP, ::Hash) &&
data/lib/rbs/type_name.rb CHANGED
@@ -36,7 +36,7 @@ module RBS
36
36
  "#{namespace.to_s}#{name}"
37
37
  end
38
38
 
39
- def to_json(state = _ = nil)
39
+ def to_json(state = nil)
40
40
  to_s.to_json(state)
41
41
  end
42
42
 
@@ -100,10 +100,3 @@ module RBS
100
100
  end
101
101
  end
102
102
  end
103
-
104
- module Kernel
105
- def TypeName(string)
106
- warn "Kernel#TypeName() is deprecated. Use RBS::TypeName.parse instead.", category: :deprecated
107
- RBS::TypeName.parse(string)
108
- end
109
- end