rbs 4.0.3 → 4.1.3

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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +37 -0
  3. data/.github/dependabot.yml +1 -1
  4. data/.github/workflows/bundle-update.yml +2 -2
  5. data/.github/workflows/c-check.yml +14 -6
  6. data/.github/workflows/comments.yml +2 -2
  7. data/.github/workflows/dependabot.yml +2 -2
  8. data/.github/workflows/jruby.yml +74 -0
  9. data/.github/workflows/release-gems.yml +235 -0
  10. data/.github/workflows/ruby.yml +43 -3
  11. data/.github/workflows/rust.yml +13 -10
  12. data/.github/workflows/truffleruby.yml +54 -0
  13. data/.github/workflows/typecheck.yml +5 -2
  14. data/.github/workflows/wasm.yml +55 -0
  15. data/.github/workflows/windows.yml +5 -2
  16. data/.gitignore +8 -0
  17. data/CHANGELOG.md +113 -0
  18. data/Dockerfile.jruby +53 -0
  19. data/README.md +4 -4
  20. data/Rakefile +512 -82
  21. data/Steepfile +9 -0
  22. data/config.yml +26 -0
  23. data/core/array.rbs +243 -180
  24. data/core/builtin.rbs +7 -6
  25. data/core/class.rbs +5 -3
  26. data/core/enumerable.rbs +109 -109
  27. data/core/enumerator/product.rbs +5 -5
  28. data/core/enumerator.rbs +28 -28
  29. data/core/file.rbs +24 -1018
  30. data/core/file_constants.rbs +463 -0
  31. data/core/file_stat.rbs +534 -0
  32. data/core/float.rbs +0 -24
  33. data/core/hash.rbs +117 -101
  34. data/core/integer.rbs +21 -58
  35. data/core/io.rbs +25 -7
  36. data/core/kernel.rbs +26 -11
  37. data/core/match_data.rbs +1 -1
  38. data/core/module.rbs +88 -74
  39. data/core/numeric.rbs +3 -0
  40. data/core/object_space/weak_key_map.rbs +7 -7
  41. data/core/pathname.rbs +0 -10
  42. data/core/ractor.rbs +0 -10
  43. data/core/range.rbs +23 -23
  44. data/core/rbs/ops.rbs +154 -0
  45. data/core/rbs/unnamed/argf.rbs +3 -3
  46. data/core/ruby_vm.rbs +40 -0
  47. data/core/rubygems/errors.rbs +4 -1
  48. data/core/rubygems/requirement.rbs +0 -10
  49. data/core/rubygems/rubygems.rbs +4 -1
  50. data/core/rubygems/specification.rbs +8 -0
  51. data/core/rubygems/version.rbs +0 -160
  52. data/core/set.rbs +3 -3
  53. data/core/struct.rbs +16 -16
  54. data/core/thread.rbs +9 -14
  55. data/docs/CONTRIBUTING.md +2 -1
  56. data/docs/inline.md +65 -7
  57. data/docs/rbs_by_example.md +20 -20
  58. data/docs/release.md +247 -0
  59. data/docs/syntax.md +2 -2
  60. data/docs/wasm_serialization.md +80 -0
  61. data/ext/rbs_extension/ast_translation.c +1298 -956
  62. data/ext/rbs_extension/ast_translation.h +4 -0
  63. data/ext/rbs_extension/class_constants.c +2 -0
  64. data/ext/rbs_extension/class_constants.h +1 -0
  65. data/ext/rbs_extension/extconf.rb +1 -0
  66. data/ext/rbs_extension/legacy_location.c +11 -6
  67. data/ext/rbs_extension/main.c +139 -4
  68. data/include/rbs/ast.h +323 -298
  69. data/include/rbs/defines.h +18 -0
  70. data/include/rbs/lexer.h +1 -0
  71. data/include/rbs/serialize.h +39 -0
  72. data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
  73. data/lib/rbs/ast/ruby/annotations.rb +42 -0
  74. data/lib/rbs/ast/ruby/comment_block.rb +6 -4
  75. data/lib/rbs/ast/ruby/declarations.rb +11 -1
  76. data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
  77. data/lib/rbs/ast/ruby/members.rb +40 -1
  78. data/lib/rbs/buffer.rb +48 -11
  79. data/lib/rbs/cli.rb +3 -5
  80. data/lib/rbs/collection/config/lockfile_generator.rb +14 -1
  81. data/lib/rbs/collection/sources/git.rb +6 -0
  82. data/lib/rbs/definition_builder/method_builder.rb +12 -6
  83. data/lib/rbs/environment.rb +10 -3
  84. data/lib/rbs/inline_parser.rb +54 -28
  85. data/lib/rbs/namespace.rb +47 -11
  86. data/lib/rbs/parser_aux.rb +4 -2
  87. data/lib/rbs/prototype/rbi.rb +193 -25
  88. data/lib/rbs/prototype/runtime.rb +2 -0
  89. data/lib/rbs/resolver/type_name_resolver.rb +12 -14
  90. data/lib/rbs/rewriter.rb +70 -0
  91. data/lib/rbs/test/type_check.rb +6 -1
  92. data/lib/rbs/type_name.rb +33 -13
  93. data/lib/rbs/unit_test/type_assertions.rb +14 -5
  94. data/lib/rbs/version.rb +1 -1
  95. data/lib/rbs/wasm/deserializer.rb +213 -0
  96. data/lib/rbs/wasm/location.rb +61 -0
  97. data/lib/rbs/wasm/parser.rb +137 -0
  98. data/lib/rbs/wasm/runtime.rb +196 -0
  99. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  100. data/lib/rbs.rb +14 -2
  101. data/lib/rbs_jars.rb +39 -0
  102. data/lib/rdoc_plugin/parser.rb +5 -0
  103. data/rbs.gemspec +32 -2
  104. data/sig/annotate/rdoc_annotater.rbs +12 -9
  105. data/sig/ast/ruby/annotations.rbs +49 -0
  106. data/sig/ast/ruby/members.rbs +21 -1
  107. data/sig/buffer.rbs +19 -1
  108. data/sig/collection/config/lockfile_generator.rbs +2 -0
  109. data/sig/inline_parser.rbs +2 -0
  110. data/sig/manifest.yaml +0 -1
  111. data/sig/namespace.rbs +20 -0
  112. data/sig/parser.rbs +10 -0
  113. data/sig/prototype/rbi.rbs +33 -4
  114. data/sig/resolver/type_name_resolver.rbs +2 -4
  115. data/sig/rewriter.rbs +45 -0
  116. data/sig/typename.rbs +15 -0
  117. data/sig/unit_test/type_assertions.rbs +6 -2
  118. data/sig/wasm/deserializer.rbs +66 -0
  119. data/sig/wasm/serialization_schema.rbs +13 -0
  120. data/src/ast.c +186 -162
  121. data/src/lexer.c +220 -193
  122. data/src/lexer.re +2 -1
  123. data/src/lexstate.c +10 -1
  124. data/src/parser.c +61 -8
  125. data/src/serialize.c +958 -0
  126. data/src/util/rbs_allocator.c +14 -8
  127. data/stdlib/abbrev/0/array.rbs +1 -1
  128. data/stdlib/csv/0/csv.rbs +5 -5
  129. data/stdlib/delegate/0/delegator.rbs +2 -1
  130. data/stdlib/digest/0/digest.rbs +11 -5
  131. data/stdlib/erb/0/erb.rbs +1 -1
  132. data/stdlib/etc/0/etc.rbs +18 -4
  133. data/stdlib/fileutils/0/fileutils.rbs +21 -21
  134. data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
  135. data/stdlib/json/0/json.rbs +6 -6
  136. data/stdlib/monitor/0/monitor.rbs +2 -2
  137. data/stdlib/openssl/0/openssl.rbs +46 -40
  138. data/stdlib/resolv/0/resolv.rbs +1 -1
  139. data/stdlib/shellwords/0/shellwords.rbs +1 -1
  140. data/stdlib/stringio/0/stringio.rbs +32 -10
  141. data/stdlib/strscan/0/string_scanner.rbs +74 -55
  142. data/stdlib/tempfile/0/manifest.yaml +3 -0
  143. data/stdlib/timeout/0/timeout.rbs +0 -5
  144. data/stdlib/tsort/0/cyclic.rbs +1 -1
  145. data/stdlib/tsort/0/interfaces.rbs +8 -8
  146. data/stdlib/tsort/0/tsort.rbs +9 -9
  147. data/stdlib/uri/0/generic.rbs +0 -5
  148. data/stdlib/zlib/0/gzip_reader.rbs +2 -2
  149. data/stdlib/zlib/0/zstream.rbs +0 -1
  150. data/wasm/README.md +93 -0
  151. data/wasm/rbs_wasm.c +423 -0
  152. metadata +29 -6
  153. data/.github/workflows/milestone.yml +0 -80
  154. data/.vscode/extensions.json +0 -5
  155. data/.vscode/settings.json +0 -19
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "runtime"
4
+ require_relative "deserializer"
5
+
6
+ module RBS
7
+ # WebAssembly-backed implementation of the parser primitives.
8
+ #
9
+ # On CRuby these come from the C extension (ext/rbs_extension/main.c). JRuby
10
+ # loads this instead: it runs the parser inside WebAssembly, then rebuilds the
11
+ # AST with RBS::WASM::Deserializer. rbs/parser_aux.rb layers the public
12
+ # RBS::Parser API on top, exactly as it does for the C extension.
13
+ class Parser
14
+ class << self
15
+ def _parse_signature(buffer, start_pos, end_pos)
16
+ validate_position_range(start_pos, end_pos)
17
+ encoding = buffer.content.encoding.name
18
+ success, bytes = WASM::Runtime.instance.parse_signature(buffer.content, encoding, start_pos, end_pos)
19
+ raise_parsing_error(buffer, bytes) unless success
20
+
21
+ WASM::Deserializer.deserialize(bytes, buffer)
22
+ end
23
+
24
+ def _parse_type(buffer, start_pos, end_pos, variables, require_eof, void_allowed, self_allowed, classish_allowed)
25
+ validate_position_range(start_pos, end_pos)
26
+ validate_variables(variables)
27
+ encoding = buffer.content.encoding.name
28
+ success, bytes = WASM::Runtime.instance.parse_type(buffer.content, encoding, start_pos, end_pos, variables, require_eof, void_allowed, self_allowed, classish_allowed)
29
+ raise_parsing_error(buffer, bytes) unless success
30
+
31
+ deserialize_or_nil(bytes, buffer)
32
+ end
33
+
34
+ def _parse_method_type(buffer, start_pos, end_pos, variables, require_eof)
35
+ validate_position_range(start_pos, end_pos)
36
+ validate_variables(variables)
37
+ encoding = buffer.content.encoding.name
38
+ success, bytes = WASM::Runtime.instance.parse_method_type(buffer.content, encoding, start_pos, end_pos, variables, require_eof)
39
+ raise_parsing_error(buffer, bytes) unless success
40
+
41
+ deserialize_or_nil(bytes, buffer)
42
+ end
43
+
44
+ def _parse_type_params(buffer, start_pos, end_pos, module_type_params)
45
+ validate_position_range(start_pos, end_pos)
46
+ encoding = buffer.content.encoding.name
47
+ success, bytes = WASM::Runtime.instance.parse_type_params(buffer.content, encoding, start_pos, end_pos, module_type_params)
48
+ raise_parsing_error(buffer, bytes) unless success
49
+
50
+ bytes.empty? ? nil : WASM::Deserializer.deserialize_node_list(bytes, buffer)
51
+ end
52
+
53
+ def _lex(buffer, end_pos)
54
+ encoding = buffer.content.encoding.name
55
+ _success, bytes = WASM::Runtime.instance.lex(buffer.content, encoding, end_pos)
56
+
57
+ WASM::Deserializer.deserialize_tokens(bytes, buffer)
58
+ end
59
+
60
+ def _parse_inline_leading_annotation(buffer, start_pos, end_pos, variables)
61
+ validate_position_range(start_pos, end_pos)
62
+ validate_variables(variables)
63
+ encoding = buffer.content.encoding.name
64
+ success, bytes = WASM::Runtime.instance.parse_inline_leading_annotation(buffer.content, encoding, start_pos, end_pos, variables)
65
+ raise_parsing_error(buffer, bytes) unless success
66
+
67
+ deserialize_or_nil(bytes, buffer)
68
+ end
69
+
70
+ def _parse_inline_trailing_annotation(buffer, start_pos, end_pos, variables)
71
+ validate_position_range(start_pos, end_pos)
72
+ validate_variables(variables)
73
+ encoding = buffer.content.encoding.name
74
+ success, bytes = WASM::Runtime.instance.parse_inline_trailing_annotation(buffer.content, encoding, start_pos, end_pos, variables)
75
+ raise_parsing_error(buffer, bytes) unless success
76
+
77
+ deserialize_or_nil(bytes, buffer)
78
+ end
79
+
80
+ private
81
+
82
+ # Reject negative or reversed ranges before handing them to the parser,
83
+ # matching validate_position_range in the C extension (main.c). A reversed
84
+ # range would otherwise make the lexer loop forever inside WebAssembly.
85
+ def validate_position_range(start_pos, end_pos)
86
+ if start_pos < 0 || end_pos < 0
87
+ raise ArgumentError, "negative position range: #{start_pos}...#{end_pos}"
88
+ end
89
+ if start_pos > end_pos
90
+ raise ArgumentError, "invalid position range: #{start_pos}...#{end_pos}"
91
+ end
92
+ end
93
+
94
+ # Reject anything that is not nil or an Array of Symbols, matching
95
+ # declare_type_variables in the C extension (main.c).
96
+ def validate_variables(variables)
97
+ return if variables.nil?
98
+
99
+ unless variables.is_a?(Array)
100
+ raise TypeError, "wrong argument type #{variables.class} (must be an Array of Symbols or nil)"
101
+ end
102
+
103
+ variables.each do |variable|
104
+ unless variable.is_a?(Symbol)
105
+ raise TypeError, "Type variables Array contains invalid value #{variable.inspect} of type #{variable.class} (must be an Array of Symbols or nil)"
106
+ end
107
+ end
108
+ end
109
+
110
+ # An empty result means the parser reached EOF immediately (`nil`).
111
+ def deserialize_or_nil(bytes, buffer)
112
+ bytes.empty? ? nil : WASM::Deserializer.deserialize(bytes, buffer)
113
+ end
114
+
115
+ # Decodes the error blob written by set_error_result (rbs_wasm.c) and raises
116
+ # the same error the C extension would (see raise_error in main.c).
117
+ def raise_parsing_error(buffer, blob)
118
+ start_char, end_char, syntax_error = blob.unpack("l<l<C")
119
+
120
+ raise "Unexpected error" if syntax_error.zero?
121
+
122
+ offset = 9
123
+ token_type_length = blob.unpack1("L<", offset: offset)
124
+ offset += 4
125
+ token_type = blob.byteslice(offset, token_type_length).to_s.force_encoding(Encoding::UTF_8)
126
+ offset += token_type_length
127
+
128
+ message_length = blob.unpack1("L<", offset: offset)
129
+ offset += 4
130
+ message = blob.byteslice(offset, message_length).to_s.force_encoding(Encoding::UTF_8)
131
+
132
+ location = Location.new(buffer, start_char, end_char)
133
+ raise ParsingError.new(location, message, token_type)
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "java"
4
+ require "monitor"
5
+
6
+ module RBS
7
+ module WASM
8
+ # Loads rbs_parser.wasm into a JVM WebAssembly runtime (Chicory) and drives
9
+ # it. This is the JRuby counterpart of the C extension's main.c: it copies a
10
+ # source string into the module's linear memory, runs the parser, and returns
11
+ # the serialized result for RBS::WASM::Deserializer to rebuild.
12
+ #
13
+ # Chicory is a pure-Java runtime, so there is no native dependency. The
14
+ # `.wasm` ships in the gem; the Chicory jars are fetched from Maven by
15
+ # jar-dependencies (see lib/rbs_jars.rb and rbs.gemspec).
16
+ class Runtime
17
+ include MonitorMixin
18
+
19
+ class << self
20
+ def instance
21
+ @instance ||= new
22
+ end
23
+
24
+ def wasm_path
25
+ ENV["RBS_WASM_PARSER"] || File.expand_path("rbs_parser.wasm", __dir__)
26
+ end
27
+ end
28
+
29
+ def initialize
30
+ super()
31
+ # rbs_jars.rb require_jars the Chicory/ASM jars from the local Maven
32
+ # repository (~/.m2), where jar-dependencies puts them at gem install (or
33
+ # `rake wasm:install_jars` when running from source).
34
+ require "rbs_jars"
35
+ @wasm = build_instance
36
+ @memory = @wasm.memory
37
+ @alloc = @wasm.export("rbs_wasm_alloc")
38
+ @free = @wasm.export("rbs_wasm_free")
39
+ @result_ptr = @wasm.export("rbs_wasm_result_ptr")
40
+ @result_len = @wasm.export("rbs_wasm_result_len")
41
+ @parse_signature = @wasm.export("rbs_wasm_parse_signature")
42
+ @parse_type = @wasm.export("rbs_wasm_parse_type")
43
+ @parse_method_type = @wasm.export("rbs_wasm_parse_method_type")
44
+ @parse_type_params = @wasm.export("rbs_wasm_parse_type_params")
45
+ @parse_inline_leading_annotation = @wasm.export("rbs_wasm_parse_inline_leading_annotation")
46
+ @parse_inline_trailing_annotation = @wasm.export("rbs_wasm_parse_inline_trailing_annotation")
47
+ @lex = @wasm.export("rbs_wasm_lex")
48
+ end
49
+
50
+ # `content` is the whole buffer; `start_pos`/`end_pos` are the character
51
+ # range within it to parse. Each method returns [success, bytes]: on success
52
+ # `bytes` is the serialized AST, otherwise it is the error blob (see
53
+ # set_error_result in rbs_wasm.c).
54
+
55
+ def parse_signature(content, encoding, start_pos, end_pos)
56
+ run(content, encoding) { |ptr, len, enc_ptr, enc_len| @parse_signature.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos)[0] }
57
+ end
58
+
59
+ def parse_type(content, encoding, start_pos, end_pos, variables, require_eof, void_allowed, self_allowed, classish_allowed)
60
+ with_variables(variables) do |vars_ptr, vars_len|
61
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
62
+ @parse_type.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len, bool(require_eof), bool(void_allowed), bool(self_allowed), bool(classish_allowed))[0]
63
+ end
64
+ end
65
+ end
66
+
67
+ def parse_method_type(content, encoding, start_pos, end_pos, variables, require_eof)
68
+ with_variables(variables) do |vars_ptr, vars_len|
69
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
70
+ @parse_method_type.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len, bool(require_eof))[0]
71
+ end
72
+ end
73
+ end
74
+
75
+ def parse_type_params(content, encoding, start_pos, end_pos, module_type_params)
76
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
77
+ @parse_type_params.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, bool(module_type_params))[0]
78
+ end
79
+ end
80
+
81
+ def parse_inline_leading_annotation(content, encoding, start_pos, end_pos, variables)
82
+ with_variables(variables) do |vars_ptr, vars_len|
83
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
84
+ @parse_inline_leading_annotation.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len)[0]
85
+ end
86
+ end
87
+ end
88
+
89
+ def parse_inline_trailing_annotation(content, encoding, start_pos, end_pos, variables)
90
+ with_variables(variables) do |vars_ptr, vars_len|
91
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
92
+ @parse_inline_trailing_annotation.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len)[0]
93
+ end
94
+ end
95
+ end
96
+
97
+ def lex(content, encoding, end_pos)
98
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
99
+ @lex.apply(ptr, len, enc_ptr, enc_len, end_pos)[0]
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ # Copies `source` and its encoding name into linear memory, yields their
106
+ # pointers/lengths to the block (which invokes the parser and returns its
107
+ # status), then reads the result back out. Serialized through the monitor
108
+ # because the module keeps its result in a single shared location.
109
+ def run(source, encoding)
110
+ synchronize do
111
+ bytes = source.b
112
+ length = bytes.bytesize
113
+ name = encoding.to_s.b
114
+ name_length = name.bytesize
115
+ source_ptr = @alloc.apply(length)[0]
116
+ name_ptr = @alloc.apply(name_length)[0]
117
+ begin
118
+ @memory.write(source_ptr, bytes.to_java_bytes)
119
+ @memory.write(name_ptr, name.to_java_bytes) unless name_length.zero?
120
+ status = yield(source_ptr, length, name_ptr, name_length)
121
+ [status == 1, read_result]
122
+ ensure
123
+ @free.apply(source_ptr)
124
+ @free.apply(name_ptr)
125
+ end
126
+ end
127
+ end
128
+
129
+ def read_result
130
+ pointer = @result_ptr.apply[0]
131
+ length = @result_len.apply[0]
132
+ return "".b if length.zero?
133
+
134
+ String.from_java_bytes(@memory.read_bytes(pointer, length)).b
135
+ end
136
+
137
+ # Allocates a buffer of newline-separated variable names and yields its
138
+ # pointer/length. A nil `variables` is passed as length -1 ("no variables").
139
+ def with_variables(variables)
140
+ names = variables&.map(&:to_s)&.join("\n")
141
+
142
+ if names.nil? || names.empty?
143
+ return yield(0, variables.nil? ? -1 : 0)
144
+ end
145
+
146
+ bytes = names.b
147
+ length = bytes.bytesize
148
+ synchronize do
149
+ pointer = @alloc.apply(length)[0]
150
+ begin
151
+ @memory.write(pointer, bytes.to_java_bytes)
152
+ yield(pointer, length)
153
+ ensure
154
+ @free.apply(pointer)
155
+ end
156
+ end
157
+ end
158
+
159
+ def bool(value)
160
+ value ? 1 : 0
161
+ end
162
+
163
+ def build_instance
164
+ parser = Java::ComDylibsoChicoryWasm::Parser
165
+ instance_class = Java::ComDylibsoChicoryRuntime::Instance
166
+ import_values = Java::ComDylibsoChicoryRuntime::ImportValues
167
+ wasi_preview1 = Java::ComDylibsoChicoryWasi::WasiPreview1
168
+ wasi_options = Java::ComDylibsoChicoryWasi::WasiOptions
169
+
170
+ wasm_module = parser.parse(java.io.File.new(self.class.wasm_path))
171
+ wasi = wasi_preview1.builder.with_options(wasi_options.builder.build).build
172
+ imports = import_values.builder.add_function(wasi.to_host_functions).build
173
+
174
+ builder = instance_class.builder(wasm_module).with_import_values(imports)
175
+ if (factory = machine_factory(wasm_module))
176
+ builder = builder.with_machine_factory(factory)
177
+ end
178
+
179
+ wasm = builder.build
180
+ wasm.export("_initialize").apply
181
+ wasm
182
+ end
183
+
184
+ # Chicory's AOT compiler when its jars are present and usable, otherwise nil
185
+ # (the builder then uses the interpreter). NameError covers a missing
186
+ # compiler class; LinkageError covers an incompatible/missing ASM (so a bad
187
+ # jar set degrades to the interpreter instead of crashing).
188
+ def machine_factory(wasm_module)
189
+ Java::ComDylibsoChicoryCompiler::MachineFactoryCompiler.compile(wasm_module)
190
+ rescue NameError, Java::JavaLang::LinkageError
191
+ nil
192
+ end
193
+
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # This file is generated by the templates/template.rb script and should not be
4
+ # modified manually. To change the template see
5
+ # templates/lib/rbs/wasm/serialization_schema.rb.erb
6
+
7
+ module RBS
8
+ module WASM
9
+ # Describes how to decode the binary buffer produced by `rbs_serialize_node`
10
+ # (src/serialize.c) back into RBS::AST objects. RBS::WASM::Deserializer walks
11
+ # this table; the matching encoder is generated from the same config.yml, so
12
+ # the two stay in sync.
13
+ #
14
+ # SCHEMA is indexed by node tag: tag 0 is NULL and SYMBOL_TAG is the
15
+ # interned-symbol tag. Each remaining entry is one of:
16
+ #
17
+ # [:node, class_name, expose_location, loc_children, fields, resolve_type_params]
18
+ # [:bool] / [:integer] / [:string_value] / [:record_field]
19
+ # [:signature] / [:namespace] / [:type_name]
20
+ #
21
+ # where loc_children is [[name, required?], ...] and fields is
22
+ # [[name, reader], ...] with reader one of :node, :node_list, :hash, :string,
23
+ # :bool, :location_range, :location_range_list, :attr_ivar_name, or
24
+ # [:enum, [value_or_nil, ...]].
25
+ module SerializationSchema
26
+ SYMBOL_TAG = 78
27
+
28
+ SCHEMA = [
29
+ nil, # tag 0 is reserved for NULL
30
+ [:node, "RBS::AST::Annotation", true, nil, [[:string, :string]], false],
31
+ [:bool],
32
+ [:node, "RBS::AST::Comment", true, nil, [[:string, :string]], false],
33
+ [:node, "RBS::AST::Declarations::Class", true, [[:keyword, true], [:name, true], [:end, true], [:type_params, false], [:lt, false]], [[:name, :node], [:type_params, :node_list], [:super_class, :node], [:members, :node_list], [:annotations, :node_list], [:comment, :node]], true],
34
+ [:node, "RBS::AST::Declarations::Class::Super", true, [[:name, true], [:args, false]], [[:name, :node], [:args, :node_list]], false],
35
+ [:node, "RBS::AST::Declarations::ClassAlias", true, [[:keyword, true], [:new_name, true], [:eq, true], [:old_name, true]], [[:new_name, :node], [:old_name, :node], [:comment, :node], [:annotations, :node_list]], false],
36
+ [:node, "RBS::AST::Declarations::Constant", true, [[:name, true], [:colon, true]], [[:name, :node], [:type, :node], [:comment, :node], [:annotations, :node_list]], false],
37
+ [:node, "RBS::AST::Declarations::Global", true, [[:name, true], [:colon, true]], [[:name, :node], [:type, :node], [:comment, :node], [:annotations, :node_list]], false],
38
+ [:node, "RBS::AST::Declarations::Interface", true, [[:keyword, true], [:name, true], [:end, true], [:type_params, false]], [[:name, :node], [:type_params, :node_list], [:members, :node_list], [:annotations, :node_list], [:comment, :node]], true],
39
+ [:node, "RBS::AST::Declarations::Module", true, [[:keyword, true], [:name, true], [:end, true], [:type_params, false], [:colon, false], [:self_types, false]], [[:name, :node], [:type_params, :node_list], [:self_types, :node_list], [:members, :node_list], [:annotations, :node_list], [:comment, :node]], true],
40
+ [:node, "RBS::AST::Declarations::Module::Self", true, [[:name, true], [:args, false]], [[:name, :node], [:args, :node_list]], false],
41
+ [:node, "RBS::AST::Declarations::ModuleAlias", true, [[:keyword, true], [:new_name, true], [:eq, true], [:old_name, true]], [[:new_name, :node], [:old_name, :node], [:comment, :node], [:annotations, :node_list]], false],
42
+ [:node, "RBS::AST::Declarations::TypeAlias", true, [[:keyword, true], [:name, true], [:eq, true], [:type_params, false]], [[:name, :node], [:type_params, :node_list], [:type, :node], [:annotations, :node_list], [:comment, :node]], true],
43
+ [:node, "RBS::AST::Directives::Use", true, [[:keyword, true]], [[:clauses, :node_list]], false],
44
+ [:node, "RBS::AST::Directives::Use::SingleClause", true, [[:type_name, true], [:keyword, false], [:new_name, false]], [[:type_name, :node], [:new_name, :node]], false],
45
+ [:node, "RBS::AST::Directives::Use::WildcardClause", true, [[:namespace, true], [:star, true]], [[:namespace, :node]], false],
46
+ [:integer],
47
+ [:node, "RBS::AST::Members::Alias", true, [[:keyword, true], [:new_name, true], [:old_name, true], [:new_kind, false], [:old_kind, false]], [[:new_name, :node], [:old_name, :node], [:kind, [:enum, [:instance, :singleton]]], [:annotations, :node_list], [:comment, :node]], false],
48
+ [:node, "RBS::AST::Members::AttrAccessor", true, [[:keyword, true], [:name, true], [:colon, true], [:kind, false], [:ivar, false], [:ivar_name, false], [:visibility, false]], [[:name, :node], [:type, :node], [:ivar_name, :attr_ivar_name], [:kind, [:enum, [:instance, :singleton]]], [:annotations, :node_list], [:comment, :node], [:visibility, [:enum, [nil, :public, :private]]]], false],
49
+ [:node, "RBS::AST::Members::AttrReader", true, [[:keyword, true], [:name, true], [:colon, true], [:kind, false], [:ivar, false], [:ivar_name, false], [:visibility, false]], [[:name, :node], [:type, :node], [:ivar_name, :attr_ivar_name], [:kind, [:enum, [:instance, :singleton]]], [:annotations, :node_list], [:comment, :node], [:visibility, [:enum, [nil, :public, :private]]]], false],
50
+ [:node, "RBS::AST::Members::AttrWriter", true, [[:keyword, true], [:name, true], [:colon, true], [:kind, false], [:ivar, false], [:ivar_name, false], [:visibility, false]], [[:name, :node], [:type, :node], [:ivar_name, :attr_ivar_name], [:kind, [:enum, [:instance, :singleton]]], [:annotations, :node_list], [:comment, :node], [:visibility, [:enum, [nil, :public, :private]]]], false],
51
+ [:node, "RBS::AST::Members::ClassInstanceVariable", true, [[:name, true], [:colon, true], [:kind, false]], [[:name, :node], [:type, :node], [:comment, :node]], false],
52
+ [:node, "RBS::AST::Members::ClassVariable", true, [[:name, true], [:colon, true], [:kind, false]], [[:name, :node], [:type, :node], [:comment, :node]], false],
53
+ [:node, "RBS::AST::Members::Extend", true, [[:name, true], [:keyword, true], [:args, false]], [[:name, :node], [:args, :node_list], [:annotations, :node_list], [:comment, :node]], false],
54
+ [:node, "RBS::AST::Members::Include", true, [[:name, true], [:keyword, true], [:args, false]], [[:name, :node], [:args, :node_list], [:annotations, :node_list], [:comment, :node]], false],
55
+ [:node, "RBS::AST::Members::InstanceVariable", true, [[:name, true], [:colon, true], [:kind, false]], [[:name, :node], [:type, :node], [:comment, :node]], false],
56
+ [:node, "RBS::AST::Members::MethodDefinition", true, [[:keyword, true], [:name, true], [:kind, false], [:overloading, false], [:visibility, false]], [[:name, :node], [:kind, [:enum, [:instance, :singleton, :singleton_instance]]], [:overloads, :node_list], [:annotations, :node_list], [:comment, :node], [:overloading, :bool], [:visibility, [:enum, [nil, :public, :private]]]], false],
57
+ [:node, "RBS::AST::Members::MethodDefinition::Overload", false, nil, [[:annotations, :node_list], [:method_type, :node]], false],
58
+ [:node, "RBS::AST::Members::Prepend", true, [[:name, true], [:keyword, true], [:args, false]], [[:name, :node], [:args, :node_list], [:annotations, :node_list], [:comment, :node]], false],
59
+ [:node, "RBS::AST::Members::Private", true, nil, nil, false],
60
+ [:node, "RBS::AST::Members::Public", true, nil, nil, false],
61
+ [:node, "RBS::AST::Ruby::Annotations::BlockParamTypeAnnotation", true, nil, [[:prefix_location, :location_range], [:ampersand_location, :location_range], [:name_location, :location_range], [:colon_location, :location_range], [:question_location, :location_range], [:type_location, :location_range], [:type, :node], [:comment_location, :location_range]], false],
62
+ [:node, "RBS::AST::Ruby::Annotations::ClassAliasAnnotation", true, nil, [[:prefix_location, :location_range], [:keyword_location, :location_range], [:type_name, :node], [:type_name_location, :location_range]], false],
63
+ [:node, "RBS::AST::Ruby::Annotations::ColonMethodTypeAnnotation", true, nil, [[:prefix_location, :location_range], [:annotations, :node_list], [:method_type, :node]], false],
64
+ [:node, "RBS::AST::Ruby::Annotations::DoubleSplatParamTypeAnnotation", true, nil, [[:prefix_location, :location_range], [:star2_location, :location_range], [:name_location, :location_range], [:colon_location, :location_range], [:param_type, :node], [:comment_location, :location_range]], false],
65
+ [:node, "RBS::AST::Ruby::Annotations::InstanceVariableAnnotation", true, nil, [[:prefix_location, :location_range], [:ivar_name, :node], [:ivar_name_location, :location_range], [:colon_location, :location_range], [:type, :node], [:comment_location, :location_range]], false],
66
+ [:node, "RBS::AST::Ruby::Annotations::MethodTypesAnnotation", true, nil, [[:prefix_location, :location_range], [:overloads, :node_list], [:vertical_bar_locations, :location_range_list], [:dot3_location, :location_range]], false],
67
+ [:node, "RBS::AST::Ruby::Annotations::ModuleAliasAnnotation", true, nil, [[:prefix_location, :location_range], [:keyword_location, :location_range], [:type_name, :node], [:type_name_location, :location_range]], false],
68
+ [:node, "RBS::AST::Ruby::Annotations::ModuleSelfAnnotation", true, nil, [[:prefix_location, :location_range], [:keyword_location, :location_range], [:colon_location, :location_range], [:name, :node], [:args, :node_list], [:open_bracket_location, :location_range], [:close_bracket_location, :location_range], [:args_comma_locations, :location_range_list], [:comment_location, :location_range]], false],
69
+ [:node, "RBS::AST::Ruby::Annotations::NodeTypeAssertion", true, nil, [[:prefix_location, :location_range], [:type, :node]], false],
70
+ [:node, "RBS::AST::Ruby::Annotations::ParamTypeAnnotation", true, nil, [[:prefix_location, :location_range], [:name_location, :location_range], [:colon_location, :location_range], [:param_type, :node], [:comment_location, :location_range]], false],
71
+ [:node, "RBS::AST::Ruby::Annotations::ReturnTypeAnnotation", true, nil, [[:prefix_location, :location_range], [:return_location, :location_range], [:colon_location, :location_range], [:return_type, :node], [:comment_location, :location_range]], false],
72
+ [:node, "RBS::AST::Ruby::Annotations::SkipAnnotation", true, nil, [[:prefix_location, :location_range], [:skip_location, :location_range], [:comment_location, :location_range]], false],
73
+ [:node, "RBS::AST::Ruby::Annotations::SplatParamTypeAnnotation", true, nil, [[:prefix_location, :location_range], [:star_location, :location_range], [:name_location, :location_range], [:colon_location, :location_range], [:param_type, :node], [:comment_location, :location_range]], false],
74
+ [:node, "RBS::AST::Ruby::Annotations::TypeApplicationAnnotation", true, nil, [[:prefix_location, :location_range], [:type_args, :node_list], [:close_bracket_location, :location_range], [:comma_locations, :location_range_list]], false],
75
+ [:string_value],
76
+ [:node, "RBS::AST::TypeParam", true, [[:name, true], [:variance, false], [:unchecked, false], [:upper_bound, false], [:lower_bound, false], [:default, false]], [[:name, :node], [:variance, [:enum, [:invariant, :covariant, :contravariant]]], [:upper_bound, :node], [:lower_bound, :node], [:default_type, :node], [:unchecked, :bool]], false],
77
+ [:node, "RBS::MethodType", true, [[:type, true], [:type_params, false]], [[:type_params, :node_list], [:type, :node], [:block, :node]], true],
78
+ [:namespace],
79
+ [:signature],
80
+ [:type_name],
81
+ [:node, "RBS::Types::Alias", true, [[:name, true], [:args, false]], [[:name, :node], [:args, :node_list]], false],
82
+ [:node, "RBS::Types::Bases::Any", true, nil, [[:todo, :bool]], false],
83
+ [:node, "RBS::Types::Bases::Bool", true, nil, nil, false],
84
+ [:node, "RBS::Types::Bases::Bottom", true, nil, nil, false],
85
+ [:node, "RBS::Types::Bases::Class", true, nil, nil, false],
86
+ [:node, "RBS::Types::Bases::Instance", true, nil, nil, false],
87
+ [:node, "RBS::Types::Bases::Nil", true, nil, nil, false],
88
+ [:node, "RBS::Types::Bases::Self", true, nil, nil, false],
89
+ [:node, "RBS::Types::Bases::Top", true, nil, nil, false],
90
+ [:node, "RBS::Types::Bases::Void", true, nil, nil, false],
91
+ [:node, "RBS::Types::Block", true, nil, [[:type, :node], [:required, :bool], [:self_type, :node]], false],
92
+ [:node, "RBS::Types::ClassInstance", true, [[:name, true], [:args, false]], [[:name, :node], [:args, :node_list]], false],
93
+ [:node, "RBS::Types::ClassSingleton", true, [[:name, true], [:args, false]], [[:name, :node], [:args, :node_list]], false],
94
+ [:node, "RBS::Types::Function", false, nil, [[:required_positionals, :node_list], [:optional_positionals, :node_list], [:rest_positionals, :node], [:trailing_positionals, :node_list], [:required_keywords, :hash], [:optional_keywords, :hash], [:rest_keywords, :node], [:return_type, :node]], false],
95
+ [:node, "RBS::Types::Function::Param", true, [[:name, false]], [[:type, :node], [:name, :node]], false],
96
+ [:node, "RBS::Types::Interface", true, [[:name, true], [:args, false]], [[:name, :node], [:args, :node_list]], false],
97
+ [:node, "RBS::Types::Intersection", true, nil, [[:types, :node_list]], false],
98
+ [:node, "RBS::Types::Literal", true, nil, [[:literal, :node]], false],
99
+ [:node, "RBS::Types::Optional", true, nil, [[:type, :node]], false],
100
+ [:node, "RBS::Types::Proc", true, nil, [[:type, :node], [:block, :node], [:self_type, :node]], false],
101
+ [:node, "RBS::Types::Record", true, nil, [[:all_fields, :hash]], false],
102
+ [:record_field],
103
+ [:node, "RBS::Types::Tuple", true, nil, [[:types, :node_list]], false],
104
+ [:node, "RBS::Types::Union", true, nil, [[:types, :node_list]], false],
105
+ [:node, "RBS::Types::UntypedFunction", false, nil, [[:return_type, :node]], false],
106
+ [:node, "RBS::Types::Variable", true, nil, [[:name, :node]], false],
107
+ ].freeze
108
+ end
109
+ end
110
+ end
data/lib/rbs.rb CHANGED
@@ -4,7 +4,11 @@ require "rbs/version"
4
4
 
