diff --git a/cli/benches/benchmark.rs b/cli/benches/benchmark.rs index fa3a5e73..7983bde5 100644 --- a/cli/benches/benchmark.rs +++ b/cli/benches/benchmark.rs @@ -167,6 +167,6 @@ fn parse(parser: &mut Parser, example_path: &Path, max_path_length: usize) -> us fn get_language(name: &str) -> Language { TEST_LOADER - .load_language_at_path(name, &GRAMMARS_DIR.join(name).join("src"), &HEADER_DIR) + .load_language_at_path(&GRAMMARS_DIR.join(name).join("src"), &HEADER_DIR) .unwrap() } diff --git a/cli/src/loader.rs b/cli/src/loader.rs index 678fbb1b..5c2a19a7 100644 --- a/cli/src/loader.rs +++ b/cli/src/loader.rs @@ -3,6 +3,7 @@ use libloading::{Library, Symbol}; use regex::{Regex, RegexBuilder}; use serde_derive::Deserialize; use std::collections::HashMap; +use std::io::BufReader; use std::path::{Path, PathBuf}; use std::process::Command; use std::time::SystemTime; @@ -18,7 +19,6 @@ const DYLIB_EXTENSION: &'static str = "dll"; const BUILD_TARGET: &'static str = env!("BUILD_TARGET"); struct LanguageRepo { - name: String, path: PathBuf, language: Option, configurations: Vec, @@ -109,35 +109,42 @@ impl Loader { language } else { let src_path = repo.path.join("src"); - let language = self.load_language_at_path(&repo.name, &src_path, &src_path)?; + let language = self.load_language_at_path(&src_path, &src_path)?; self.language_repos[id].language = Some(language); language }; Ok((language, &self.language_repos[id].configurations)) } - pub fn load_language_at_path( - &self, - name: &str, - src_path: &Path, - header_path: &Path, - ) -> Result { + pub fn load_language_at_path(&self, src_path: &Path, header_path: &Path) -> Result { + let grammar_path = src_path.join("grammar.json"); let parser_path = src_path.join("parser.c"); + let mut scanner_path = src_path.join("scanner.c"); - let scanner_path; - let scanner_c_path = src_path.join("scanner.c"); - if scanner_c_path.exists() { - scanner_path = Some(scanner_c_path); - } else { - let scanner_cc_path = src_path.join("scanner.cc"); - if scanner_cc_path.exists() { - scanner_path = Some(scanner_cc_path); - } else { - scanner_path = None; - } + #[derive(Deserialize)] + struct GrammarJSON { + name: String, } + let mut grammar_file = fs::File::open(grammar_path)?; + let grammar_json: GrammarJSON = serde_json::from_reader(BufReader::new(&mut grammar_file))?; - self.load_language_from_sources(name, &header_path, &parser_path, &scanner_path) + let scanner_path = if scanner_path.exists() { + Some(scanner_path) + } else { + scanner_path.set_extension("cc"); + if scanner_path.exists() { + Some(scanner_path) + } else { + None + } + }; + + self.load_language_from_sources( + &grammar_json.name, + &header_path, + &parser_path, + &scanner_path, + ) } pub fn load_language_from_sources( @@ -236,7 +243,6 @@ impl Loader { #[derive(Deserialize)] struct PackageJSON { - name: String, #[serde(rename = "tree-sitter")] tree_sitter: Option>, } @@ -272,11 +278,6 @@ impl Loader { } self.language_repos.push(LanguageRepo { - name: package_json - .name - .split_at("tree-sitter-".len()) - .1 - .to_string(), path: parser_path.to_owned(), language: None, configurations, diff --git a/cli/src/tests/helpers/fixtures.rs b/cli/src/tests/helpers/fixtures.rs index a5ea9ed0..8fc00038 100644 --- a/cli/src/tests/helpers/fixtures.rs +++ b/cli/src/tests/helpers/fixtures.rs @@ -16,7 +16,7 @@ pub fn fixtures_dir<'a>() -> &'static Path { pub fn get_language(name: &str) -> Language { TEST_LOADER - .load_language_at_path(name, &GRAMMARS_DIR.join(name).join("src"), &HEADER_DIR) + .load_language_at_path(&GRAMMARS_DIR.join(name).join("src"), &HEADER_DIR) .unwrap() }