rbs 3.10.4 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +7 -5
  5. data/.github/workflows/comments.yml +2 -2
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +16 -26
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +1 -1
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +2 -2
  12. data/.vscode/extensions.json +5 -0
  13. data/.vscode/settings.json +19 -0
  14. data/CHANGELOG.md +202 -2
  15. data/Rakefile +9 -23
  16. data/Steepfile +2 -0
  17. data/config.yml +457 -13
  18. data/core/array.rbs +218 -188
  19. data/core/basic_object.rbs +9 -8
  20. data/core/binding.rbs +0 -2
  21. data/core/builtin.rbs +2 -2
  22. data/core/class.rbs +6 -5
  23. data/core/comparable.rbs +45 -31
  24. data/core/complex.rbs +66 -55
  25. data/core/dir.rbs +57 -45
  26. data/core/encoding.rbs +6 -6
  27. data/core/enumerable.rbs +105 -91
  28. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  29. data/core/enumerator.rbs +24 -3
  30. data/core/errno.rbs +3 -2
  31. data/core/errors.rbs +31 -29
  32. data/core/exception.rbs +12 -12
  33. data/core/fiber.rbs +47 -36
  34. data/core/file.rbs +242 -169
  35. data/core/file_test.rbs +2 -2
  36. data/core/float.rbs +42 -68
  37. data/core/gc.rbs +78 -70
  38. data/core/hash.rbs +70 -60
  39. data/core/integer.rbs +32 -75
  40. data/core/io/buffer.rbs +36 -36
  41. data/core/io/wait.rbs +7 -7
  42. data/core/io.rbs +192 -146
  43. data/core/kernel.rbs +198 -147
  44. data/core/marshal.rbs +3 -3
  45. data/core/match_data.rbs +14 -12
  46. data/core/math.rbs +69 -67
  47. data/core/method.rbs +6 -8
  48. data/core/module.rbs +148 -88
  49. data/core/nil_class.rbs +4 -3
  50. data/core/numeric.rbs +53 -50
  51. data/core/object.rbs +6 -8
  52. data/core/object_space.rbs +11 -10
  53. data/core/pathname.rbs +131 -81
  54. data/core/proc.rbs +65 -34
  55. data/core/process.rbs +221 -201
  56. data/core/ractor.rbs +15 -11
  57. data/core/random.rbs +21 -3
  58. data/core/range.rbs +152 -49
  59. data/core/rational.rbs +5 -56
  60. data/core/rbs/unnamed/argf.rbs +58 -51
  61. data/core/rbs/unnamed/env_class.rbs +18 -13
  62. data/core/rbs/unnamed/main_class.rbs +123 -0
  63. data/core/rbs/unnamed/random.rbs +7 -116
  64. data/core/regexp.rbs +236 -197
  65. data/core/ruby.rbs +1 -1
  66. data/core/ruby_vm.rbs +32 -30
  67. data/core/rubygems/config_file.rbs +5 -5
  68. data/core/rubygems/errors.rbs +1 -1
  69. data/core/rubygems/requirement.rbs +5 -5
  70. data/core/rubygems/rubygems.rbs +5 -3
  71. data/core/set.rbs +17 -16
  72. data/core/signal.rbs +2 -2
  73. data/core/string.rbs +318 -298
  74. data/core/struct.rbs +26 -25
  75. data/core/symbol.rbs +25 -24
  76. data/core/thread.rbs +40 -41
  77. data/core/time.rbs +47 -42
  78. data/core/trace_point.rbs +34 -31
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +10 -10
  81. data/core/warning.rbs +7 -7
  82. data/docs/collection.md +1 -1
  83. data/docs/config.md +171 -0
  84. data/docs/inline.md +576 -0
  85. data/docs/syntax.md +46 -16
  86. data/docs/type_fingerprint.md +21 -0
  87. data/exe/rbs +1 -1
  88. data/ext/rbs_extension/ast_translation.c +595 -98
  89. data/ext/rbs_extension/class_constants.c +30 -0
  90. data/ext/rbs_extension/class_constants.h +15 -0
  91. data/ext/rbs_extension/legacy_location.c +30 -53
  92. data/ext/rbs_extension/legacy_location.h +37 -0
  93. data/ext/rbs_extension/main.c +125 -24
  94. data/include/rbs/ast.h +485 -150
  95. data/include/rbs/lexer.h +11 -4
  96. data/include/rbs/location.h +25 -44
  97. data/include/rbs/parser.h +20 -2
  98. data/include/rbs/util/rbs_constant_pool.h +0 -3
  99. data/include/rbs.h +8 -0
  100. data/lib/rbs/ast/annotation.rb +1 -1
  101. data/lib/rbs/ast/comment.rb +1 -1
  102. data/lib/rbs/ast/declarations.rb +10 -10
  103. data/lib/rbs/ast/members.rb +14 -14
  104. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  105. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  106. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  107. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  108. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  109. data/lib/rbs/ast/ruby/members.rb +723 -0
  110. data/lib/rbs/ast/type_param.rb +24 -4
  111. data/lib/rbs/buffer.rb +105 -20
  112. data/lib/rbs/cli/diff.rb +16 -15
  113. data/lib/rbs/cli/validate.rb +62 -125
  114. data/lib/rbs/cli.rb +55 -23
  115. data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
  116. data/lib/rbs/collection/sources/git.rb +1 -0
  117. data/lib/rbs/collection.rb +0 -1
  118. data/lib/rbs/definition.rb +6 -1
  119. data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
  120. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  121. data/lib/rbs/definition_builder.rb +177 -20
  122. data/lib/rbs/diff.rb +7 -1
  123. data/lib/rbs/environment/class_entry.rb +69 -0
  124. data/lib/rbs/environment/module_entry.rb +66 -0
  125. data/lib/rbs/environment.rb +338 -155
  126. data/lib/rbs/environment_loader.rb +2 -2
  127. data/lib/rbs/errors.rb +30 -20
  128. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  129. data/lib/rbs/inline_parser.rb +542 -0
  130. data/lib/rbs/location_aux.rb +36 -4
  131. data/lib/rbs/locator.rb +5 -1
  132. data/lib/rbs/method_type.rb +5 -3
  133. data/lib/rbs/namespace.rb +0 -7
  134. data/lib/rbs/parser_aux.rb +31 -8
  135. data/lib/rbs/prototype/helpers.rb +57 -0
  136. data/lib/rbs/prototype/rb.rb +3 -28
  137. data/lib/rbs/prototype/rbi.rb +3 -20
  138. data/lib/rbs/prototype/runtime.rb +10 -2
  139. data/lib/rbs/resolver/type_name_resolver.rb +0 -8
  140. data/lib/rbs/source.rb +99 -0
  141. data/lib/rbs/subtractor.rb +4 -3
  142. data/lib/rbs/test/type_check.rb +5 -2
  143. data/lib/rbs/type_name.rb +1 -8
  144. data/lib/rbs/types.rb +88 -78
  145. data/lib/rbs/unit_test/convertibles.rb +1 -0
  146. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  147. data/lib/rbs/validator.rb +2 -2
  148. data/lib/rbs/version.rb +1 -1
  149. data/lib/rbs.rb +12 -1
  150. data/rbs.gemspec +3 -2
  151. data/rust/.gitignore +1 -0
  152. data/rust/Cargo.lock +378 -0
  153. data/rust/Cargo.toml +7 -0
  154. data/rust/ruby-rbs/Cargo.toml +22 -0
  155. data/rust/ruby-rbs/build.rs +764 -0
  156. data/rust/ruby-rbs/examples/locations.rs +60 -0
  157. data/rust/ruby-rbs/src/lib.rs +1 -0
  158. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  159. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  160. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  161. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  162. data/rust/ruby-rbs-sys/build.rs +204 -0
  163. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  164. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  165. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  166. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  167. data/schema/typeParam.json +17 -1
  168. data/sig/ancestor_builder.rbs +1 -1
  169. data/sig/ast/ruby/annotations.rbs +421 -0
  170. data/sig/ast/ruby/comment_block.rbs +127 -0
  171. data/sig/ast/ruby/declarations.rbs +158 -0
  172. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  173. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  174. data/sig/ast/ruby/members.rbs +178 -0
  175. data/sig/buffer.rbs +63 -5
  176. data/sig/cli/diff.rbs +5 -11
  177. data/sig/cli/validate.rbs +12 -8
  178. data/sig/cli.rbs +18 -18
  179. data/sig/definition.rbs +6 -0
  180. data/sig/definition_builder.rbs +3 -1
  181. data/sig/environment/class_entry.rbs +50 -0
  182. data/sig/environment/module_entry.rbs +50 -0
  183. data/sig/environment.rbs +37 -81
  184. data/sig/errors.rbs +26 -20
  185. data/sig/inline_parser/comment_association.rbs +71 -0
  186. data/sig/inline_parser.rbs +124 -0
  187. data/sig/location.rbs +32 -7
  188. data/sig/locator.rbs +0 -2
  189. data/sig/method_builder.rbs +9 -4
  190. data/sig/namespace.rbs +0 -5
  191. data/sig/parser.rbs +47 -13
  192. data/sig/prototype/helpers.rbs +2 -0
  193. data/sig/resolver/type_name_resolver.rbs +0 -3
  194. data/sig/source.rbs +48 -0
  195. data/sig/type_param.rbs +13 -8
  196. data/sig/typename.rbs +0 -5
  197. data/sig/types.rbs +6 -7
  198. data/sig/unit_test/spy.rbs +0 -8
  199. data/sig/unit_test/type_assertions.rbs +11 -0
  200. data/src/ast.c +491 -143
  201. data/src/lexer.c +1552 -1314
  202. data/src/lexer.re +7 -0
  203. data/src/lexstate.c +8 -1
  204. data/src/location.c +8 -48
  205. data/src/parser.c +1107 -409
  206. data/src/util/rbs_constant_pool.c +0 -4
  207. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
  208. data/stdlib/cgi-escape/0/escape.rbs +4 -4
  209. data/stdlib/coverage/0/coverage.rbs +4 -3
  210. data/stdlib/date/0/date.rbs +33 -28
  211. data/stdlib/date/0/date_time.rbs +24 -23
  212. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  213. data/stdlib/digest/0/digest.rbs +110 -0
  214. data/stdlib/erb/0/erb.rbs +64 -53
  215. data/stdlib/etc/0/etc.rbs +55 -50
  216. data/stdlib/fileutils/0/fileutils.rbs +140 -126
  217. data/stdlib/forwardable/0/forwardable.rbs +10 -10
  218. data/stdlib/io-console/0/io-console.rbs +2 -2
  219. data/stdlib/json/0/json.rbs +158 -131
  220. data/stdlib/monitor/0/monitor.rbs +3 -3
  221. data/stdlib/net-http/0/net-http.rbs +159 -134
  222. data/stdlib/objspace/0/objspace.rbs +8 -30
  223. data/stdlib/open-uri/0/open-uri.rbs +8 -8
  224. data/stdlib/open3/0/open3.rbs +469 -10
  225. data/stdlib/openssl/0/openssl.rbs +144 -129
  226. data/stdlib/optparse/0/optparse.rbs +23 -14
  227. data/stdlib/pathname/0/pathname.rbs +2 -2
  228. data/stdlib/pp/0/pp.rbs +9 -8
  229. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  230. data/stdlib/pstore/0/pstore.rbs +35 -30
  231. data/stdlib/psych/0/psych.rbs +62 -9
  232. data/stdlib/psych/0/store.rbs +2 -4
  233. data/stdlib/pty/0/pty.rbs +9 -6
  234. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  235. data/stdlib/rdoc/0/code_object.rbs +2 -1
  236. data/stdlib/rdoc/0/parser.rbs +1 -1
  237. data/stdlib/rdoc/0/store.rbs +1 -1
  238. data/stdlib/ripper/0/ripper.rbs +20 -17
  239. data/stdlib/securerandom/0/manifest.yaml +2 -0
  240. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  241. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  242. data/stdlib/socket/0/addrinfo.rbs +9 -9
  243. data/stdlib/socket/0/basic_socket.rbs +3 -3
  244. data/stdlib/socket/0/ip_socket.rbs +10 -8
  245. data/stdlib/socket/0/socket.rbs +10 -9
  246. data/stdlib/socket/0/tcp_server.rbs +1 -1
  247. data/stdlib/socket/0/tcp_socket.rbs +1 -1
  248. data/stdlib/socket/0/udp_socket.rbs +1 -1
  249. data/stdlib/socket/0/unix_server.rbs +1 -1
  250. data/stdlib/stringio/0/stringio.rbs +55 -54
  251. data/stdlib/strscan/0/string_scanner.rbs +46 -44
  252. data/stdlib/tempfile/0/tempfile.rbs +24 -20
  253. data/stdlib/time/0/time.rbs +7 -5
  254. data/stdlib/tsort/0/tsort.rbs +7 -6
  255. data/stdlib/uri/0/common.rbs +31 -18
  256. data/stdlib/uri/0/file.rbs +2 -2
  257. data/stdlib/uri/0/generic.rbs +9 -2
  258. data/stdlib/uri/0/http.rbs +2 -2
  259. data/stdlib/uri/0/ldap.rbs +2 -2
  260. data/stdlib/uri/0/mailto.rbs +3 -3
  261. data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
  262. data/stdlib/zlib/0/deflate.rbs +4 -3
  263. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  264. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  265. data/stdlib/zlib/0/inflate.rbs +1 -1
  266. data/stdlib/zlib/0/need_dict.rbs +1 -1
  267. metadata +66 -3