5
5
  require "set"
6
6
  require "json"
7
- require "pathname" unless defined?(Pathname)
7
+ # Always require pathname: `Pathname()` (Kernel#Pathname) is only defined once
8
+ # pathname is loaded. Guarding on `defined?(Pathname)` is wrong because another
9
+ # library (e.g. Bundler) can define the Pathname constant without that method,
10
+ # which left RBS::EnvironmentLoader's `Pathname(...)` undefined on JRuby.
11
+ require "pathname"
8
12
  require "pp"
9
13
  require "logger"
10
14
  require "tsort"
@@ -51,6 +55,7 @@ require "rbs/resolver/constant_resolver"
51
55
  require "rbs/resolver/type_name_resolver"
52
56
  require "rbs/ast/comment"
53
57
  require "rbs/writer"
58
+ require "rbs/rewriter"
54
59
  require "rbs/prototype/helpers"
55
60
  require "rbs/prototype/rbi"
56
61
  require "rbs/prototype/rb"
@@ -68,7 +73,14 @@ require "rbs/type_alias_dependency"
68
73
  require "rbs/type_alias_regularity"
69
74
  require "rbs/collection"
70
75
 
71
- require "rbs_extension"
76
+ if RUBY_ENGINE == "jruby"
77
+ # JRuby cannot load the MRI C extension. Run the parser in WebAssembly and
78
+ # provide pure-Ruby implementations of RBS::Location and RBS::Parser instead.
79
+ require "rbs/wasm/location"
80
+ require "rbs/wasm/parser"
81
+ else
82
+ require "rbs_extension"
83
+ end
72
84
  require "rbs/parser_aux"
