diff options
Diffstat (limited to 'cli/source_maps.rs')
-rw-r--r-- | cli/source_maps.rs | 82 |
1 files changed, 53 insertions, 29 deletions
diff --git a/cli/source_maps.rs b/cli/source_maps.rs index 318665e9d..26ba4ca29 100644 --- a/cli/source_maps.rs +++ b/cli/source_maps.rs @@ -33,14 +33,15 @@ pub fn apply_source_map<G: SourceMapGetter>( // prepareStackTrace(). let mut mappings_map: CachedMaps = HashMap::new(); - let (script_resource_name, line_number, start_column) = + let (script_resource_name, line_number, start_column, source_line) = get_maybe_orig_position( js_error.script_resource_name.clone(), js_error.line_number, // start_column is 0-based, we need 1-based here. js_error.start_column.map(|n| n + 1), + js_error.source_line.clone(), &mut mappings_map, - getter.clone(), + getter, ); let start_column = start_column.map(|n| n - 1); // It is better to just move end_column to be the same distance away from @@ -56,20 +57,6 @@ pub fn apply_source_map<G: SourceMapGetter>( } _ => None, }; - // if there is a source line that we might be different in the source file, we - // will go fetch it from the getter - let source_line = match line_number { - Some(ln) - if js_error.source_line.is_some() && script_resource_name.is_some() => - { - getter.get_source_line( - &js_error.script_resource_name.clone().unwrap(), - // Getter expects 0-based line numbers, but ours are 1-based. - ln as usize - 1, - ) - } - _ => js_error.source_line.clone(), - }; JsError { message: js_error.message.clone(), @@ -87,16 +74,29 @@ fn get_maybe_orig_position<G: SourceMapGetter>( file_name: Option<String>, line_number: Option<i64>, column_number: Option<i64>, + source_line: Option<String>, mappings_map: &mut CachedMaps, getter: Arc<G>, -) -> (Option<String>, Option<i64>, Option<i64>) { +) -> (Option<String>, Option<i64>, Option<i64>, Option<String>) { match (file_name, line_number, column_number) { (Some(file_name_v), Some(line_v), Some(column_v)) => { - let (file_name, line_number, column_number) = - get_orig_position(file_name_v, line_v, column_v, mappings_map, getter); - (Some(file_name), Some(line_number), Some(column_number)) + let (file_name, line_number, column_number, source_line) = + get_orig_position( + file_name_v, + line_v, + column_v, + source_line, + mappings_map, + getter, + ); + ( + Some(file_name), + Some(line_number), + Some(column_number), + source_line, + ) } - _ => (None, None, None), + _ => (None, None, None, source_line), } } @@ -104,11 +104,13 @@ pub fn get_orig_position<G: SourceMapGetter>( file_name: String, line_number: i64, column_number: i64, + source_line: Option<String>, mappings_map: &mut CachedMaps, getter: Arc<G>, -) -> (String, i64, i64) { - let maybe_source_map = get_mappings(&file_name, mappings_map, getter); - let default_pos = (file_name, line_number, column_number); +) -> (String, i64, i64, Option<String>) { + let maybe_source_map = get_mappings(&file_name, mappings_map, getter.clone()); + let default_pos = + (file_name, line_number, column_number, source_line.clone()); // Lookup expects 0-based line and column numbers, but ours are 1-based. let line_number = line_number - 1; @@ -121,11 +123,33 @@ pub fn get_orig_position<G: SourceMapGetter>( None => default_pos, Some(token) => match token.get_source() { None => default_pos, - Some(original) => ( - original.to_string(), - i64::from(token.get_src_line()) + 1, - i64::from(token.get_src_col()) + 1, - ), + Some(original) => { + let maybe_source_line = + if let Some(source_view) = token.get_source_view() { + source_view.get_line(token.get_src_line()) + } else { + None + }; + + let source_line = if let Some(source_line) = maybe_source_line { + Some(source_line.to_string()) + } else if let Some(source_line) = getter.get_source_line( + original, + // Getter expects 0-based line numbers, but ours are 1-based. + token.get_src_line() as usize, + ) { + Some(source_line) + } else { + source_line + }; + + ( + original.to_string(), + i64::from(token.get_src_line()) + 1, + i64::from(token.get_src_col()) + 1, + source_line, + ) + } }, } } |