Rollup merge of #111560 - m-ou-se:span-char-boundary-stuff, r=cjgillot
Simplify find_width_of_character_at_span. This makes `find_width_of_character_at_span` simpler and more robust against bad spans. Fixes (but does not close, per beta policy) https://github.com/rust-lang/rust/issues/111485
This commit is contained in:
commit
ee914a4ee9
@ -20,6 +20,7 @@
|
||||
#![feature(min_specialization)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(round_char_boundary)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
|
||||
|
@ -1019,36 +1019,19 @@ fn find_width_of_character_at_span(&self, sp: Span, forwards: bool) -> u32 {
|
||||
|
||||
let src = local_begin.sf.external_src.borrow();
|
||||
|
||||
// We need to extend the snippet to the end of the src rather than to end_index so when
|
||||
// searching forwards for boundaries we've got somewhere to search.
|
||||
let snippet = if let Some(ref src) = local_begin.sf.src {
|
||||
&src[start_index..]
|
||||
let snippet = if let Some(src) = &local_begin.sf.src {
|
||||
src
|
||||
} else if let Some(src) = src.get_source() {
|
||||
&src[start_index..]
|
||||
src
|
||||
} else {
|
||||
return 1;
|
||||
};
|
||||
debug!("snippet=`{:?}`", snippet);
|
||||
|
||||
let mut target = if forwards { end_index + 1 } else { end_index - 1 };
|
||||
debug!("initial target=`{:?}`", target);
|
||||
|
||||
while !snippet.is_char_boundary(target - start_index) && target < source_len {
|
||||
target = if forwards {
|
||||
target + 1
|
||||
} else {
|
||||
match target.checked_sub(1) {
|
||||
Some(target) => target,
|
||||
None => {
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
debug!("target=`{:?}`", target);
|
||||
if forwards {
|
||||
(snippet.ceil_char_boundary(end_index + 1) - end_index) as u32
|
||||
} else {
|
||||
(end_index - snippet.floor_char_boundary(end_index - 1)) as u32
|
||||
}
|
||||
debug!("final target=`{:?}`", target);
|
||||
|
||||
if forwards { (target - end_index) as u32 } else { (end_index - target) as u32 }
|
||||
}
|
||||
|
||||
pub fn get_source_file(&self, filename: &FileName) -> Option<Lrc<SourceFile>> {
|
||||
|
Loading…
Reference in New Issue
Block a user