rbs 4.0.0.dev.2 → 4.0.0.dev.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +74 -0
  3. data/.clangd +2 -0
  4. data/.github/workflows/c-check.yml +51 -0
  5. data/.github/workflows/dependabot.yml +1 -1
  6. data/.github/workflows/ruby.yml +0 -17
  7. data/.github/workflows/typecheck.yml +0 -2
  8. data/.gitignore +4 -0
  9. data/.rubocop.yml +1 -1
  10. data/.vscode/extensions.json +5 -0
  11. data/.vscode/settings.json +19 -0
  12. data/README.md +37 -0
  13. data/Rakefile +82 -0
  14. data/config.yml +1 -1
  15. data/core/enumerable.rbs +9 -0
  16. data/core/io.rbs +4 -4
  17. data/core/thread.rbs +0 -7
  18. data/ext/rbs_extension/ast_translation.c +1008 -1074
  19. data/ext/rbs_extension/class_constants.c +78 -74
  20. data/ext/rbs_extension/compat.h +3 -3
  21. data/ext/rbs_extension/extconf.rb +11 -1
  22. data/ext/rbs_extension/legacy_location.c +173 -172
  23. data/ext/rbs_extension/legacy_location.h +3 -3
  24. data/ext/rbs_extension/main.c +315 -273
  25. data/include/rbs/ast.h +11 -12
  26. data/include/rbs/defines.h +11 -12
  27. data/include/rbs/lexer.h +105 -105
  28. data/include/rbs/location.h +14 -14
  29. data/include/rbs/parser.h +21 -19
  30. data/include/rbs/string.h +3 -3
  31. data/include/rbs/util/rbs_allocator.h +14 -14
  32. data/include/rbs/util/rbs_constant_pool.h +3 -3
  33. data/include/rbs/util/rbs_encoding.h +1 -1
  34. data/lib/rbs/environment.rb +4 -0
  35. data/lib/rbs/namespace.rb +0 -7
  36. data/lib/rbs/parser_aux.rb +5 -0
  37. data/lib/rbs/type_name.rb +0 -7
  38. data/lib/rbs/types.rb +3 -1
  39. data/lib/rbs/unit_test/convertibles.rb +1 -0
  40. data/lib/rbs/version.rb +1 -1
  41. data/sig/environment.rbs +3 -0
  42. data/sig/namespace.rbs +0 -5
  43. data/sig/parser.rbs +20 -0
  44. data/sig/typename.rbs +0 -5
  45. data/sig/types.rbs +4 -1
  46. data/src/ast.c +216 -214
  47. data/src/lexer.c +2923 -2675
  48. data/src/lexstate.c +155 -155
  49. data/src/location.c +40 -40
  50. data/src/parser.c +2591 -2586
  51. data/src/string.c +2 -2
  52. data/src/util/rbs_allocator.c +7 -9
  53. data/src/util/rbs_assert.c +9 -9
  54. data/src/util/rbs_constant_pool.c +5 -7
  55. data/src/util/rbs_encoding.c +20095 -4056
  56. data/src/util/rbs_unescape.c +33 -32
  57. data/stdlib/json/0/json.rbs +9 -43
  58. data/stdlib/ripper/0/ripper.rbs +3 -0
  59. data/stdlib/socket/0/addrinfo.rbs +2 -2
  60. metadata +7 -2
data/src/lexstate.c CHANGED
@@ -1,191 +1,191 @@
1
1
  #include "rbs/lexer.h"
2
2
 
3
3
  static const char *RBS_TOKENTYPE_NAMES[] = {
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 */
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 */
93
93
  };
94
94
 
95
95
  const rbs_position_t NullPosition = { -1, -1, -1, -1 };
96
96
  const rbs_range_t NULL_RANGE = { { -1, -1, -1, -1 }, { -1, -1, -1, -1 } };
97
- const rbs_token_t NullToken = { .type = NullType, .range = { {0}, {0} } };
97
+ const rbs_token_t NullToken = { .type = NullType, .range = { { 0 }, { 0 } } };
98
98
 
99
99
  const char *rbs_token_type_str(enum RBSTokenType type) {
100
- return RBS_TOKENTYPE_NAMES[type];
100
+ return RBS_TOKENTYPE_NAMES[type];
101
101
  }
102
102
 
103
103
  int rbs_token_chars(rbs_token_t tok) {
104
- return tok.range.end.char_pos - tok.range.start.char_pos;
104
+ return tok.range.end.char_pos - tok.range.start.char_pos;
105
105
  }
106
106
 
107
107
  int rbs_token_bytes(rbs_token_t tok) {
108
- return RBS_RANGE_BYTES(tok.range);
108
+ return RBS_RANGE_BYTES(tok.range);
109
109
  }
110
110
 
111
111
  unsigned int rbs_peek(rbs_lexer_t *lexer) {
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
- }
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
+ }
124
124
  }
125
125
 
126
126
  rbs_token_t rbs_next_token(rbs_lexer_t *lexer, enum RBSTokenType type) {
127
- rbs_token_t t;
128
-
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
- }
136
-
137
- return t;
138
- }
139
-
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
143
127
  rbs_token_t t;
144
- t.type = pEOF;
128
+
129
+ t.type = type;
145
130
  t.range.start = lexer->start;
146
- t.range.end = lexer->start;
131
+ t.range.end = lexer->current;
147
132
  lexer->start = lexer->current;
133
+ if (type != tTRIVIA) {
134
+ lexer->first_token_of_line = false;
135
+ }
148
136
 
149
137
  return t;
150
- } else {
151
- // NULL byte in the middle of the string
152
- return rbs_next_token(lexer, pEOF);
153
- }
138
+ }
139
+
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
143
+ rbs_token_t t;
144
+ t.type = pEOF;
145
+ t.range.start = lexer->start;
146
+ t.range.end = lexer->start;
147
+ lexer->start = lexer->current;
148
+
149
+ return t;
150
+ } else {
151
+ // NULL byte in the middle of the string
152
+ return rbs_next_token(lexer, pEOF);
153
+ }
154
154
  }
155
155
 
156
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
- }
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
+ }
180
180
  }
181
181
 
182
182
  void rbs_skipn(rbs_lexer_t *lexer, size_t size) {
183
- for (size_t i = 0; i < size; i ++) {
184
- rbs_peek(lexer);
185
- rbs_skip(lexer);
186
- }
183
+ for (size_t i = 0; i < size; i++) {
184
+ rbs_peek(lexer);
185
+ rbs_skip(lexer);
186
+ }
187
187
  }
188
188
 
189
189
  char *rbs_peek_token(rbs_lexer_t *lexer, rbs_token_t tok) {
190
- return (char *) lexer->string.start + tok.range.start.byte_pos;
190
+ return (char *) lexer->string.start + tok.range.start.byte_pos;
191
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_allocator_malloc_impl(allocator, RBS_LOC_CHILDREN_SIZE(capacity), 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
  }