From 08e2eff4abf04eaa483da2f4802a3c868a011088 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Mon, 22 Jun 2026 01:28:04 +0200 Subject: [PATCH] Keyword injection --- crates/analyzer/src/lib.rs | 70 +++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/crates/analyzer/src/lib.rs b/crates/analyzer/src/lib.rs index 2370c42..f1b71c4 100644 --- a/crates/analyzer/src/lib.rs +++ b/crates/analyzer/src/lib.rs @@ -1,7 +1,7 @@ pub mod rust_analyzer; pub mod transpiler; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::path::{Component, Path, PathBuf}; use std::sync::Arc; use std::sync::atomic::{AtomicU64, Ordering}; @@ -19,6 +19,42 @@ use crate::transpiler::transpile_mist; static MARKER_COUNTER: AtomicU64 = AtomicU64::new(0); +const KEYWORDS: [&'static str; 24] = [ + "if", + "else", + "for", + "while", + "match", + "return", + "break", + "continue", + "struct", + "enum", + "class", + "trait", + "impl", + "pub", + "mut", + "let", + "true", + "false", + "dyn", + "loop", + "fn", + "unsafe", + "override", + "module" +]; + +fn keyword_completion_items() -> impl Iterator { + KEYWORDS.into_iter().map(|kw| CompletionItem { + label: kw.to_string(), + kind: Some(CompletionItemKind::KEYWORD), + insert_text: Some(kw.to_string()), + ..Default::default() + }) +} + #[derive(Debug)] struct Backend { client: Client, @@ -793,17 +829,35 @@ impl LanguageServer for Backend { .await { Ok(Some(CompletionResponse::Array(items))) => { - let cleaned: Vec = + let mut cleaned: Vec = items.into_iter().map(clean_completion_item).collect(); + + let existing: HashSet = + cleaned.iter().map(|item| item.label.clone()).collect(); + + cleaned.extend( + keyword_completion_items() + .filter(|item| !existing.contains(&item.label)), + ); + Ok(Some(CompletionResponse::Array(cleaned))) } - Ok(Some(CompletionResponse::List(list))) => { - let cleaned: Vec = + + Ok(Some(CompletionResponse::List(mut list))) => { + let mut cleaned: Vec = list.items.into_iter().map(clean_completion_item).collect(); - Ok(Some(CompletionResponse::List(CompletionList { - is_incomplete: list.is_incomplete, - items: cleaned, - }))) + + let existing: HashSet = + cleaned.iter().map(|item| item.label.clone()).collect(); + + cleaned.extend( + keyword_completion_items() + .filter(|item| !existing.contains(&item.label)), + ); + + list.items = cleaned; + + Ok(Some(CompletionResponse::List(list))) } Ok(None) => Ok(None), Err(e) => {