Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
Merge pull request #34 from Sarrus1/feat/completion-resolver
Browse files Browse the repository at this point in the history
feat: improve completions features
  • Loading branch information
Sarrus1 authored Jul 7, 2023
2 parents 2543c3f + f0692f2 commit 41b67c5
Show file tree
Hide file tree
Showing 18 changed files with 607 additions and 428 deletions.
577 changes: 275 additions & 302 deletions Cargo.lock

Large diffs are not rendered by default.

24 changes: 22 additions & 2 deletions src/providers/completion.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use lsp_types::{CompletionList, CompletionParams};
use lsp_types::{CompletionItem, CompletionList, CompletionParams};
use sourcepawn_lexer::{SourcepawnLexer, TokenKind};

use crate::{
Expand All @@ -22,7 +22,9 @@ mod getters;
mod include;
mod matchtoken;

pub fn provide_completions(request: FeatureRequest<CompletionParams>) -> Option<CompletionList> {
pub(crate) fn provide_completions(
request: FeatureRequest<CompletionParams>,
) -> Option<CompletionList> {
log::debug!("Providing completions with request: {:#?}", request.params);
let document = request.store.get(&request.uri)?;
let all_items = request.store.get_all_items(false);
Expand Down Expand Up @@ -104,3 +106,21 @@ pub fn provide_completions(request: FeatureRequest<CompletionParams>) -> Option<

None
}

pub(crate) fn resolve_completion_item(
request: FeatureRequest<CompletionItem>,
) -> Option<CompletionItem> {
let mut completion_item = request.params.clone();

if let Some(sp_item) = request
.store
.get_item_from_key(request.params.data?.to_string().replace('"', ""))
{
let sp_item = &*sp_item.read().unwrap();
completion_item.detail = Some(sp_item.formatted_text());
completion_item.documentation = Some(sp_item.documentation());
return Some(completion_item);
}

None
}
14 changes: 9 additions & 5 deletions src/server/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ use crossbeam_channel::{Receiver, Sender};
use fxhash::FxHashMap;
use lsp_server::{Connection, Message};
use lsp_types::{
CallHierarchyServerCapability, CompletionOptions, HoverProviderCapability, InitializeParams,
OneOf, SemanticTokenModifier, SemanticTokenType, SemanticTokensFullOptions,
SemanticTokensLegend, SemanticTokensOptions, SemanticTokensServerCapabilities,
ServerCapabilities, SignatureHelpOptions, TextDocumentSyncCapability, TextDocumentSyncKind,
Url, WorkDoneProgressOptions,
CallHierarchyServerCapability, CompletionOptions, CompletionOptionsCompletionItem,
HoverProviderCapability, InitializeParams, OneOf, SemanticTokenModifier, SemanticTokenType,
SemanticTokensFullOptions, SemanticTokensLegend, SemanticTokensOptions,
SemanticTokensServerCapabilities, ServerCapabilities, SignatureHelpOptions,
TextDocumentSyncCapability, TextDocumentSyncKind, Url, WorkDoneProgressOptions,
};

use threadpool::ThreadPool;
Expand Down Expand Up @@ -83,6 +83,10 @@ impl Server {
"$".to_string(),
"*".to_string(),
]),
resolve_provider: Some(true),
completion_item: Some(CompletionOptionsCompletionItem {
label_details_support: Some(true),
}),
..Default::default()
}),
hover_provider: Some(HoverProviderCapability::Simple(true)),
Expand Down
3 changes: 2 additions & 1 deletion src/server/requests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use lsp_types::{
request::{
CallHierarchyIncomingCalls, CallHierarchyOutgoingCalls, CallHierarchyPrepare, Completion,
DocumentSymbolRequest, GotoDefinition, HoverRequest, References, Rename,
SemanticTokensFullRequest, SignatureHelpRequest,
ResolveCompletionItem, SemanticTokensFullRequest, SignatureHelpRequest,
},
Url,
};
Expand All @@ -34,6 +34,7 @@ impl Server {
}
if let Some(response) = dispatch::RequestDispatcher::new(request)
.on::<Completion, _>(|id, params| self.completion(id, params))?
.on::<ResolveCompletionItem, _>(|id, params| self.resolve_completion_item(id, params))?
.on::<HoverRequest, _>(|id, params| self.hover(id, params))?
.on::<GotoDefinition, _>(|id, params| self.definition(id, params))?
.on::<SemanticTokensFullRequest, _>(|id, params| self.semantic_tokens(id, params))?
Expand Down
17 changes: 16 additions & 1 deletion src/server/requests/completion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::utils;
use std::sync::Arc;

