From b407b5588db29e2b93939afea001693776811131 Mon Sep 17 00:00:00 2001 From: Tom Beckmann Date: Thu, 3 Aug 2023 16:02:51 +0200 Subject: [PATCH 1/2] binding_web: expose Node.fieldNameForChild(index) function --- lib/binding_web/binding.c | 5 +++++ lib/binding_web/binding.js | 11 +++++++++++ lib/binding_web/exports.json | 1 + 3 files changed, 17 insertions(+) diff --git a/lib/binding_web/binding.c b/lib/binding_web/binding.c index 5a8e4e34..4be22a7e 100644 --- a/lib/binding_web/binding.c +++ b/lib/binding_web/binding.c @@ -361,6 +361,11 @@ uint16_t ts_node_symbol_wasm(const TSTree *tree) { return ts_node_symbol(node); } +const char *ts_node_field_name_for_child_wasm(const TSTree *tree, uint32_t index) { + TSNode node = unmarshal_node(tree); + return ts_node_field_name_for_child(node, index); +} + uint16_t ts_node_grammar_symbol_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); return ts_node_grammar_symbol(node); diff --git a/lib/binding_web/binding.js b/lib/binding_web/binding.js index e6c2b27e..35ad1cf5 100644 --- a/lib/binding_web/binding.js +++ b/lib/binding_web/binding.js @@ -282,6 +282,17 @@ class Node { return unmarshalNode(this.tree); } + fieldNameForChild(index) { + marshalNode(this); + const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index); + if (!address) { + return null; + } + const result = AsciiToString(address); + // must not free, the string memory is owned by the language + return result; + } + namedChild(index) { marshalNode(this); C._ts_node_named_child_wasm(this.tree[0], index); diff --git a/lib/binding_web/exports.json b/lib/binding_web/exports.json index 9e219d70..2063db47 100644 --- a/lib/binding_web/exports.json +++ b/lib/binding_web/exports.json @@ -44,6 +44,7 @@ "_ts_language_symbol_type", "_ts_language_version", "_ts_language_next_state", + "_ts_node_field_name_for_child_wasm", "_ts_node_child_by_field_id_wasm", "_ts_node_child_count_wasm", "_ts_node_child_wasm", From b947145e53234d13c935030113f16f5cd0bb6d3a Mon Sep 17 00:00:00 2001 From: Tom Beckmann Date: Thu, 3 Aug 2023 16:32:51 +0200 Subject: [PATCH 2/2] add a test --- lib/binding_web/test/node-test.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/binding_web/test/node-test.js b/lib/binding_web/test/node-test.js index a87658c7..a1011154 100644 --- a/lib/binding_web/test/node-test.js +++ b/lib/binding_web/test/node-test.js @@ -454,4 +454,20 @@ describe("Node", () => { assert(!node1.equals(node2)); }); }); + + describe('.fieldNameForChild(index)', () => { + it('returns the field of a child or null', () => { + tree = parser.parse('let a = 5'); + + const noField = tree.rootNode.fieldNameForChild(0); + const name = tree.rootNode.firstChild.children[1].fieldNameForChild(0); + const value = tree.rootNode.firstChild.children[1].fieldNameForChild(2); + const overflow = tree.rootNode.firstChild.children[1].fieldNameForChild(3); + + assert.equal(noField, null); + assert.equal(name, 'name'); + assert.equal(value, 'value'); + assert.equal(overflow, null); + }); + }); });