Add comment to the push_trailing function

This commit is contained in:
allaboutevemirolive 2023-08-24 17:09:14 -04:00
parent b60e31b673
commit a8827eea27

View File

@ -197,8 +197,14 @@ pub fn splice_lines(
use rustc_span::{CharPos, Pos}; use rustc_span::{CharPos, Pos};
/// Append to a buffer the remainder of the line of existing source code, and return the /// Extracts a substring from the provided `line_opt` based on the specified low and high indices,
/// count of lines that have been added for accurate highlighting. /// appends it to the given buffer `buf`, and returns the count of newline characters in the substring
/// for accurate highlighting.
/// If `line_opt` is `None`, a newline character is appended to the buffer, and 0 is returned.
///
/// ## Returns
///
/// The count of newline characters in the extracted substring.
fn push_trailing( fn push_trailing(
buf: &mut String, buf: &mut String,
line_opt: Option<&Cow<'_, str>>, line_opt: Option<&Cow<'_, str>>,
@ -206,22 +212,30 @@ fn push_trailing(
hi_opt: Option<&Loc>, hi_opt: Option<&Loc>,
) -> usize { ) -> usize {
let mut line_count = 0; let mut line_count = 0;
// Convert CharPos to Usize, as CharPose is character offset
// Extract low index and high index
let (lo, hi_opt) = (lo.col.to_usize(), hi_opt.map(|hi| hi.col.to_usize())); let (lo, hi_opt) = (lo.col.to_usize(), hi_opt.map(|hi| hi.col.to_usize()));
if let Some(line) = line_opt { if let Some(line) = line_opt {
if let Some(lo) = line.char_indices().map(|(i, _)| i).nth(lo) { if let Some(lo) = line.char_indices().map(|(i, _)| i).nth(lo) {
// Get high index while account for rare unicode and emoji with char_indices
let hi_opt = hi_opt.and_then(|hi| line.char_indices().map(|(i, _)| i).nth(hi)); let hi_opt = hi_opt.and_then(|hi| line.char_indices().map(|(i, _)| i).nth(hi));
match hi_opt { match hi_opt {
// If high index exist, take string from low to high index
Some(hi) if hi > lo => { Some(hi) if hi > lo => {
// count how many '\n' exist
line_count = line[lo..hi].matches('\n').count(); line_count = line[lo..hi].matches('\n').count();
buf.push_str(&line[lo..hi]) buf.push_str(&line[lo..hi])
} }
Some(_) => (), Some(_) => (),
// If high index absence, take string from low index till end string.len
None => { None => {
// count how many '\n' exist
line_count = line[lo..].matches('\n').count(); line_count = line[lo..].matches('\n').count();
buf.push_str(&line[lo..]) buf.push_str(&line[lo..])
} }
} }
} }
// If high index is None
if hi_opt.is_none() { if hi_opt.is_none() {
buf.push('\n'); buf.push('\n');
} }