]> git.lizzy.rs Git - rust.git/commitdiff
Avoid byte to char position conversions in is_multiline
authorTomasz Miąsko <tomasz.miasko@gmail.com>
Thu, 1 Jul 2021 00:00:00 +0000 (00:00 +0000)
committerTomasz Miąsko <tomasz.miasko@gmail.com>
Thu, 1 Jul 2021 11:30:00 +0000 (13:30 +0200)
Converting a byte position into a char position is currently linear in
the number of multibyte characters in the source code. Avoid it when
checking if a range spans across lines.

This makes it feasible to compile source files with a large number of
multibyte characters.

compiler/rustc_span/src/source_map.rs

index 32031ac70715f9735ceff3b2f759e2824f98bde7..77a3ad931d5717343eef8355a25a6c529ff11793 100644 (file)
@@ -461,9 +461,13 @@ pub fn span_to_filename(&self, sp: Span) -> FileName {
     }
 
     pub fn is_multiline(&self, sp: Span) -> bool {
     }
 
     pub fn is_multiline(&self, sp: Span) -> bool {
-        let lo = self.lookup_char_pos(sp.lo());
-        let hi = self.lookup_char_pos(sp.hi());
-        lo.line != hi.line
+        let lo = self.lookup_source_file_idx(sp.lo());
+        let hi = self.lookup_source_file_idx(sp.hi());
+        if lo != hi {
+            return true;
+        }
+        let f = (*self.files.borrow().source_files)[lo].clone();
+        f.lookup_line(sp.lo()) != f.lookup_line(sp.hi())
     }
 
     pub fn is_valid_span(&self, sp: Span) -> Result<(Loc, Loc), SpanLinesError> {
     }
 
     pub fn is_valid_span(&self, sp: Span) -> Result<(Loc, Loc), SpanLinesError> {