Skip to content

Commit bf16ed5

Browse files
committed
Improve mappings
1 parent 5d1b474 commit bf16ed5

File tree

2 files changed

+79
-57
lines changed

2 files changed

+79
-57
lines changed

src/mappings.rs

Lines changed: 79 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,51 @@ use crate::{chunk::Chunk, locator::Locator, TextSize};
22
#[derive(Debug)]
33

44
pub struct Segment {
5-
// column in the generated code
6-
/// `dst_column` is calculated based on utf-16.
7-
pub dst_column: i64,
8-
pub source_index: i64,
9-
pub src_line: i64,
10-
/// `src_column` is calculated based on utf-16.
11-
pub src_column: i64,
12-
pub name_index: Option<i64>,
5+
/// [dst_column, source_index, src_line, src_column]
6+
/// - `dst_column` is calculated based on utf-16.
7+
/// - `src_column` is calculated based on utf-16.
8+
inner: [i64; 4],
9+
name_index: Option<i64>,
10+
}
11+
12+
impl Segment {
13+
pub fn new(
14+
dst_column: i64,
15+
source_index: i64,
16+
src_line: i64,
17+
src_column: i64,
18+
name_index: Option<i64>,
19+
) -> Self {
20+
Self {
21+
inner: [
22+
dst_column.into(),
23+
source_index.into(),
24+
src_line.into(),
25+
src_column.into(),
26+
],
27+
name_index: name_index.map(|n| n.into()),
28+
}
29+
}
30+
31+
pub fn dst_column(&self) -> i64 {
32+
self.inner[0]
33+
}
34+
35+
pub fn source_index(&self) -> i64 {
36+
self.inner[1]
37+
}
38+
39+
pub fn src_line(&self) -> i64 {
40+
self.inner[2]
41+
}
42+
43+
pub fn src_column(&self) -> i64 {
44+
self.inner[3]
45+
}
46+
47+
pub fn name_index(&self) -> Option<i64> {
48+
self.name_index
49+
}
1350
}
1451

1552
#[derive(Debug)]
@@ -40,13 +77,13 @@ impl Mappings {
4077
let mut loc = locator.locate(chunk.start());
4178
if let Some(edited_content) = &chunk.edited_content {
4279
if !edited_content.is_empty() {
43-
let segment = Segment {
44-
dst_column: self.generated_code_column.into(),
45-
source_index: source_index.into(),
46-
src_line: loc.line.into(),
47-
src_column: loc.column.into(),
48-
name_index: name_index.map(|n| n.into()),
49-
};
80+
let segment = Segment::new(
81+
self.generated_code_column.into(),
82+
source_index.into(),
83+
loc.line.into(),
84+
loc.column.into(),
85+
name_index.map(|n| n.into()),
86+
);
5087
self.add_segment_to_current_line(segment);
5188
}
5289
self.advance(edited_content);
@@ -63,13 +100,13 @@ impl Mappings {
63100
_ => {
64101
if new_line {
65102
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-
};
103+
let segment = Segment::new(
104+
self.generated_code_column.into(),
105+
source_index.into(),
106+
loc.line.into(),
107+
loc.column.into(),
108+
None,
109+
);
73110
self.add_segment_to_current_line(segment);
74111
}
75112

@@ -87,7 +124,7 @@ impl Mappings {
87124
return;
88125
}
89126
let mut lines = content.split('\n');
90-
127+
91128
// SAFETY: In any cases, lines would have at least one element.
92129
// "".split('\n') would create `[""]`.
93130
// "\n".split('\n') would create `["", ""]`.
@@ -111,43 +148,28 @@ impl Mappings {
111148

112149
pub fn encoded(&self) -> String {
113150
let mut encoded_mappings = String::new();
114-
let mut last_segment = Segment {
115-
dst_column: 0,
116-
source_index: 0,
117-
src_line: 0,
118-
src_column: 0,
119-
name_index: None,
120-
};
151+
// [dst_column, source_index, src_line, src_column]
152+
let mut last_segment = [0i64, 0, 0, 0];
153+
let mut last_name_idx = 0i64;
121154
for (line_idx, line) in self.raw.iter().enumerate() {
122-
last_segment.dst_column = 0;
155+
last_segment[0] = 0;
123156
for (segment_idx, segment) in line.iter().enumerate() {
124-
encode_vlq(
125-
segment.dst_column - last_segment.dst_column,
126-
&mut encoded_mappings,
127-
);
128-
encode_vlq(
129-
segment.source_index - last_segment.source_index,
130-
&mut encoded_mappings,
131-
);
132-
encode_vlq(
133-
segment.src_line - last_segment.src_line,
134-
&mut encoded_mappings,
135-
);
136-
encode_vlq(
137-
segment.src_column - last_segment.src_column,
138-
&mut encoded_mappings,
139-
);
140-
last_segment.dst_column = segment.dst_column;
141-
last_segment.source_index = segment.source_index;
142-
last_segment.src_line = segment.src_line;
143-
last_segment.src_column = segment.src_column;
144-
if let Some(name_index) = segment.name_index {
145-
encode_vlq(
146-
name_index - last_segment.name_index.unwrap_or_default(),
147-
&mut encoded_mappings,
148-
);
149-
last_segment.name_index = segment.name_index;
157+
let diff = [
158+
segment.dst_column() - last_segment[0],
159+
segment.source_index() - last_segment[1],
160+
segment.src_line() - last_segment[2],
161+
segment.src_column() - last_segment[3],
162+
];
163+
diff.into_iter().for_each(|diff| {
164+
encode_vlq(diff, &mut encoded_mappings);
165+
});
166+
last_segment = segment.inner;
167+
168+
if let Some(name_index) = segment.name_index() {
169+
encode_vlq(name_index - last_name_idx, &mut encoded_mappings);
170+
last_name_idx = name_index;
150171
}
172+
151173
if segment_idx != line.len() - 1 {
152174
encoded_mappings.push(',');
153175
}
File renamed without changes.

0 commit comments

Comments
 (0)