rbs 3.10.0 → 4.0.0.dev.1
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/workflows/comments.yml +3 -3
- data/.github/workflows/ruby.yml +24 -35
- data/.github/workflows/typecheck.yml +3 -1
- data/.github/workflows/windows.yml +2 -2
- data/.gitignore +0 -4
- data/CHANGELOG.md +0 -88
- data/README.md +1 -38
- data/Rakefile +20 -142
- data/Steepfile +1 -0
- data/config.yml +43 -1
- data/core/array.rbs +46 -100
- data/core/complex.rbs +21 -32
- data/core/dir.rbs +2 -2
- data/core/encoding.rbs +9 -6
- data/core/enumerable.rbs +3 -90
- data/core/enumerator.rbs +1 -18
- data/core/errno.rbs +0 -8
- data/core/errors.rbs +1 -28
- data/core/exception.rbs +2 -2
- data/core/fiber.rbs +4 -5
- data/core/file.rbs +12 -27
- data/core/file_test.rbs +1 -1
- data/core/float.rbs +22 -209
- data/core/gc.rbs +281 -417
- data/core/hash.rbs +727 -1024
- data/core/integer.rbs +38 -78
- data/core/io/buffer.rbs +7 -18
- data/core/io/wait.rbs +33 -11
- data/core/io.rbs +12 -14
- data/core/kernel.rbs +51 -57
- data/core/marshal.rbs +1 -1
- data/core/match_data.rbs +1 -1
- data/core/math.rbs +3 -42
- data/core/method.rbs +6 -14
- data/core/module.rbs +17 -88
- data/core/nil_class.rbs +3 -3
- data/core/numeric.rbs +16 -16
- data/core/object.rbs +3 -3
- data/core/object_space.rbs +15 -21
- data/core/proc.rbs +8 -15
- data/core/process.rbs +2 -2
- data/core/ractor.rbs +437 -278
- data/core/range.rbs +8 -7
- data/core/rational.rbs +24 -37
- data/core/rbs/unnamed/argf.rbs +2 -2
- data/core/rbs/unnamed/env_class.rbs +1 -1
- data/core/rbs/unnamed/random.rbs +2 -4
- data/core/regexp.rbs +20 -25
- data/core/ruby_vm.rbs +4 -6
- data/core/rubygems/errors.rbs +70 -3
- data/core/rubygems/rubygems.rbs +79 -11
- data/core/rubygems/version.rbs +3 -2
- data/core/set.rbs +359 -488
- data/core/string.rbs +1228 -3153
- data/core/struct.rbs +1 -1
- data/core/symbol.rbs +4 -4
- data/core/thread.rbs +29 -92
- data/core/time.rbs +9 -35
- data/core/trace_point.rbs +4 -7
- data/core/unbound_method.rbs +6 -14
- data/docs/collection.md +2 -2
- data/docs/gem.md +1 -0
- data/docs/sigs.md +3 -3
- data/ext/rbs_extension/ast_translation.c +1077 -944
- data/ext/rbs_extension/ast_translation.h +0 -7
- data/ext/rbs_extension/class_constants.c +83 -71
- data/ext/rbs_extension/class_constants.h +7 -4
- data/ext/rbs_extension/extconf.rb +2 -24
- data/ext/rbs_extension/legacy_location.c +172 -173
- data/ext/rbs_extension/legacy_location.h +3 -8
- data/ext/rbs_extension/main.c +289 -239
- data/ext/rbs_extension/rbs_extension.h +0 -3
- data/ext/rbs_extension/rbs_string_bridging.h +0 -4
- data/include/rbs/ast.h +98 -37
- data/include/rbs/defines.h +12 -38
- data/include/rbs/lexer.h +114 -126
- data/include/rbs/location.h +14 -14
- data/include/rbs/parser.h +37 -21
- data/include/rbs/string.h +5 -3
- data/include/rbs/util/rbs_allocator.h +19 -40
- data/include/rbs/util/rbs_assert.h +1 -12
- data/include/rbs/util/rbs_constant_pool.h +3 -3
- data/include/rbs/util/rbs_encoding.h +1 -3
- data/include/rbs/util/rbs_unescape.h +1 -2
- data/lib/rbs/ast/ruby/annotations.rb +119 -0
- data/lib/rbs/ast/ruby/comment_block.rb +221 -0
- data/lib/rbs/ast/ruby/declarations.rb +86 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +213 -0
- data/lib/rbs/buffer.rb +104 -24
- data/lib/rbs/cli/validate.rb +40 -35
- data/lib/rbs/cli.rb +5 -6
- data/lib/rbs/collection/config/lockfile_generator.rb +0 -1
- data/lib/rbs/collection.rb +0 -1
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +65 -62
- data/lib/rbs/definition_builder/method_builder.rb +45 -30
- data/lib/rbs/definition_builder.rb +44 -9
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +244 -218
- data/lib/rbs/environment_loader.rb +3 -3
- data/lib/rbs/errors.rb +5 -4
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +206 -0
- data/lib/rbs/location_aux.rb +35 -3
- data/lib/rbs/parser_aux.rb +11 -6
- data/lib/rbs/prototype/runtime.rb +2 -2
- data/lib/rbs/resolver/constant_resolver.rb +2 -2
- data/lib/rbs/resolver/type_name_resolver.rb +38 -124
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +4 -3
- data/lib/rbs/test/type_check.rb +0 -14
- data/lib/rbs/types.rb +1 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +13 -1
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +1 -1
- data/rbs.gemspec +1 -0
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +110 -0
- data/sig/ast/ruby/comment_block.rbs +119 -0
- data/sig/ast/ruby/declarations.rbs +60 -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 +72 -0
- data/sig/buffer.rbs +63 -5
- data/sig/definition.rbs +1 -0
- data/sig/definition_builder.rbs +1 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +28 -133
- data/sig/errors.rbs +13 -6
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +87 -0
- data/sig/location.rbs +32 -7
- data/sig/manifest.yaml +1 -0
- data/sig/method_builder.rbs +7 -4
- data/sig/parser.rbs +16 -20
- data/sig/resolver/type_name_resolver.rbs +7 -38
- data/sig/source.rbs +48 -0
- data/sig/types.rbs +1 -4
- data/src/ast.c +290 -201
- data/src/lexer.c +2813 -2902
- data/src/lexer.re +4 -0
- data/src/lexstate.c +155 -169
- data/src/location.c +40 -40
- data/src/parser.c +2665 -2433
- data/src/string.c +48 -0
- data/src/util/rbs_allocator.c +77 -80
- data/src/util/rbs_assert.c +10 -10
- data/src/util/rbs_buffer.c +2 -2
- data/src/util/rbs_constant_pool.c +15 -13
- data/src/util/rbs_encoding.c +4062 -20097
- data/src/util/rbs_unescape.c +48 -85
- data/stdlib/bigdecimal/0/big_decimal.rbs +82 -100
- data/stdlib/bigdecimal-math/0/big_math.rbs +8 -169
- data/stdlib/cgi/0/core.rbs +396 -2
- data/stdlib/cgi/0/manifest.yaml +0 -1
- data/stdlib/coverage/0/coverage.rbs +1 -3
- data/stdlib/date/0/date.rbs +59 -67
- data/stdlib/date/0/date_time.rbs +1 -1
- data/stdlib/delegate/0/delegator.rbs +7 -10
- data/stdlib/erb/0/erb.rbs +347 -737
- data/stdlib/fileutils/0/fileutils.rbs +13 -18
- data/stdlib/forwardable/0/forwardable.rbs +0 -3
- data/stdlib/json/0/json.rbs +48 -68
- data/stdlib/net-http/0/net-http.rbs +0 -3
- data/stdlib/objspace/0/objspace.rbs +4 -9
- data/stdlib/open-uri/0/open-uri.rbs +0 -40
- data/stdlib/openssl/0/openssl.rbs +228 -331
- data/stdlib/optparse/0/optparse.rbs +3 -3
- data/{core → stdlib/pathname/0}/pathname.rbs +355 -255
- data/stdlib/psych/0/psych.rbs +3 -3
- data/stdlib/rdoc/0/rdoc.rbs +1 -1
- data/stdlib/resolv/0/resolv.rbs +68 -25
- data/stdlib/ripper/0/ripper.rbs +2 -5
- data/stdlib/singleton/0/singleton.rbs +0 -3
- data/stdlib/socket/0/socket.rbs +1 -13
- data/stdlib/socket/0/tcp_socket.rbs +2 -10
- data/stdlib/stringio/0/stringio.rbs +85 -1176
- data/stdlib/strscan/0/string_scanner.rbs +31 -31
- data/stdlib/tempfile/0/tempfile.rbs +3 -3
- data/stdlib/time/0/time.rbs +1 -1
- data/stdlib/timeout/0/timeout.rbs +7 -63
- data/stdlib/tsort/0/cyclic.rbs +0 -3
- data/stdlib/uri/0/common.rbs +2 -11
- data/stdlib/uri/0/file.rbs +1 -1
- data/stdlib/uri/0/generic.rbs +16 -17
- data/stdlib/uri/0/rfc2396_parser.rbs +7 -6
- data/stdlib/zlib/0/zstream.rbs +0 -1
- metadata +40 -12
- data/.clang-format +0 -74
- data/.clangd +0 -2
- data/.github/workflows/c-check.yml +0 -54
- data/core/ruby.rbs +0 -53
- data/docs/aliases.md +0 -79
- data/docs/encoding.md +0 -56
- data/ext/rbs_extension/compat.h +0 -10
- data/stdlib/cgi-escape/0/escape.rbs +0 -153
data/src/lexer.re
CHANGED
|
@@ -46,6 +46,7 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) {
|
|
|
46
46
|
"<" { return rbs_next_token(lexer, pLT); }
|
|
47
47
|
"[]" { return rbs_next_token(lexer, pAREF_OPR); }
|
|
48
48
|
operator { return rbs_next_token(lexer, tOPERATOR); }
|
|
49
|
+
"--" [^\x00]* { return rbs_next_token(lexer, tINLINECOMMENT); }
|
|
49
50
|
|
|
50
51
|
number = [0-9] [0-9_]*;
|
|
51
52
|
("-"|"+")? number { return rbs_next_token(lexer, tINTEGER); }
|
|
@@ -95,6 +96,9 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) {
|
|
|
95
96
|
"use" { return rbs_next_token(lexer, kUSE); }
|
|
96
97
|
"as" { return rbs_next_token(lexer, kAS); }
|
|
97
98
|
"__todo__" { return rbs_next_token(lexer, k__TODO__); }
|
|
99
|
+
"@rbs" { return rbs_next_token(lexer, kATRBS); }
|
|
100
|
+
"skip" { return rbs_next_token(lexer, kSKIP); }
|
|
101
|
+
"return" { return rbs_next_token(lexer, kRETURN); }
|
|
98
102
|
|
|
99
103
|
unicode_char = "\\u" [0-9a-fA-F]{4};
|
|
100
104
|
oct_char = "\\x" [0-9a-f]{1,2};
|
data/src/lexstate.c
CHANGED
|
@@ -1,205 +1,191 @@
|
|
|
1
|
-
#include "rbs/defines.h"
|
|
2
1
|
#include "rbs/lexer.h"
|
|
3
|
-
#include "rbs/util/rbs_assert.h"
|
|
4
2
|
|
|
5
3
|
static const char *RBS_TOKENTYPE_NAMES[] = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
4
|
+
"NullType",
|
|
5
|
+
"pEOF",
|
|
6
|
+
"ErrorToken",
|
|
7
|
+
|
|
8
|
+
"pLPAREN", /* ( */
|
|
9
|
+
"pRPAREN", /* ) */
|
|
10
|
+
"pCOLON", /* : */
|
|
11
|
+
"pCOLON2", /* :: */
|
|
12
|
+
"pLBRACKET", /* [ */
|
|
13
|
+
"pRBRACKET", /* ] */
|
|
14
|
+
"pLBRACE", /* { */
|
|
15
|
+
"pRBRACE", /* } */
|
|
16
|
+
"pHAT", /* ^ */
|
|
17
|
+
"pARROW", /* -> */
|
|
18
|
+
"pFATARROW", /* => */
|
|
19
|
+
"pCOMMA", /* , */
|
|
20
|
+
"pBAR", /* | */
|
|
21
|
+
"pAMP", /* & */
|
|
22
|
+
"pSTAR", /* * */
|
|
23
|
+
"pSTAR2", /* ** */
|
|
24
|
+
"pDOT", /* . */
|
|
25
|
+
"pDOT3", /* ... */
|
|
26
|
+
"pBANG", /* ! */
|
|
27
|
+
"pQUESTION", /* ? */
|
|
28
|
+
"pLT", /* < */
|
|
29
|
+
"pEQ", /* = */
|
|
30
|
+
|
|
31
|
+
"kALIAS", /* alias */
|
|
32
|
+
"kATTRACCESSOR", /* attr_accessor */
|
|
33
|
+
"kATTRREADER", /* attr_reader */
|
|
34
|
+
"kATTRWRITER", /* attr_writer */
|
|
35
|
+
"kBOOL", /* bool */
|
|
36
|
+
"kBOT", /* bot */
|
|
37
|
+
"kCLASS", /* class */
|
|
38
|
+
"kDEF", /* def */
|
|
39
|
+
"kEND", /* end */
|
|
40
|
+
"kEXTEND", /* extend */
|
|
41
|
+
"kFALSE", /* kFALSE */
|
|
42
|
+
"kIN", /* in */
|
|
43
|
+
"kINCLUDE", /* include */
|
|
44
|
+
"kINSTANCE", /* instance */
|
|
45
|
+
"kINTERFACE", /* interface */
|
|
46
|
+
"kMODULE", /* module */
|
|
47
|
+
"kNIL", /* nil */
|
|
48
|
+
"kOUT", /* out */
|
|
49
|
+
"kPREPEND", /* prepend */
|
|
50
|
+
"kPRIVATE", /* private */
|
|
51
|
+
"kPUBLIC", /* public */
|
|
52
|
+
"kSELF", /* self */
|
|
53
|
+
"kSINGLETON", /* singleton */
|
|
54
|
+
"kTOP", /* top */
|
|
55
|
+
"kTRUE", /* true */
|
|
56
|
+
"kTYPE", /* type */
|
|
57
|
+
"kUNCHECKED", /* unchecked */
|
|
58
|
+
"kUNTYPED", /* untyped */
|
|
59
|
+
"kVOID", /* void */
|
|
60
|
+
"kUSE", /* use */
|
|
61
|
+
"kAS", /* as */
|
|
62
|
+
"k__TODO__", /* __todo__ */
|
|
63
|
+
"kATRBS", /* @rbs */
|
|
64
|
+
"kSKIP", /* skip */
|
|
65
|
+
"kRETURN", /* return */
|
|
66
|
+
|
|
67
|
+
"tLIDENT", /* Identifiers starting with lower case */
|
|
68
|
+
"tUIDENT", /* Identifiers starting with upper case */
|
|
69
|
+
"tULIDENT", /* Identifiers starting with `_` */
|
|
70
|
+
"tULLIDENT",
|
|
71
|
+
"tGIDENT", /* Identifiers starting with `$` */
|
|
72
|
+
"tAIDENT", /* Identifiers starting with `@` */
|
|
73
|
+
"tA2IDENT", /* Identifiers starting with `@@` */
|
|
74
|
+
"tBANGIDENT",
|
|
75
|
+
"tEQIDENT",
|
|
76
|
+
"tQIDENT", /* Quoted identifier */
|
|
77
|
+
"pAREF_OPR", /* [] */
|
|
78
|
+
"tOPERATOR", /* Operator identifier */
|
|
79
|
+
|
|
80
|
+
"tCOMMENT",
|
|
81
|
+
"tLINECOMMENT",
|
|
82
|
+
"tINLINECOMMENT",
|
|
83
|
+
|
|
84
|
+
"tTRIVIA",
|
|
85
|
+
|
|
86
|
+
"tDQSTRING", /* Double quoted string */
|
|
87
|
+
"tSQSTRING", /* Single quoted string */
|
|
88
|
+
"tINTEGER", /* Integer */
|
|
89
|
+
"tSYMBOL", /* Symbol */
|
|
90
|
+
"tDQSYMBOL",
|
|
91
|
+
"tSQSYMBOL",
|
|
92
|
+
"tANNOTATION", /* Annotation */
|
|
91
93
|
};
|
|
92
94
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
rbs_token_t NullToken = { .type = NullType, .range = {} };
|
|
96
|
+
rbs_position_t NullPosition = { -1, -1, -1, -1 };
|
|
97
|
+
rbs_range_t NULL_RANGE = { { -1, -1, -1, -1 }, { -1, -1, -1, -1 } };
|
|
96
98
|
|
|
97
99
|
const char *rbs_token_type_str(enum RBSTokenType type) {
|
|
98
|
-
|
|
100
|
+
return RBS_TOKENTYPE_NAMES[type];
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
int rbs_token_chars(rbs_token_t tok) {
|
|
102
|
-
|
|
104
|
+
return tok.range.end.char_pos - tok.range.start.char_pos;
|
|
103
105
|
}
|
|
104
106
|
|
|
105
107
|
int rbs_token_bytes(rbs_token_t tok) {
|
|
106
|
-
|
|
108
|
+
return RBS_RANGE_BYTES(tok.range);
|
|
107
109
|
}
|
|
108
110
|
|
|
109
111
|
unsigned int rbs_peek(rbs_lexer_t *lexer) {
|
|
110
|
-
|
|
112
|
+
if (lexer->current.char_pos == lexer->end_pos) {
|
|
113
|
+
lexer->last_char = '\0';
|
|
114
|
+
return 0;
|
|
115
|
+
} else {
|
|
116
|
+
rbs_string_t str = rbs_string_new(
|
|
117
|
+
lexer->string.start + lexer->current.byte_pos,
|
|
118
|
+
lexer->string.end
|
|
119
|
+
);
|
|
120
|
+
unsigned int c = rbs_utf8_string_to_codepoint(str);
|
|
121
|
+
lexer->last_char = c;
|
|
122
|
+
return c;
|
|
123
|
+
}
|
|
111
124
|
}
|
|
112
125
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const char *start = lexer->string.start + lexer->current.byte_pos;
|
|
119
|
-
|
|
120
|
-
// Fast path for ASCII (single-byte) characters
|
|
121
|
-
if ((unsigned int) *start < 128) {
|
|
122
|
-
*codepoint = (unsigned int) *start;
|
|
123
|
-
*byte_len = 1;
|
|
124
|
-
return true;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
*byte_len = lexer->encoding->char_width((const uint8_t *) start, (ptrdiff_t) (lexer->string.end - start));
|
|
128
|
-
|
|
129
|
-
if (*byte_len == 1) {
|
|
130
|
-
*codepoint = (unsigned int) *start;
|
|
131
|
-
} else {
|
|
132
|
-
*codepoint = 12523; // Dummy data for "ル" from "ルビー" (Ruby) in Unicode
|
|
133
|
-
}
|
|
126
|
+
rbs_token_t rbs_next_token(rbs_lexer_t *lexer, enum RBSTokenType type) {
|
|
127
|
+
rbs_token_t t;
|
|
134
128
|
|
|
135
|
-
|
|
136
|
-
|
|
129
|
+
t.type = type;
|
|
130
|
+
t.range.start = lexer->start;
|
|
131
|
+
t.range.end = lexer->current;
|
|
132
|
+
lexer->start = lexer->current;
|
|
133
|
+
if (type != tTRIVIA) {
|
|
134
|
+
lexer->first_token_of_line = false;
|
|
135
|
+
}
|
|
137
136
|
|
|
138
|
-
|
|
139
|
-
RBS_ASSERT(lexer->current_character_bytes > 0, "rbs_skip called with current_character_bytes == 0");
|
|
140
|
-
|
|
141
|
-
if (RBS_UNLIKELY(lexer->current_code_point == '\0')) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
unsigned int codepoint;
|
|
146
|
-
size_t byte_len;
|
|
147
|
-
|
|
148
|
-
lexer->current.byte_pos += lexer->current_character_bytes;
|
|
149
|
-
lexer->current.char_pos += 1;
|
|
150
|
-
if (lexer->current_code_point == '\n') {
|
|
151
|
-
lexer->current.line += 1;
|
|
152
|
-
lexer->current.column = 0;
|
|
153
|
-
lexer->first_token_of_line = true;
|
|
154
|
-
} else {
|
|
155
|
-
lexer->current.column += 1;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (rbs_next_char(lexer, &codepoint, &byte_len)) {
|
|
159
|
-
lexer->current_code_point = codepoint;
|
|
160
|
-
lexer->current_character_bytes = byte_len;
|
|
161
|
-
} else {
|
|
162
|
-
lexer->current_character_bytes = 1;
|
|
163
|
-
lexer->current_code_point = '\0';
|
|
164
|
-
}
|
|
137
|
+
return t;
|
|
165
138
|
}
|
|
166
139
|
|
|
167
|
-
rbs_token_t
|
|
140
|
+
rbs_token_t rbs_next_eof_token(rbs_lexer_t *lexer) {
|
|
141
|
+
if ((size_t) lexer->current.byte_pos == rbs_string_len(lexer->string) + 1) {
|
|
142
|
+
// End of String
|
|
168
143
|
rbs_token_t t;
|
|
169
|
-
|
|
170
|
-
t.type = type;
|
|
144
|
+
t.type = pEOF;
|
|
171
145
|
t.range.start = lexer->start;
|
|
172
|
-
t.range.end = lexer->
|
|
146
|
+
t.range.end = lexer->start;
|
|
173
147
|
lexer->start = lexer->current;
|
|
174
|
-
if (type != tTRIVIA) {
|
|
175
|
-
lexer->first_token_of_line = false;
|
|
176
|
-
}
|
|
177
148
|
|
|
178
149
|
return t;
|
|
150
|
+
} else {
|
|
151
|
+
// NULL byte in the middle of the string
|
|
152
|
+
return rbs_next_token(lexer, pEOF);
|
|
153
|
+
}
|
|
179
154
|
}
|
|
180
155
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
156
|
+
void rbs_skip(rbs_lexer_t *lexer) {
|
|
157
|
+
if (!lexer->last_char) {
|
|
158
|
+
rbs_peek(lexer);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
size_t byte_len;
|
|
162
|
+
|
|
163
|
+
if (lexer->last_char == '\0') {
|
|
164
|
+
byte_len = 1;
|
|
165
|
+
} else {
|
|
166
|
+
const char *start = lexer->string.start + lexer->current.byte_pos;
|
|
167
|
+
byte_len = lexer->encoding->char_width((const uint8_t *) start, (ptrdiff_t) (lexer->string.end - start));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
lexer->current.char_pos += 1;
|
|
171
|
+
lexer->current.byte_pos += byte_len;
|
|
172
|
+
|
|
173
|
+
if (lexer->last_char == '\n') {
|
|
174
|
+
lexer->current.line += 1;
|
|
175
|
+
lexer->current.column = 0;
|
|
176
|
+
lexer->first_token_of_line = true;
|
|
177
|
+
} else {
|
|
178
|
+
lexer->current.column += 1;
|
|
179
|
+
}
|
|
195
180
|
}
|
|
196
181
|
|
|
197
182
|
void rbs_skipn(rbs_lexer_t *lexer, size_t size) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
183
|
+
for (size_t i = 0; i < size; i ++) {
|
|
184
|
+
rbs_peek(lexer);
|
|
185
|
+
rbs_skip(lexer);
|
|
186
|
+
}
|
|
201
187
|
}
|
|
202
188
|
|
|
203
189
|
char *rbs_peek_token(rbs_lexer_t *lexer, rbs_token_t tok) {
|
|
204
|
-
|
|
190
|
+
return (char *) lexer->string.start + tok.range.start.byte_pos;
|
|
205
191
|
}
|
data/src/location.c
CHANGED
|
@@ -6,66 +6,66 @@
|
|
|
6
6
|
#define RBS_LOC_CHILDREN_SIZE(cap) (sizeof(rbs_loc_children) + sizeof(rbs_loc_entry) * ((cap) - 1))
|
|
7
7
|
|
|
8
8
|
void rbs_loc_alloc_children(rbs_allocator_t *allocator, rbs_location_t *loc, size_t capacity) {
|
|
9
|
-
|
|
9
|
+
rbs_assert(capacity <= sizeof(rbs_loc_entry_bitmap) * 8, "Capacity %zu is too large. Max is %zu", capacity, sizeof(rbs_loc_entry_bitmap) * 8);
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
loc->children = rbs_allocator_malloc_impl(allocator, RBS_LOC_CHILDREN_SIZE(capacity), alignof(rbs_loc_children));
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
loc->children->len = 0;
|
|
14
|
+
loc->children->required_p = 0;
|
|
15
|
+
loc->children->cap = capacity;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
void rbs_loc_add_optional_child(rbs_location_t *loc, rbs_constant_id_t name, rbs_range_t r) {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
rbs_assert(loc->children != NULL, "All children should have been pre-allocated with rbs_loc_alloc_children()");
|
|
20
|
+
rbs_assert((loc->children->len + 1 <= loc->children->cap), "Not enough space was pre-allocated for the children. Children: %hu, Capacity: %hu", loc->children->len, loc->children->cap);
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
unsigned short i = loc->children->len++;
|
|
23
|
+
loc->children->entries[i].name = name;
|
|
24
|
+
loc->children->entries[i].rg = (rbs_loc_range) { r.start.char_pos, r.end.char_pos };
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
void rbs_loc_add_required_child(rbs_location_t *loc, rbs_constant_id_t name, rbs_range_t r) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
rbs_loc_add_optional_child(loc, name, r);
|
|
29
|
+
unsigned short last_index = loc->children->len - 1;
|
|
30
|
+
loc->children->required_p |= 1 << last_index;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
rbs_location_t *rbs_location_new(rbs_allocator_t *allocator, rbs_range_t rg) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
rbs_location_t *location = rbs_allocator_alloc(allocator, rbs_location_t);
|
|
35
|
+
*location = (rbs_location_t) {
|
|
36
|
+
.rg = rg,
|
|
37
|
+
.children = NULL,
|
|
38
|
+
};
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
return location;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
rbs_location_list_t *rbs_location_list_new(rbs_allocator_t *allocator) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
rbs_location_list_t *list = rbs_allocator_alloc(allocator, rbs_location_list_t);
|
|
45
|
+
*list = (rbs_location_list_t) {
|
|
46
|
+
.allocator = allocator,
|
|
47
|
+
.head = NULL,
|
|
48
|
+
.tail = NULL,
|
|
49
|
+
.length = 0,
|
|
50
|
+
};
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
return list;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
void rbs_location_list_append(rbs_location_list_t *list, rbs_location_t *loc) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
rbs_location_list_node_t *node = rbs_allocator_alloc(list->allocator, rbs_location_list_node_t);
|
|
57
|
+
*node = (rbs_location_list_node_t) {
|
|
58
|
+
.loc = loc,
|
|
59
|
+
.next = NULL,
|
|
60
|
+
};
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
if (list->head == NULL) {
|
|
63
|
+
list->head = node;
|
|
64
|
+
list->tail = node;
|
|
65
|
+
} else {
|
|
66
|
+
list->tail->next = node;
|
|
67
|
+
list->tail = node;
|
|
68
|
+
}
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
list->length++;
|
|
71
71
|
}
|