diff --git a/crates/oxc_codegen/src/lib.rs b/crates/oxc_codegen/src/lib.rs index 2db18baea..effb2ccff 100644 --- a/crates/oxc_codegen/src/lib.rs +++ b/crates/oxc_codegen/src/lib.rs @@ -72,7 +72,7 @@ pub struct Codegen { /// Track the current indentation level indentation: u8, - sourcemap_builder: SourcemapBuilder, + sourcemap_builder: Option, } #[derive(Debug, Clone, Copy)] @@ -89,10 +89,12 @@ impl Codegen { let source_len = source_text.len(); let capacity = if MINIFY { source_len / 2 } else { source_len }; - let mut sourcemap_builder = SourcemapBuilder::default(); - if options.enable_source_map { + let sourcemap_builder = options.enable_source_map.then(|| { + let mut sourcemap_builder = SourcemapBuilder::default(); sourcemap_builder.with_name_and_source(source_name, source_text); - } + sourcemap_builder + }); + Self { options, // mangler: None, @@ -117,7 +119,7 @@ impl Codegen { pub fn build(mut self, program: &Program<'_>) -> CodegenReturn { program.gen(&mut self, Context::default()); let source_text = self.into_source_text(); - let source_map = self.sourcemap_builder.into_sourcemap(); + let source_map = self.sourcemap_builder.map(SourcemapBuilder::into_sourcemap); CodegenReturn { source_text, source_map } } @@ -409,11 +411,15 @@ impl Codegen { } fn add_source_mapping(&mut self, position: u32) { - self.sourcemap_builder.add_source_mapping(&self.code, position, None); + if let Some(sourcemap_builder) = self.sourcemap_builder.as_mut() { + sourcemap_builder.add_source_mapping(&self.code, position, None); + } } fn add_source_mapping_for_name(&mut self, span: Span, name: &str) { - self.sourcemap_builder.add_source_mapping_for_name(&self.code, span, name); + if let Some(sourcemap_builder) = self.sourcemap_builder.as_mut() { + sourcemap_builder.add_source_mapping_for_name(&self.code, span, name); + } } } diff --git a/crates/oxc_codegen/src/sourcemap_builder.rs b/crates/oxc_codegen/src/sourcemap_builder.rs index ff4bb5b0f..597aafb75 100644 --- a/crates/oxc_codegen/src/sourcemap_builder.rs +++ b/crates/oxc_codegen/src/sourcemap_builder.rs @@ -23,7 +23,6 @@ pub struct LineOffsetTable { #[allow(clippy::struct_field_names)] pub struct SourcemapBuilder { - enable_sourcemap: bool, source_id: u32, original_source: Arc, last_generated_update: usize, @@ -38,7 +37,6 @@ pub struct SourcemapBuilder { impl Default for SourcemapBuilder { fn default() -> Self { Self { - enable_sourcemap: false, source_id: 0, original_source: "".into(), last_generated_update: 0, @@ -54,14 +52,13 @@ impl Default for SourcemapBuilder { impl SourcemapBuilder { pub fn with_name_and_source(&mut self, name: &str, source: &str) { - self.enable_sourcemap = true; self.line_offset_tables = Self::generate_line_offset_tables(source); self.source_id = self.sourcemap_builder.set_source_and_content(name, source); self.original_source = source.into(); } - pub fn into_sourcemap(self) -> Option { - self.enable_sourcemap.then(|| self.sourcemap_builder.into_sourcemap()) + pub fn into_sourcemap(self) -> oxc_sourcemap::SourceMap { + self.sourcemap_builder.into_sourcemap() } pub fn add_source_mapping_for_name(&mut self, output: &[u8], span: Span, name: &str) { @@ -75,23 +72,21 @@ impl SourcemapBuilder { } pub fn add_source_mapping(&mut self, output: &[u8], position: u32, name: Option>) { - if self.enable_sourcemap { - if matches!(self.last_position, Some(last_position) if last_position >= position) { - return; - } - let (original_line, original_column) = self.search_original_line_and_column(position); - self.update_generated_line_and_column(output); - let name_id = name.map(|s| self.sourcemap_builder.add_name(&s)); - self.sourcemap_builder.add_token( - self.generated_line, - self.generated_column, - original_line, - original_column, - Some(self.source_id), - name_id, - ); - self.last_position = Some(position); + if matches!(self.last_position, Some(last_position) if last_position >= position) { + return; } + let (original_line, original_column) = self.search_original_line_and_column(position); + self.update_generated_line_and_column(output); + let name_id = name.map(|s| self.sourcemap_builder.add_name(&s)); + self.sourcemap_builder.add_token( + self.generated_line, + self.generated_column, + original_line, + original_column, + Some(self.source_id), + name_id, + ); + self.last_position = Some(position); } #[allow(clippy::cast_possible_truncation)] @@ -388,7 +383,7 @@ mod test { builder.with_name_and_source("x.js", "ab"); builder.add_source_mapping_for_name(output, Span::new(0, 1), "a"); builder.add_source_mapping_for_name(output, Span::new(1, 2), "c"); - let sm = builder.into_sourcemap().unwrap(); + let sm = builder.into_sourcemap(); // The name `a` not change. assert_eq!( sm.get_source_view_token(0_u32).as_ref().and_then(|token| token.get_name()),