[PRISM] Implement MatchLastLineNode

This PR implements `MatchLastLineNode` for Prism.

Related: ruby/prism#1335
This commit is contained in:
eileencodes 2023-09-27 16:53:37 -04:00 коммит произвёл Kevin Newton
Родитель 175ac32c62
Коммит 54bbf9a6e9
2 изменённых файлов: 37 добавлений и 0 удалений

Просмотреть файл

@ -1594,6 +1594,32 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
ADD_SETLOCAL(ret, &dummy_line_node, (int)index, local_write_node->depth);
return;
}
case PM_MATCH_LAST_LINE_NODE: {
if (!popped) {
pm_match_last_line_node_t *regular_expression_node = (pm_match_last_line_node_t *) node;
VALUE regex_str = parse_string(&regular_expression_node->unescaped);
int flags = 0;
if (regular_expression_node->base.flags & PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE) {
flags |= ONIG_OPTION_IGNORECASE;
}
if (regular_expression_node->base.flags & PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE) {
flags |= ONIG_OPTION_MULTILINE;
}
if (regular_expression_node->base.flags & PM_REGULAR_EXPRESSION_FLAGS_EXTENDED) {
flags |= ONIG_OPTION_EXTEND;
}
VALUE regex = rb_reg_new(RSTRING_PTR(regex_str), RSTRING_LEN(regex_str), flags);
ADD_INSN1(ret, &dummy_line_node, putobject, regex);
ADD_INSN2(ret, &dummy_line_node, getspecial, INT2FIX(0), INT2FIX(0));
ADD_SEND(ret, &dummy_line_node, idEqTilde, INT2NUM(1));
}
return;
}
case PM_MISSING_NODE: {
rb_bug("A pm_missing_node_t should not exist in prism's AST.");
return;

Просмотреть файл

@ -37,6 +37,17 @@ module Prism
test_prism_eval("010")
end
def test_MatchLastLineNode
test_prism_eval("if /foo/; end")
test_prism_eval("if /foo/i; end")
test_prism_eval("if /foo/x; end")
test_prism_eval("if /foo/m; end")
test_prism_eval("if /foo/im; end")
test_prism_eval("if /foo/mx; end")
test_prism_eval("if /foo/xi; end")
test_prism_eval("if /foo/ixm; end")
end
def test_NilNode
test_prism_eval("nil")
end