use lsp_server::RequestId;
use lsp_types::CompletionParams;
use lsp_types::{CompletionItem, CompletionParams, Url};

use crate::{providers, Server};

Expand All @@ -20,4 +20,19 @@ impl Server {

Ok(())
}

pub(super) fn resolve_completion_item(
&mut self,
id: RequestId,
params: CompletionItem,
) -> anyhow::Result<()> {
self.handle_feature_request(
id,
params,
Arc::new(Url::parse("https://example.com").unwrap()), // TODO: Better alternative to this.
providers::completion::resolve_completion_item,
)?;

Ok(())
}
}
28 changes: 16 additions & 12 deletions src/spitem/define_item.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use std::sync::Arc;

use lsp_types::{
CompletionItem, CompletionItemKind, CompletionItemTag, CompletionParams, DocumentSymbol,
GotoDefinitionParams, Hover, HoverContents, HoverParams, LanguageString, LocationLink,
MarkedString, Range, SymbolKind, SymbolTag, Url,
CompletionItem, CompletionItemKind, CompletionItemLabelDetails, CompletionItemTag,
CompletionParams, DocumentSymbol, GotoDefinitionParams, Hover, HoverContents, HoverParams,
LanguageString, LocationLink, MarkedString, Range, SymbolKind, SymbolTag, Url,
};

