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.
- checksums.yaml +4 -4
- data/.dockerignore +37 -0
- data/.github/dependabot.yml +1 -1
- data/.github/workflows/bundle-update.yml +2 -2
- data/.github/workflows/c-check.yml +14 -6
- data/.github/workflows/comments.yml +2 -2
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/jruby.yml +74 -0
- data/.github/workflows/release-gems.yml +235 -0
- data/.github/workflows/ruby.yml +43 -3
- data/.github/workflows/rust.yml +13 -10
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +5 -2
- data/.github/workflows/wasm.yml +55 -0
- data/.github/workflows/windows.yml +5 -2
- data/.gitignore +8 -0
- data/CHANGELOG.md +113 -0
- data/Dockerfile.jruby +53 -0
- data/README.md +4 -4
- data/Rakefile +512 -82
- data/Steepfile +9 -0
- data/config.yml +26 -0
- data/core/array.rbs +243 -180
- data/core/builtin.rbs +7 -6
- data/core/class.rbs +5 -3
- data/core/enumerable.rbs +109 -109
- data/core/enumerator/product.rbs +5 -5
- data/core/enumerator.rbs +28 -28
- data/core/file.rbs +24 -1018
- data/core/file_constants.rbs +463 -0
- data/core/file_stat.rbs +534 -0
- data/core/float.rbs +0 -24
- data/core/hash.rbs +117 -101
- data/core/integer.rbs +21 -58
- data/core/io.rbs +25 -7
- data/core/kernel.rbs +26 -11
- data/core/match_data.rbs +1 -1
- data/core/module.rbs +88 -74
- data/core/numeric.rbs +3 -0
- data/core/object_space/weak_key_map.rbs +7 -7
- data/core/pathname.rbs +0 -10
- data/core/ractor.rbs +0 -10
- data/core/range.rbs +23 -23
- data/core/rbs/ops.rbs +154 -0
- data/core/rbs/unnamed/argf.rbs +3 -3
- data/core/ruby_vm.rbs +40 -0
- data/core/rubygems/errors.rbs +4 -1
- data/core/rubygems/requirement.rbs +0 -10
- data/core/rubygems/rubygems.rbs +4 -1
- data/core/rubygems/specification.rbs +8 -0
- data/core/rubygems/version.rbs +0 -160
- data/core/set.rbs +3 -3
- data/core/struct.rbs +16 -16
- data/core/thread.rbs +9 -14
- data/docs/CONTRIBUTING.md +2 -1
- data/docs/inline.md +65 -7
- data/docs/rbs_by_example.md +20 -20
- data/docs/release.md +247 -0
- data/docs/syntax.md +2 -2
- data/docs/wasm_serialization.md +80 -0
- data/ext/rbs_extension/ast_translation.c +1298 -956
- data/ext/rbs_extension/ast_translation.h +4 -0
- data/ext/rbs_extension/class_constants.c +2 -0
- data/ext/rbs_extension/class_constants.h +1 -0
- data/ext/rbs_extension/extconf.rb +1 -0
- data/ext/rbs_extension/legacy_location.c +11 -6
- data/ext/rbs_extension/main.c +139 -4
- data/include/rbs/ast.h +323 -298
- data/include/rbs/defines.h +18 -0
- data/include/rbs/lexer.h +1 -0
- data/include/rbs/serialize.h +39 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
- data/lib/rbs/ast/ruby/annotations.rb +42 -0
- data/lib/rbs/ast/ruby/comment_block.rb +6 -4
- data/lib/rbs/ast/ruby/declarations.rb +11 -1
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
- data/lib/rbs/ast/ruby/members.rb +40 -1
- data/lib/rbs/buffer.rb +48 -11
- data/lib/rbs/cli.rb +3 -5
- data/lib/rbs/collection/config/lockfile_generator.rb +14 -1
- data/lib/rbs/collection/sources/git.rb +6 -0
- data/lib/rbs/definition_builder/method_builder.rb +12 -6
- data/lib/rbs/environment.rb +10 -3
- data/lib/rbs/inline_parser.rb +54 -28
- data/lib/rbs/namespace.rb +47 -11
- data/lib/rbs/parser_aux.rb +4 -2
- data/lib/rbs/prototype/rbi.rb +193 -25
- data/lib/rbs/prototype/runtime.rb +2 -0
- data/lib/rbs/resolver/type_name_resolver.rb +12 -14
- data/lib/rbs/rewriter.rb +70 -0
- data/lib/rbs/test/type_check.rb +6 -1
- data/lib/rbs/type_name.rb +33 -13
- data/lib/rbs/unit_test/type_assertions.rb +14 -5
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/wasm/deserializer.rb +213 -0
- data/lib/rbs/wasm/location.rb +61 -0
- data/lib/rbs/wasm/parser.rb +137 -0
- data/lib/rbs/wasm/runtime.rb +196 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs.rb +14 -2
- data/lib/rbs_jars.rb +39 -0
- data/lib/rdoc_plugin/parser.rb +5 -0
- data/rbs.gemspec +32 -2
- data/sig/annotate/rdoc_annotater.rbs +12 -9
- data/sig/ast/ruby/annotations.rbs +49 -0
- data/sig/ast/ruby/members.rbs +21 -1
- data/sig/buffer.rbs +19 -1
- data/sig/collection/config/lockfile_generator.rbs +2 -0
- data/sig/inline_parser.rbs +2 -0
- data/sig/manifest.yaml +0 -1
- data/sig/namespace.rbs +20 -0
- data/sig/parser.rbs +10 -0
- data/sig/prototype/rbi.rbs +33 -4
- data/sig/resolver/type_name_resolver.rbs +2 -4
- data/sig/rewriter.rbs +45 -0
- data/sig/typename.rbs +15 -0
- data/sig/unit_test/type_assertions.rbs +6 -2
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/src/ast.c +186 -162
- data/src/lexer.c +220 -193
- data/src/lexer.re +2 -1
- data/src/lexstate.c +10 -1
- data/src/parser.c +61 -8
- data/src/serialize.c +958 -0
- data/src/util/rbs_allocator.c +14 -8
- data/stdlib/abbrev/0/array.rbs +1 -1
- data/stdlib/csv/0/csv.rbs +5 -5
- data/stdlib/delegate/0/delegator.rbs +2 -1
- data/stdlib/digest/0/digest.rbs +11 -5
- data/stdlib/erb/0/erb.rbs +1 -1
- data/stdlib/etc/0/etc.rbs +18 -4
- data/stdlib/fileutils/0/fileutils.rbs +21 -21
- data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
- data/stdlib/json/0/json.rbs +6 -6
- data/stdlib/monitor/0/monitor.rbs +2 -2
- data/stdlib/openssl/0/openssl.rbs +46 -40
- data/stdlib/resolv/0/resolv.rbs +1 -1
- data/stdlib/shellwords/0/shellwords.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +32 -10
- data/stdlib/strscan/0/string_scanner.rbs +74 -55
- data/stdlib/tempfile/0/manifest.yaml +3 -0
- data/stdlib/timeout/0/timeout.rbs +0 -5
- data/stdlib/tsort/0/cyclic.rbs +1 -1
- data/stdlib/tsort/0/interfaces.rbs +8 -8
- data/stdlib/tsort/0/tsort.rbs +9 -9
- data/stdlib/uri/0/generic.rbs +0 -5
- data/stdlib/zlib/0/gzip_reader.rbs +2 -2
- data/stdlib/zlib/0/zstream.rbs +0 -1
- data/wasm/README.md +93 -0
- data/wasm/rbs_wasm.c +423 -0
- metadata +29 -6
- data/.github/workflows/milestone.yml +0 -80
- data/.vscode/extensions.json +0 -5
- 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
|
|
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
|
-
|
|
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
|
data/lib/rdoc_plugin/parser.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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: (
|
|
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
|