73
85
  require "rbs/location_aux"
74
86
 
data/lib/rbs_jars.rb ADDED
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This is the file jar-dependencies generates from the `jar` requirements in
4
+ # rbs.gemspec, kept with hand edits:
5
+ # 1. the `com.dylibso.chicory:runtime` require_jar line is corrected -- the
6
+ # generator mangles that artifact id to `jar` (it collides with a Maven
7
+ # scope keyword), which breaks loading;
8
+ # 2. the "# this is a generated file" marker is dropped so jar-dependencies
9
+ # does not regenerate (and re-break) this file at gem install;
10
+ # 3. a frozen_string_literal magic comment is added (rubocop).
11
+ # `rake wasm:install_jars` downloads the jars into ~/.m2; to refresh the list
12
+ # after a version bump, regenerate the file and re-apply these edits.
13
+ begin
14
+ require 'jar_dependencies'
15
+ rescue LoadError
16
+ require 'com/dylibso/chicory/compiler/1.7.5/compiler-1.7.5.jar'
17
+ require 'com/dylibso/chicory/runtime/1.7.5/runtime-1.7.5.jar'
18
+ require 'com/dylibso/chicory/wasm/1.7.5/wasm-1.7.5.jar'
19
+ require 'org/ow2/asm/asm/9.9.1/asm-9.9.1.jar'
20
+ require 'org/ow2/asm/asm-commons/9.9.1/asm-commons-9.9.1.jar'
21
+ require 'org/ow2/asm/asm-tree/9.9.1/asm-tree-9.9.1.jar'
22
+ require 'org/ow2/asm/asm-util/9.9.1/asm-util-9.9.1.jar'
23
+ require 'org/ow2/asm/asm-analysis/9.9.1/asm-analysis-9.9.1.jar'
24
+ require 'com/dylibso/chicory/wasi/1.7.5/wasi-1.7.5.jar'
25
+ require 'com/dylibso/chicory/log/1.7.5/log-1.7.5.jar'
26
+ end
27
+
28
+ if defined? Jars
29
+ require_jar 'com.dylibso.chicory', 'compiler', '1.7.5'
30
+ require_jar 'com.dylibso.chicory', 'runtime', '1.7.5'
31
+ require_jar 'com.dylibso.chicory', 'wasm', '1.7.5'
32
+ require_jar 'org.ow2.asm', 'asm', '9.9.1'
33
+ require_jar 'org.ow2.asm', 'asm-commons', '9.9.1'
34
+ require_jar 'org.ow2.asm', 'asm-tree', '9.9.1'
35
+ require_jar 'org.ow2.asm', 'asm-util', '9.9.1'
36
+ require_jar 'org.ow2.asm', 'asm-analysis', '9.9.1'
37
+ require_jar 'com.dylibso.chicory', 'wasi', '1.7.5'
38
+ require_jar 'com.dylibso.chicory', 'log', '1.7.5'
39
+ end
@@ -14,6 +14,11 @@ module RBS
14
14
  end
