Use vendored tree-sitter-rust

ida_star
Wilfred Hughes 2021-08-15 16:50:43 +07:00
parent 8a6c7c8013
commit c80ce0d024
4 changed files with 25 additions and 15 deletions

12
Cargo.lock generated

@ -96,6 +96,7 @@ name = "difftastic"
version = "0.7.0" version = "0.7.0"
dependencies = [ dependencies = [
"atty", "atty",
"cc",
"clap", "clap",
"colored", "colored",
"diff", "diff",
@ -109,7 +110,6 @@ dependencies = [
"term_size", "term_size",
"toml", "toml",
"tree-sitter", "tree-sitter",
"tree-sitter-rust",
"typed-arena", "typed-arena",
] ]
@ -326,16 +326,6 @@ dependencies = [
"regex", "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]] [[package]]
name = "typed-arena" name = "typed-arena"
version = "2.0.1" version = "2.0.1"

@ -23,7 +23,9 @@ strsim = "0.10.0"
lazy_static = "1.4.0" lazy_static = "1.4.0"
atty = "0.2.14" atty = "0.2.14"
tree-sitter = "0.19.5" tree-sitter = "0.19.5"
tree-sitter-rust = "0.19.0"
[dev-dependencies] [dev-dependencies]
pretty_assertions = "0.6.1" pretty_assertions = "0.6.1"
[build-dependencies]
cc="*"

@ -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");
}

@ -1,19 +1,25 @@
use std::ffi::OsStr; use std::ffi::OsStr;
use tree_sitter::{Parser, TreeCursor}; use tree_sitter::{Language, Parser, TreeCursor};
use typed_arena::Arena; use typed_arena::Arena;
use crate::{lines::NewlinePositions, syntax::Syntax}; use crate::{lines::NewlinePositions, syntax::Syntax};
extern "C" {
fn tree_sitter_rust() -> Language;
}
pub fn supported(extension: &OsStr) -> bool { pub fn supported(extension: &OsStr) -> bool {
extension == "rs" extension == "rs"
} }
pub fn parse<'a>(arena: &'a Arena<Syntax<'a>>, src: &str) -> Vec<&'a Syntax<'a>> { pub fn parse<'a>(arena: &'a Arena<Syntax<'a>>, src: &str) -> Vec<&'a Syntax<'a>> {
let mut parser = Parser::new(); let mut parser = Parser::new();
let language = unsafe { tree_sitter_rust() };
parser parser
.set_language(tree_sitter_rust::language()) .set_language(language)
.expect("Error loading Rust grammar"); .expect("Incompatible tree-sitter version in tree-sitter-rust");
let tree = parser.parse(src, None).unwrap(); let tree = parser.parse(src, None).unwrap();
let nl_pos = NewlinePositions::from(src); let nl_pos = NewlinePositions::from(src);