diff --git a/.github/workflows/Bench.yaml b/.github/workflows/Bench.yaml.bak similarity index 100% rename from .github/workflows/Bench.yaml rename to .github/workflows/Bench.yaml.bak diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 8d3f227d..e7f52bc8 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "nightly-2022-12-15" +channel = "1.74.0" profile = "default" diff --git a/rustfmt.toml b/rustfmt.toml index acc50d12..4c1eefae 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,3 +1,2 @@ max_width = 80 tab_spaces = 2 -format_code_in_doc_comments = true diff --git a/src/concat_source.rs b/src/concat_source.rs index 930f0372..a2b60f46 100644 --- a/src/concat_source.rs +++ b/src/concat_source.rs @@ -161,22 +161,27 @@ impl StreamChunks for ConcatSource { }; if need_to_cloas_mapping { if mapping.generated_line != 1 || mapping.generated_column != 0 { - on_chunk(None, Mapping { - generated_line: current_line_offset + 1, - generated_column: current_column_offset, - original: None, - }); + on_chunk( + None, + Mapping { + generated_line: current_line_offset + 1, + generated_column: current_column_offset, + original: None, + }, + ); } need_to_cloas_mapping = false; } - let result_source_index = mapping.original.as_ref().and_then(|original| { - source_index_mapping - .borrow() - .get(&original.source_index) - .copied() - }); + let result_source_index = + mapping.original.as_ref().and_then(|original| { + source_index_mapping + .borrow() + .get(&original.source_index) + .copied() + }); let result_name_index = mapping - .original.as_ref() + .original + .as_ref() .and_then(|original| original.name_index) .and_then(|name_index| { name_index_mapping.borrow().get(&name_index).copied() @@ -187,8 +192,29 @@ impl StreamChunks for ConcatSource { mapping.generated_line }; if options.final_source { - if let Some(result_source_index) = result_source_index && let Some(original) = &mapping.original { - on_chunk(None, Mapping { + if let (Some(result_source_index), Some(original)) = + (result_source_index, &mapping.original) + { + on_chunk( + None, + Mapping { + generated_line: line, + generated_column: column, + original: Some(OriginalLocation { + source_index: result_source_index, + original_line: original.original_line, + original_column: original.original_column, + name_index: result_name_index, + }), + }, + ); + } + } else if let (Some(result_source_index), Some(original)) = + (result_source_index, &mapping.original) + { + on_chunk( + chunk, + Mapping { generated_line: line, generated_column: column, original: Some(OriginalLocation { @@ -197,25 +223,17 @@ impl StreamChunks for ConcatSource { original_column: original.original_column, name_index: result_name_index, }), - }); - } - } else if let Some(result_source_index) = result_source_index && let Some(original) = &mapping.original { - on_chunk(chunk, Mapping { - generated_line: line, - generated_column: column, - original: Some(OriginalLocation { - source_index: result_source_index, - original_line: original.original_line, - original_column: original.original_column, - name_index: result_name_index, - }), - }); + }, + ); } else { - on_chunk(chunk, Mapping { - generated_line: line, - generated_column: column, - original: None, - }); + on_chunk( + chunk, + Mapping { + generated_line: line, + generated_column: column, + original: None, + }, + ); } }, &mut |i, source, source_content| { diff --git a/src/helpers.rs b/src/helpers.rs index 0a4c9f3c..e05cb991 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -284,16 +284,16 @@ fn encode_full_mappings(mappings: &[Mapping]) -> String { |acc, mapping| { if active_mapping && current_line == mapping.generated_line { // A mapping is still active - if let Some(original) = &mapping.original - && original.source_index == current_source_index - && original.original_line == current_original_line - && original.original_column == current_original_column - && !active_name - && original.name_index.is_none() - { - // avoid repeating the same original mapping - return acc; - } + if mapping.original.is_some_and(|original| { + original.source_index == current_source_index + && original.original_line == current_original_line + && original.original_column == current_original_column + && !active_name + && original.name_index.is_none() + }) { + // avoid repeating the same original mapping + return acc; + } } else { // No mapping is active if mapping.original.is_none() { @@ -531,7 +531,9 @@ pub fn stream_chunks_of_raw_source( line += 1; last_line = Some(l); } - if let Some(last_line) = last_line && !last_line.ends_with('\n') { + if let Some(last_line) = + last_line.filter(|last_line| !last_line.ends_with('\n')) + { GeneratedInfo { generated_line: line, generated_column: last_line.len() as u32, @@ -753,10 +755,11 @@ fn stream_chunks_of_source_map_full( } current_generated_column = mapping.generated_column; } - if let Some(original) = &mapping.original - && (mapping.generated_line < final_line + if let Some(original) = &mapping.original.filter(|_| { + mapping.generated_line < final_line || (mapping.generated_line == final_line - && mapping.generated_column < final_column)) { + && mapping.generated_column < final_column) + }) { mapping_active = true; active_mapping_original = Some(*original); } @@ -801,19 +804,23 @@ fn stream_chunks_of_source_map_lines_final( let mut current_generated_line = 1; let mut on_mapping = |mapping: &Mapping| { - if let Some(original) = &mapping.original - && current_generated_line <= mapping.generated_line - && mapping.generated_line <= final_line { - on_chunk(None, Mapping { - generated_line: mapping.generated_line, - generated_column: 0, - original: Some(OriginalLocation { - source_index: original.source_index, - original_line: original.original_line, - original_column: original.original_column, - name_index: None, - }), - }); + if let Some(original) = &mapping.original.filter(|_| { + current_generated_line <= mapping.generated_line + && mapping.generated_line <= final_line + }) { + on_chunk( + None, + Mapping { + generated_line: mapping.generated_line, + generated_column: 0, + original: Some(OriginalLocation { + source_index: original.source_index, + original_line: original.original_line, + original_column: original.original_column, + name_index: None, + }), + }, + ); current_generated_line = mapping.generated_line + 1; } }; @@ -861,17 +868,23 @@ fn stream_chunks_of_source_map_lines_full( } current_generated_line += 1; } - if let Some(original) = &mapping.original && mapping.generated_line as usize <= lines.len() { - on_chunk(Some(lines[mapping.generated_line as usize - 1]), Mapping { - generated_line: mapping.generated_line, - generated_column: 0, - original: Some(OriginalLocation { - source_index: original.source_index, - original_line: original.original_line, - original_column: original.original_column, - name_index: None, - }), - }); + if let Some(original) = &mapping + .original + .filter(|_| mapping.generated_line as usize <= lines.len()) + { + on_chunk( + Some(lines[mapping.generated_line as usize - 1]), + Mapping { + generated_line: mapping.generated_line, + generated_column: 0, + original: Some(OriginalLocation { + source_index: original.source_index, + original_line: original.original_line, + original_column: original.original_column, + name_index: None, + }), + }, + ); current_generated_line += 1; } }; diff --git a/src/lib.rs b/src/lib.rs index e1b08a12..a13ce2ae 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,5 @@ //! Rusty [`webpack-sources`](https://github.com/webpack/webpack-sources) port. -#![feature(let_chains)] #![warn(unsafe_code)] #![deny(missing_docs)] diff --git a/src/original_source.rs b/src/original_source.rs index de117c8d..dde88d98 100644 --- a/src/original_source.rs +++ b/src/original_source.rs @@ -198,7 +198,9 @@ impl StreamChunks for OriginalSource { line += 1; last_line = Some(l); } - if let Some(last_line) = last_line && !last_line.ends_with('\n') { + if let Some(last_line) = + last_line.filter(|last_line| !last_line.ends_with('\n')) + { GeneratedInfo { generated_line: line, generated_column: last_line.len() as u32, diff --git a/src/replace_source.rs b/src/replace_source.rs index f7d466b0..d55bc724 100644 --- a/src/replace_source.rs +++ b/src/replace_source.rs @@ -272,15 +272,17 @@ impl StreamChunks for ReplaceSource { let mut chunk_pos = 0; let end_pos = pos + chunk.len() as u32; // Skip over when it has been replaced - if let Some(replacment_end) = replacement_end && replacment_end > pos { - // Skip over the whole chunk + if let Some(replacment_end) = + replacement_end.filter(|replacment_end| *replacment_end > pos) + { + // Skip over the whole chunk if replacment_end >= end_pos { let line = mapping.generated_line as i64 + generated_line_offset; if chunk.ends_with('\n') { generated_line_offset -= 1; if generated_column_offset_line == line { - // undo exiting corrections form the current line - generated_column_offset += mapping.generated_column as i64; + // undo exiting corrections form the current line + generated_column_offset += mapping.generated_column as i64; } } else if generated_column_offset_line == line { generated_column_offset -= chunk.len() as i64; @@ -289,17 +291,18 @@ impl StreamChunks for ReplaceSource { generated_column_offset_line = line; } pos = end_pos; - return ; + return; } // Partially skip over chunk chunk_pos = replacment_end - pos; - if let Some(original) = &mut mapping.original - && check_original_content( + if let Some(original) = mapping.original.as_mut().filter(|original| { + check_original_content( original.source_index, original.original_line, original.original_column, chunk_with_indices.substring(0, chunk_pos as usize), - ) { + ) + }) { original.original_column += chunk_pos; } pos += chunk_pos; @@ -313,36 +316,64 @@ impl StreamChunks for ReplaceSource { mapping.generated_column += chunk_pos; } - // Is a replacement in the chunk? - while let Some(next_replacement_pos) = next_replacement && next_replacement_pos < end_pos { + // Is a replacement in the chunk? + while let Some(next_replacement_pos) = next_replacement + .filter(|next_replacement_pos| *next_replacement_pos < end_pos) + { let mut line = mapping.generated_line as i64 + generated_line_offset; if next_replacement_pos > pos { // Emit chunk until replacement let offset = next_replacement_pos - pos; - let chunk_slice = chunk_with_indices.substring(chunk_pos as usize, (chunk_pos + offset) as usize); - on_chunk(Some(chunk_slice), Mapping { - generated_line: line as u32, - generated_column: ((mapping.generated_column as i64) + if line == generated_column_offset_line { generated_column_offset } else { 0 }) as u32, - original: mapping.original.as_ref().map(|original| OriginalLocation { - source_index: original.source_index, - original_line: original.original_line, - original_column: original.original_column, - name_index: original.name_index.and_then(|name_index| name_index_mapping.borrow().get(&name_index).copied()), - }), - }); + let chunk_slice = chunk_with_indices + .substring(chunk_pos as usize, (chunk_pos + offset) as usize); + on_chunk( + Some(chunk_slice), + Mapping { + generated_line: line as u32, + generated_column: ((mapping.generated_column as i64) + + if line == generated_column_offset_line { + generated_column_offset + } else { + 0 + }) as u32, + original: mapping.original.as_ref().map(|original| { + OriginalLocation { + source_index: original.source_index, + original_line: original.original_line, + original_column: original.original_column, + name_index: original.name_index.and_then(|name_index| { + name_index_mapping.borrow().get(&name_index).copied() + }), + } + }), + }, + ); mapping.generated_column += offset; chunk_pos += offset; pos = next_replacement_pos; - if let Some(original) = &mut mapping.original - && check_original_content(original.source_index, original.original_line, original.original_column, chunk_slice) { + if let Some(original) = + mapping.original.as_mut().filter(|original| { + check_original_content( + original.source_index, + original.original_line, + original.original_column, + chunk_slice, + ) + }) + { original.original_column += chunk_slice.len() as u32; } } // Insert replacement content splitted into chunks by lines let repl = &repls[i]; let lines: Vec<&str> = split_into_lines(&repl.content); - let mut replacement_name_index = mapping.original.as_ref().and_then(|original| original.name_index); - if mapping.original.is_some() && let Some(name) = &repl.name { + let mut replacement_name_index = mapping + .original + .as_ref() + .and_then(|original| original.name_index); + if let Some(name) = + repl.name.as_ref().filter(|_| mapping.original.is_some()) + { let mut name_mapping = name_mapping.borrow_mut(); let mut global_index = name_mapping.get(name).copied(); if global_index.is_none() { @@ -354,11 +385,26 @@ impl StreamChunks for ReplaceSource { replacement_name_index = global_index; } for (m, content_line) in lines.iter().enumerate() { - on_chunk(Some(content_line), Mapping { - generated_line: line as u32, - generated_column: ((mapping.generated_column as i64) + if line == generated_column_offset_line { generated_column_offset } else { 0 }) as u32, - original: mapping.original.as_ref().map(|original| OriginalLocation { source_index: original.source_index, original_line: original.original_line, original_column: original.original_column, name_index: replacement_name_index }), - }); + on_chunk( + Some(content_line), + Mapping { + generated_line: line as u32, + generated_column: ((mapping.generated_column as i64) + + if line == generated_column_offset_line { + generated_column_offset + } else { + 0 + }) as u32, + original: mapping.original.as_ref().map(|original| { + OriginalLocation { + source_index: original.source_index, + original_line: original.original_line, + original_column: original.original_column, + name_index: replacement_name_index, + } + }), + }, + ); // Only the first chunk has name assigned replacement_name_index = None; @@ -386,13 +432,21 @@ impl StreamChunks for ReplaceSource { // Move to next replacment i += 1; - next_replacement = if i < repls.len() { Some(repls[i].start) } else { None }; + next_replacement = if i < repls.len() { + Some(repls[i].start) + } else { + None + }; // Skip over when it has been replaced - let offset = chunk.len() as i64 - end_pos as i64 + replacement_end.unwrap() as i64 - chunk_pos as i64; + let offset = chunk.len() as i64 - end_pos as i64 + + replacement_end.unwrap() as i64 + - chunk_pos as i64; if offset > 0 { // Skip over whole chunk - if let Some(replacement_end) = replacement_end && replacement_end >= end_pos { + if replacement_end + .is_some_and(|replacement_end| replacement_end >= end_pos) + { let line = mapping.generated_line as i64 + generated_line_offset; if chunk.ends_with('\n') { generated_line_offset -= 1; @@ -401,18 +455,31 @@ impl StreamChunks for ReplaceSource { generated_column_offset += mapping.generated_column as i64; } } else if generated_column_offset_line == line { - generated_column_offset -= chunk.len() as i64 - chunk_pos as i64; + generated_column_offset -= + chunk.len() as i64 - chunk_pos as i64; } else { generated_column_offset = chunk_pos as i64 - chunk.len() as i64; generated_column_offset_line = line; } pos = end_pos; - return ; + return; } // Partially skip over chunk let line = mapping.generated_line as i64 + generated_line_offset; - if let Some(original) = &mut mapping.original && check_original_content(original.source_index, original.original_line, original.original_column, chunk_with_indices.substring(chunk_pos as usize, (chunk_pos + offset as u32) as usize)) { + if let Some(original) = + mapping.original.as_mut().filter(|original| { + check_original_content( + original.source_index, + original.original_line, + original.original_column, + chunk_with_indices.substring( + chunk_pos as usize, + (chunk_pos + offset as u32) as usize, + ), + ) + }) + { original.original_column += offset as u32; } chunk_pos += offset as u32; @@ -427,26 +494,51 @@ impl StreamChunks for ReplaceSource { } } - // Emit remaining chunk + // Emit remaining chunk if (chunk_pos as usize) < chunk.len() { - let chunk_slice = if chunk_pos == 0 {chunk} else {chunk_with_indices.substring(chunk_pos as usize, usize::MAX)}; + let chunk_slice = if chunk_pos == 0 { + chunk + } else { + chunk_with_indices.substring(chunk_pos as usize, usize::MAX) + }; let line = mapping.generated_line as i64 + generated_line_offset; - on_chunk(Some(chunk_slice), Mapping { - generated_line: line as u32, - generated_column: ((mapping.generated_column as i64) + if line == generated_column_offset_line { generated_column_offset } else { 0 }) as u32, - original: mapping.original.as_ref().map(|original| OriginalLocation { source_index: original.source_index, original_line: original.original_line, original_column: original.original_column, name_index: original.name_index.and_then(|name_index| name_index_mapping.borrow().get(&name_index).copied()) }), - }); + on_chunk( + Some(chunk_slice), + Mapping { + generated_line: line as u32, + generated_column: ((mapping.generated_column as i64) + + if line == generated_column_offset_line { + generated_column_offset + } else { + 0 + }) as u32, + original: mapping.original.as_ref().map(|original| { + OriginalLocation { + source_index: original.source_index, + original_line: original.original_line, + original_column: original.original_column, + name_index: original.name_index.and_then(|name_index| { + name_index_mapping.borrow().get(&name_index).copied() + }), + } + }), + }, + ); } - pos = end_pos; + pos = end_pos; }, &mut |source_index, source, source_content| { let mut source_content_lines = source_content_lines.borrow_mut(); while source_content_lines.len() <= source_index as usize { source_content_lines.push(None); } - source_content_lines[source_index as usize] = source_content.map(|source_content| { - split_into_lines(source_content).into_iter().map(|line| WithIndices::new(line.into())).collect() - }); + source_content_lines[source_index as usize] = + source_content.map(|source_content| { + split_into_lines(source_content) + .into_iter() + .map(|line| WithIndices::new(line.into())) + .collect() + }); on_source(source_index, source, source_content); }, &mut |name_index, name| { @@ -458,7 +550,9 @@ impl StreamChunks for ReplaceSource { on_name.borrow_mut()(len, name); global_index = Some(len); } - name_index_mapping.borrow_mut().insert(name_index, global_index.unwrap()); + name_index_mapping + .borrow_mut() + .insert(name_index, global_index.unwrap()); }, );