15
15
 
16
16
  def scan
17
+ Kernel.warn(
18
+ "The RBS RDoc parser plugin is deprecated and will be removed from RBS. " \
19
+ "RDoc 8.0 provides RBS parsing directly."
20
+ )
21
+
17
22
  _, _, decls = ::RBS::Parser.parse_signature(@content)
18
23
  decls.each do |decl|
19
24
  parse_member(decl: decl, context: @top_level)
data/rbs.gemspec CHANGED
@@ -30,12 +30,42 @@ Gem::Specification.new do |spec|
30
30
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
31
31
  `git ls-files -z`.split("\x0").reject do |f|
32
32
  [
33
- %r{^(test|spec|features|bin|steep|benchmark|templates|rust)/},
33
+ %r{^(test|spec|features|bin|steep|benchmark|templates|rust|\.vscode)/},
34
34
  /Gemfile/,
35
35
  ].any? {|r| f.match(r) }
36
36
  end
37
37
  end
38
- spec.extensions = %w{ext/rbs_extension/extconf.rb}
38
+
39
+ # JRuby cannot load the MRI C extension. On JRuby (and in the `java` platform
40
+ # gem, built with RBS_PLATFORM=java) RBS runs the WebAssembly-backed parser, so
41
+ # ship the prebuilt parser (built by `rake wasm:build`) and skip the C
42
+ # extension. The Chicory/ASM jars the runtime needs are NOT shipped in the gem:
43
+ # they are declared as `jar-dependencies` requirements below and fetched from
44
+ # Maven Central at install time (see lib/rbs/wasm/jars.rb).
45
+ building_java_gem = ENV["RBS_PLATFORM"] == "java"
46
+ on_jruby = defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
47
+
48
+ if building_java_gem || on_jruby
49
+ # Only stamp the platform when building the release gem; leave it unset for
50
+ # local development on JRuby so it still matches a `ruby` platform lockfile.
51
+ spec.platform = "java" if building_java_gem
52
+ # rbs_parser.wasm is a build artifact (not tracked in git), so add it
53
+ # explicitly. lib/rbs_jars.rb is committed, so git ls-files already has it.
54
+ spec.files += Dir.chdir(File.expand_path('..', __FILE__)) do
55
+ Dir.glob("lib/rbs/wasm/rbs_parser.wasm")
56
+ end
57
+
58
+ # jar-dependencies (bundled with JRuby) downloads these jars from Maven when
59
+ # the gem is installed, keeping the gem small and avoiding conflicting copies.
60
+ # Only the top-level artifacts are declared; Maven resolves the rest (runtime,
61
+ # wasm, asm, ...) transitively. lib/rbs_jars.rb require_jars the full resolved
62
+ # set at load time.
63
+ spec.add_dependency "jar-dependencies", ">= 0.1.7"
64
+ spec.requirements << "jar com.dylibso.chicory:compiler, 1.7.5"
65
+ spec.requirements << "jar com.dylibso.chicory:wasi, 1.7.5"
66
+ else
67
+ spec.extensions = %w{ext/rbs_extension/extconf.rb}
68
+ end
39
69
 
