fix(bindings): improve zig dependency fetching logic

Currently, including a tree-sitter parser as a dependency in a zig
project and running `zig build test` on the project will fetch the
zig-tree-sitter dependency declared by the parser. This is a problem
because (a) consumers may not want this dependency for whatever reason
and (b) due to how often Zig breaks everything and how scarcely most
tree-sitter parsers are updated, the zig-tree-sitter version pinned
by the parser module will often be outdated and broken.

The workaround I used was taken from https://ziggit.dev/t/11234
This commit is contained in:
ObserverOfTime 2025-08-23 23:53:03 +03:00
parent e67f9f8f7a
commit 107bd800b0
2 changed files with 32 additions and 13 deletions

View file

@ -411,6 +411,7 @@ pub fn generate_grammar_files(
|path| {
let contents = fs::read_to_string(path)?;
if !contents.contains("bun") {
eprintln!("Replacing index.js");
generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?;
}
Ok(())
@ -777,8 +778,13 @@ pub fn generate_grammar_files(
allow_update,
|path| generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts),
|path| {
eprintln!("Replacing build.zig");
generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts)
let contents = fs::read_to_string(path)?;
if !contents.contains("b.pkg_hash.len") {
eprintln!("Replacing build.zig");
generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts)
} else {
Ok(())
}
},
)?;
@ -787,8 +793,13 @@ pub fn generate_grammar_files(
allow_update,
|path| generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts),
|path| {
eprintln!("Replacing build.zig.zon");
generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts)
let contents = fs::read_to_string(path)?;
if !contents.contains(".name = .tree_sitter_") {
eprintln!("Replacing build.zig.zon");
generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts)
} else {
Ok(())
}
},
)?;
@ -798,8 +809,13 @@ pub fn generate_grammar_files(
allow_update,
|path| generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts),
|path| {
eprintln!("Replacing root.zig");
generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts)
let contents = fs::read_to_string(path)?;
if contents.contains("ts.Language") {
eprintln!("Replacing root.zig");
generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts)
} else {
Ok(())
}
},
)?;