diff --git a/src/cargo/ops/fix.rs b/src/cargo/ops/fix.rs index 5bb912f07a4..843e01a8afc 100644 --- a/src/cargo/ops/fix.rs +++ b/src/cargo/ops/fix.rs @@ -400,21 +400,21 @@ fn rustfix_and_fix( for suggestion in suggestions { trace!("suggestion"); // Make sure we've got a file associated with this suggestion and all - // snippets point to the same location. Right now it's not clear what - // we would do with multiple locations. - let (file_name, range) = match suggestion.snippets.get(0) { - Some(s) => (s.file_name.clone(), s.line_range), - None => { - trace!("rejecting as it has no snippets {:?}", suggestion); - continue; - } + // snippets point to the same file. Right now it's not clear what + // we would do with multiple files. + let file_names = suggestion.solutions.iter() + .flat_map(|s| s.replacements.iter()) + .map(|r| &r.snippet.file_name); + + let file_name = if let Some(file_name) = file_names.clone().next() { + file_name.clone() + } else { + trace!("rejecting as it has no solutions {:?}", suggestion); + continue; }; - if !suggestion - .snippets - .iter() - .all(|s| s.file_name == file_name && s.line_range == range) - { - trace!("rejecting as it spans multiple files {:?}", suggestion); + + if !file_names.clone().all(|f| f == &file_name) { + trace!("rejecting as it changes multiple files: {:?}", suggestion); continue; }