diff options
Diffstat (limited to 'prism/prism.c')
-rw-r--r-- | prism/prism.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/prism/prism.c b/prism/prism.c index e7eb967e15..aaad62d739 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -20018,7 +20018,7 @@ typedef struct { * This callback is called when the regular expression parser encounters a named * capture group. */ -void +static void parse_regular_expression_named_capture(const pm_string_t *capture, void *data) { parse_regular_expression_named_capture_data_t *callback_data = (parse_regular_expression_named_capture_data_t *) data; @@ -20084,6 +20084,38 @@ parse_regular_expression_named_capture(const pm_string_t *capture, void *data) { } /** + * This struct is used to pass information between the regular expression parser + * and the error callback. + */ +typedef struct { + pm_parser_t *parser; + const pm_string_t *content; + const pm_call_node_t *call; +} parse_regular_expression_error_data_t; + +/** + * This callback is called when the regular expression parser encounters a + * syntax error. + */ +static void +parse_regular_expression_error(const uint8_t *start, const uint8_t *end, const char *message, void *data) { + parse_regular_expression_error_data_t *callback_data = (parse_regular_expression_error_data_t *) data; + + pm_parser_t *parser = callback_data->parser; + const pm_string_t *content = callback_data->content; + const pm_call_node_t *call = callback_data->call; + + pm_location_t location; + if (content->type == PM_STRING_SHARED) { + location = (pm_location_t) { .start = start, .end = end }; + } else { + location = call->receiver->location; + } + + PM_PARSER_ERR_FORMAT(parser, location.start, location.end, PM_ERR_REGEXP_PARSE_ERROR, message); +} + +/** * Potentially change a =~ with a regular expression with named captures into a * match write node. */ @@ -20096,7 +20128,13 @@ parse_regular_expression_named_captures(pm_parser_t *parser, const pm_string_t * .names = { 0 } }; - pm_regexp_parse(parser, pm_string_source(content), pm_string_length(content), parse_regular_expression_named_capture, &callback_data); + parse_regular_expression_error_data_t error_data = { + .parser = parser, + .content = content, + .call = call + }; + + pm_regexp_parse(parser, pm_string_source(content), pm_string_length(content), parse_regular_expression_named_capture, &callback_data, parse_regular_expression_error, &error_data); pm_constant_id_list_free(&callback_data.names); if (callback_data.match != NULL) { |