From 5c6ab75de1e5817df3620a5cdd85eba748b2a8a6 Mon Sep 17 00:00:00 2001 From: Yusuke Tanaka Date: Tue, 12 Jan 2021 16:53:58 +0900 Subject: fix(watcher): keep working even when imported file has invalid syntax (#9091) --- cli/file_watcher.rs | 7 +++++-- cli/tests/integration_tests.rs | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cli/file_watcher.rs b/cli/file_watcher.rs index 699a27864..d9681af7f 100644 --- a/cli/file_watcher.rs +++ b/cli/file_watcher.rs @@ -172,7 +172,7 @@ where let mut debounce = Debounce::new(); // Store previous data. If module resolution fails at some point, the watcher will try to // continue watching files using these data. - let mut paths; + let mut paths = Vec::new(); let mut module = None; loop { @@ -185,7 +185,10 @@ where module = Some(module_info); } ModuleResolutionResult::Fail { source_path, error } => { - paths = vec![source_path]; + if paths.is_empty() { + paths = vec![source_path]; + } + if module.is_none() { eprintln!("{}: {}", colors::red_bold("error"), error); } diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index 1bffe9ba9..feb3f7f04 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -1571,6 +1571,21 @@ fn run_watch() { assert!(stdout_lines.next().unwrap().contains("42")); wait_for_process_finished("Process", &mut stderr_lines); + // Update the content of the imported file with invalid syntax + std::fs::write(&another_file, "syntax error ^^").expect("error writing file"); + std::thread::sleep(std::time::Duration::from_secs(1)); + assert!(stderr_lines.next().unwrap().contains("Restarting")); + assert!(stderr_lines.next().unwrap().contains("error:")); + wait_for_process_finished("Process", &mut stderr_lines); + + // Modify the imported file and make sure that restarting occurs + std::fs::write(&another_file, "export const foo = 'modified!';") + .expect("error writing file"); + std::thread::sleep(std::time::Duration::from_secs(1)); + assert!(stderr_lines.next().unwrap().contains("Restarting")); + assert!(stdout_lines.next().unwrap().contains("modified!")); + wait_for_process_finished("Process", &mut stderr_lines); + // the watcher process is still alive assert!(child.try_wait().unwrap().is_none()); -- cgit v1.2.3