Skip to content

Commit

Permalink
feat: add snippet completions
Browse files Browse the repository at this point in the history
  • Loading branch information
viddrobnic committed Oct 8, 2024
1 parent 21ba624 commit 5204f01
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 0 deletions.
20 changes: 20 additions & 0 deletions language_server/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use std::{
};

use analyze::{analyze, document_info::DocumentInfo};
use completion::CompletionList;
use diagnostics::{Diagnostic, DiagnosticSeverity, PublishDiagnosticsParams};
use document_symbol::{DocumentSymbol, DocumentSymbolParams};
use error::{Error, ErrorKind};
Expand All @@ -15,12 +16,14 @@ use message::{initialize::*, *};
use parser::position::PositionOrdering;
use reference::ReferenceParams;
use runtime::compiler;
use snippet::extend_completions;
use text::*;

pub mod error;

mod analyze;
mod message;
mod snippet;

#[derive(Clone, Copy)]
#[allow(dead_code)]
Expand Down Expand Up @@ -280,6 +283,22 @@ impl Server {
Response::new_ok(req_id, res)
}

"textDocument/completion" => {
let (req_id, params) = req.extract::<TextDocumentPositionParams>()?;

self.log(LogLevel::Debug, &format!("Params: {:?}", params));

let mut completions = vec![];
extend_completions(&mut completions);

let res = CompletionList {
is_incomplete: false,
items: completions,
};

Response::new_ok(req_id, res)
}

method => {
self.log(LogLevel::Warn, &format!("Got unknown method: {method}"));
Response::new_err(
Expand Down Expand Up @@ -309,6 +328,7 @@ impl Server {
references_provider: true,
hover_provider: true,
document_symbol_provider: true,
completion_provider: CompletionOptions {},
},
}
}
Expand Down
60 changes: 60 additions & 0 deletions language_server/src/message/completion.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CompletionList {
pub is_incomplete: bool,
pub items: Vec<CompletionItem>,
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CompletionItem {
pub label: String,

#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<i32>,

#[serde(skip_serializing_if = "Option::is_none")]
pub insert_text: Option<String>,

#[serde(skip_serializing_if = "Option::is_none")]
pub insert_text_format: Option<i32>,
}

#[derive(Clone, Copy, Debug)]
#[allow(dead_code)]
pub enum CompletionItemKind {
Text = 1,
Method = 2,
Function = 3,
Constructor = 4,
Field = 5,
Variable = 6,
Class = 7,
Interface = 8,
Module = 9,
Property = 10,
Unit = 11,
Value = 12,
Enum = 13,
Keyword = 14,
Snippet = 15,
Color = 16,
File = 17,
Reference = 18,
Folder = 19,
EnumMember = 20,
Constant = 21,
Struct = 22,
Event = 23,
Operator = 24,
TypeParameter = 25,
}

#[derive(Clone, Copy, Debug)]
#[allow(dead_code)]
pub enum InsertTextFormat {
PlainText = 1,
Snippet = 2,
}
4 changes: 4 additions & 0 deletions language_server/src/message/initialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ pub struct ServerCapabilities {
pub references_provider: bool,
pub hover_provider: bool,
pub document_symbol_provider: bool,
pub completion_provider: CompletionOptions,
}

#[derive(Debug, Serialize, Deserialize)]
Expand All @@ -39,6 +40,9 @@ pub struct TextDocumentSyncOptions {
pub change: u8,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct CompletionOptions {}

#[derive(Debug)]
#[allow(dead_code)]
pub enum TextDocumentSyncKind {
Expand Down
1 change: 1 addition & 0 deletions language_server/src/message/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use serde_json::Value;

use crate::error::{Error, ErrorKind};

pub mod completion;
pub mod diagnostics;
pub mod document_symbol;
pub mod hover;
Expand Down
31 changes: 31 additions & 0 deletions language_server/src/snippet.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
use crate::completion::{CompletionItem, CompletionItemKind, InsertTextFormat};

pub fn extend_completions(completions: &mut Vec<CompletionItem>) {
completions.push(CompletionItem {
label: "for".to_string(),
kind: Some(CompletionItemKind::Snippet as i32),
insert_text: Some("for ($1; $2; $3) {\n $4\n}$0".to_string()),
insert_text_format: Some(InsertTextFormat::Snippet as i32),
});

completions.push(CompletionItem {
label: "if".to_string(),
kind: Some(CompletionItemKind::Snippet as i32),
insert_text: Some("if ($1) {\n $2\n}$0".to_string()),
insert_text_format: Some(InsertTextFormat::Snippet as i32),
});

completions.push(CompletionItem {
label: "ifelse".to_string(),
kind: Some(CompletionItemKind::Snippet as i32),
insert_text: Some("if ($1) {\n $2\n} else {\n $3\n}$0".to_string()),
insert_text_format: Some(InsertTextFormat::Snippet as i32),
});

completions.push(CompletionItem {
label: "while".to_string(),
kind: Some(CompletionItemKind::Snippet as i32),
insert_text: Some("while ($1) {\n $2\n}$0".to_string()),
insert_text_format: Some(InsertTextFormat::Snippet as i32),
});
}

0 comments on commit 5204f01

Please sign in to comment.