refactor(codegen): make codegen sourcemap builder clearer (#2894)

Avoid `enable_sourcemap` appear multiply times.
This commit is contained in:
underfin 2024-04-03 15:07:19 +08:00 committed by GitHub
parent 7bc638ee7d
commit 114f68ea7c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 29 deletions

View file

@ -72,7 +72,7 @@ pub struct Codegen<const MINIFY: bool> {
/// Track the current indentation level
indentation: u8,
sourcemap_builder: SourcemapBuilder,
sourcemap_builder: Option<SourcemapBuilder>,
}
#[derive(Debug, Clone, Copy)]
@ -89,10 +89,12 @@ impl<const MINIFY: bool> Codegen<MINIFY> {
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<const MINIFY: bool> Codegen<MINIFY> {
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<const MINIFY: bool> Codegen<MINIFY> {
}
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);
}
}
}

View file

@ -23,7 +23,6 @@ pub struct LineOffsetTable {
#[allow(clippy::struct_field_names)]
pub struct SourcemapBuilder {
enable_sourcemap: bool,
source_id: u32,
original_source: Arc<str>,
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<oxc_sourcemap::SourceMap> {
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<Arc<str>>) {
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()),