pub struct SourceMap {
pub segments: Vec<SourceMapSegment>,
}Expand description
Where each byte of the original source ended up in the output.
This is what lets an editor keep a cursor, a diagnostic, or a breakpoint pointing at the right place after a removal.
§Examples
use ocomment_core::{Language, TransformOptions, transform};
let source = b"let x = 1; // note\nlet y = 2;\n";
let result = transform(source, Language::Rust, TransformOptions::default());
let map = &result.source_map;
// The `let y` on the second line survived, at a lower offset.
let original = source.windows(5).position(|w| w == b"let y").unwrap();
let moved = map.original_to_output(original).unwrap();
assert_eq!(&result.output[moved..moved + 5], b"let y");
assert_eq!(map.output_to_original(moved), Some(original));Fields§
§segments: Vec<SourceMapSegment>The sections, in order, covering the whole of both sides.
Implementations§
Source§impl SourceMap
impl SourceMap
Sourcepub fn from_edits(source_len: usize, edits: &[Edit]) -> Self
pub fn from_edits(source_len: usize, edits: &[Edit]) -> Self
Build a byte source map for sorted, non-overlapping edits.
§Panics
Panics if an edit has start > end, starts before its predecessor
ends, or reaches past source_len — the same contract
apply_edits enforces, so a map is never built
for edits that could not be applied.
Sourcepub fn original_to_output(&self, offset: usize) -> Option<usize>
pub fn original_to_output(&self, offset: usize) -> Option<usize>
Where an original offset landed in the output.
An offset inside a replaced section maps to the start of that
replacement, and the end of the source maps to the end of the output.
None when offset is past the end of the original.
Sourcepub fn output_to_original(&self, offset: usize) -> Option<usize>
pub fn output_to_original(&self, offset: usize) -> Option<usize>
Where an output offset came from in the original.
The mirror of Self::original_to_output, with the same rule for
replaced sections and the same None past the end.