pinel 0.8.0

A lightweight editor built with rust
#![allow(dead_code)]

#[derive(Default, Debug, Clone)]
pub struct CompletionContext {
    pub is_member_access: bool,
    pub is_function_call: bool,
    pub is_namespace_access: bool,
    pub is_type_position: bool,
}

impl CompletionContext {
    pub fn analyze(text: &str, cursor_pos: usize) -> Self {
        let mut context = Self::default();
        let cursor_pos = cursor_pos.min(text.len());

        if cursor_pos == 0 {
            return context;
        }

        let before_cursor = &text[..cursor_pos];
        let after_cursor = &text[cursor_pos..];

        if before_cursor.ends_with('.') || before_cursor.trim_end().ends_with('.') {
            context.is_member_access = true;
        }

        if after_cursor.trim_start().starts_with('(') {
            context.is_function_call = true;
        }

        if before_cursor.ends_with("::") {
            context.is_namespace_access = true;
        }

        if before_cursor.trim_end().ends_with(':') || before_cursor.trim_end().ends_with("->") {
            context.is_type_position = true;
        }

        context
    }

    pub fn should_show_keywords(&self) -> bool {
        !self.is_member_access && !self.is_namespace_access
    }

    pub fn should_boost_types(&self) -> bool {
        self.is_type_position
    }

    pub fn should_show_member(&self) -> bool {
        self.is_member_access || self.is_namespace_access
    }
}