mirror of
https://github.com/danbulant/oxc
synced 2026-05-19 04:08:41 +00:00
refactor(codegen): make codegen sourcemap builder clearer (#2894)
Avoid `enable_sourcemap` appear multiply times.
This commit is contained in:
parent
7bc638ee7d
commit
114f68ea7c
2 changed files with 30 additions and 29 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()),
|
||||
|
|
|
|||
Loading…
Reference in a new issue