use mago_database::file::File;
use mago_span::HasSpan;
use crate::ast::Program;
use crate::ast::Trivia;
use crate::ast::TriviaKind;
#[inline]
pub fn get_docblock_for_node<'a>(program: &'a Program, file: &File, node: impl HasSpan) -> Option<&'a Trivia> {
get_docblock_before_position(file, program.trivia.as_slice(), node.span().start.offset)
}
pub fn get_docblock_before_position<'a>(
file: &File,
trivias: &'a [Trivia],
node_start_offset: u32,
) -> Option<&'a Trivia> {
let candidate_partition_idx = trivias.partition_point(|trivia| trivia.span.start.offset < node_start_offset);
if candidate_partition_idx == 0 {
return None;
}
for i in (0..candidate_partition_idx).rev() {
let trivia = &trivias[i];
match trivia.kind {
TriviaKind::DocBlockComment => {
let docblock_end_offset = trivia.span().end.offset;
let code_between_slice = file
.contents
.as_bytes()
.get(docblock_end_offset as usize..node_start_offset as usize)
.unwrap_or(&[]);
if code_between_slice.iter().all(|b| b.is_ascii_whitespace()) {
return Some(trivia);
} else {
return None;
}
}
TriviaKind::WhiteSpace => {
continue;
}
_ => {
return None;
}
}
}
None
}