Skip to content

Commit e101376

Browse files
Add PM_VALIDATE_NODE_TYPE macro
1 parent 7e1dc8f commit e101376

1 file changed

Lines changed: 19 additions & 0 deletions

File tree

src/prism.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1987,6 +1987,25 @@ pm_unexpected_node_create(pm_parser_t *parser, pm_node_t *child) {
19871987
return node;
19881988
}
19891989

1990+
/**
1991+
* Validate a required node's type. If NULL, creates an ErrorRecoveryNode with
1992+
* no child. If present but not one of the expected types, wraps it in an
1993+
* ErrorRecoveryNode.
1994+
*/
1995+
#define PM_VALIDATE_NODE_TYPE(parser, node, ...) \
1996+
do { \
1997+
if ((node) == NULL) { \
1998+
(node) = UP(pm_missing_node_create((parser), (parser)->previous.start, (parser)->previous.end)); \
1999+
} else if (!PM_NODE_TYPE_P((node), PM_ERROR_RECOVERY_NODE)) { \
2000+
pm_node_type_t _expected[] = {__VA_ARGS__}; \
2001+
bool _found = false; \
2002+
for (size_t _i = 0; _i < sizeof(_expected) / sizeof(pm_node_type_t); _i++) { \
2003+
if (PM_NODE_TYPE_P((node), _expected[_i])) { _found = true; break; } \
2004+
} \
2005+
if (!_found) (node) = UP(pm_unexpected_node_create((parser), (node))); \
2006+
} \
2007+
} while (0)
2008+
19902009
/**
19912010
* Allocate and initialize a new AliasGlobalVariableNode node.
19922011
*/

0 commit comments

Comments
 (0)