aboutsummaryrefslogtreecommitdiffstats
path: root/prism/prism.c
diff options
context:
space:
mode:
Diffstat (limited to 'prism/prism.c')
-rw-r--r--prism/prism.c42
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) {