From c033cab79e957fee58e73b98ce46ef82e9a6cb0a Mon Sep 17 00:00:00 2001 From: rvcas Date: Mon, 20 Feb 2023 12:55:00 -0500 Subject: [PATCH] feat(lsp): bring over some stuff for completions, it basically doesn't work right though --- crates/aiken-lsp/src/lib.rs | 17 +++++----- crates/aiken-lsp/src/server.rs | 58 +++++++++++++++++++++++++++++++++ crates/aiken-project/src/lib.rs | 4 +++ 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/crates/aiken-lsp/src/lib.rs b/crates/aiken-lsp/src/lib.rs index 281ccf99..1456f351 100644 --- a/crates/aiken-lsp/src/lib.rs +++ b/crates/aiken-lsp/src/lib.rs @@ -51,14 +51,15 @@ pub fn start() -> Result<(), Error> { fn capabilities() -> lsp_types::ServerCapabilities { lsp_types::ServerCapabilities { - completion_provider: Some(lsp_types::CompletionOptions { - resolve_provider: None, - trigger_characters: Some(vec![".".into(), " ".into()]), - all_commit_characters: None, - work_done_progress_options: lsp_types::WorkDoneProgressOptions { - work_done_progress: None, - }, - }), + // THIS IS STILL WEIRD, ONLY ENABLE IF DEVELOPING + // completion_provider: Some(lsp_types::CompletionOptions { + // resolve_provider: None, + // trigger_characters: Some(vec![".".into(), " ".into()]), + // all_commit_characters: None, + // work_done_progress_options: lsp_types::WorkDoneProgressOptions { + // work_done_progress: None, + // }, + // }), document_formatting_provider: Some(lsp_types::OneOf::Left(true)), definition_provider: Some(lsp_types::OneOf::Left(true)), hover_provider: Some(lsp_types::HoverProviderCapability::Simple(true)), diff --git a/crates/aiken-lsp/src/server.rs b/crates/aiken-lsp/src/server.rs index e06b93e9..d07eaf22 100644 --- a/crates/aiken-lsp/src/server.rs +++ b/crates/aiken-lsp/src/server.rs @@ -261,12 +261,70 @@ impl Server { }) } + Completion::METHOD => { + let params = cast_request::(request).expect("cast Completion"); + + let completions = self.completion(params); + + Ok(lsp_server::Response { + id, + error: None, + result: Some(serde_json::to_value(completions)?), + }) + } + unsupported => Err(ServerError::UnsupportedLspRequest { request: unsupported.to_string(), }), } } + fn completion( + &self, + params: lsp_types::CompletionParams, + ) -> Option> { + let found = self + .node_at_position(¶ms.text_document_position) + .map(|(_, found)| found); + + match found { + // TODO: test + None | Some(Located::Definition(Definition::Use(Use { .. }))) => { + self.completion_for_import() + } + + // TODO: autocompletion for other definitions + Some(Located::Definition(_expression)) => None, + + // TODO: autocompletion for expressions + Some(Located::Expression(_expression)) => None, + } + } + + fn completion_for_import(&self) -> Option> { + let compiler = self.compiler.as_ref()?; + + // TODO: Test + let dependencies_modules = compiler.project.importable_modules(); + + // TODO: Test + let project_modules = compiler.modules.keys().cloned(); + + let modules = dependencies_modules + .into_iter() + .chain(project_modules) + .sorted() + .map(|label| lsp_types::CompletionItem { + label, + kind: None, + documentation: None, + ..Default::default() + }) + .collect(); + + Some(modules) + } + fn goto_definition( &self, params: lsp_types::GotoDefinitionParams, diff --git a/crates/aiken-project/src/lib.rs b/crates/aiken-project/src/lib.rs index bc133b32..fcf6cf21 100644 --- a/crates/aiken-project/src/lib.rs +++ b/crates/aiken-project/src/lib.rs @@ -125,6 +125,10 @@ where self.checked_modules.values().cloned().collect() } + pub fn importable_modules(&self) -> Vec { + self.module_types.keys().cloned().collect() + } + pub fn checkpoint(&self) -> Checkpoint { Checkpoint { module_types: self.module_types.clone(),