diff --git a/crates/mq-lsp/README.md b/crates/mq-lsp/README.md
index b1c045a4c..4880639e0 100644
--- a/crates/mq-lsp/README.md
+++ b/crates/mq-lsp/README.md
@@ -8,6 +8,7 @@ Language Server Protocol (LSP) implementation for the [mq](https://mqlang.org/)
- ๐งน **Linting**: Optional `mq-lint` diagnostics (correctness, style, complexity, selector, and module rules), toggled with `--enable-lint`
- ๐ก **Code Completion**: Intelligent suggestions for selectors, functions, and variables
- ๐ **Hover Information**: Inline documentation and type information
+- โ๏ธ **Signature Help**: Inline parameter hints while typing a function or macro call
- ๐ฏ **Go To Definition**: Navigate to symbol definitions with a single click
- ๐ **Find References**: Locate all usages of a symbol across your workspace
- ๐๏ธ **Document Symbols**: Outline view of all symbols in the current file
diff --git a/crates/mq-lsp/src/capabilities.rs b/crates/mq-lsp/src/capabilities.rs
index 9b208b03a..8c930c36c 100644
--- a/crates/mq-lsp/src/capabilities.rs
+++ b/crates/mq-lsp/src/capabilities.rs
@@ -2,8 +2,8 @@ use tower_lsp_server::ls_types::{
CodeActionKind, CodeActionOptions, CodeActionProviderCapability, CompletionOptions, DocumentFormattingOptions,
DocumentRangeFormattingOptions, ExecuteCommandOptions, HoverProviderCapability, InlayHintOptions,
InlayHintServerCapabilities, OneOf, RenameOptions, SemanticTokensFullOptions, SemanticTokensLegend,
- SemanticTokensOptions, SemanticTokensServerCapabilities, ServerCapabilities, TextDocumentSyncCapability,
- TextDocumentSyncKind,
+ SemanticTokensOptions, SemanticTokensServerCapabilities, ServerCapabilities, SignatureHelpOptions,
+ TextDocumentSyncCapability, TextDocumentSyncKind,
};
use crate::semantic_tokens;
@@ -12,6 +12,11 @@ pub(crate) fn server_capabilities() -> ServerCapabilities {
ServerCapabilities {
text_document_sync: Some(TextDocumentSyncCapability::Kind(TextDocumentSyncKind::FULL)),
hover_provider: Some(HoverProviderCapability::Simple(true)),
+ signature_help_provider: Some(SignatureHelpOptions {
+ trigger_characters: Some(vec!["(".to_string(), ",".to_string()]),
+ retrigger_characters: None,
+ work_done_progress_options: Default::default(),
+ }),
completion_provider: Some(CompletionOptions {
trigger_characters: Some(vec!["|".to_string(), ":".to_string(), ".".to_string()]),
..Default::default()
diff --git a/crates/mq-lsp/src/lib.rs b/crates/mq-lsp/src/lib.rs
index 29b0c5583..1dbb46320 100644
--- a/crates/mq-lsp/src/lib.rs
+++ b/crates/mq-lsp/src/lib.rs
@@ -31,6 +31,7 @@ pub mod references;
pub mod rename;
pub mod semantic_tokens;
pub mod server;
+pub mod signature_help;
pub mod workspace_symbol;
pub use server::start;
diff --git a/crates/mq-lsp/src/main.rs b/crates/mq-lsp/src/main.rs
index b9af6332a..37999f70a 100644
--- a/crates/mq-lsp/src/main.rs
+++ b/crates/mq-lsp/src/main.rs
@@ -17,6 +17,7 @@ pub mod references;
pub mod rename;
pub mod semantic_tokens;
pub mod server;
+pub mod signature_help;
pub mod workspace_symbol;
#[derive(Parser, Debug)]
diff --git a/crates/mq-lsp/src/server.rs b/crates/mq-lsp/src/server.rs
index dd97e697a..0eda29e5c 100644
--- a/crates/mq-lsp/src/server.rs
+++ b/crates/mq-lsp/src/server.rs
@@ -11,7 +11,7 @@ use url::Url;
use crate::error::LspError;
use crate::{
capabilities, code_action, completions, document_symbol, execute_command, goto_definition, hover, inlay_hints,
- references, rename, semantic_tokens, workspace_symbol,
+ references, rename, semantic_tokens, signature_help, workspace_symbol,
};
use tower_lsp_server::{Client, LanguageServer, LspService, Server, jsonrpc, ls_types};
@@ -172,6 +172,22 @@ impl LanguageServer for Backend {
Ok(hover::response(Arc::clone(&self.hir), to_url(&url), type_env, position))
}
+ async fn signature_help(
+ &self,
+ params: ls_types::SignatureHelpParams,
+ ) -> jsonrpc::Result