From 12cd2132ff428e81c5c5d18b3ac76cfd39149f74 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 4 Jan 2017 21:23:04 -0800 Subject: [PATCH] Add test for retrieving last external token state in a Tree --- spec/runtime/tree_spec.cc | 35 +++++++++++++++++++++++++++++++++++ src/runtime/tree.c | 2 ++ 2 files changed, 37 insertions(+) diff --git a/spec/runtime/tree_spec.cc b/spec/runtime/tree_spec.cc index b67cd0a8..bdc8145f 100644 --- a/spec/runtime/tree_spec.cc +++ b/spec/runtime/tree_spec.cc @@ -30,6 +30,9 @@ describe("Tree", []() { symbol4, symbol5, symbol6, + symbol7, + symbol8, + symbol9, }; TSSymbolMetadata visible = {true, true, false, true}; @@ -399,6 +402,38 @@ describe("Tree", []() { ts_tree_release(different_parent); }); }); + + describe("last_external_token_state", [&]() { + Length padding = {1, 1, {0, 1}}; + Length size = {2, 2, {0, 2}}; + + auto make_external = [](Tree *tree) { + tree->has_external_tokens = true; + tree->has_external_token_state = true; + return tree; + }; + + it("returns the last serialized external token state in the given tree", [&]() { + Tree *tree1, *tree2, *tree3, *tree4, *tree5, *tree6, *tree7, *tree8, *tree9; + + tree1 = ts_tree_make_node(symbol1, 2, tree_array({ + (tree2 = ts_tree_make_node(symbol2, 3, tree_array({ + (tree3 = make_external(ts_tree_make_leaf(symbol3, padding, size, visible))), + (tree4 = ts_tree_make_leaf(symbol4, padding, size, visible)), + (tree5 = ts_tree_make_leaf(symbol5, padding, size, visible)), + }), visible)), + (tree6 = ts_tree_make_node(symbol6, 2, tree_array({ + (tree7 = ts_tree_make_node(symbol7, 1, tree_array({ + (tree8 = ts_tree_make_leaf(symbol8, padding, size, visible)), + }), visible)), + (tree9 = ts_tree_make_leaf(symbol9, padding, size, visible)), + }), visible)), + }), visible); + + auto state = ts_tree_last_external_token_state(tree1); + AssertThat(state, Equals(&tree3->external_token_state)); + }); + }); }); END_TEST diff --git a/src/runtime/tree.c b/src/runtime/tree.c index ebcca441..858ad90e 100644 --- a/src/runtime/tree.c +++ b/src/runtime/tree.c @@ -386,6 +386,8 @@ const TSExternalTokenState *ts_tree_last_external_token_state(const Tree *tree) if (child->has_external_token_state) { tree = child; break; + } else if (child->has_external_tokens) { + return NULL; } } }