40
70
  if false
41
71
  spec.required_ruby_version = ">= 3.4"
@@ -8,9 +8,10 @@ module RBS
8
8
 
9
9
  def initialize: (source: RDocSource) -> void
10
10
 
11
- def annotate_file: (Pathname, preserve: bool) -> void
11
+ def annotate_file: (Pathname) -> void
12
+ | %a{deprecated: it preserves the format by default} (Pathname, preserve: bool) -> void
12
13
 
13
- def annotate_decls: (Array[AST::Declarations::t], ?outer: Array[Namespace]) -> void
14
+ def annotate_decls: (Array[AST::Declarations::t], Rewriter, ?outer: Array[Namespace]) -> void
14
15
 
15
16
  interface _PathTester
16
17
  def test_path: (String) -> bool
@@ -50,15 +51,15 @@ module RBS
50
51
 
51
52
  def resolve_doc_source: (Annotations::Copy?, tester: _PathTester) { () -> String? } -> String?
52
53
 
53
- def annotate_class: (AST::Declarations::Class | AST::Declarations::Module, outer: Array[Namespace]) -> void
54
+ def annotate_class: (AST::Declarations::Class | AST::Declarations::Module, Rewriter, outer: Array[Namespace]) -> void
54
55
 
55
- def annotate_constant: (AST::Declarations::Constant, outer: Array[Namespace]) -> void
56
+ def annotate_constant: (AST::Declarations::Constant, Rewriter, outer: Array[Namespace]) -> void
56
57
 
