Skip to content

Commit 5d1b474

Browse files
committed
Fix sourcemap
1 parent b26cc8d commit 5d1b474

File tree

3 files changed

+39
-20
lines changed

3 files changed

+39
-20
lines changed

examples/source_map.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
use string_wizard::{MagicString, SourceMapOptions, UpdateOptions};
22

33
fn main() {
4-
let demo = "<div>
5-
hello, world
6-
</div>";
4+
let demo = "<div>\n hello, world\n</div>";
75
let mut s = MagicString::new(demo);
86

97
let update_options = UpdateOptions {
108
store_name: true,
119
..Default::default()
1210
};
13-
s.update_with(1, 2, "v", update_options.clone())
11+
s.prepend("import React from 'react';\n")
12+
.update_with(1, 2, "v", update_options.clone())
1413
.update_with(3, 4, "d", update_options.clone())
1514
.update_with(demo.len() - 4, demo.len() - 1, "h1", update_options.clone());
1615

src/mappings.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,24 +54,25 @@ impl Mappings {
5454
let chunk_content = chunk.span.text(source);
5555
let mut new_line = true;
5656
for char in chunk_content.chars() {
57-
if new_line {
58-
new_line = false;
59-
let segment = Segment {
60-
dst_column: self.generated_code_column.into(),
61-
source_index: source_index.into(),
62-
src_line: loc.line.into(),
63-
src_column: loc.column.into(),
64-
name_index: None,
65-
};
66-
self.add_segment_to_current_line(segment);
67-
}
6857
match char {
6958
'\n' => {
7059
loc.bump_line();
7160
self.bump_line();
7261
new_line = true;
7362
}
7463
_ => {
64+
if new_line {
65+
new_line = false;
66+
let segment = Segment {
67+
dst_column: self.generated_code_column.into(),
68+
source_index: source_index.into(),
69+
src_line: loc.line.into(),
70+
src_column: loc.column.into(),
71+
name_index: None,
72+
};
73+
self.add_segment_to_current_line(segment);
74+
}
75+
7576
let char_utf16_len = char.len_utf16() as u32;
7677
loc.column += char_utf16_len;
7778
self.generated_code_column += char_utf16_len;
@@ -85,9 +86,11 @@ impl Mappings {
8586
if content.is_empty() {
8687
return;
8788
}
88-
let mut lines = content.lines();
89-
// SAFETY: The content at least has one line after checking of `content.is_empty()` .
90-
// `"\n".lines().collect::<Vec<_>>()` would create `[""]`.
89+
let mut lines = content.split('\n');
90+
91+
// SAFETY: In any cases, lines would have at least one element.
92+
// "".split('\n') would create `[""]`.
93+
// "\n".split('\n') would create `["", ""]`.
9194
let last_line = unsafe { lines.next_back().unwrap_unchecked() };
9295
for _ in lines {
9396
self.bump_line();

tests/magic_string_source_map.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,28 @@ fn basic() {
1010
};
1111
s.update_with(1, 2, "v", update_options.clone())
1212
.update_with(3, 4, "d", update_options.clone())
13-
.update_with(input.len() - 4, input.len() - 1, "h1", update_options.clone());
13+
.update_with(
14+
input.len() - 4,
15+
input.len() - 1,
16+
"h1",
17+
update_options.clone(),
18+
);
1419

1520
let sm = s.source_map(SourceMapOptions {
1621
include_content: true,
1722
});
1823

19-
assert_eq!(sm.mappings, "AAAA,CAACA,CAAC,CAACC,CAAC;AACJ;AACA,EAAEC,EAAG")
24+
assert_eq!(
25+
sm.mappings,
26+
"AAAA,CAACA,CAAC,CAACC,CAAC;AACJ;AACA,EAAEC,EAAG"
27+
);
28+
29+
s.prepend("import React from 'react';\n");
30+
let sm = s.source_map(SourceMapOptions {
31+
include_content: true,
32+
});
33+
assert_eq!(
34+
sm.mappings,
35+
";AAAA,CAACA,CAAC,CAACC,CAAC;AACJ;AACA,EAAEC,EAAG"
36+
);
2037
}

0 commit comments

Comments
 (0)