Make tree node handle names visible in context user fields
This commit is contained in:
1 parent
2508fb311e
commit
e9c1be83cb
6 files changed
+206
-19
No files matched your search
@@ -2113,6 +2113,38 @@ EOF
|
||||
end
|
||||
end
|
||||
|
||||
# Rust is excluded since a Rust tree node handle borrows the context, so
|
||||
# storing one in a context field would make the context self-referential.
|
||||
if %w[c cpp d].include?(language)
|
||||
it "allows a tree node handle type in a context user field" do
|
||||
write_grammar <<EOF
|
||||
tree;
|
||||
ptype int;
|
||||
context_user_fields <<
|
||||
Item first_item;
|
||||
int have_first;
|
||||
>>
|
||||
drop /\\s+/;
|
||||
token a /a/ << $$ = 7; >>
|
||||
Item -> a;
|
||||
Items -> ;
|
||||
Items -> Items Item <<
|
||||
if (${context.have_first} == 0)
|
||||
{
|
||||
${context.first_item} = $2;
|
||||
${context.have_first} = 1;
|
||||
}
|
||||
>>
|
||||
Start -> Items;
|
||||
EOF
|
||||
run_propane(language: language)
|
||||
compile("spec/test_context_field_handle.#{language}", language: language)
|
||||
results = run_test(language: language)
|
||||
expect(results.stderr).to eq ""
|
||||
expect(results.status).to eq 0
|
||||
end
|
||||
end
|
||||
|
||||
if language == "rust"
|
||||
it "marks user code sections with their grammar file and line number" do
|
||||
write_grammar <<EOF
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
#include "testparser.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include "testutils.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
char input[128];
|
||||
size_t i;
|
||||
p_context_t * context;
|
||||
Token token;
|
||||
|
||||
/* Enough tokens that the tree node arena is reallocated during the parse. */
|
||||
memset(input, 0, sizeof(input));
|
||||
for (i = 0u; i < 40u; i++)
|
||||
{
|
||||
input[i] = 'a';
|
||||
}
|
||||
|
||||
context = p_context_new((uint8_t const *)input, strlen(input));
|
||||
assert_eq(P_SUCCESS, p_parse(context));
|
||||
|
||||
/* The handle was stored in a context user field during the parse, before
|
||||
* the remaining nodes were created. It still refers to the same node. */
|
||||
assert_eq(1u, context->have_first);
|
||||
assert(p_node_valid(context->first_item));
|
||||
token = p_Item_pToken1(context->first_item);
|
||||
assert(p_node_valid(token));
|
||||
assert_eq(TOKEN_a, p_Token_token(token));
|
||||
assert_eq(7u, p_Token_pvalue(token));
|
||||
|
||||
/* The stored handle refers to the first Item, which starts at column 1. */
|
||||
assert_eq(1u, p_node_position(context->first_item).row);
|
||||
assert_eq(1u, p_node_position(context->first_item).col);
|
||||
|
||||
p_context_delete(context);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#include "testparser.h"
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include "testutils.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
char input[128];
|
||||
|
||||
/* Enough tokens that the tree node arena is reallocated during the parse. */
|
||||
memset(input, 0, sizeof(input));
|
||||
for (size_t i = 0u; i < 40u; i++)
|
||||
{
|
||||
input[i] = 'a';
|
||||
}
|
||||
|
||||
p_context_t * context = p_context_new((uint8_t const *)input, strlen(input));
|
||||
assert_eq(P_SUCCESS, p_parse(context));
|
||||
|
||||
/* The handle was stored in a context user field during the parse, before
|
||||
* the remaining nodes were created. It still refers to the same node. */
|
||||
assert_eq(1u, context->have_first);
|
||||
assert(context->first_item.valid());
|
||||
Token token = context->first_item.pToken1();
|
||||
assert(token.valid());
|
||||
assert_eq(TOKEN_a, token.token());
|
||||
assert_eq(7u, token.pvalue());
|
||||
|
||||
/* The stored handle refers to the first Item, which starts at column 1. */
|
||||
assert_eq(1u, context->first_item.position().row);
|
||||
assert_eq(1u, context->first_item.position().col);
|
||||
|
||||
p_context_delete(context);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import testparser;
|
||||
import testutils;
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
/* Enough tokens that the tree node array is reallocated during the parse. */
|
||||
string input;
|
||||
foreach (i; 0 .. 40)
|
||||
{
|
||||
input ~= "a";
|
||||
}
|
||||
|
||||
p_context_t * context = p_context_new(input);
|
||||
assert_eq(P_SUCCESS, p_parse(context));
|
||||
|
||||
/* The handle was stored in a context user field during the parse, before
|
||||
* the remaining nodes were created. It still refers to the same node. */
|
||||
assert_eq(1, context.have_first);
|
||||
assert(context.first_item.valid);
|
||||
Token token = context.first_item.pToken1;
|
||||
assert(token.valid);
|
||||
assert_eq(TOKEN_a, token.token);
|
||||
assert_eq(7, token.pvalue);
|
||||
|
||||
/* The stored handle refers to the first Item, which starts at column 1. */
|
||||
assert_eq(1u, context.first_item.position.row);
|
||||
assert_eq(1u, context.first_item.position.col);
|
||||
|
||||
p_context_delete(context);
|
||||
}
|
||||
Reference in new issue
Block a user