summaryrefslogtreecommitdiff
path: root/cli/worker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/worker.rs')
-rw-r--r--cli/worker.rs88
1 files changed, 51 insertions, 37 deletions
diff --git a/cli/worker.rs b/cli/worker.rs
index 98bea6eb8..59eecda6f 100644
--- a/cli/worker.rs
+++ b/cli/worker.rs
@@ -212,35 +212,39 @@ fn fetch_module_meta_data_and_maybe_compile_async(
specifier: &str,
referrer: &str,
) -> impl Future<Item = ModuleMetaData, Error = DenoError> {
- let use_cache = !state.flags.reload;
- let no_fetch = state.flags.no_fetch;
let state_ = state.clone();
let specifier = specifier.to_string();
let referrer = referrer.to_string();
- state
- .dir
- .fetch_module_meta_data_async(&specifier, &referrer, use_cache, no_fetch)
- .and_then(move |out| {
- if out.media_type == msg::MediaType::TypeScript
- && !out.has_output_code_and_source_map()
- {
- debug!(">>>>> compile_sync START");
- Either::A(
- compile_async(state_.clone(), &specifier, &referrer, &out)
- .map_err(|e| {
- debug!("compiler error exiting!");
- eprintln!("{}", JSErrorColor(&e).to_string());
- std::process::exit(1);
- }).and_then(move |out| {
- debug!(">>>>> compile_sync END");
- state_.dir.code_cache(&out)?;
- Ok(out)
- }),
- )
- } else {
- Either::B(futures::future::ok(out))
- }
- })
+
+ let f = futures::future::result(Worker::resolve(&specifier, &referrer));
+ f.and_then(move |module_id| {
+ let use_cache = !state_.flags.reload || state_.has_compiled(&module_id);
+ let no_fetch = state_.flags.no_fetch;
+
+ state_
+ .dir
+ .fetch_module_meta_data_async(&specifier, &referrer, use_cache, no_fetch)
+ .and_then(move |out| {
+ if out.media_type == msg::MediaType::TypeScript
+ && !out.has_output_code_and_source_map()
+ {
+ debug!(">>>>> compile_sync START");
+ Either::A(
+ compile_async(state_.clone(), &specifier, &referrer, &out)
+ .map_err(|e| {
+ debug!("compiler error exiting!");
+ eprintln!("{}", JSErrorColor(&e).to_string());
+ std::process::exit(1);
+ }).and_then(move |out| {
+ debug!(">>>>> compile_sync END");
+ Ok(out)
+ }),
+ )
+ } else {
+ Either::B(futures::future::ok(out))
+ }
+ })
+ })
}
pub fn fetch_module_meta_data_and_maybe_compile(
@@ -297,6 +301,8 @@ mod tests {
let metrics = &state_.metrics;
assert_eq!(metrics.resolve_count.load(Ordering::SeqCst), 2);
+ // Check that we didn't start the compiler.
+ assert_eq!(metrics.compiler_starts.load(Ordering::SeqCst), 0);
}
#[test]
@@ -327,6 +333,8 @@ mod tests {
let metrics = &state_.metrics;
assert_eq!(metrics.resolve_count.load(Ordering::SeqCst), 2);
+ // Check that we didn't start the compiler.
+ assert_eq!(metrics.compiler_starts.load(Ordering::SeqCst), 0);
}
#[test]
@@ -361,6 +369,8 @@ mod tests {
let metrics = &state_.metrics;
assert_eq!(metrics.resolve_count.load(Ordering::SeqCst), 3);
+ // Check that we've only invoked the compiler once.
+ assert_eq!(metrics.compiler_starts.load(Ordering::SeqCst), 1);
}
fn create_test_worker() -> Worker {
@@ -459,20 +469,24 @@ mod tests {
#[test]
fn execute_mod_resolve_error() {
- // "foo" is not a vailid module specifier so this should return an error.
- let worker = create_test_worker();
- let js_url = root_specifier_to_url("does-not-exist").unwrap();
- let result = worker.execute_mod_async(&js_url, false).wait();
- assert!(result.is_err());
+ tokio_util::init(|| {
+ // "foo" is not a vailid module specifier so this should return an error.
+ let worker = create_test_worker();
+ let js_url = root_specifier_to_url("does-not-exist").unwrap();
+ let result = worker.execute_mod_async(&js_url, false).wait();
+ assert!(result.is_err());
+ })
}
#[test]
fn execute_mod_002_hello() {
- // This assumes cwd is project root (an assumption made throughout the
- // tests).
- let worker = create_test_worker();
- let js_url = root_specifier_to_url("./tests/002_hello.ts").unwrap();
- let result = worker.execute_mod_async(&js_url, false).wait();
- assert!(result.is_ok());
+ tokio_util::init(|| {
+ // This assumes cwd is project root (an assumption made throughout the
+ // tests).
+ let worker = create_test_worker();
+ let js_url = root_specifier_to_url("./tests/002_hello.ts").unwrap();
+ let result = worker.execute_mod_async(&js_url, false).wait();
+ assert!(result.is_ok());
+ })
}
}