fn should_complete()

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)
    }
}