From 557c3a842675a1ebd77e84021f9f5236d4fa5648 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sat, 5 Mar 2022 21:02:58 +0100 Subject: [PATCH] always return dependencies, even when hitting an error --- src/lib.rs | 106 +++++++++++++++++++++++++++------------------------- src/main.rs | 6 +-- 2 files changed, 59 insertions(+), 53 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ca02845..ded5e13 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,65 +28,71 @@ pub struct CompiledModule { pub dependencies: Vec, } -pub fn compile_file>(path: P, options: Options) -> Result { - let mut dependencies = HashSet::new(); +pub fn compile_file>(path: P, options: Options) -> (Result>, Vec) { + fn compile_file_inner( + path: &Path, + options: Options, + dependencies: &mut HashSet, + ) -> Result> { + let mut script = ast::Script::default(); - let path = path.as_ref(); - let mut script = ast::Script::default(); + let mut sources = Sources::new(); - let mut sources = Sources::new(); + let mut pending_files = vec![(path.to_path_buf(), None)]; + while let Some((path, span)) = pending_files.pop() { + match sources.add(&path) { + Ok((id, true)) => { + dependencies.insert(path.clone()); + let mut new_script = match parser::parse(&sources, id) { + Ok(script) => script, + Err(_) => bail!("Parse failed"), + }; - let mut pending_files = vec![(path.to_path_buf(), None)]; - while let Some((path, span)) = pending_files.pop() { - match sources.add(&path) { - Ok((id, true)) => { - dependencies.insert(path.clone()); - let mut new_script = match parser::parse(&sources, id) { - Ok(script) => script, - Err(_) => bail!("Parse failed"), - }; + includes::resolve_includes(&mut new_script, dependencies, &path)?; - includes::resolve_includes(&mut new_script, &mut dependencies, &path)?; + for include in std::mem::take(&mut new_script.includes) { + let mut path = path + .parent() + .expect("Script path has no parent") + .to_path_buf(); + path.push(include.path); + pending_files.push((path, Some(include.span))); + } - for include in std::mem::take(&mut new_script.includes) { - let mut path = path - .parent() - .expect("Script path has no parent") - .to_path_buf(); - path.push(include.path); - pending_files.push((path, Some(include.span))); + script.merge(new_script); } - - script.merge(new_script); - } - Ok((_, false)) => (), // already parsed this include - Err(err) => { - if let Some(span) = span { - let _ = typecheck::report_error(&err.to_string(), &span, &sources); - } else { - eprintln!("Failed to load script {}: {}", path.display(), err); + Ok((_, false)) => (), // already parsed this include + Err(err) => { + if let Some(span) = span { + let _ = typecheck::report_error(&err.to_string(), &span, &sources); + } else { + eprintln!("Failed to load script {}: {}", path.display(), err); + } + bail!("Parse failed"); } - bail!("Parse failed"); } } + + if constfold::fold_script(&mut script, &sources).is_err() { + bail!("Constant folding failed"); + } + if typecheck::tc_script(&mut script, &sources).is_err() { + bail!("Type check failed"); + } + let wasm = emit::emit( + &script, + &path + .file_stem() + .unwrap_or_else(|| OsStr::new("unknown")) + .to_string_lossy(), + &options, + ); + Ok(wasm) } - if constfold::fold_script(&mut script, &sources).is_err() { - bail!("Constant folding failed"); - } - if typecheck::tc_script(&mut script, &sources).is_err() { - bail!("Type check failed"); - } - let wasm = emit::emit( - &script, - &path - .file_stem() - .unwrap_or_else(|| OsStr::new("unknown")) - .to_string_lossy(), - &options, - ); - Ok(CompiledModule { - wasm, - dependencies: dependencies.into_iter().collect(), - }) + let mut dependencies = HashSet::new(); + + let result = compile_file_inner(path.as_ref(), options, &mut dependencies); + + (result, dependencies.into_iter().collect()) } diff --git a/src/main.rs b/src/main.rs index 6b63145..40a575a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,12 +15,12 @@ fn main() -> Result<()> { let mut filename = args.free_from_os_str::(|s| Ok(s.into()))?; - let module = compile_file(&filename, options)?; + let wasm = compile_file(&filename, options).0?; - wasmparser::validate(&module.wasm)?; + wasmparser::validate(&wasm)?; filename.set_extension("wasm"); - File::create(filename)?.write_all(&module.wasm)?; + File::create(filename)?.write_all(&wasm)?; Ok(()) }