use crate::{providers::hover::description::Description, utils::uri_to_file_name};
Expand Down Expand Up @@ -57,7 +57,11 @@ impl DefineItem {
label: self.name.to_string(),
kind: Some(CompletionItemKind::CONSTANT),
tags: Some(tags),
detail: uri_to_file_name(&self.uri),
label_details: Some(CompletionItemLabelDetails {
detail: None,
description: uri_to_file_name(&self.uri),
}),
data: Some(serde_json::Value::String(self.key())),
..Default::default()
})
}
Expand All @@ -70,7 +74,10 @@ impl DefineItem {
pub(crate) fn to_hover(&self, _params: &HoverParams) -> Option<Hover> {
Some(Hover {
contents: HoverContents::Array(vec![
self.formatted_text(),
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value: self.formatted_text(),
}),
MarkedString::String(self.description.to_md()),
]),
range: None,
Expand Down Expand Up @@ -120,12 +127,9 @@ impl DefineItem {
/// # Exemple
///
/// `#define FOO 1`
fn formatted_text(&self) -> MarkedString {
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value: format!("#define {} {}", self.name, self.value)
.trim()
.to_string(),
})
pub(crate) fn formatted_text(&self) -> String {
format!("#define {} {}", self.name, self.value)
.trim()
.to_string()
}
}
28 changes: 18 additions & 10 deletions src/spitem/enum_item.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use std::sync::{Arc, RwLock};

use lsp_types::{
CompletionItem, CompletionItemKind, CompletionParams, DocumentSymbol, GotoDefinitionParams,
Hover, HoverContents, HoverParams, LanguageString, LocationLink, MarkedString, Range,
SymbolKind, SymbolTag, Url,
CompletionItem, CompletionItemKind, CompletionItemLabelDetails, CompletionParams,
DocumentSymbol, GotoDefinitionParams, Hover, HoverContents, HoverParams, LanguageString,
LocationLink, MarkedString, Range, SymbolKind, SymbolTag, Url,
};

use super::{Location, SPItem};
Expand Down Expand Up @@ -57,7 +57,15 @@ impl EnumItem {
res.push(CompletionItem {
label: self.name.to_string(),
kind: Some(CompletionItemKind::ENUM),
detail: uri_to_file_name(&self.uri),
label_details: Some(CompletionItemLabelDetails {
detail: None,
description: if *self.uri != params.text_document_position.text_document.uri {
uri_to_file_name(&self.uri)
} else {
None
},
}),
data: Some(serde_json::Value::String(self.key())),
..Default::default()
})
}
Expand All @@ -77,7 +85,10 @@ impl EnumItem {
pub(crate) fn to_hover(&self, _params: &HoverParams) -> Option<Hover> {
Some(Hover {
contents: HoverContents::Array(vec![
self.formatted_text(),
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value: self.formatted_text(),
}),
MarkedString::String(self.description.to_md()),
]),
range: None,
Expand Down Expand Up @@ -132,10 +143,7 @@ impl EnumItem {
/// # Exemple
///
/// `enum Action`
fn formatted_text(&self) -> MarkedString {
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value: format!("enum {}", self.name),
})
pub(crate) fn formatted_text(&self) -> String {
format!("enum {}", self.name)
}
}
34 changes: 25 additions & 9 deletions src/spitem/enum_member_item.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use std::sync::{Arc, RwLock, Weak};

use lsp_types::{
CompletionItem, CompletionItemKind, CompletionItemTag, CompletionParams, DocumentSymbol, Hover,
HoverContents, HoverParams, LanguageString, MarkedString, Range, SymbolKind, SymbolTag, Url,
CompletionItem, CompletionItemKind, CompletionItemLabelDetails, CompletionItemTag,
CompletionParams, DocumentSymbol, Hover, HoverContents, HoverParams, LanguageString,
MarkedString, Range, SymbolKind, SymbolTag, Url,
};
use lsp_types::{GotoDefinitionParams, LocationLink};

Expand Down Expand Up @@ -52,7 +53,22 @@ impl EnumMemberItem {
label: self.name.clone(),
kind: Some(CompletionItemKind::ENUM_MEMBER),
tags: Some(tags),
detail: Some(self.parent.upgrade().unwrap().read().unwrap().name()),
label_details: Some(CompletionItemLabelDetails {
detail: None,
description: {
let name = self.parent.upgrade().unwrap().read().unwrap().name();
if name.starts_with("Enum#") {
None
} else {
Some(format!(
"{}::{}",
self.parent.upgrade().unwrap().read().unwrap().name(),
self.name
))
}
},
}),
data: Some(serde_json::Value::String(self.key())),
..Default::default()
})
}
Expand All @@ -65,7 +81,10 @@ impl EnumMemberItem {
pub(crate) fn to_hover(&self, _params: &HoverParams) -> Option<Hover> {
Some(Hover {
contents: HoverContents::Array(vec![
self.formatted_text(),
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value: self.formatted_text(),
}),
MarkedString::String(self.description.to_md()),
]),
range: None,
Expand Down Expand Up @@ -115,7 +134,7 @@ impl EnumMemberItem {
/// # Exemple
///
/// `Plugin_Continue`
fn formatted_text(&self) -> MarkedString {
pub(crate) fn formatted_text(&self) -> String {
let mut value = "".to_string();
if let SPItem::Enum(parent) = &*self.parent.upgrade().unwrap().read().unwrap() {
if parent.name.contains('#') {
Expand All @@ -124,9 +143,6 @@ impl EnumMemberItem {
value = format!("{}::{}", parent.name, self.name);
}
}
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value,
})
value
}
}
28 changes: 18 additions & 10 deletions src/spitem/enum_struct_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ use std::sync::{Arc, RwLock};

use super::{Location, SPItem};
use lsp_types::{
CompletionItem, CompletionItemKind, CompletionParams, DocumentSymbol, GotoDefinitionParams,
Hover, HoverContents, HoverParams, LanguageString, LocationLink, MarkedString, Range,
SymbolKind, SymbolTag, Url,
CompletionItem, CompletionItemKind, CompletionItemLabelDetails, CompletionParams,
DocumentSymbol, GotoDefinitionParams, Hover, HoverContents, HoverParams, LanguageString,
LocationLink, MarkedString, Range, SymbolKind, SymbolTag, Url,
};

use crate::{providers::hover::description::Description, utils::uri_to_file_name};
Expand Down Expand Up @@ -57,7 +57,15 @@ impl EnumStructItem {
res.push(CompletionItem {
label: self.name.to_string(),
kind: Some(CompletionItemKind::STRUCT),
detail: uri_to_file_name(&self.uri),
label_details: Some(CompletionItemLabelDetails {
detail: None,
description: if *self.uri != params.text_document_position.text_document.uri {
uri_to_file_name(&self.uri)
} else {
None
},
}),
data: Some(serde_json::Value::String(self.key())),
..Default::default()
});

Expand All @@ -76,7 +84,10 @@ impl EnumStructItem {
pub(crate) fn to_hover(&self, _params: &HoverParams) -> Option<Hover> {
Some(Hover {
contents: HoverContents::Array(vec![
self.formatted_text(),
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value: self.formatted_text(),
}),
MarkedString::String(self.description.to_md()),
]),
range: None,
Expand Down Expand Up @@ -131,10 +142,7 @@ impl EnumStructItem {
/// # Exemple
///
/// `enum struct Action`
fn formatted_text(&self) -> MarkedString {
MarkedString::LanguageString(LanguageString {
language: "sourcepawn".to_string(),
value: format!("enum struct {}", self.name),
})
pub(crate) fn formatted_text(&self) -> String {
format!("enum struct {}", self.name)
}
}
Loading

0 comments on commit 41b67c5

Please sign in to comment.