From c80ce0d0248de694b551bcad9a97bbd42179427d Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Sun, 15 Aug 2021 16:50:43 -0700 Subject: [PATCH] Use vendored tree-sitter-rust --- Cargo.lock | 12 +----------- Cargo.toml | 4 +++- build.rs | 12 ++++++++++++ src/sitter.rs | 12 +++++++++--- 4 files changed, 25 insertions(+), 15 deletions(-) create mode 100644 build.rs diff --git a/Cargo.lock b/Cargo.lock index 2b3986a6f..f328f4c6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,6 +96,7 @@ name = "difftastic" version = "0.7.0" dependencies = [ "atty", + "cc", "clap", "colored", "diff", @@ -109,7 +110,6 @@ dependencies = [ "term_size", "toml", "tree-sitter", - "tree-sitter-rust", "typed-arena", ] @@ -326,16 +326,6 @@ dependencies = [ "regex", ] -[[package]] -name = "tree-sitter-rust" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784f7ef9cdbd4c895dc2d4bb785e95b4a5364a602eec803681db83d1927ddf15" -dependencies = [ - "cc", - "tree-sitter", -] - [[package]] name = "typed-arena" version = "2.0.1" diff --git a/Cargo.toml b/Cargo.toml index 7dd841d07..4f9aca9b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,9 @@ strsim = "0.10.0" lazy_static = "1.4.0" atty = "0.2.14" tree-sitter = "0.19.5" -tree-sitter-rust = "0.19.0" [dev-dependencies] pretty_assertions = "0.6.1" + +[build-dependencies] +cc="*" diff --git a/build.rs b/build.rs new file mode 100644 index 000000000..ecb5411c2 --- /dev/null +++ b/build.rs @@ -0,0 +1,12 @@ +use std::path::PathBuf; + +fn main() { + let dir: PathBuf = ["vendor", "tree-sitter-rust", "src"].iter().collect(); + + cc::Build::new() + .include(&dir) + .file(dir.join("parser.c")) + .file(dir.join("scanner.c")) + .warnings(false) // ignore unused parameter warnings + .compile("tree-sitter-javascript"); +} diff --git a/src/sitter.rs b/src/sitter.rs index 6ea7beb40..9fd00bf50 100644 --- a/src/sitter.rs +++ b/src/sitter.rs @@ -1,19 +1,25 @@ use std::ffi::OsStr; -use tree_sitter::{Parser, TreeCursor}; +use tree_sitter::{Language, Parser, TreeCursor}; use typed_arena::Arena; use crate::{lines::NewlinePositions, syntax::Syntax}; +extern "C" { + fn tree_sitter_rust() -> Language; +} + pub fn supported(extension: &OsStr) -> bool { extension == "rs" } pub fn parse<'a>(arena: &'a Arena>, src: &str) -> Vec<&'a Syntax<'a>> { let mut parser = Parser::new(); + let language = unsafe { tree_sitter_rust() }; parser - .set_language(tree_sitter_rust::language()) - .expect("Error loading Rust grammar"); + .set_language(language) + .expect("Incompatible tree-sitter version in tree-sitter-rust"); + let tree = parser.parse(src, None).unwrap(); let nl_pos = NewlinePositions::from(src);