57
- def annotate_method: (TypeName, AST::Members::MethodDefinition) -> void
58
+ def annotate_method: (TypeName, AST::Members::MethodDefinition, Rewriter) -> void
58
59
 
59
- def annotate_alias: (TypeName, AST::Members::Alias) -> void
60
+ def annotate_alias: (TypeName, AST::Members::Alias, Rewriter) -> void
60
61
 
61
- def annotate_attribute: (TypeName, AST::Members::AttrReader | AST::Members::AttrWriter | AST::Members::AttrAccessor) -> void
62
+ def annotate_attribute: (TypeName, AST::Members::AttrReader | AST::Members::AttrWriter | AST::Members::AttrAccessor, Rewriter) -> void
62
63
 
63
64
  def annotations: (_Annotated) -> Annotations
64
65
 
@@ -70,10 +71,12 @@ module RBS
70
71
  # - If empty string is given as `comment`, it deletes the original comment.
71
72
  # - If `nil` is given as `comment`, it keeps the original comment.
72
73
  #
73
- def replace_comment: (Object & _Commented, String? comment) -> void
74
+ def replace_comment: (_Commented, String?, Rewriter) -> void
74
75
 
75
76
  interface _Commented
76
- def comment: () -> AST::Comment?
77
+ %a{pure} def comment: () -> AST::Comment?
78
+ %a{pure} def location: () -> Location[untyped, untyped]?
79
+ def annotations: () -> Array[AST::Annotation]
77
80
  end
78
81
 
79
82
  def resolve_name: (TypeName, outer: Array[Namespace]) -> TypeName