Skip to content

Commit c5ae315

Browse files
committed
unified: auto-generate parser files
Uses the `tree-sitter-generate` crate to generate these files on the fly.
1 parent 60d6429 commit c5ae315

13 files changed

Lines changed: 391 additions & 595541 deletions

File tree

Cargo.lock

Lines changed: 338 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

MODULE.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ use_repo(
150150
"vendor_ts__tracing-subscriber-0.3.20",
151151
"vendor_ts__tree-sitter-0.26.8",
152152
"vendor_ts__tree-sitter-embedded-template-0.25.0",
153+
"vendor_ts__tree-sitter-generate-0.26.8",
153154
"vendor_ts__tree-sitter-json-0.24.8",
154155
"vendor_ts__tree-sitter-language-0.1.5",
155156
"vendor_ts__tree-sitter-python-0.23.6",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Generated by tree-sitter from grammar.js. The Cargo build script
2+
# (bindings/rust/build.rs) and Bazel's cargo_build_script regenerate them into
3+
# OUT_DIR. The tree-sitter CLI (parse, test, playground, etc.) expects them in
4+
# src/, so contributors can run `tree-sitter generate` locally to populate
5+
# these — they are intentionally untracked.
6+
src/parser.c
7+
src/grammar.json
8+
src/node-types.json
9+
src/tree_sitter/

unified/extractor/tree-sitter-swift/BUILD.bazel

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ cargo_build_script(
1010
name = "tree-sitter-swift-build",
1111
srcs = ["bindings/rust/build.rs"],
1212
data = glob([
13-
"src/**",
14-
]),
13+
"src/scanner.c",
14+
]) + [
15+
"grammar.js",
16+
],
1517
deps = all_crate_deps(
1618
build = True,
1719
),

unified/extractor/tree-sitter-swift/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ tree-sitter-language = "0.1"
1919

2020
[build-dependencies]
2121
cc = "1.2"
22+
tree-sitter-generate = "0.26.8"
Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,49 @@
1+
use std::env;
2+
use std::path::PathBuf;
3+
14
fn main() {
2-
let src_dir = std::path::Path::new("src");
5+
// tree-sitter-generate produces parser.c, grammar.json, node-types.json,
6+
// and src/tree_sitter/*.h headers from grammar.js. We write them into
7+
// OUT_DIR so the build is sandbox-friendly and we don't litter the source
8+
// tree.
9+
let crate_dir: PathBuf = env::var("CARGO_MANIFEST_DIR").unwrap().into();
10+
let out_dir: PathBuf = env::var("OUT_DIR").unwrap().into();
11+
let grammar_js = crate_dir.join("grammar.js");
12+
13+
tree_sitter_generate::generate_parser_in_directory(
14+
&crate_dir,
15+
Some(&out_dir),
16+
Some(&grammar_js),
17+
tree_sitter_generate::ABI_VERSION_MAX,
18+
None,
19+
None,
20+
true,
21+
tree_sitter_generate::OptLevel::default(),
22+
)
23+
.expect("failed to generate tree-sitter-swift parser");
324

425
let mut c_config = cc::Build::new();
5-
c_config.std("c11").include(src_dir);
26+
c_config
27+
.std("c11")
28+
.include(&out_dir)
29+
.include(out_dir.join("tree_sitter"));
630

731
#[cfg(target_env = "msvc")]
832
c_config.flag("-utf-8");
933

10-
let parser_path = src_dir.join("parser.c");
11-
c_config.file(&parser_path);
12-
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
34+
c_config.file(out_dir.join("parser.c"));
35+
36+
// scanner.c is hand-written and lives in the source tree.
37+
let scanner_path = crate_dir.join("src").join("scanner.c");
38+
c_config.include(crate_dir.join("src")).file(&scanner_path);
1339

14-
let scanner_path = src_dir.join("scanner.c");
15-
c_config.file(&scanner_path);
40+
println!("cargo:rerun-if-changed={}", grammar_js.to_str().unwrap());
1641
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
42+
// Re-export OUT_DIR so consumers can include_str! the generated files.
43+
println!(
44+
"cargo:rustc-env=TREE_SITTER_SWIFT_OUT_DIR={}",
45+
out_dir.to_str().unwrap()
46+
);
1747

1848
c_config.compile("tree-sitter-swift");
1949
}

unified/extractor/tree-sitter-swift/bindings/rust/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_swift
3232
/// The content of the [`node-types.json`][] file for this grammar.
3333
///
3434
/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
35-
pub const NODE_TYPES: &str = include_str!("../../src/node-types.json");
35+
pub const NODE_TYPES: &str = include_str!(concat!(env!("TREE_SITTER_SWIFT_OUT_DIR"), "/node-types.json"));
3636

3737
pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm");
3838
pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm");

0 commit comments

Comments
 (0)