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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +14 -14
- data/.github/workflows/bundle-update.yml +60 -0
- data/.github/workflows/c-check.yml +7 -5
- data/.github/workflows/comments.yml +2 -2
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/ruby.yml +16 -26
- data/.github/workflows/rust.yml +95 -0
- data/.github/workflows/typecheck.yml +1 -1
- data/.github/workflows/windows.yml +2 -2
- data/.rubocop.yml +2 -2
- data/.vscode/extensions.json +5 -0
- data/.vscode/settings.json +19 -0
- data/CHANGELOG.md +202 -2
- data/Rakefile +9 -23
- data/Steepfile +2 -0
- data/config.yml +457 -13
- data/core/array.rbs +218 -188
- data/core/basic_object.rbs +9 -8
- data/core/binding.rbs +0 -2
- data/core/builtin.rbs +2 -2
- data/core/class.rbs +6 -5
- data/core/comparable.rbs +45 -31
- data/core/complex.rbs +66 -55
- data/core/dir.rbs +57 -45
- data/core/encoding.rbs +6 -6
- data/core/enumerable.rbs +105 -91
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator.rbs +24 -3
- data/core/errno.rbs +3 -2
- data/core/errors.rbs +31 -29
- data/core/exception.rbs +12 -12
- data/core/fiber.rbs +47 -36
- data/core/file.rbs +242 -169
- data/core/file_test.rbs +2 -2
- data/core/float.rbs +42 -68
- data/core/gc.rbs +78 -70
- data/core/hash.rbs +70 -60
- data/core/integer.rbs +32 -75
- data/core/io/buffer.rbs +36 -36
- data/core/io/wait.rbs +7 -7
- data/core/io.rbs +192 -146
- data/core/kernel.rbs +198 -147
- data/core/marshal.rbs +3 -3
- data/core/match_data.rbs +14 -12
- data/core/math.rbs +69 -67
- data/core/method.rbs +6 -8
- data/core/module.rbs +148 -88
- data/core/nil_class.rbs +4 -3
- data/core/numeric.rbs +53 -50
- data/core/object.rbs +6 -8
- data/core/object_space.rbs +11 -10
- data/core/pathname.rbs +131 -81
- data/core/proc.rbs +65 -34
- data/core/process.rbs +221 -201
- data/core/ractor.rbs +15 -11
- data/core/random.rbs +21 -3
- data/core/range.rbs +152 -49
- data/core/rational.rbs +5 -56
- data/core/rbs/unnamed/argf.rbs +58 -51
- data/core/rbs/unnamed/env_class.rbs +18 -13
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +7 -116
- data/core/regexp.rbs +236 -197
- data/core/ruby.rbs +1 -1
- data/core/ruby_vm.rbs +32 -30
- data/core/rubygems/config_file.rbs +5 -5
- data/core/rubygems/errors.rbs +1 -1
- data/core/rubygems/requirement.rbs +5 -5
- data/core/rubygems/rubygems.rbs +5 -3
- data/core/set.rbs +17 -16
- data/core/signal.rbs +2 -2
- data/core/string.rbs +318 -298
- data/core/struct.rbs +26 -25
- data/core/symbol.rbs +25 -24
- data/core/thread.rbs +40 -41
- data/core/time.rbs +47 -42
- data/core/trace_point.rbs +34 -31
- data/core/true_class.rbs +2 -2
- data/core/unbound_method.rbs +10 -10
- data/core/warning.rbs +7 -7
- data/docs/collection.md +1 -1
- data/docs/config.md +171 -0
- data/docs/inline.md +576 -0
- data/docs/syntax.md +46 -16
- data/docs/type_fingerprint.md +21 -0
- data/exe/rbs +1 -1
- data/ext/rbs_extension/ast_translation.c +595 -98
- data/ext/rbs_extension/class_constants.c +30 -0
- data/ext/rbs_extension/class_constants.h +15 -0
- data/ext/rbs_extension/legacy_location.c +30 -53
- data/ext/rbs_extension/legacy_location.h +37 -0
- data/ext/rbs_extension/main.c +125 -24
- data/include/rbs/ast.h +485 -150
- data/include/rbs/lexer.h +11 -4
- data/include/rbs/location.h +25 -44
- data/include/rbs/parser.h +20 -2
- data/include/rbs/util/rbs_constant_pool.h +0 -3
- data/include/rbs.h +8 -0
- data/lib/rbs/ast/annotation.rb +1 -1
- data/lib/rbs/ast/comment.rb +1 -1
- data/lib/rbs/ast/declarations.rb +10 -10
- data/lib/rbs/ast/members.rb +14 -14
- data/lib/rbs/ast/ruby/annotations.rb +409 -0
- data/lib/rbs/ast/ruby/comment_block.rb +245 -0
- data/lib/rbs/ast/ruby/declarations.rb +281 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +723 -0
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +105 -20
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +62 -125
- data/lib/rbs/cli.rb +55 -23
- data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
- data/lib/rbs/collection/sources/git.rb +1 -0
- data/lib/rbs/collection.rb +0 -1
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
- data/lib/rbs/definition_builder/method_builder.rb +65 -30
- data/lib/rbs/definition_builder.rb +177 -20
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +338 -155
- data/lib/rbs/environment_loader.rb +2 -2
- data/lib/rbs/errors.rb +30 -20
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +542 -0
- data/lib/rbs/location_aux.rb +36 -4
- data/lib/rbs/locator.rb +5 -1
- data/lib/rbs/method_type.rb +5 -3
- data/lib/rbs/namespace.rb +0 -7
- data/lib/rbs/parser_aux.rb +31 -8
- data/lib/rbs/prototype/helpers.rb +57 -0
- data/lib/rbs/prototype/rb.rb +3 -28
- data/lib/rbs/prototype/rbi.rb +3 -20
- data/lib/rbs/prototype/runtime.rb +10 -2
- data/lib/rbs/resolver/type_name_resolver.rb +0 -8
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +4 -3
- data/lib/rbs/test/type_check.rb +5 -2
- data/lib/rbs/type_name.rb +1 -8
- data/lib/rbs/types.rb +88 -78
- data/lib/rbs/unit_test/convertibles.rb +1 -0
- data/lib/rbs/unit_test/type_assertions.rb +35 -8
- data/lib/rbs/validator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +12 -1
- data/rbs.gemspec +3 -2
- data/rust/.gitignore +1 -0
- data/rust/Cargo.lock +378 -0
- data/rust/Cargo.toml +7 -0
- data/rust/ruby-rbs/Cargo.toml +22 -0
- data/rust/ruby-rbs/build.rs +764 -0
- data/rust/ruby-rbs/examples/locations.rs +60 -0
- data/rust/ruby-rbs/src/lib.rs +1 -0
- data/rust/ruby-rbs/src/node/mod.rs +742 -0
- data/rust/ruby-rbs/tests/sanity.rs +47 -0
- data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
- data/rust/ruby-rbs-sys/Cargo.toml +23 -0
- data/rust/ruby-rbs-sys/build.rs +204 -0
- data/rust/ruby-rbs-sys/src/lib.rs +50 -0
- data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
- data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
- data/rust/ruby-rbs-sys/wrapper.h +1 -0
- data/schema/typeParam.json +17 -1
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +421 -0
- data/sig/ast/ruby/comment_block.rbs +127 -0
- data/sig/ast/ruby/declarations.rbs +158 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +178 -0
- data/sig/buffer.rbs +63 -5
- data/sig/cli/diff.rbs +5 -11
- data/sig/cli/validate.rbs +12 -8
- data/sig/cli.rbs +18 -18
- data/sig/definition.rbs +6 -0
- data/sig/definition_builder.rbs +3 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +37 -81
- data/sig/errors.rbs +26 -20
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +124 -0
- data/sig/location.rbs +32 -7
- data/sig/locator.rbs +0 -2
- data/sig/method_builder.rbs +9 -4
- data/sig/namespace.rbs +0 -5
- data/sig/parser.rbs +47 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/resolver/type_name_resolver.rbs +0 -3
- data/sig/source.rbs +48 -0
- data/sig/type_param.rbs +13 -8
- data/sig/typename.rbs +0 -5
- data/sig/types.rbs +6 -7
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +11 -0
- data/src/ast.c +491 -143
- data/src/lexer.c +1552 -1314
- data/src/lexer.re +7 -0
- data/src/lexstate.c +8 -1
- data/src/location.c +8 -48
- data/src/parser.c +1107 -409
- data/src/util/rbs_constant_pool.c +0 -4
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
- data/stdlib/cgi-escape/0/escape.rbs +4 -4
- data/stdlib/coverage/0/coverage.rbs +4 -3
- data/stdlib/date/0/date.rbs +33 -28
- data/stdlib/date/0/date_time.rbs +24 -23
- data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
- data/stdlib/digest/0/digest.rbs +110 -0
- data/stdlib/erb/0/erb.rbs +64 -53
- data/stdlib/etc/0/etc.rbs +55 -50
- data/stdlib/fileutils/0/fileutils.rbs +140 -126
- data/stdlib/forwardable/0/forwardable.rbs +10 -10
- data/stdlib/io-console/0/io-console.rbs +2 -2
- data/stdlib/json/0/json.rbs +158 -131
- data/stdlib/monitor/0/monitor.rbs +3 -3
- data/stdlib/net-http/0/net-http.rbs +159 -134
- data/stdlib/objspace/0/objspace.rbs +8 -30
- data/stdlib/open-uri/0/open-uri.rbs +8 -8
- data/stdlib/open3/0/open3.rbs +469 -10
- data/stdlib/openssl/0/openssl.rbs +144 -129
- data/stdlib/optparse/0/optparse.rbs +23 -14
- data/stdlib/pathname/0/pathname.rbs +2 -2
- data/stdlib/pp/0/pp.rbs +9 -8
- data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
- data/stdlib/pstore/0/pstore.rbs +35 -30
- data/stdlib/psych/0/psych.rbs +62 -9
- data/stdlib/psych/0/store.rbs +2 -4
- data/stdlib/pty/0/pty.rbs +9 -6
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +2 -1
- data/stdlib/rdoc/0/parser.rbs +1 -1
- data/stdlib/rdoc/0/store.rbs +1 -1
- data/stdlib/ripper/0/ripper.rbs +20 -17
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +7 -20
- data/stdlib/shellwords/0/shellwords.rbs +2 -2
- data/stdlib/socket/0/addrinfo.rbs +9 -9
- data/stdlib/socket/0/basic_socket.rbs +3 -3
- data/stdlib/socket/0/ip_socket.rbs +10 -8
- data/stdlib/socket/0/socket.rbs +10 -9
- data/stdlib/socket/0/tcp_server.rbs +1 -1
- data/stdlib/socket/0/tcp_socket.rbs +1 -1
- data/stdlib/socket/0/udp_socket.rbs +1 -1
- data/stdlib/socket/0/unix_server.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +55 -54
- data/stdlib/strscan/0/string_scanner.rbs +46 -44
- data/stdlib/tempfile/0/tempfile.rbs +24 -20
- data/stdlib/time/0/time.rbs +7 -5
- data/stdlib/tsort/0/tsort.rbs +7 -6
- data/stdlib/uri/0/common.rbs +31 -18
- data/stdlib/uri/0/file.rbs +2 -2
- data/stdlib/uri/0/generic.rbs +9 -2
- data/stdlib/uri/0/http.rbs +2 -2
- data/stdlib/uri/0/ldap.rbs +2 -2
- data/stdlib/uri/0/mailto.rbs +3 -3
- data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
- data/stdlib/zlib/0/deflate.rbs +4 -3
- data/stdlib/zlib/0/gzip_reader.rbs +6 -6
- data/stdlib/zlib/0/gzip_writer.rbs +14 -12
- data/stdlib/zlib/0/inflate.rbs +1 -1
- data/stdlib/zlib/0/need_dict.rbs +1 -1
- metadata +66 -3
|
@@ -12,6 +12,8 @@ VALUE RBS_AST;
|
|
|
12
12
|
VALUE RBS_AST_Declarations;
|
|
13
13
|
VALUE RBS_AST_Directives;
|
|
14
14
|
VALUE RBS_AST_Members;
|
|
15
|
+
VALUE RBS_AST_Ruby;
|
|
16
|
+
VALUE RBS_AST_Ruby_Annotations;
|
|
15
17
|
VALUE RBS_Parser;
|
|
16
18
|
VALUE RBS_Types;
|
|
17
19
|
VALUE RBS_Types_Bases;
|
|
@@ -45,6 +47,19 @@ VALUE RBS_AST_Members_MethodDefinition_Overload;
|
|
|
45
47
|
VALUE RBS_AST_Members_Prepend;
|
|
46
48
|
VALUE RBS_AST_Members_Private;
|
|
47
49
|
VALUE RBS_AST_Members_Public;
|
|
50
|
+
VALUE RBS_AST_Ruby_Annotations_BlockParamTypeAnnotation;
|
|
51
|
+
VALUE RBS_AST_Ruby_Annotations_ClassAliasAnnotation;
|
|
52
|
+
VALUE RBS_AST_Ruby_Annotations_ColonMethodTypeAnnotation;
|
|
53
|
+
VALUE RBS_AST_Ruby_Annotations_DoubleSplatParamTypeAnnotation;
|
|
54
|
+
VALUE RBS_AST_Ruby_Annotations_InstanceVariableAnnotation;
|
|
55
|
+
VALUE RBS_AST_Ruby_Annotations_MethodTypesAnnotation;
|
|
56
|
+
VALUE RBS_AST_Ruby_Annotations_ModuleAliasAnnotation;
|
|
57
|
+
VALUE RBS_AST_Ruby_Annotations_NodeTypeAssertion;
|
|
58
|
+
VALUE RBS_AST_Ruby_Annotations_ParamTypeAnnotation;
|
|
59
|
+
VALUE RBS_AST_Ruby_Annotations_ReturnTypeAnnotation;
|
|
60
|
+
VALUE RBS_AST_Ruby_Annotations_SkipAnnotation;
|
|
61
|
+
VALUE RBS_AST_Ruby_Annotations_SplatParamTypeAnnotation;
|
|
62
|
+
VALUE RBS_AST_Ruby_Annotations_TypeApplicationAnnotation;
|
|
48
63
|
VALUE RBS_AST_TypeParam;
|
|
49
64
|
VALUE RBS_MethodType;
|
|
50
65
|
VALUE RBS_Namespace;
|
|
@@ -91,6 +106,8 @@ void rbs__init_constants(void) {
|
|
|
91
106
|
IMPORT_CONSTANT(RBS_AST_Declarations, RBS_AST, "Declarations");
|
|
92
107
|
IMPORT_CONSTANT(RBS_AST_Directives, RBS_AST, "Directives");
|
|
93
108
|
IMPORT_CONSTANT(RBS_AST_Members, RBS_AST, "Members");
|
|
109
|
+
IMPORT_CONSTANT(RBS_AST_Ruby, RBS_AST, "Ruby");
|
|
110
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations, RBS_AST_Ruby, "Annotations");
|
|
94
111
|
IMPORT_CONSTANT(RBS_Types, RBS, "Types");
|
|
95
112
|
IMPORT_CONSTANT(RBS_Types_Bases, RBS_Types, "Bases");
|
|
96
113
|
|
|
@@ -123,6 +140,19 @@ void rbs__init_constants(void) {
|
|
|
123
140
|
IMPORT_CONSTANT(RBS_AST_Members_Prepend, RBS_AST_Members, "Prepend");
|
|
124
141
|
IMPORT_CONSTANT(RBS_AST_Members_Private, RBS_AST_Members, "Private");
|
|
125
142
|
IMPORT_CONSTANT(RBS_AST_Members_Public, RBS_AST_Members, "Public");
|
|
143
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_BlockParamTypeAnnotation, RBS_AST_Ruby_Annotations, "BlockParamTypeAnnotation");
|
|
144
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ClassAliasAnnotation, RBS_AST_Ruby_Annotations, "ClassAliasAnnotation");
|
|
145
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ColonMethodTypeAnnotation, RBS_AST_Ruby_Annotations, "ColonMethodTypeAnnotation");
|
|
146
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_DoubleSplatParamTypeAnnotation, RBS_AST_Ruby_Annotations, "DoubleSplatParamTypeAnnotation");
|
|
147
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_InstanceVariableAnnotation, RBS_AST_Ruby_Annotations, "InstanceVariableAnnotation");
|
|
148
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_MethodTypesAnnotation, RBS_AST_Ruby_Annotations, "MethodTypesAnnotation");
|
|
149
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ModuleAliasAnnotation, RBS_AST_Ruby_Annotations, "ModuleAliasAnnotation");
|
|
150
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_NodeTypeAssertion, RBS_AST_Ruby_Annotations, "NodeTypeAssertion");
|
|
151
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ParamTypeAnnotation, RBS_AST_Ruby_Annotations, "ParamTypeAnnotation");
|
|
152
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ReturnTypeAnnotation, RBS_AST_Ruby_Annotations, "ReturnTypeAnnotation");
|
|
153
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_SkipAnnotation, RBS_AST_Ruby_Annotations, "SkipAnnotation");
|
|
154
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_SplatParamTypeAnnotation, RBS_AST_Ruby_Annotations, "SplatParamTypeAnnotation");
|
|
155
|
+
IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_TypeApplicationAnnotation, RBS_AST_Ruby_Annotations, "TypeApplicationAnnotation");
|
|
126
156
|
IMPORT_CONSTANT(RBS_AST_TypeParam, RBS_AST, "TypeParam");
|
|
127
157
|
IMPORT_CONSTANT(RBS_MethodType, RBS, "MethodType");
|
|
128
158
|
IMPORT_CONSTANT(RBS_Namespace, RBS, "Namespace");
|
|
@@ -20,6 +20,8 @@ extern VALUE RBS_AST;
|
|
|
20
20
|
extern VALUE RBS_AST_Declarations;
|
|
21
21
|
extern VALUE RBS_AST_Directives;
|
|
22
22
|
extern VALUE RBS_AST_Members;
|
|
23
|
+
extern VALUE RBS_AST_Ruby;
|
|
24
|
+
extern VALUE RBS_AST_Ruby_Annotations;
|
|
23
25
|
extern VALUE RBS_Types;
|
|
24
26
|
extern VALUE RBS_Types_Bases;
|
|
25
27
|
extern VALUE RBS_ParsingError;
|
|
@@ -53,6 +55,19 @@ extern VALUE RBS_AST_Members_MethodDefinition_Overload;
|
|
|
53
55
|
extern VALUE RBS_AST_Members_Prepend;
|
|
54
56
|
extern VALUE RBS_AST_Members_Private;
|
|
55
57
|
extern VALUE RBS_AST_Members_Public;
|
|
58
|
+
extern VALUE RBS_AST_Ruby_Annotations_BlockParamTypeAnnotation;
|
|
59
|
+
extern VALUE RBS_AST_Ruby_Annotations_ClassAliasAnnotation;
|
|
60
|
+
extern VALUE RBS_AST_Ruby_Annotations_ColonMethodTypeAnnotation;
|
|
61
|
+
extern VALUE RBS_AST_Ruby_Annotations_DoubleSplatParamTypeAnnotation;
|
|
62
|
+
extern VALUE RBS_AST_Ruby_Annotations_InstanceVariableAnnotation;
|
|
63
|
+
extern VALUE RBS_AST_Ruby_Annotations_MethodTypesAnnotation;
|
|
64
|
+
extern VALUE RBS_AST_Ruby_Annotations_ModuleAliasAnnotation;
|
|
65
|
+
extern VALUE RBS_AST_Ruby_Annotations_NodeTypeAssertion;
|
|
66
|
+
extern VALUE RBS_AST_Ruby_Annotations_ParamTypeAnnotation;
|
|
67
|
+
extern VALUE RBS_AST_Ruby_Annotations_ReturnTypeAnnotation;
|
|
68
|
+
extern VALUE RBS_AST_Ruby_Annotations_SkipAnnotation;
|
|
69
|
+
extern VALUE RBS_AST_Ruby_Annotations_SplatParamTypeAnnotation;
|
|
70
|
+
extern VALUE RBS_AST_Ruby_Annotations_TypeApplicationAnnotation;
|
|
56
71
|
extern VALUE RBS_AST_TypeParam;
|
|
57
72
|
extern VALUE RBS_MethodType;
|
|
58
73
|
extern VALUE RBS_Namespace;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#include "legacy_location.h"
|
|
2
2
|
#include "rbs_extension.h"
|
|
3
|
+
#include "ruby/internal/symbol.h"
|
|
3
4
|
|
|
4
5
|
#define RBS_LOC_REQUIRED_P(loc, i) ((loc)->children->required_p & (1 << (i)))
|
|
5
6
|
#define RBS_LOC_OPTIONAL_P(loc, i) (!RBS_LOC_REQUIRED_P((loc), (i)))
|
|
@@ -9,19 +10,6 @@
|
|
|
9
10
|
rbs_loc_range RBS_LOC_NULL_RANGE = { -1, -1 };
|
|
10
11
|
VALUE RBS_Location;
|
|
11
12
|
|
|
12
|
-
rbs_position_t rbs_loc_position(int char_pos) {
|
|
13
|
-
return (rbs_position_t) { 0, char_pos, -1, -1 };
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
rbs_position_t rbs_loc_position3(int char_pos, int line, int column) {
|
|
17
|
-
return (rbs_position_t) { 0, char_pos, line, column };
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
static rbs_loc_range rbs_new_loc_range(rbs_range_t rg) {
|
|
21
|
-
rbs_loc_range r = { rg.start.char_pos, rg.end.char_pos };
|
|
22
|
-
return r;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
13
|
static void check_children_max(unsigned short n) {
|
|
26
14
|
size_t max = sizeof(rbs_loc_entry_bitmap) * 8;
|
|
27
15
|
if (n > max) {
|
|
@@ -34,7 +22,6 @@ void rbs_loc_legacy_alloc_children(rbs_loc *loc, unsigned short cap) {
|
|
|
34
22
|
|
|
35
23
|
size_t s = RBS_LOC_CHILDREN_SIZE(cap);
|
|
36
24
|
loc->children = (rbs_loc_children *) malloc(s);
|
|
37
|
-
|
|
38
25
|
*loc->children = (rbs_loc_children) {
|
|
39
26
|
.len = 0,
|
|
40
27
|
.required_p = 0,
|
|
@@ -55,17 +42,17 @@ static void check_children_cap(rbs_loc *loc) {
|
|
|
55
42
|
}
|
|
56
43
|
}
|
|
57
44
|
|
|
58
|
-
void rbs_loc_legacy_add_optional_child(rbs_loc *loc,
|
|
45
|
+
void rbs_loc_legacy_add_optional_child(rbs_loc *loc, ID name, rbs_loc_range r) {
|
|
59
46
|
check_children_cap(loc);
|
|
60
47
|
|
|
61
48
|
unsigned short i = loc->children->len++;
|
|
62
49
|
loc->children->entries[i] = (rbs_loc_entry) {
|
|
63
50
|
.name = name,
|
|
64
|
-
.rg =
|
|
51
|
+
.rg = r,
|
|
65
52
|
};
|
|
66
53
|
}
|
|
67
54
|
|
|
68
|
-
void rbs_loc_legacy_add_required_child(rbs_loc *loc,
|
|
55
|
+
void rbs_loc_legacy_add_required_child(rbs_loc *loc, ID name, rbs_loc_range r) {
|
|
69
56
|
rbs_loc_legacy_add_optional_child(loc, name, r);
|
|
70
57
|
|
|
71
58
|
unsigned short last_index = loc->children->len - 1;
|
|
@@ -168,23 +155,15 @@ static VALUE location_end_pos(VALUE self) {
|
|
|
168
155
|
return INT2FIX(loc->rg.end);
|
|
169
156
|
}
|
|
170
157
|
|
|
171
|
-
static rbs_constant_id_t rbs_constant_pool_insert_ruby_symbol(VALUE symbol) {
|
|
172
|
-
VALUE name = rb_sym2str(symbol);
|
|
173
|
-
|
|
174
|
-
// Constants inserted here will never be freed, but that's acceptable because:
|
|
175
|
-
// 1. Most symbols passed into here will be the ones already inserted into the constant pool by `parser.c`.
|
|
176
|
-
// 2. Methods like `add_required_child` and `add_optional_child` will usually only get called with a few different symbols.
|
|
177
|
-
return rbs_constant_pool_insert_constant(RBS_GLOBAL_CONSTANT_POOL, (const uint8_t *) RSTRING_PTR(name), RSTRING_LEN(name));
|
|
178
|
-
}
|
|
179
|
-
|
|
180
158
|
static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VALUE end) {
|
|
181
159
|
rbs_loc *loc = rbs_check_location(self);
|
|
182
160
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
161
|
+
rbs_loc_range rg = {
|
|
162
|
+
.start = FIX2INT(start),
|
|
163
|
+
.end = FIX2INT(end),
|
|
164
|
+
};
|
|
186
165
|
|
|
187
|
-
rbs_loc_legacy_add_required_child(loc,
|
|
166
|
+
rbs_loc_legacy_add_required_child(loc, rb_sym2id(name), rg);
|
|
188
167
|
|
|
189
168
|
return Qnil;
|
|
190
169
|
}
|
|
@@ -192,11 +171,12 @@ static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VA
|
|
|
192
171
|
static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VALUE end) {
|
|
193
172
|
rbs_loc *loc = rbs_check_location(self);
|
|
194
173
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
174
|
+
rbs_loc_range rg = {
|
|
175
|
+
.start = FIX2INT(start),
|
|
176
|
+
.end = FIX2INT(end),
|
|
177
|
+
};
|
|
198
178
|
|
|
199
|
-
rbs_loc_legacy_add_optional_child(loc,
|
|
179
|
+
rbs_loc_legacy_add_optional_child(loc, rb_sym2id(name), rg);
|
|
200
180
|
|
|
201
181
|
return Qnil;
|
|
202
182
|
}
|
|
@@ -204,7 +184,7 @@ static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VA
|
|
|
204
184
|
static VALUE location_add_optional_no_child(VALUE self, VALUE name) {
|
|
205
185
|
rbs_loc *loc = rbs_check_location(self);
|
|
206
186
|
|
|
207
|
-
rbs_loc_legacy_add_optional_child(loc,
|
|
187
|
+
rbs_loc_legacy_add_optional_child(loc, rb_sym2id(name), RBS_LOC_NULL_RANGE);
|
|
208
188
|
|
|
209
189
|
return Qnil;
|
|
210
190
|
}
|
|
@@ -213,32 +193,35 @@ VALUE rbs_new_location(VALUE buffer, rbs_range_t rg) {
|
|
|
213
193
|
rbs_loc *loc;
|
|
214
194
|
VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
|
|
215
195
|
|
|
216
|
-
rbs_loc_init(loc, buffer,
|
|
196
|
+
rbs_loc_init(loc, buffer, (rbs_loc_range) { rg.start.char_pos, rg.end.char_pos });
|
|
217
197
|
|
|
218
198
|
return obj;
|
|
219
199
|
}
|
|
220
200
|
|
|
221
|
-
|
|
201
|
+
VALUE rbs_new_location2(VALUE buffer, int start_char, int end_char) {
|
|
222
202
|
rbs_loc *loc;
|
|
223
203
|
VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
|
|
224
204
|
|
|
225
|
-
rbs_loc_init(loc, buffer,
|
|
205
|
+
rbs_loc_init(loc, buffer, (rbs_loc_range) { .start = start_char, .end = end_char });
|
|
226
206
|
|
|
227
207
|
return obj;
|
|
228
208
|
}
|
|
229
209
|
|
|
230
|
-
static
|
|
231
|
-
|
|
210
|
+
static VALUE rbs_new_location_from_loc_range(VALUE buffer, rbs_loc_range rg) {
|
|
211
|
+
rbs_loc *loc;
|
|
212
|
+
VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
|
|
232
213
|
|
|
233
|
-
|
|
214
|
+
rbs_loc_init(loc, buffer, rg);
|
|
215
|
+
|
|
216
|
+
return obj;
|
|
234
217
|
}
|
|
235
218
|
|
|
236
219
|
static VALUE location_aref(VALUE self, VALUE name) {
|
|
237
220
|
rbs_loc *loc = rbs_check_location(self);
|
|
238
221
|
|
|
239
|
-
|
|
222
|
+
ID id = rb_sym2id(name);
|
|
240
223
|
|
|
241
|
-
if (loc->children != NULL
|
|
224
|
+
if (loc->children != NULL) {
|
|
242
225
|
for (unsigned short i = 0; i < loc->children->len; i++) {
|
|
243
226
|
if (loc->children->entries[i].name == id) {
|
|
244
227
|
rbs_loc_range result = loc->children->entries[i].rg;
|
|
@@ -256,10 +239,6 @@ static VALUE location_aref(VALUE self, VALUE name) {
|
|
|
256
239
|
rb_raise(rb_eRuntimeError, "Unknown child name given: %s", RSTRING_PTR(string));
|
|
257
240
|
}
|
|
258
241
|
|
|
259
|
-
static VALUE rbs_constant_to_ruby_symbol(rbs_constant_t *constant) {
|
|
260
|
-
return ID2SYM(rb_intern2((const char *) constant->start, constant->length));
|
|
261
|
-
}
|
|
262
|
-
|
|
263
242
|
static VALUE location_optional_keys(VALUE self) {
|
|
264
243
|
VALUE keys = rb_ary_new();
|
|
265
244
|
|
|
@@ -271,8 +250,7 @@ static VALUE location_optional_keys(VALUE self) {
|
|
|
271
250
|
|
|
272
251
|
for (unsigned short i = 0; i < children->len; i++) {
|
|
273
252
|
if (RBS_LOC_OPTIONAL_P(loc, i)) {
|
|
274
|
-
|
|
275
|
-
VALUE key_sym = rbs_constant_to_ruby_symbol(key_id);
|
|
253
|
+
VALUE key_sym = rb_id2sym(children->entries[i].name);
|
|
276
254
|
rb_ary_push(keys, key_sym);
|
|
277
255
|
}
|
|
278
256
|
}
|
|
@@ -291,8 +269,7 @@ static VALUE location_required_keys(VALUE self) {
|
|
|
291
269
|
|
|
292
270
|
for (unsigned short i = 0; i < children->len; i++) {
|
|
293
271
|
if (RBS_LOC_REQUIRED_P(loc, i)) {
|
|
294
|
-
|
|
295
|
-
VALUE key_sym = rbs_constant_to_ruby_symbol(key_id);
|
|
272
|
+
VALUE key_sym = rb_id2sym(children->entries[i].name);
|
|
296
273
|
rb_ary_push(keys, key_sym);
|
|
297
274
|
}
|
|
298
275
|
}
|
|
@@ -306,8 +283,8 @@ void rbs__init_location(void) {
|
|
|
306
283
|
rb_define_private_method(RBS_Location, "initialize", location_initialize, 3);
|
|
307
284
|
rb_define_private_method(RBS_Location, "initialize_copy", location_initialize_copy, 1);
|
|
308
285
|
rb_define_method(RBS_Location, "buffer", location_buffer, 0);
|
|
309
|
-
rb_define_method(RBS_Location, "
|
|
310
|
-
rb_define_method(RBS_Location, "
|
|
286
|
+
rb_define_method(RBS_Location, "_start_pos", location_start_pos, 0);
|
|
287
|
+
rb_define_method(RBS_Location, "_end_pos", location_end_pos, 0);
|
|
311
288
|
rb_define_method(RBS_Location, "_add_required_child", location_add_required_child, 3);
|
|
312
289
|
rb_define_method(RBS_Location, "_add_optional_child", location_add_optional_child, 3);
|
|
313
290
|
rb_define_method(RBS_Location, "_add_optional_no_child", location_add_optional_no_child, 1);
|
|
@@ -9,11 +9,43 @@ SUPPRESS_RUBY_HEADER_DIAGNOSTICS_END
|
|
|
9
9
|
|
|
10
10
|
#include "rbs.h"
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Data structures for implementing RBS::Location class in Ruby.
|
|
14
|
+
*
|
|
15
|
+
* These structs support hierarchical locations, allowing sub-locations (children)
|
|
16
|
+
* to be stored under a main location. Each sub-location is identified by its
|
|
17
|
+
* name (Ruby Symbol ID).
|
|
18
|
+
*/
|
|
19
|
+
|
|
12
20
|
/**
|
|
13
21
|
* RBS::Location class
|
|
14
22
|
* */
|
|
15
23
|
extern VALUE RBS_Location;
|
|
16
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Range of character index for `rbs_loc` locations.
|
|
27
|
+
*/
|
|
28
|
+
typedef struct {
|
|
29
|
+
int start;
|
|
30
|
+
int end;
|
|
31
|
+
} rbs_loc_range;
|
|
32
|
+
|
|
33
|
+
typedef struct {
|
|
34
|
+
ID name; /* Ruby ID for the name of the entry */
|
|
35
|
+
rbs_loc_range rg;
|
|
36
|
+
} rbs_loc_entry;
|
|
37
|
+
|
|
38
|
+
typedef unsigned int rbs_loc_entry_bitmap;
|
|
39
|
+
|
|
40
|
+
// The flexible array always allocates, but it's okay.
|
|
41
|
+
// This struct is not allocated when the `rbs_loc` doesn't have children.
|
|
42
|
+
typedef struct {
|
|
43
|
+
unsigned short len;
|
|
44
|
+
unsigned short cap;
|
|
45
|
+
rbs_loc_entry_bitmap required_p;
|
|
46
|
+
rbs_loc_entry entries[1];
|
|
47
|
+
} rbs_loc_children;
|
|
48
|
+
|
|
17
49
|
typedef struct {
|
|
18
50
|
VALUE buffer;
|
|
19
51
|
rbs_loc_range rg;
|
|
@@ -25,6 +57,8 @@ typedef struct {
|
|
|
25
57
|
* */
|
|
26
58
|
VALUE rbs_new_location(VALUE buffer, rbs_range_t rg);
|
|
27
59
|
|
|
60
|
+
VALUE rbs_new_location2(VALUE buffer, int start_char, int end_char);
|
|
61
|
+
|
|
28
62
|
/**
|
|
29
63
|
* Return rbs_loc associated with the RBS::Location object.
|
|
30
64
|
* */
|
|
@@ -37,6 +71,9 @@ rbs_loc *rbs_check_location(VALUE location);
|
|
|
37
71
|
* */
|
|
38
72
|
void rbs_loc_legacy_alloc_children(rbs_loc *loc, unsigned short cap);
|
|
39
73
|
|
|
74
|
+
void rbs_loc_legacy_add_optional_child(rbs_loc *loc, ID name, rbs_loc_range r);
|
|
75
|
+
void rbs_loc_legacy_add_required_child(rbs_loc *loc, ID name, rbs_loc_range r);
|
|
76
|
+
|
|
40
77
|
/**
|
|
41
78
|
* Define RBS::Location class.
|
|
42
79
|
* */
|
data/ext/rbs_extension/main.c
CHANGED
|
@@ -67,10 +67,12 @@ static void declare_type_variables(rbs_parser_t *parser, VALUE variables, VALUE
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
VALUE name_str = rb_sym2str(symbol);
|
|
70
|
+
uint8_t *copied_name = (uint8_t *) malloc((size_t) RSTRING_LEN(name_str));
|
|
71
|
+
memcpy((void *) copied_name, RSTRING_PTR(name_str), RSTRING_LEN(name_str));
|
|
70
72
|
|
|
71
|
-
rbs_constant_id_t id =
|
|
73
|
+
rbs_constant_id_t id = rbs_constant_pool_insert_owned(
|
|
72
74
|
&parser->constant_pool,
|
|
73
|
-
|
|
75
|
+
copied_name,
|
|
74
76
|
RSTRING_LEN(name_str)
|
|
75
77
|
);
|
|
76
78
|
|
|
@@ -85,6 +87,23 @@ struct parse_type_arg {
|
|
|
85
87
|
rb_encoding *encoding;
|
|
86
88
|
rbs_parser_t *parser;
|
|
87
89
|
VALUE require_eof;
|
|
90
|
+
VALUE void_allowed;
|
|
91
|
+
VALUE self_allowed;
|
|
92
|
+
VALUE classish_allowed;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
struct parse_method_type_arg {
|
|
96
|
+
VALUE buffer;
|
|
97
|
+
rb_encoding *encoding;
|
|
98
|
+
rbs_parser_t *parser;
|
|
99
|
+
VALUE require_eof;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
struct parse_signature_arg {
|
|
103
|
+
VALUE buffer;
|
|
104
|
+
rb_encoding *encoding;
|
|
105
|
+
rbs_parser_t *parser;
|
|
106
|
+
VALUE require_eof;
|
|
88
107
|
};
|
|
89
108
|
|
|
90
109
|
static VALUE ensure_free_parser(VALUE parser) {
|
|
@@ -100,8 +119,12 @@ static VALUE parse_type_try(VALUE a) {
|
|
|
100
119
|
return Qnil;
|
|
101
120
|
}
|
|
102
121
|
|
|
122
|
+
bool void_allowed = RTEST(arg->void_allowed);
|
|
123
|
+
bool self_allowed = RTEST(arg->self_allowed);
|
|
124
|
+
bool classish_allowed = RTEST(arg->classish_allowed);
|
|
125
|
+
|
|
103
126
|
rbs_node_t *type;
|
|
104
|
-
rbs_parse_type(parser, &type);
|
|
127
|
+
rbs_parse_type(parser, &type, void_allowed, self_allowed, classish_allowed);
|
|
105
128
|
|
|
106
129
|
raise_error_if_any(parser, arg->buffer);
|
|
107
130
|
|
|
@@ -157,7 +180,7 @@ static rbs_parser_t *alloc_parser_from_buffer(VALUE buffer, int start_pos, int e
|
|
|
157
180
|
);
|
|
158
181
|
}
|
|
159
182
|
|
|
160
|
-
static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof) {
|
|
183
|
+
static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof, VALUE void_allowed, VALUE self_allowed, VALUE classish_allowed) {
|
|
161
184
|
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
|
|
162
185
|
StringValue(string);
|
|
163
186
|
rb_encoding *encoding = rb_enc_get(string);
|
|
@@ -168,7 +191,10 @@ static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VAL
|
|
|
168
191
|
.buffer = buffer,
|
|
169
192
|
.encoding = encoding,
|
|
170
193
|
.parser = parser,
|
|
171
|
-
.require_eof = require_eof
|
|
194
|
+
.require_eof = require_eof,
|
|
195
|
+
.void_allowed = void_allowed,
|
|
196
|
+
.self_allowed = self_allowed,
|
|
197
|
+
.classish_allowed = classish_allowed
|
|
172
198
|
};
|
|
173
199
|
|
|
174
200
|
VALUE result = rb_ensure(parse_type_try, (VALUE) &arg, ensure_free_parser, (VALUE) parser);
|
|
@@ -179,7 +205,7 @@ static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VAL
|
|
|
179
205
|
}
|
|
180
206
|
|
|
181
207
|
static VALUE parse_method_type_try(VALUE a) {
|
|
182
|
-
struct
|
|
208
|
+
struct parse_method_type_arg *arg = (struct parse_method_type_arg *) a;
|
|
183
209
|
rbs_parser_t *parser = arg->parser;
|
|
184
210
|
|
|
185
211
|
if (parser->next_token.type == pEOF) {
|
|
@@ -187,7 +213,7 @@ static VALUE parse_method_type_try(VALUE a) {
|
|
|
187
213
|
}
|
|
188
214
|
|
|
189
215
|
rbs_method_type_t *method_type = NULL;
|
|
190
|
-
rbs_parse_method_type(parser, &method_type, RB_TEST(arg->require_eof));
|
|
216
|
+
rbs_parse_method_type(parser, &method_type, RB_TEST(arg->require_eof), true);
|
|
191
217
|
|
|
192
218
|
raise_error_if_any(parser, arg->buffer);
|
|
193
219
|
|
|
@@ -207,7 +233,7 @@ static VALUE rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_p
|
|
|
207
233
|
|
|
208
234
|
rbs_parser_t *parser = alloc_parser_from_buffer(buffer, FIX2INT(start_pos), FIX2INT(end_pos));
|
|
209
235
|
declare_type_variables(parser, variables, buffer);
|
|
210
|
-
struct
|
|
236
|
+
struct parse_method_type_arg arg = {
|
|
211
237
|
.buffer = buffer,
|
|
212
238
|
.encoding = encoding,
|
|
213
239
|
.parser = parser,
|
|
@@ -222,7 +248,7 @@ static VALUE rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_p
|
|
|
222
248
|
}
|
|
223
249
|
|
|
224
250
|
static VALUE parse_signature_try(VALUE a) {
|
|
225
|
-
struct
|
|
251
|
+
struct parse_signature_arg *arg = (struct parse_signature_arg *) a;
|
|
226
252
|
rbs_parser_t *parser = arg->parser;
|
|
227
253
|
|
|
228
254
|
rbs_signature_t *signature = NULL;
|
|
@@ -245,7 +271,7 @@ static VALUE rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE start_pos
|
|
|
245
271
|
rb_encoding *encoding = rb_enc_get(string);
|
|
246
272
|
|
|
247
273
|
rbs_parser_t *parser = alloc_parser_from_buffer(buffer, FIX2INT(start_pos), FIX2INT(end_pos));
|
|
248
|
-
struct
|
|
274
|
+
struct parse_signature_arg arg = {
|
|
249
275
|
.buffer = buffer,
|
|
250
276
|
.encoding = encoding,
|
|
251
277
|
.parser = parser,
|
|
@@ -308,6 +334,92 @@ static VALUE rbsparser_parse_type_params(VALUE self, VALUE buffer, VALUE start_p
|
|
|
308
334
|
return result;
|
|
309
335
|
}
|
|
310
336
|
|
|
337
|
+
static VALUE parse_inline_leading_annotation_try(VALUE a) {
|
|
338
|
+
struct parse_type_arg *arg = (struct parse_type_arg *) a;
|
|
339
|
+
rbs_parser_t *parser = arg->parser;
|
|
340
|
+
|
|
341
|
+
rbs_ast_ruby_annotations_t *annotation = NULL;
|
|
342
|
+
bool success = rbs_parse_inline_leading_annotation(parser, &annotation);
|
|
343
|
+
|
|
344
|
+
raise_error_if_any(parser, arg->buffer);
|
|
345
|
+
|
|
346
|
+
if (!success || annotation == NULL) {
|
|
347
|
+
return Qnil;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
rbs_translation_context_t ctx = rbs_translation_context_create(
|
|
351
|
+
&parser->constant_pool,
|
|
352
|
+
arg->buffer,
|
|
353
|
+
arg->encoding
|
|
354
|
+
);
|
|
355
|
+
|
|
356
|
+
return rbs_struct_to_ruby_value(ctx, (rbs_node_t *) annotation);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
static VALUE rbsparser_parse_inline_leading_annotation(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables) {
|
|
360
|
+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
|
|
361
|
+
StringValue(string);
|
|
362
|
+
rb_encoding *encoding = rb_enc_get(string);
|
|
363
|
+
|
|
364
|
+
rbs_parser_t *parser = alloc_parser_from_buffer(buffer, FIX2INT(start_pos), FIX2INT(end_pos));
|
|
365
|
+
declare_type_variables(parser, variables, buffer);
|
|
366
|
+
struct parse_type_arg arg = {
|
|
367
|
+
.buffer = buffer,
|
|
368
|
+
.encoding = encoding,
|
|
369
|
+
.parser = parser,
|
|
370
|
+
.require_eof = Qfalse
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
VALUE result = rb_ensure(parse_inline_leading_annotation_try, (VALUE) &arg, ensure_free_parser, (VALUE) parser);
|
|
374
|
+
|
|
375
|
+
RB_GC_GUARD(string);
|
|
376
|
+
|
|
377
|
+
return result;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
static VALUE parse_inline_trailing_annotation_try(VALUE a) {
|
|
381
|
+
struct parse_type_arg *arg = (struct parse_type_arg *) a;
|
|
382
|
+
rbs_parser_t *parser = arg->parser;
|
|
383
|
+
|
|
384
|
+
rbs_ast_ruby_annotations_t *annotation = NULL;
|
|
385
|
+
bool success = rbs_parse_inline_trailing_annotation(parser, &annotation);
|
|
386
|
+
|
|
387
|
+
raise_error_if_any(parser, arg->buffer);
|
|
388
|
+
|
|
389
|
+
if (!success || annotation == NULL) {
|
|
390
|
+
return Qnil;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
rbs_translation_context_t ctx = rbs_translation_context_create(
|
|
394
|
+
&parser->constant_pool,
|
|
395
|
+
arg->buffer,
|
|
396
|
+
arg->encoding
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
return rbs_struct_to_ruby_value(ctx, (rbs_node_t *) annotation);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
static VALUE rbsparser_parse_inline_trailing_annotation(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables) {
|
|
403
|
+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
|
|
404
|
+
StringValue(string);
|
|
405
|
+
rb_encoding *encoding = rb_enc_get(string);
|
|
406
|
+
|
|
407
|
+
rbs_parser_t *parser = alloc_parser_from_buffer(buffer, FIX2INT(start_pos), FIX2INT(end_pos));
|
|
408
|
+
declare_type_variables(parser, variables, buffer);
|
|
409
|
+
struct parse_type_arg arg = {
|
|
410
|
+
.buffer = buffer,
|
|
411
|
+
.encoding = encoding,
|
|
412
|
+
.parser = parser,
|
|
413
|
+
.require_eof = Qfalse
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
VALUE result = rb_ensure(parse_inline_trailing_annotation_try, (VALUE) &arg, ensure_free_parser, (VALUE) parser);
|
|
417
|
+
|
|
418
|
+
RB_GC_GUARD(string);
|
|
419
|
+
|
|
420
|
+
return result;
|
|
421
|
+
}
|
|
422
|
+
|
|
311
423
|
static VALUE rbsparser_lex(VALUE self, VALUE buffer, VALUE end_pos) {
|
|
312
424
|
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
|
|
313
425
|
StringValue(string);
|
|
@@ -342,15 +454,16 @@ void rbs__init_parser(void) {
|
|
|
342
454
|
EMPTY_HASH = rb_obj_freeze(rb_hash_new());
|
|
343
455
|
rb_gc_register_mark_object(EMPTY_HASH);
|
|
344
456
|
|
|
345
|
-
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type,
|
|
457
|
+
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 8);
|
|
346
458
|
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
|
|
347
459
|
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 3);
|
|
348
460
|
rb_define_singleton_method(RBS_Parser, "_parse_type_params", rbsparser_parse_type_params, 4);
|
|
461
|
+
rb_define_singleton_method(RBS_Parser, "_parse_inline_leading_annotation", rbsparser_parse_inline_leading_annotation, 4);
|
|
462
|
+
rb_define_singleton_method(RBS_Parser, "_parse_inline_trailing_annotation", rbsparser_parse_inline_trailing_annotation, 4);
|
|
349
463
|
rb_define_singleton_method(RBS_Parser, "_lex", rbsparser_lex, 2);
|
|
350
464
|
}
|
|
351
465
|
|
|
352
466
|
static void Deinit_rbs_extension(ruby_vm_t *_) {
|
|
353
|
-
rbs_constant_pool_free(RBS_GLOBAL_CONSTANT_POOL);
|
|
354
467
|
}
|
|
355
468
|
|
|
356
469
|
void Init_rbs_extension(void) {
|
|
@@ -361,17 +474,5 @@ void Init_rbs_extension(void) {
|
|
|
361
474
|
rbs__init_location();
|
|
362
475
|
rbs__init_parser();
|
|
363
476
|
|
|
364
|
-
/* Calculated based on the number of unique strings used with the `INTERN` macro in `parser.c`.
|
|
365
|
-
*
|
|
366
|
-
* ```bash
|
|
367
|
-
* grep -o 'INTERN("\([^"]*\)")' ext/rbs_extension/parser.c \
|
|
368
|
-
* | sed 's/INTERN("\(.*\)")/\1/' \
|
|
369
|
-
* | sort -u \
|
|
370
|
-
* | wc -l
|
|
371
|
-
* ```
|
|
372
|
-
*/
|
|
373
|
-
const size_t num_uniquely_interned_strings = 26;
|
|
374
|
-
rbs_constant_pool_init(RBS_GLOBAL_CONSTANT_POOL, num_uniquely_interned_strings);
|
|
375
|
-
|
|
376
477
|
ruby_vm_at_exit(Deinit_rbs_extension);
|
|
377
478
|
}
|