binding_web: Add Query.didExceedMatchLimit

This lets wasm clients check whether a query exceeded its maximum number
of in-progress matches.
This commit is contained in:
Douglas Creager 2021-04-27 09:21:38 -04:00
parent b5ec720696
commit e8eb3c5d5a
4 changed files with 32 additions and 0 deletions

View file

@ -670,3 +670,10 @@ void ts_query_captures_wasm(
TRANSFER_BUFFER[0] = (const void *)(capture_count);
TRANSFER_BUFFER[1] = result.contents;
}
bool ts_query_did_exceed_match_limit_wasm(
const TSQuery *self
) {
if (!scratch_query_cursor) return false;
return ts_query_cursor_did_exceed_match_limit(scratch_query_cursor);
}

View file

@ -1048,6 +1048,10 @@ class Query {
predicatesForPattern(patternIndex) {
return this.predicates[patternIndex]
}
didExceedMatchLimit() {
return C._ts_query_did_exceed_match_limit_wasm(this[0]);
}
}
function getText(tree, startIndex, endIndex) {

View file

@ -76,6 +76,7 @@
"_ts_query_capture_name_for_id",
"_ts_query_captures_wasm",
"_ts_query_delete",
"_ts_query_did_exceed_match_limit_wasm",
"_ts_query_matches_wasm",
"_ts_query_new",
"_ts_query_pattern_count",

View file

@ -238,6 +238,26 @@ describe("Query", () => {
refutedProperties: { bar: "baz" },
},
]);
assert.ok(!query.didExceedMatchLimit());
});
it("detects queries with too many permutations to track", () => {
tree = parser.parse(`
[
hello, hello, hello, hello, hello, hello, hello, hello, hello, hello,
hello, hello, hello, hello, hello, hello, hello, hello, hello, hello,
hello, hello, hello, hello, hello, hello, hello, hello, hello, hello,
hello, hello, hello, hello, hello, hello, hello, hello, hello, hello,
hello, hello, hello, hello, hello, hello, hello, hello, hello, hello,
];
`);
query = JavaScript.query(`
(array (identifier) @pre (identifier) @post)
`);
const captures = query.captures(tree.rootNode);
assert.ok(query.didExceedMatchLimit());
});
});