From 31bdf5eb97faabcf61e0f4b911b34ebaa4c319f2 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 18 Jan 2019 09:40:09 -0800 Subject: [PATCH] Fix handling of JavaScript errors Refs #258 --- cli/src/generate/dsl.js | 3 +-- cli/src/generate/mod.rs | 16 ++++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/cli/src/generate/dsl.js b/cli/src/generate/dsl.js index 950b2d3b..1a9bed20 100644 --- a/cli/src/generate/dsl.js +++ b/cli/src/generate/dsl.js @@ -135,7 +135,6 @@ token.immediate = function(value) { } function normalize(value) { - if (typeof value == "undefined") throw new Error("Undefined symbol"); @@ -289,7 +288,7 @@ function grammar(baseGrammar, options) { throw new Error("Grammar's conflicts must be an array of arrays of rules."); } - return conflictSet.map(symbol => symbol.name); + return conflictSet.map(symbol => normalize(symbol).name); }); } diff --git a/cli/src/generate/mod.rs b/cli/src/generate/mod.rs index 062a9e6b..535f9d19 100644 --- a/cli/src/generate/mod.rs +++ b/cli/src/generate/mod.rs @@ -36,7 +36,7 @@ pub fn generate_parser_in_directory( ) -> Result<()> { if !properties_only { let grammar_path = grammar_path.map_or(repo_path.join("grammar.js"), |s| s.into()); - let grammar_json = load_grammar_file(&grammar_path); + let grammar_json = load_grammar_file(&grammar_path)?; let (language_name, c_code) = generate_parser_for_grammar_with_opts(&grammar_json, minimize, state_ids_to_log)?; let repo_src_path = repo_path.join("src"); @@ -92,15 +92,15 @@ fn generate_parser_for_grammar_with_opts( Ok((input_grammar.name, c_code)) } -fn load_grammar_file(grammar_path: &PathBuf) -> String { +fn load_grammar_file(grammar_path: &PathBuf) -> Result { match grammar_path.extension().and_then(|e| e.to_str()) { - Some("js") => load_js_grammar_file(grammar_path), - Some("json") => fs::read_to_string(grammar_path).expect("Failed to read grammar file"), - _ => panic!("Unknown grammar file extension"), + Some("js") => Ok(load_js_grammar_file(grammar_path)?), + Some("json") => Ok(fs::read_to_string(grammar_path)?), + _ => Err(Error(format!("Unknown grammar file extension: {:?}", grammar_path))), } } -fn load_js_grammar_file(grammar_path: &PathBuf) -> String { +fn load_js_grammar_file(grammar_path: &PathBuf) -> Result { let mut node_process = Command::new("node") .env("TREE_SITTER_GRAMMAR_PATH", grammar_path) .stdin(Stdio::piped()) @@ -123,10 +123,10 @@ fn load_js_grammar_file(grammar_path: &PathBuf) -> String { match output.status.code() { None => panic!("Node process was killed"), Some(0) => {} - Some(code) => panic!(format!("Node process exited with status {}", code)), + Some(code) => return Err(Error(format!("Node process exited with status {}", code))), } - String::from_utf8(output.stdout).expect("Got invalid UTF8 from node") + Ok(String::from_utf8(output.stdout).expect("Got invalid UTF8 from node")) } fn ensure_file(path: &PathBuf, f: impl Fn() -> String) -> Result<()> {