@@ -0,0 +1,421 @@
1
+ module RBS
2
+ module AST
3
+ module Ruby
4
+ module Annotations
5
+ type leading_annotation = ColonMethodTypeAnnotation
6
+ | MethodTypesAnnotation
7
+ | SkipAnnotation
8
+ | ReturnTypeAnnotation
9
+ | InstanceVariableAnnotation
10
+ | ParamTypeAnnotation
11
+ | SplatParamTypeAnnotation
12
+ | DoubleSplatParamTypeAnnotation
13
+ | BlockParamTypeAnnotation
14
+
15
+ type trailing_annotation = NodeTypeAssertion
16
+ | TypeApplicationAnnotation
17
+ | ClassAliasAnnotation
18
+ | ModuleAliasAnnotation
19
+
20
+ type t = leading_annotation | trailing_annotation
21
+
22
+ class Base
23
+ # Location that covers all of the annotation
24
+ #
25
+ attr_reader location: Location
26
+
27
+ # Location of `@rbs`, `@rbs!`, or `:` prefix
28
+ #
29
+ attr_reader prefix_location: Location
30
+
31
+ def initialize: (Location location, Location prefix_location) -> void
32
+
33
+ def buffer: () -> Buffer
34
+
35
+ # Returns the type fingerprint for this annotation
36
+ def type_fingerprint: () -> untyped
37
+ end
38
+
39
+ # `: TYPE` annotation attached to nodes
40
+ #
41
+ class NodeTypeAssertion < Base
42
+ attr_reader type: Types::t
43
+
44
+ def initialize: (location: Location, prefix_location: Location, type: Types::t) -> void
45
+
46
+ def map_type_name: () { (TypeName) -> TypeName } -> self
47
+
48
+ def type_fingerprint: () -> untyped
49
+ end
50
+
51
+ class AliasAnnotation < Base
52
+ attr_reader keyword_location: Location
53
+
54
+ attr_reader type_name_location: Location?
55
+
56
+ # The name of the module that will be the target of the alias
57
+ #
58
+ # - `nil` if the module/class name is unspecified
59
+ # - `TypeName` object if the module/class name is specified
60
+ #
61
+ attr_reader type_name: TypeName?
62
+
63
+ def initialize: (location: Location, prefix_location: Location, keyword_location: Location, type_name: TypeName?, type_name_location: Location?) -> void
64
+
65
+ def map_type_name: () { (TypeName) -> TypeName } -> self
66
+ end
67
+
68
+ # `: class-alias` annotation
69
+ #
70
+ # ```
71
+ # : class-alias Foo::Bar
72
+ # ^ -- prefix_location
73
+ # ^^^^^^^^^^^^ -- keyword_location
74
+ # ^^^^^^^^ -- type_name_location
75
+ # ```
76
+ #
77
+ class ClassAliasAnnotation < AliasAnnotation
78
+ def type_fingerprint: () -> untyped
79
+ end
80
+
81
+ # `: module-alias` annotation
82
+ #
83
+ # ```
84
+ # : module-alias Foo::Bar
85
+ # ^ -- prefix_location
86
+ # ^^^^^^^^^^^^ -- keyword_location
87
+ # ^^^^^^^^ -- type_name_location
88
+ # ```
89
+ #
90
+ class ModuleAliasAnnotation < AliasAnnotation
91
+ def type_fingerprint: () -> untyped
92
+ end
93
+
94
+ # `: METHOD-TYPE` annotation in leading comments
95
+ #
96
+ class ColonMethodTypeAnnotation < Base
97
+ attr_reader annotations: Array[AST::Annotation]
98
+
99
+ attr_reader method_type: MethodType
100
+
101
+ def initialize: (location: Location, prefix_location: Location, annotations: Array[AST::Annotation], method_type: MethodType) -> void
102
+
103
+ def map_type_name: () { (TypeName) -> TypeName } -> self
104
+
105
+ def type_fingerprint: () -> untyped
106
+ end
107
+
108
+ # `@rbs METHOD-TYPEs` annotation in leading comments
109
+ #
110
+ # ```
111
+ # @rbs () -> void | %a{foo} () -> String | ...
112
+ # ^^^^ -- prefix_location
113
+ # ^ -- vertical_bar_locations[0]
114
+ # ^ -- vertical_bar_locations[1]
115
+ # ^^^ -- dot3_location
116
+ # ```
117
+ class MethodTypesAnnotation < Base
118
+ class Overload = AST::Members::MethodDefinition::Overload
119
+
120
+ attr_reader overloads: Array[Overload]
121
+
122
+ attr_reader vertical_bar_locations: Array[Location]
123
+
124
+ attr_reader dot3_location: Location?
125
+
126
+ def initialize: (location: Location, prefix_location: Location, overloads: Array[Overload], vertical_bar_locations: Array[Location], dot3_location: Location?) -> void
127
+
128
+ def map_type_name: () { (TypeName) -> TypeName } -> self
129
+
130
+ def type_fingerprint: () -> untyped
131
+ end
132
+
133
+ # `@rbs skip -- comment` annotation in leading comments
134
+ #
135
+ class SkipAnnotation < Base
136
+ attr_reader skip_location: Location
137
+ attr_reader comment_location: Location?
138
+
139
+ def initialize: (location: Location, prefix_location: Location, skip_location: Location, comment_location: Location?) -> void
140
+
141
+ def type_fingerprint: () -> untyped
142
+ end
143
+
144
+ # `@rbs return: T -- comment` annotation in leading comments
145
+ #
146
+ # ```
147
+ # @rbs return: String -- Returns a string
148
+ # ^^^ -- prefix_location
149
+ # ^^^^^^ -- return_location
150
+ # ^ -- colon_location
151
+ # ^^^^^^^^^^^^^^^^^^^ -- comment
152
+ # ```
153
+ class ReturnTypeAnnotation < Base
154
+ attr_reader return_location: Location
155
+
156
+ attr_reader colon_location: Location
157
+
158
+ attr_reader return_type: Types::t
159
+
160
+ attr_reader comment_location: Location?
161
+
162
+ def initialize: (
163
+ location: Location,
164
+ prefix_location: Location,
165
+ return_location: Location,
166
+ colon_location: Location,
167
+ return_type: Types::t,
168
+ comment_location: Location?,
169
+ ) -> void
170
+
171
+ def map_type_name: () { (TypeName) -> TypeName } -> self
172
+
173
+ def type_fingerprint: () -> untyped
174
+ end
175
+
176
+ # `[T1, T2, ...]` annotation in trailing comments
177
+ #
178
+ # ```
179
+ # #[String, Integer]
180
+ # ^ -- prefix_location
181
+ # ^ -- comma_locations[0]
182
+ # ^ -- close_bracket_location
183
+ # ```
184
+ #
185
+ class TypeApplicationAnnotation < Base
186
+ attr_reader type_args: Array[Types::t]
187
+
188
+ attr_reader close_bracket_location: Location
189
+
190
+ attr_reader comma_locations: Array[Location]
191
+
192
+ def initialize: (
193
+ location: Location,
194
+ prefix_location: Location,
195
+ type_args: Array[Types::t],
196
+ close_bracket_location: Location,
197
+ comma_locations: Array[Location],
198
+ ) -> void
199
+
200
+ def map_type_name: () { (TypeName) -> TypeName } -> self
201
+
202
+ def type_fingerprint: () -> untyped
203
+ end
204
+
205
+ # `@rbs IVAR-NAME : TYPE` annotation in leading comments
206
+ #
207
+ # ```
208
+ # @rbs @foo : String -- comment
209
+ # ^^^^ -- prefix_location
210
+ # ^^^^ -- ivar_name_location
211
+ # ^ -- colon_location
212
+ # ^^^^^^^^^^ -- comment_location
213
+ # ```
214
+ class InstanceVariableAnnotation < Base
215
+ attr_reader ivar_name: Symbol
216
+
217
+ attr_reader ivar_name_location: Location
218
+
219
+ attr_reader colon_location: Location
220
+
221
+ attr_reader type: Types::t
222
+
223
+ attr_reader comment_location: Location?
224
+
225
+ def initialize: (
226
+ location: Location,
227
+ prefix_location: Location,
228
+ ivar_name: Symbol,
229
+ ivar_name_location: Location,
230
+ colon_location: Location,
231
+ type: Types::t,
232
+ comment_location: Location?,
233
+ ) -> void
234
+
235
+ def map_type_name: () { (TypeName) -> TypeName } -> self
236
+
237
+ def type_fingerprint: () -> untyped
238
+ end
239
+
240
+ class ParamTypeAnnotation < Base
241
+ attr_reader name_location: Location
242
+
243
+ attr_reader colon_location: Location
244
+
245
+ attr_reader param_type: Types::t
246
+
247
+ attr_reader comment_location: Location?
248
+
249
+ def initialize: (
250
+ location: Location,
251
+ prefix_location: Location,
252
+ name_location: Location,
253
+ colon_location: Location,
254
+ param_type: Types::t,
255
+ comment_location: Location?,
256
+ ) -> void
257
+
258
+ def map_type_name: () { (TypeName) -> TypeName } -> self
259
+
260
+ def type_fingerprint: () -> untyped
261
+
262
+ %a{pure}
263
+ def name: () -> Symbol
264
+ end
265
+
266
+ # `@rbs *name: Type -- comment` annotation in leading comments
267
+ #
268
+ # ```
269
+ # @rbs *a: String -- comment
270
+ # ^^^^ -- prefix_location
271
+ # ^ -- star_location
272
+ # ^ -- name_location
273
+ # ^ -- colon_location
274
+ # ^^^^^^^^^^ -- comment_location
275
+ # ```
276
+ #
277
+ # ```
278
+ # @rbs *: String
279
+ # ^^^^ -- prefix_location
280
+ # ^ -- star_location
281
+ # ^ -- colon_location
282
+ # ```
283
+ #
284
+ class SplatParamTypeAnnotation < Base
285
+ attr_reader star_location: Location
286
+
287
+ attr_reader name_location: Location?
288
+
289
+ attr_reader colon_location: Location
290
+
291
+ attr_reader param_type: Types::t
292
+
293
+ attr_reader comment_location: Location?
294
+
295
+ def initialize: (
296
+ location: Location,
297
+ prefix_location: Location,
298
+ star_location: Location,
299
+ name_location: Location?,
300
+ colon_location: Location,
301
+ param_type: Types::t,
302
+ comment_location: Location?,
303
+ ) -> void
304
+
305
+ def map_type_name: () { (TypeName) -> TypeName } -> self
306
+
307
+ def type_fingerprint: () -> untyped
308
+
309
+ %a{pure}
310
+ def name: () -> Symbol?
311
+ end
312
+
313
+ # `@rbs **name: Type -- comment` annotation in leading comments
314
+ #
315
+ # ```
316
+ # @rbs **b: bool -- comment
317
+ # ^^^^ -- prefix_location
318
+ # ^^ -- star2_location
319
+ # ^ -- name_location
320
+ # ^ -- colon_location
321
+ # ^^^^^^^^^^ -- comment_location
322
+ # ```
323
+ #
324
+ # ```
325
+ # @rbs **: bool
326
+ # ^^^^ -- prefix_location
327
+ # ^^ -- star2_location
328
+ # ^ -- colon_location
329
+ # ```
330
+ #
331
+ class DoubleSplatParamTypeAnnotation < Base
332
+ attr_reader star2_location: Location
333
+
334
+ attr_reader name_location: Location?
335
+
336
+ attr_reader colon_location: Location
337
+
338
+ attr_reader param_type: Types::t
339
+
340
+ attr_reader comment_location: Location?
341
+
342
+ def initialize: (
343
+ location: Location,
344
+ prefix_location: Location,
345
+ star2_location: Location,
346
+ name_location: Location?,
347
+ colon_location: Location,
348
+ param_type: Types::t,
349
+ comment_location: Location?,
350
+ ) -> void
351
+
352
+ def map_type_name: () { (TypeName) -> TypeName } -> self
353
+
354
+ def type_fingerprint: () -> untyped
355
+
356
+ %a{pure}
357
+ def name: () -> Symbol?
358
+ end
359
+
360
+ # `@rbs &name: TYPE -- comment` annotation in leading comments
361
+ #
362
+ # ```
363
+ # @rbs &block: () -> void -- comment
364
+ # ^^^^ -- prefix_location
365
+ # ^ -- ampersand_location
366
+ # ^^^^^ -- name_location
367
+ # ^ -- colon_location
368
+ # ^^^^^^^^^^ -- type_location
369
+ # ^^^^^^^^^^ -- comment_location
370
+ # ```
371
+ #
372
+ # ```
373
+ # @rbs &: ? () -> void
374
+ # ^^^^ -- prefix_location
375
+ # ^ -- ampersand_location
376
+ # ^ -- colon_location
377
+ # ^ -- question_location
378
+ # ^^^^^^^^^^ -- type_location
379
+ # ```
380
+ #
381
+ class BlockParamTypeAnnotation < Base
382
+ attr_reader ampersand_location: Location
383
+
384
+ attr_reader name_location: Location?
385
+
386
+ attr_reader colon_location: Location
387
+
388
+ attr_reader type_location: Location
389
+
390
+ attr_reader type: Types::function
391
+
392
+ attr_reader question_location: Location?
393
+
394
+ attr_reader comment_location: Location?
395
+
396
+ def initialize: (
397
+ location: Location,
398
+ prefix_location: Location,
399
+ ampersand_location: Location,
400
+ name_location: Location?,
401
+ colon_location: Location,
402
+ question_location: Location?,
403
+ type_location: Location,
404
+ type: Types::function,
405
+ comment_location: Location?,
406
+ ) -> void
407
+
408
+ def map_type_name: () { (TypeName) -> TypeName } -> self
409
+
410
+ def type_fingerprint: () -> untyped
411
+
412
+ %a{pure} def name: () -> Symbol?
413
+
414
+ def optional?: () -> bool
415
+
416
+ def required?: () -> bool
417
+ end
418
+ end
419
+ end
420
+ end
421
+ end
@@ -0,0 +1,127 @@
1
+ use Prism::Comment
2
+
3
+ module RBS
4
+ module AST
5
+ module Ruby
6
+ # CommentBlock is a collection of comments
7
+ #
8
+ # ```ruby
9
+ # # Comment1 < block1
10
+ # # Comment2 <
11
+ #
12
+ # # Comment3 < block2
13
+ # ```
14
+ #
15
+ # A comment block is a *leading* block or *trailing* block.
16
+ #
17
+ # ```ruby
18
+ # # This is leading block.
19
+ # # This is the second line of the leading block.
20
+ #
21
+ # foo # This is trailing block.
22
+ # # This is second line of the trailing block.
23
+ # ```
24
+ #
25
+ # A leading block is a comment block where all of the comments are at the start of the line content.
26
+ # A trailing block is a comment block where the first comment of the block has something at the line before the comment.
27
+ #
28
+ class CommentBlock
29
+ attr_reader name: Pathname
30
+
31
+ # Sub buffer of the contents of the comments
32
+ #
33
+ attr_reader comment_buffer: Buffer
34
+
35
+ attr_reader offsets: Array[
36
+ [
37
+ Comment,
38
+ Integer, # -- prefix size
39
+ ]
40
+ ]
41
+
42
+ def initialize: (Buffer source_buffer, Array[Comment]) -> void
43
+
44
+ # Build comment block instances
45
+ def self.build: (Buffer, Array[Comment]) -> Array[instance]
46
+
47
+ # Returns true if the comment block is a *leading* comment, which is attached to the successor node
48
+ def leading?: () -> bool
49
+
50
+ # Returns true if the comment block is a *trailing* comment, which is attached to the predecessor node
51
+ def trailing?: () -> bool
52
+
53
+ # The line number of the first comment in the block
54
+ def start_line: () -> Integer
55
+
56
+ # The line number of the last comment in the block
57
+ def end_line: () -> Integer
58
+
59
+ # The character index of `#comment_buffer` at the start of the lines
60
+ #
61
+ def line_starts: () -> Array[Integer]
62
+
63
+ # Returns the text content of the comment
64
+ def text: (Integer index) -> String
65
+
66
+ # Yields paragraph and annotation
67
+ #
68
+ # A paragraph is a sequence of lines that are separated by annotations.
69
+ # An annotation starts with a line starting with `@rbs` or `:`, and may continue with lines that has more leading spaces.
70
+ #
71
+ # ```
72
+ # # Line 1 ^ Paragraph 1
73
+ # # Line 2 |
74
+ # # |
75
+ # # Line 3 v
76
+ # # @rbs ... < Annotation 1
77
+ # # @rbs ... ^ Annotation 2
78
+ # # ... |
79
+ # # |
80
+ # # ... v
81
+ # # ^ Paragraph 2
82
+ # # Line 4 |
83
+ # # Line 5 v
84
+ # ```
85
+ #
86
+ def each_paragraph: (Array[Symbol] variables) { (Location | AST::Ruby::Annotations::leading_annotation | AnnotationSyntaxError) -> void } -> void
87
+ | (Array[Symbol] variables) -> Enumerator[Location | AST::Ruby::Annotations::leading_annotation | AnnotationSyntaxError]
88
+
89
+ # Returns a trailing annotation if it exists
90
+ #
91
+ # * Returns `nil` if the block is not a type annotation
92
+ # * Returns an annotation if the block has a type annotation
93
+ # * Returns AnnotationSyntaxError if the annotation has a syntax error
94
+ #
95
+ def trailing_annotation: (Array[Symbol] variables) -> (AST::Ruby::Annotations::trailing_annotation | AnnotationSyntaxError | nil)
96
+
97
+ class AnnotationSyntaxError
98
+ attr_reader location: Location
99
+
100
+ attr_reader error: ParsingError
101
+
102
+ def initialize: (Location, ParsingError) -> void
103
+ end
104
+
105
+ private def yield_paragraph: (Integer start_line, Integer current_line, Array[Symbol] variables) { (Location | AST::Ruby::Annotations::leading_annotation | AnnotationSyntaxError) -> void } -> void
106
+
107
+ private def yield_annotation: (Integer start_line, Integer end_line, Integer current_line, Array[Symbol] variables) { (Location | AST::Ruby::Annotations::leading_annotation | AnnotationSyntaxError) -> void } -> void
108
+
109
+ private def parse_annotation_lines: (Integer start_line, Integer end_line, Array[Symbol] variables) -> (AST::Ruby::Annotations::leading_annotation | AnnotationSyntaxError)
110
+
111
+ def comments: () -> Array[Comment]
112
+
113
+ def line_location: (Integer start_line, Integer end_line) -> Location
114
+
115
+ def location: () -> Location
116
+
117
+ private def leading_annotation?: (Integer index) -> bool
118
+
119
+ # Returns an comment object that contains the docs of from the comment block
120
+ #
121
+ # It ignores type annotations and syntax errors.
122
+ #
123
+ def as_comment: () -> AST::Comment?
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,158 @@
1
+ module RBS
2
+ module AST
3
+ module Ruby
4
+ module Declarations
5
+ type t = ClassDecl | ModuleDecl | ConstantDecl | ClassModuleAliasDecl
6
+
7
+ class Base
8
+ attr_reader buffer: Buffer
9
+
10
+ include Helpers::ConstantHelper
11
+ include Helpers::LocationHelper
12
+
13
+ def initialize: (Buffer) -> void
14
+
15
+ def type_fingerprint: () -> untyped
16
+ end
17
+
18
+ class ClassDecl < Base
19
+ class SuperClass
20
+ attr_reader operator_location: Location
21
+
22
+ attr_reader type_name_location: Location
23
+
24
+ attr_reader type_name: TypeName
25
+
26
+ attr_reader type_annotation: Annotations::TypeApplicationAnnotation?
27
+
28
+ def type_args: () -> Array[Types::t]
29
+
30
+ alias name type_name
31
+
32
+ alias args type_args
33
+
34
+ def initialize: (Location type_name_location, Location operator_location, TypeName, RBS::AST::Ruby::Annotations::TypeApplicationAnnotation?) -> void
35
+
36
+ def location: () -> Location
37
+
38
+ def type_fingerprint: () -> untyped
39
+ end
40
+
41
+ type member = t | Members::t
42
+
43
+ attr_reader class_name: TypeName
44
+
45
+ attr_reader node: Prism::ClassNode
46
+
47
+ attr_reader super_class: SuperClass?
48
+
49
+ attr_reader members: Array[member]
50
+
51
+ def initialize: (Buffer, TypeName, Prism::ClassNode, SuperClass?) -> void
52
+
53
+ def each_decl: () { (t) -> void } -> void
54
+ | () -> Enumerator[t]
55
+
56
+ def type_params: () -> Array[AST::TypeParam]
57
+
58
+ def location: () -> Location
59
+
60
+ def name_location: () -> Location
61
+
62
+ def type_fingerprint: () -> untyped
63
+ end
64
+
65
+ class ModuleDecl < Base
66
+ type member = t | Members::t
67
+
68
+ attr_reader module_name: TypeName
69
+
70
+ attr_reader node: Prism::ModuleNode
71
+
72
+ attr_reader members: Array[member]
73
+
74
+ def initialize: (Buffer, TypeName, Prism::ModuleNode) -> void
75
+
76
+ def each_decl: () { (t) -> void } -> void
77
+ | () -> Enumerator[t]
78
+
79
+ def type_params: () -> Array[AST::TypeParam]
80
+
81
+ def location: () -> Location
82
+
83
+ def self_types: () -> Array[AST::Declarations::Module::Self]
84
+
85
+ def name_location: () -> Location
86
+
87
+ def type_fingerprint: () -> untyped
88
+ end
89
+
90
+ class ConstantDecl < Base
91
+ type node = Prism::ConstantWriteNode | Prism::ConstantPathWriteNode
92
+
93
+ attr_reader leading_comment: CommentBlock?
94
+
95
+ attr_reader constant_name: TypeName
96
+
97
+ attr_reader node: node
98
+
99
+ attr_reader type_annotation: Annotations::NodeTypeAssertion?
100
+
101
+ def initialize: (Buffer, TypeName, node, CommentBlock?, Annotations::NodeTypeAssertion?) -> void
102
+
103
+ def location: () -> Location
104
+
105
+ def name_location: () -> Location
106
+
107
+ # Returns the type of the constant
108
+ #
109
+ # - When type_anntoation is given, it returns the type from the annotation.
110
+ # - When type_annotation is not given, it returns infered type from the right-hand-side of the constant assignment
111
+ # - Or it returns `untyped` type
112
+ #
113
+ def type: () -> Types::t
114
+
115
+ # Returns the comment content extracted from the leading comment block
116
+ #
117
+ def comment: () -> AST::Comment?
118
+
119
+ def type_fingerprint: () -> untyped
120
+ end
121
+
122
+ class ClassModuleAliasDecl < Base
123
+ type node = Prism::ConstantWriteNode | Prism::ConstantPathWriteNode
124
+
125
+ type annotation = Annotations::ClassAliasAnnotation | Annotations::ModuleAliasAnnotation
126
+
127
+ attr_reader node: node
128
+
129
+ attr_reader leading_comment: CommentBlock?
130
+
131
+ attr_reader new_name: TypeName
132
+
133
+ # The infered old name from the right-hand side of the constant declaration
134
+ #
135
+ # - `nil` if the annotation has the type name
136
+ #
137
+ attr_reader infered_old_name: TypeName?
138
+
139
+ attr_reader annotation: annotation
140
+
141
+ def initialize: (Buffer, node, TypeName, TypeName?, CommentBlock?, annotation) -> void
142
+
143
+ def name_location: () -> Location
144
+
145
+ def location: () -> Location
146
+
147
+ # Returns the old name of the class/module alias
148
+ #
149
+ def old_name: () -> TypeName
150
+
151
+ def comment: () -> Comment?
152
+
153
+ def type_fingerprint: () -> untyped
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end