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