summaryrefslogtreecommitdiff
path: root/cli/emit.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/emit.rs')
-rw-r--r--cli/emit.rs122
1 files changed, 90 insertions, 32 deletions
diff --git a/cli/emit.rs b/cli/emit.rs
index f69f70cc7..92c240950 100644
--- a/cli/emit.rs
+++ b/cli/emit.rs
@@ -8,41 +8,99 @@ use deno_core::error::AnyError;
use deno_core::ModuleCode;
use deno_core::ModuleSpecifier;
use deno_graph::MediaType;
+use deno_graph::Module;
+use deno_graph::ModuleGraph;
use std::sync::Arc;
-/// A hashing function that takes the source code and emit options
-/// hash then generates a string hash which can be stored to
-/// determine if the cached emit is valid or not.
-pub fn get_source_hash(source_text: &str, emit_options_hash: u64) -> u64 {
- FastInsecureHasher::new()
- .write_str(source_text)
- .write_u64(emit_options_hash)
- .finish()
+#[derive(Clone)]
+pub struct Emitter {
+ emit_cache: EmitCache,
+ parsed_source_cache: ParsedSourceCache,
+ emit_options: deno_ast::EmitOptions,
+ // cached hash of the emit options
+ emit_options_hash: u64,
}
-pub fn emit_parsed_source(
- emit_cache: &EmitCache,
- parsed_source_cache: &ParsedSourceCache,
- specifier: &ModuleSpecifier,
- media_type: MediaType,
- source: &Arc<str>,
- emit_options: &deno_ast::EmitOptions,
- emit_config_hash: u64,
-) -> Result<ModuleCode, AnyError> {
- let source_hash = get_source_hash(source, emit_config_hash);
-
- if let Some(emit_code) = emit_cache.get_emit_code(specifier, source_hash) {
- Ok(emit_code.into())
- } else {
- // this will use a cached version if it exists
- let parsed_source = parsed_source_cache.get_or_parse_module(
- specifier,
- source.clone(),
- media_type,
- )?;
- let transpiled_source = parsed_source.transpile(emit_options)?;
- debug_assert!(transpiled_source.source_map.is_none());
- emit_cache.set_emit_code(specifier, source_hash, &transpiled_source.text);
- Ok(transpiled_source.text.into())
+impl Emitter {
+ pub fn new(
+ emit_cache: EmitCache,
+ parsed_source_cache: ParsedSourceCache,
+ emit_options: deno_ast::EmitOptions,
+ ) -> Self {
+ let emit_options_hash = FastInsecureHasher::new()
+ .write_hashable(&emit_options)
+ .finish();
+ Self {
+ emit_cache,
+ parsed_source_cache,
+ emit_options,
+ emit_options_hash,
+ }
+ }
+
+ pub fn cache_module_emits(
+ &self,
+ graph: &ModuleGraph,
+ ) -> Result<(), AnyError> {
+ for module in graph.modules() {
+ if let Module::Esm(module) = module {
+ let is_emittable = matches!(
+ module.media_type,
+ MediaType::TypeScript
+ | MediaType::Mts
+ | MediaType::Cts
+ | MediaType::Jsx
+ | MediaType::Tsx
+ );
+ if is_emittable {
+ self.emit_parsed_source(
+ &module.specifier,
+ module.media_type,
+ &module.source,
+ )?;
+ }
+ }
+ }
+ Ok(())
+ }
+
+ pub fn emit_parsed_source(
+ &self,
+ specifier: &ModuleSpecifier,
+ media_type: MediaType,
+ source: &Arc<str>,
+ ) -> Result<ModuleCode, AnyError> {
+ let source_hash = self.get_source_hash(source);
+
+ if let Some(emit_code) =
+ self.emit_cache.get_emit_code(specifier, source_hash)
+ {
+ Ok(emit_code.into())
+ } else {
+ // this will use a cached version if it exists
+ let parsed_source = self.parsed_source_cache.get_or_parse_module(
+ specifier,
+ source.clone(),
+ media_type,
+ )?;
+ let transpiled_source = parsed_source.transpile(&self.emit_options)?;
+ debug_assert!(transpiled_source.source_map.is_none());
+ self.emit_cache.set_emit_code(
+ specifier,
+ source_hash,
+ &transpiled_source.text,
+ );
+ Ok(transpiled_source.text.into())
+ }
+ }
+
+ /// A hashing function that takes the source code and uses the global emit
+ /// options then generates a string hash which can be stored to
+ /// determine if the cached emit is valid or not.
+ pub fn get_source_hash(&self, source_text: &str) -> u64 {
+ FastInsecureHasher::new()
+ .write_str(source_text)
+ .write_u64(self.emit_options_hash)
+ .finish()
}
}