@@ -2,14 +2,51 @@ use crate::{chunk::Chunk, locator::Locator, TextSize};
2
2
#[ derive( Debug ) ]
3
3
4
4
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
+ }
13
50
}
14
51
15
52
#[ derive( Debug ) ]
@@ -40,13 +77,13 @@ impl Mappings {
40
77
let mut loc = locator. locate ( chunk. start ( ) ) ;
41
78
if let Some ( edited_content) = & chunk. edited_content {
42
79
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
+ ) ;
50
87
self . add_segment_to_current_line ( segment) ;
51
88
}
52
89
self . advance ( edited_content) ;
@@ -63,13 +100,13 @@ impl Mappings {
63
100
_ => {
64
101
if new_line {
65
102
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
+ ) ;
73
110
self . add_segment_to_current_line ( segment) ;
74
111
}
75
112
@@ -87,7 +124,7 @@ impl Mappings {
87
124
return ;
88
125
}
89
126
let mut lines = content. split ( '\n' ) ;
90
-
127
+
91
128
// SAFETY: In any cases, lines would have at least one element.
92
129
// "".split('\n') would create `[""]`.
93
130
// "\n".split('\n') would create `["", ""]`.
@@ -111,43 +148,28 @@ impl Mappings {
111
148
112
149
pub fn encoded ( & self ) -> String {
113
150
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 ;
121
154
for ( line_idx, line) in self . raw . iter ( ) . enumerate ( ) {
122
- last_segment. dst_column = 0 ;
155
+ last_segment[ 0 ] = 0 ;
123
156
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;
150
171
}
172
+
151
173
if segment_idx != line. len ( ) - 1 {
152
174
encoded_mappings. push ( ',' ) ;
153
175
}
0 commit comments