Skip to content

Commit

Permalink
fix(cli): only output the sources with --no-bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
ObserverOfTime committed Mar 3, 2024
1 parent f8c41f7 commit 3009740
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 139 deletions.
266 changes: 130 additions & 136 deletions cli/src/generate/grammar_files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,7 @@ fn insert_after(
entries.into_iter().collect()
}

pub fn generate_grammar_files(
repo_path: &Path,
language_name: &str,
generate_bindings: bool,
) -> Result<()> {
pub fn generate_grammar_files(repo_path: &Path, language_name: &str) -> Result<()> {
let dashed_language_name = language_name.to_kebab_case();

// Create package.json, or update it with new binding path
Expand Down Expand Up @@ -199,162 +195,160 @@ pub fn generate_grammar_files(
generate_file(path, EDITORCONFIG_TEMPLATE, language_name)
})?;

if generate_bindings {
let bindings_dir = repo_path.join("bindings");
let bindings_dir = repo_path.join("bindings");

// Generate Rust bindings
missing_path(bindings_dir.join("rust"), create_dir)?.apply(|path| {
missing_path(path.join("lib.rs"), |path| {
generate_file(path, LIB_RS_TEMPLATE, language_name)
})?;
// Generate Rust bindings
missing_path(bindings_dir.join("rust"), create_dir)?.apply(|path| {
missing_path(path.join("lib.rs"), |path| {
generate_file(path, LIB_RS_TEMPLATE, language_name)
})?;

missing_path(path.join("build.rs"), |path| {
generate_file(path, BUILD_RS_TEMPLATE, language_name)
})?;
missing_path(path.join("build.rs"), |path| {
generate_file(path, BUILD_RS_TEMPLATE, language_name)
})?;

missing_path(repo_path.join("Cargo.toml"), |path| {
generate_file(path, CARGO_TOML_TEMPLATE, dashed_language_name.as_str())
})?;
missing_path(repo_path.join("Cargo.toml"), |path| {
generate_file(path, CARGO_TOML_TEMPLATE, dashed_language_name.as_str())
})?;

Ok(())
Ok(())
})?;

// Generate Node bindings
missing_path(bindings_dir.join("node"), create_dir)?.apply(|path| {
missing_path(path.join("index.js"), |path| {
generate_file(path, INDEX_JS_TEMPLATE, language_name)
})?;

// Generate Node bindings
missing_path(bindings_dir.join("node"), create_dir)?.apply(|path| {
missing_path(path.join("index.js"), |path| {
generate_file(path, INDEX_JS_TEMPLATE, language_name)
})?;

missing_path(path.join("index.d.ts"), |path| {
generate_file(path, INDEX_D_TS_TEMPLATE, language_name)
})?;

missing_path_else(
path.join("binding.cc"),
|path| generate_file(path, JS_BINDING_CC_TEMPLATE, language_name),
|path| {
let binding_cc =
fs::read_to_string(path).with_context(|| "Failed to read binding.cc")?;
if binding_cc.contains("NAN_METHOD(New) {}") {
eprintln!("Replacing binding.cc with new binding API");
generate_file(path, JS_BINDING_CC_TEMPLATE, language_name)?;
}
Ok(())
},
)?;

// Create binding.gyp, or update it with new binding API.
missing_path_else(
repo_path.join("binding.gyp"),
|path| generate_file(path, BINDING_GYP_TEMPLATE, language_name),
|path| {
let binding_gyp =
fs::read_to_string(path).with_context(|| "Failed to read binding.gyp")?;
if binding_gyp.contains("require('nan')") {
eprintln!("Replacing binding.gyp with new binding API");
generate_file(path, BINDING_GYP_TEMPLATE, language_name)?;
}
Ok(())
},
)?;
missing_path(path.join("index.d.ts"), |path| {
generate_file(path, INDEX_D_TS_TEMPLATE, language_name)
})?;

// Remove files from old node binding paths.
existing_path(repo_path.join("index.js"), remove_file)?;
existing_path(repo_path.join("src").join("binding.cc"), remove_file)?;
missing_path_else(
path.join("binding.cc"),
|path| generate_file(path, JS_BINDING_CC_TEMPLATE, language_name),
|path| {
let binding_cc =
fs::read_to_string(path).with_context(|| "Failed to read binding.cc")?;
if binding_cc.contains("NAN_METHOD(New) {}") {
eprintln!("Replacing binding.cc with new binding API");
generate_file(path, JS_BINDING_CC_TEMPLATE, language_name)?;
}
Ok(())
},
)?;

// Create binding.gyp, or update it with new binding API.
missing_path_else(
repo_path.join("binding.gyp"),
|path| generate_file(path, BINDING_GYP_TEMPLATE, language_name),
|path| {
let binding_gyp =
fs::read_to_string(path).with_context(|| "Failed to read binding.gyp")?;
if binding_gyp.contains("require('nan')") {
eprintln!("Replacing binding.gyp with new binding API");
generate_file(path, BINDING_GYP_TEMPLATE, language_name)?;
}
Ok(())
},
)?;

Ok(())
// Remove files from old node binding paths.
existing_path(repo_path.join("index.js"), remove_file)?;
existing_path(repo_path.join("src").join("binding.cc"), remove_file)?;

Ok(())
})?;

// Generate C bindings
missing_path(bindings_dir.join("c"), create_dir)?.apply(|path| {
missing_path(
path.join(format!("tree-sitter-{language_name}.h")),
|path| generate_file(path, PARSER_NAME_H_TEMPLATE, language_name),
)?;

missing_path(
path.join(format!("tree-sitter-{language_name}.pc.in")),
|path| generate_file(path, PARSER_NAME_PC_IN_TEMPLATE, language_name),
)?;

missing_path(repo_path.join("Makefile"), |path| {
generate_file(path, MAKEFILE_TEMPLATE, language_name)
})?;

// Generate C bindings
missing_path(bindings_dir.join("c"), create_dir)?.apply(|path| {
missing_path(
path.join(format!("tree-sitter-{language_name}.h")),
|path| generate_file(path, PARSER_NAME_H_TEMPLATE, language_name),
)?;
Ok(())
})?;

missing_path(
path.join(format!("tree-sitter-{language_name}.pc.in")),
|path| generate_file(path, PARSER_NAME_PC_IN_TEMPLATE, language_name),
)?;
// Generate Go bindings
missing_path(bindings_dir.join("go"), create_dir)?.apply(|path| {
missing_path(path.join("binding.go"), |path| {
generate_file(path, BINDING_GO_TEMPLATE, language_name)
})?;

missing_path(repo_path.join("Makefile"), |path| {
generate_file(path, MAKEFILE_TEMPLATE, language_name)
})?;
missing_path(path.join("binding_test.go"), |path| {
generate_file(path, BINDING_GO_TEST_TEMPLATE, language_name)
})?;

Ok(())
missing_path(path.join("go.mod"), |path| {
generate_file(path, GO_MOD_TEMPLATE, language_name)
})?;

// Generate Go bindings
missing_path(bindings_dir.join("go"), create_dir)?.apply(|path| {
missing_path(path.join("binding.go"), |path| {
generate_file(path, BINDING_GO_TEMPLATE, language_name)
})?;
Ok(())
})?;

missing_path(path.join("binding_test.go"), |path| {
generate_file(path, BINDING_GO_TEST_TEMPLATE, language_name)
})?;
// Generate Python bindings
missing_path(
bindings_dir
.join("python")
.join(format!("tree_sitter_{}", language_name.to_snake_case())),
create_dir,
)?
.apply(|path| {
missing_path(path.join("binding.c"), |path| {
generate_file(path, PY_BINDING_C_TEMPLATE, language_name)
})?;

missing_path(path.join("go.mod"), |path| {
generate_file(path, GO_MOD_TEMPLATE, language_name)
})?;
missing_path(path.join("__init__.py"), |path| {
generate_file(path, INIT_PY_TEMPLATE, language_name)
})?;

Ok(())
missing_path(path.join("__init__.pyi"), |path| {
generate_file(path, INIT_PYI_TEMPLATE, language_name)
})?;

// Generate Python bindings
missing_path(
bindings_dir
.join("python")
.join(format!("tree_sitter_{}", language_name.to_snake_case())),
create_dir,
)?
.apply(|path| {
missing_path(path.join("binding.c"), |path| {
generate_file(path, PY_BINDING_C_TEMPLATE, language_name)
})?;

missing_path(path.join("__init__.py"), |path| {
generate_file(path, INIT_PY_TEMPLATE, language_name)
})?;

missing_path(path.join("__init__.pyi"), |path| {
generate_file(path, INIT_PYI_TEMPLATE, language_name)
})?;

missing_path(path.join("py.typed"), |path| {
generate_file(path, "", language_name) // py.typed is empty
})?;

missing_path(repo_path.join("setup.py"), |path| {
generate_file(path, SETUP_PY_TEMPLATE, language_name)
})?;

missing_path(repo_path.join("pyproject.toml"), |path| {
generate_file(path, PYPROJECT_TOML_TEMPLATE, dashed_language_name.as_str())
})?;
missing_path(path.join("py.typed"), |path| {
generate_file(path, "", language_name) // py.typed is empty
})?;

Ok(())
missing_path(repo_path.join("setup.py"), |path| {
generate_file(path, SETUP_PY_TEMPLATE, language_name)
})?;

// Generate Swift bindings
missing_path(
bindings_dir
.join("swift")
.join(format!("TreeSitter{}", language_name.to_upper_camel_case())),
create_dir,
)?
.apply(|path| {
missing_path(path.join(format!("{language_name}.h")), |path| {
generate_file(path, PARSER_NAME_H_TEMPLATE, language_name)
})?;

missing_path(repo_path.join("Package.swift"), |path| {
generate_file(path, PACKAGE_SWIFT_TEMPLATE, language_name)
})?;
missing_path(repo_path.join("pyproject.toml"), |path| {
generate_file(path, PYPROJECT_TOML_TEMPLATE, dashed_language_name.as_str())
})?;

Ok(())
Ok(())
})?;

// Generate Swift bindings
missing_path(
bindings_dir
.join("swift")
.join(format!("TreeSitter{}", language_name.to_upper_camel_case())),
create_dir,
)?
.apply(|path| {
missing_path(path.join(format!("{language_name}.h")), |path| {
generate_file(path, PARSER_NAME_H_TEMPLATE, language_name)
})?;
}

missing_path(repo_path.join("Package.swift"), |path| {
generate_file(path, PACKAGE_SWIFT_TEMPLATE, language_name)
})?;

Ok(())
})?;

Ok(())
}
Expand Down
6 changes: 3 additions & 3 deletions cli/src/generate/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ pub fn generate_parser_in_directory(
.strip_prefix("tree-sitter-")
.or_else(|| Some(dir_name.as_ref()))
{
grammar_files::generate_grammar_files(&repo_path, language_name, false)?;
grammar_files::generate_grammar_files(&repo_path, language_name)?;
}
}
}
Expand Down Expand Up @@ -126,8 +126,8 @@ pub fn generate_parser_in_directory(
write_file(&header_path.join("array.h"), tree_sitter::ARRAY_HEADER)?;
write_file(&header_path.join("parser.h"), tree_sitter::PARSER_HEADER)?;

if !path_in_ignore(&repo_path) {
grammar_files::generate_grammar_files(&repo_path, &language_name, generate_bindings)?;
if generate_bindings && !path_in_ignore(&repo_path) {
grammar_files::generate_grammar_files(&repo_path, &language_name)?;
}

Ok(())
Expand Down

0 comments on commit 3009740

Please sign in to comment.