Keyword injection
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
pub mod rust_analyzer;
|
pub mod rust_analyzer;
|
||||||
pub mod transpiler;
|
pub mod transpiler;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::path::{Component, Path, PathBuf};
|
use std::path::{Component, Path, PathBuf};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::atomic::{AtomicU64, Ordering};
|
use std::sync::atomic::{AtomicU64, Ordering};
|
||||||
@@ -19,6 +19,42 @@ use crate::transpiler::transpile_mist;
|
|||||||
|
|
||||||
static MARKER_COUNTER: AtomicU64 = AtomicU64::new(0);
|
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<Item = CompletionItem> {
|
||||||
|
KEYWORDS.into_iter().map(|kw| CompletionItem {
|
||||||
|
label: kw.to_string(),
|
||||||
|
kind: Some(CompletionItemKind::KEYWORD),
|
||||||
|
insert_text: Some(kw.to_string()),
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Backend {
|
struct Backend {
|
||||||
client: Client,
|
client: Client,
|
||||||
@@ -793,17 +829,35 @@ impl LanguageServer for Backend {
|
|||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(Some(CompletionResponse::Array(items))) => {
|
Ok(Some(CompletionResponse::Array(items))) => {
|
||||||
let cleaned: Vec<CompletionItem> =
|
let mut cleaned: Vec<CompletionItem> =
|
||||||
items.into_iter().map(clean_completion_item).collect();
|
items.into_iter().map(clean_completion_item).collect();
|
||||||
|
|
||||||
|
let existing: HashSet<String> =
|
||||||
|
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::Array(cleaned)))
|
||||||
}
|
}
|
||||||
Ok(Some(CompletionResponse::List(list))) => {
|
|
||||||
let cleaned: Vec<CompletionItem> =
|
Ok(Some(CompletionResponse::List(mut list))) => {
|
||||||
|
let mut cleaned: Vec<CompletionItem> =
|
||||||
list.items.into_iter().map(clean_completion_item).collect();
|
list.items.into_iter().map(clean_completion_item).collect();
|
||||||
Ok(Some(CompletionResponse::List(CompletionList {
|
|
||||||
is_incomplete: list.is_incomplete,
|
let existing: HashSet<String> =
|
||||||
items: cleaned,
|
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),
|
Ok(None) => Ok(None),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user