From 67dcbc3e73483641b38964440b83b1467932882a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 11 Sep 2019 14:44:49 -0700 Subject: [PATCH] Detect error when a prefix of a valid node name is used in a query --- cli/src/tests/query_test.rs | 8 ++++---- lib/binding_web/test/query-test.js | 3 +++ lib/src/query.c | 7 +++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs index c95bdfa2..b6d669c9 100644 --- a/cli/src/tests/query_test.rs +++ b/cli/src/tests/query_test.rs @@ -44,12 +44,12 @@ fn test_query_errors_on_invalid_symbols() { let language = get_language("javascript"); assert_eq!( - Query::new(language, "(non_existent1)"), - Err(QueryError::NodeType("non_existent1")) + Query::new(language, "(clas)"), + Err(QueryError::NodeType("clas")) ); assert_eq!( - Query::new(language, "(if_statement (non_existent2))"), - Err(QueryError::NodeType("non_existent2")) + Query::new(language, "(if_statement (arrayyyyy))"), + Err(QueryError::NodeType("arrayyyyy")) ); assert_eq!( Query::new(language, "(if_statement condition: (non_existent3))"), diff --git a/lib/binding_web/test/query-test.js b/lib/binding_web/test/query-test.js index 38c3209e..cfa45bd4 100644 --- a/lib/binding_web/test/query-test.js +++ b/lib/binding_web/test/query-test.js @@ -25,6 +25,9 @@ describe("Query", () => { assert.throws(() => { JavaScript.query("(non_existent)") }, "Bad node name 'non_existent'"); + assert.throws(() => { + JavaScript.query("(a)") + }, "Bad node name 'a'"); assert.throws(() => { JavaScript.query("(function_declaration non_existent:(identifier))") }, "Bad field name 'non_existent'"); diff --git a/lib/src/query.c b/lib/src/query.c index a082e131..323abebc 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -237,10 +237,9 @@ static TSSymbol ts_query_intern_node_name( ) { uint32_t symbol_count = ts_language_symbol_count(self->language); for (TSSymbol i = 0; i < symbol_count; i++) { - if ( - ts_language_symbol_type(self->language, i) == symbol_type && - !strncmp(ts_language_symbol_name(self->language, i), name, length) - ) return i; + if (ts_language_symbol_type(self->language, i) != symbol_type) continue; + const char *symbol_name = ts_language_symbol_name(self->language, i); + if (!strncmp(symbol_name, name, length) && !symbol_name[length]) return i; } return 0; }