in crates/llm-ls/src/main.rs [65:122]
fn should_complete(document: &Document, position: Position) -> Result<CompletionType> {
let row = position.line as usize;
let column = position.character as usize;
if document.text.len_chars() == 0 {
warn!("Document is empty");
return Ok(CompletionType::Empty);
}
if let Some(tree) = &document.tree {
let current_node = tree.root_node().descendant_for_point_range(
tree_sitter::Point { row, column },
tree_sitter::Point {
row,
column: column + 1,
},
);
if let Some(node) = current_node {
if node == tree.root_node() {
return Ok(CompletionType::MultiLine);
}
let start = node.start_position();
let end = node.end_position();
let mut start_offset = get_position_idx(&document.text, start.row, start.column)?;
let mut end_offset = get_position_idx(&document.text, end.row, end.column)? - 1;
let start_char = document
.text
.get_char(start_offset.min(document.text.len_chars().saturating_sub(1)))
.ok_or(Error::OutOfBoundIndexing(start_offset))?;
let end_char = document
.text
.get_char(end_offset.min(document.text.len_chars().saturating_sub(1)))
.ok_or(Error::OutOfBoundIndexing(end_offset))?;
if !start_char.is_whitespace() {
start_offset += 1;
}
if !end_char.is_whitespace() {
end_offset -= 1;
}
if start_offset >= end_offset {
return Ok(CompletionType::SingleLine);
}
let slice = document
.text
.get_slice(start_offset..end_offset)
.ok_or(Error::OutOfBoundSlice(start_offset, end_offset))?;
if slice.to_string().trim().is_empty() {
return Ok(CompletionType::MultiLine);
}
}
}
let start_idx = document.text.try_line_to_char(row)?;
// XXX: We treat the end of a document as a newline
let next_char = document.text.get_char(start_idx + column).unwrap_or('\n');
if next_char.is_whitespace() {
Ok(CompletionType::SingleLine)
} else {
Ok(CompletionType::Empty)
}
}