@@ -15,6 +15,7 @@ use crate::sourceview::SourceView;
15
15
use crate :: utils:: { find_common_prefix, greatest_lower_bound} ;
16
16
17
17
use debugid:: DebugId ;
18
+ use rustc_hash:: FxHashMap ;
18
19
19
20
/// Controls the `SourceMap::rewrite` behavior
20
21
///
@@ -1228,27 +1229,59 @@ impl SourceMapIndex {
1228
1229
}
1229
1230
} ;
1230
1231
1232
+ let mut src_id_map = FxHashMap :: < u32 , u32 > :: default ( ) ;
1233
+
1234
+ for ( original_id, ( source, contents) ) in
1235
+ map. sources ( ) . zip ( map. source_contents ( ) ) . enumerate ( )
1236
+ {
1237
+ let src_id = builder. add_source ( source) ;
1238
+
1239
+ src_id_map. insert ( original_id as u32 , src_id) ;
1240
+
1241
+ if let Some ( contents) = contents {
1242
+ builder. set_source_contents ( src_id, Some ( contents) ) ;
1243
+ }
1244
+ }
1245
+
1246
+ let mut name_id_map = FxHashMap :: < u32 , u32 > :: default ( ) ;
1247
+
1248
+ for ( original_id, name) in map. names ( ) . enumerate ( ) {
1249
+ let name_id = builder. add_name ( name) ;
1250
+ name_id_map. insert ( original_id as u32 , name_id) ;
1251
+ }
1252
+
1231
1253
for token in map. tokens ( ) {
1232
1254
let dst_col = if token. get_dst_line ( ) == 0 {
1233
1255
token. get_dst_col ( ) + off_col
1234
1256
} else {
1235
1257
token. get_dst_col ( )
1236
1258
} ;
1237
- let raw = builder. add (
1259
+
1260
+ // Use u32 -> u32 map instead of using the hash map in SourceMapBuilder for better performance
1261
+ let original_src_id = token. raw . src_id ;
1262
+ let src_id = if original_src_id == !0 {
1263
+ None
1264
+ } else {
1265
+ src_id_map. get ( & original_src_id) . copied ( )
1266
+ } ;
1267
+
1268
+ let original_name_id = token. raw . name_id ;
1269
+ let name_id = if original_name_id == !0 {
1270
+ None
1271
+ } else {
1272
+ name_id_map. get ( & original_name_id) . copied ( )
1273
+ } ;
1274
+
1275
+ let raw = builder. add_raw (
1238
1276
token. get_dst_line ( ) + off_line,
1239
1277
dst_col,
1240
1278
token. get_src_line ( ) ,
1241
1279
token. get_src_col ( ) ,
1242
- token . get_source ( ) ,
1243
- token . get_name ( ) ,
1280
+ src_id ,
1281
+ name_id ,
1244
1282
token. is_range ( ) ,
1245
1283
) ;
1246
- if token. get_source ( ) . is_some ( ) && !builder. has_source_contents ( raw. src_id ) {
1247
- builder. set_source_contents (
1248
- raw. src_id ,
1249
- map. get_source_contents ( token. get_src_id ( ) ) ,
1250
- ) ;
1251
- }
1284
+
1252
1285
if map. ignore_list . contains ( & token. get_src_id ( ) ) {
1253
1286
builder. add_to_ignore_list ( raw. src_id ) ;
1254
1287
}
0 commit comments