pub mod call_hierarchy;
mod code_action;
mod completion;
mod configuration;
mod definition;
pub mod diagnostic;
mod document_highlight;
mod document_link;
mod document_symbol;
mod folding_range;
mod format;
mod formatting;
pub mod hover;
pub mod implementation;
mod initialized;
mod inlay_hint;
mod notification_handler;
pub mod references;
mod rename;
mod request_handler;
mod response_handler;
mod selection_range;
mod semantic_token;
mod signature_help;
mod switch_source_header;
mod text_document;
mod type_definition;
mod workspace_symbol;
use crate::context::ServerContextSnapshot;
pub use initialized::{ClientConfig, initialized_handler, start_analysis};
use lsp_types::{ClientCapabilities, ServerCapabilities};
pub use notification_handler::on_notification_handler;
pub use request_handler::on_request_handler;
pub use response_handler::on_response_handler;
pub use text_document::register_files_watch;
pub use text_document::{
process_did_change_text_document, process_did_change_watched_files, process_did_close_document,
process_did_open_text_document, process_did_save_text_document,
};
pub async fn read_the_modules(
context: &ServerContextSnapshot,
path: &std::path::Path,
caught_up: bool,
) {
if !caught_up {
context.analysis().catch_up(path).await;
}
let nothing_to_read = context
.analysis()
.with_snapshot(|session| {
!session.needs_catching_up(path)
&& !session.imports_a_module_that_is_not_read(path)
&& !session.a_module_unit_is_waiting_for_its_program()
})
.unwrap_or(false);
if nothing_to_read {
return;
}
let read = path.to_path_buf();
context
.analysis()
.update_session("a request queued the modules", move |session| {
session.queue_the_modules_a_file_imports(&read)
})
.await;
context.analysis().wake();
}
pub trait RegisterCapabilities {
fn register_capabilities(
server_capabilities: &mut ServerCapabilities,
client_capabilities: &ClientCapabilities,
);
}
macro_rules! capabilities {
(modules: {
$($module:ident => $capability:ident),* $(,)?
}) => {
pub fn server_capabilities(client_capabilities: &ClientCapabilities) -> ServerCapabilities {
let mut server_capabilities = ServerCapabilities::default();
$(
$module::$capability::register_capabilities(&mut server_capabilities, client_capabilities);
)*
server_capabilities
}
};
}
capabilities!(modules: {
text_document => TextDocumentCapabilities,
definition => DefinitionCapabilities,
hover => HoverCapabilities,
call_hierarchy => CallHierarchyCapabilities,
code_action => CodeActionCapabilities,
completion => CompletionCapabilities,
document_highlight => DocumentHighlightCapabilities,
document_link => DocumentLinkCapabilities,
document_symbol => DocumentSymbolCapabilities,
formatting => FormattingCapabilities,
folding_range => FoldingRangeCapabilities,
implementation => ImplementationCapabilities,
type_definition => TypeDefinitionCapabilities,
inlay_hint => InlayHintCapabilities,
references => ReferencesCapabilities,
rename => RenameCapabilities,
selection_range => SelectionRangeCapabilities,
signature_help => SignatureHelpCapabilities,
semantic_token => SemanticTokenCapabilities,
switch_source_header => SwitchSourceHeaderCapabilities,
workspace_symbol => WorkspaceSymbolCapabilities,
diagnostic => DiagnosticCapabilities,
configuration => ConfigurationCapabilities,
});