Ruby 4.1.0dev (2026-04-04 revision 3b6245536cf55da9e8bfcdb03c845fe9ef931d7f)
parser.c
1#include "prism/internal/parser.h"
2
3#include "prism/internal/allocator.h"
4#include "prism/internal/comments.h"
5#include "prism/internal/diagnostic.h"
6#include "prism/internal/encoding.h"
7#include "prism/internal/magic_comments.h"
8
9#include <stdlib.h>
10
15void
16pm_parser_encoding_changed_callback_set(pm_parser_t *parser, pm_encoding_changed_callback_t callback) {
17 parser->encoding_changed_callback = callback;
18}
19
23void
24pm_parser_lex_callback_set(pm_parser_t *parser, pm_lex_callback_t callback, void *data) {
25 parser->lex_callback.callback = callback;
26 parser->lex_callback.data = data;
27}
28
32void *
33pm_parser_lex_callback_data(const pm_parser_t *parser) {
34 return parser->lex_callback.data;
35}
36
40const uint8_t *
41pm_parser_start(const pm_parser_t *parser) {
42 return parser->start;
43}
44
48const uint8_t *
49pm_parser_end(const pm_parser_t *parser) {
50 return parser->end;
51}
52
59int32_t
60pm_parser_start_line(const pm_parser_t *parser) {
61 return parser->start_line;
62}
63
67const char *
68pm_parser_encoding_name(const pm_parser_t *parser) {
69 return parser->encoding->name;
70}
71
76size_t
77pm_parser_encoding_char_width(const pm_parser_t *parser, const uint8_t *start, ptrdiff_t remaining) {
78 return parser->encoding->char_width(start, remaining);
79}
80
84bool
85pm_parser_encoding_us_ascii(const pm_parser_t *parser) {
86 return parser->encoding == PM_ENCODING_US_ASCII_ENTRY;
87}
88
92const pm_string_t *
93pm_parser_filepath(const pm_parser_t *parser) {
94 return &parser->filepath;
95}
96
102pm_parser_constant_find(const pm_parser_t *parser, const uint8_t *start, size_t length) {
103 return pm_constant_pool_find(&parser->constant_pool, start, length);
104}
105
109int8_t
110pm_parser_frozen_string_literal(const pm_parser_t *parser) {
111 return parser->frozen_string_literal;
112}
113
121pm_parser_line_offsets(const pm_parser_t *parser) {
122 return &parser->line_offsets;
123}
124
129const pm_location_t *
130pm_parser_data_loc(const pm_parser_t *parser) {
131 return &parser->data_loc;
132}
133
138bool
139pm_parser_continuable(const pm_parser_t *parser) {
140 return parser->continuable;
141}
142
149int
150pm_parser_lex_state(const pm_parser_t *parser) {
151 return (int) parser->lex_state;
152}
153
159 return comment->location;
160}
161
167 return comment->type;
168}
169
173size_t
174pm_parser_comments_size(const pm_parser_t *parser) {
175 return parser->comment_list.size;
176}
177
182void
183pm_parser_comments_each(const pm_parser_t *parser, pm_comment_callback_t callback, void *data) {
184 const pm_list_node_t *current = parser->comment_list.head;
185 while (current != NULL) {
186 const pm_comment_t *comment = (const pm_comment_t *) current;
187 callback(comment, data);
188 current = current->next;
189 }
190}
191
199
207
211size_t
212pm_parser_magic_comments_size(const pm_parser_t *parser) {
213 return parser->magic_comment_list.size;
214}
215
220void
221pm_parser_magic_comments_each(const pm_parser_t *parser, pm_magic_comment_callback_t callback, void *data) {
222 const pm_list_node_t *current = parser->magic_comment_list.head;
223 while (current != NULL) {
224 const pm_magic_comment_t *magic_comment = (const pm_magic_comment_t *) current;
225 callback(magic_comment, data);
226 current = current->next;
227 }
228}
229
233size_t
234pm_parser_errors_size(const pm_parser_t *parser) {
235 return parser->error_list.size;
236}
237
241size_t
242pm_parser_warnings_size(const pm_parser_t *parser) {
243 return parser->warning_list.size;
244}
245
246static inline void
247pm_parser_diagnostics_each(const pm_list_t *list, pm_diagnostic_callback_t callback, void *data) {
248 const pm_list_node_t *current = list->head;
249 while (current != NULL) {
250 const pm_diagnostic_t *diagnostic = (const pm_diagnostic_t *) current;
251 callback(diagnostic, data);
252 current = current->next;
253 }
254}
255
260void
261pm_parser_errors_each(const pm_parser_t *parser, pm_diagnostic_callback_t callback, void *data) {
262 pm_parser_diagnostics_each(&parser->error_list, callback, data);
263}
264
269void
270pm_parser_warnings_each(const pm_parser_t *parser, pm_diagnostic_callback_t callback, void *data) {
271 pm_parser_diagnostics_each(&parser->warning_list, callback, data);
272}
273
278size_t
279pm_parser_constants_size(const pm_parser_t *parser) {
280 return parser->constant_pool.size;
281}
282
287void
288pm_parser_constants_each(const pm_parser_t *parser, pm_constant_callback_t callback, void *data) {
289 for (uint32_t index = 0; index < parser->constant_pool.size; index++) {
290 const pm_constant_t *constant = &parser->constant_pool.constants[index];
291 callback(constant, data);
292 }
293}
294
299const pm_constant_t *
300pm_parser_constant(const pm_parser_t *parser, pm_constant_id_t constant_id) {
301 return pm_constant_pool_id_to_constant(&parser->constant_pool, constant_id);
302}
PRISM_EXPORTED_FUNCTION pm_location_t pm_comment_location(const pm_comment_t *comment) PRISM_NONNULL(1)
Returns the location associated with the given comment.
Definition parser.c:158
PRISM_EXPORTED_FUNCTION pm_comment_type_t pm_comment_type(const pm_comment_t *comment) PRISM_NONNULL(1)
Returns the type associated with the given comment.
Definition parser.c:166
pm_comment_type_t
This is the type of a comment that we've found while parsing.
Definition comments.h:18
uint32_t pm_constant_id_t
A constant id is a unique identifier for a constant in the constant pool.
PRISM_EXPORTED_FUNCTION pm_location_t pm_magic_comment_value(const pm_magic_comment_t *magic_comment) PRISM_NONNULL(1)
Returns the location of the value associated with the given magic comment.
Definition parser.c:204
PRISM_EXPORTED_FUNCTION pm_location_t pm_magic_comment_key(const pm_magic_comment_t *magic_comment) PRISM_NONNULL(1)
Returns the location of the key associated with the given magic comment.
Definition parser.c:196
void(* pm_magic_comment_callback_t)(const pm_magic_comment_t *magic_comment, void *data)
A callback function that can be used to process magic comments found while parsing.
Definition parser.h:237
void(* pm_lex_callback_t)(pm_parser_t *parser, pm_token_t *token, void *data)
This is the callback that is called when a token is lexed.
Definition parser.h:55
void(* pm_diagnostic_callback_t)(const pm_diagnostic_t *diagnostic, void *data)
A callback function that can be used to process diagnostics found while parsing.
Definition parser.h:272
void(* pm_comment_callback_t)(const pm_comment_t *comment, void *data)
A callback function that can be used to process comments found while parsing.
Definition parser.h:211
void(* pm_encoding_changed_callback_t)(pm_parser_t *parser)
When the encoding that is being used to parse the source is changed by prism, we provide the ability ...
Definition parser.h:49
void(* pm_constant_callback_t)(const pm_constant_t *constant, void *data)
A callback function that can be used to process constants found while parsing.
Definition parser.h:315
A list of offsets of the start of lines in a string.
This struct represents a slice in the source code, defined by an offset and a length.
Definition ast.h:554
A generic string type that can have various ownership semantics.
Definition stringy.h:18