use lsp_types::notification::{
DidChangeWatchedFiles, DidCreateFiles, DidDeleteFiles, DidRenameFiles, Notification,
};
use lsp_types::request::{
CallHierarchyIncomingCalls, CallHierarchyOutgoingCalls, CallHierarchyPrepare,
CodeActionRequest, CodeActionResolveRequest, CodeLensRequest, CodeLensResolve,
ColorPresentationRequest, Completion, DocumentColor, DocumentDiagnosticRequest,
DocumentHighlightRequest, DocumentLinkRequest, DocumentLinkResolve, DocumentSymbolRequest,
FoldingRangeRequest, Formatting, GotoDeclaration, GotoDefinition, GotoImplementation,
GotoTypeDefinition, HoverRequest, InlayHintRequest, InlayHintResolveRequest,
InlineValueRequest, LinkedEditingRange, MonikerRequest, OnTypeFormatting, PrepareRenameRequest,
RangeFormatting, References, Rename, Request, ResolveCompletionItem, SelectionRangeRequest,
SemanticTokensFullDeltaRequest, SemanticTokensFullRequest, SemanticTokensRangeRequest,
SignatureHelpRequest, TypeHierarchyPrepare, TypeHierarchySubtypes, TypeHierarchySupertypes,
WillCreateFiles, WillDeleteFiles, WillRenameFiles, WillSaveWaitUntil,
WorkspaceDiagnosticRequest, WorkspaceSymbolRequest, WorkspaceSymbolResolve,
};
use lsp_types::{
CallHierarchyOptions, CodeActionOptions, CodeLensOptions, ColorProviderOptions,
CompletionOptions, DeclarationOptions, DefinitionOptions, DiagnosticOptions,
DocumentFormattingOptions, DocumentHighlightOptions, DocumentLinkOptions,
DocumentOnTypeFormattingOptions, DocumentRangeFormattingOptions, DocumentSymbolOptions,
FileOperationRegistrationOptions, FoldingProviderOptions, InlayHintOptions, InlineValueOptions,
LinkedEditingRangeOptions, MonikerOptions, ReferencesOptions, RenameOptions,
SelectionRangeOptions, SemanticTokensOptions, SignatureHelpOptions,
StaticTextDocumentRegistrationOptions, TypeHierarchyOptions, WorkspaceSymbolOptions,
};
use crate::capability::CapabilityBuilder;
use crate::error::BuildError;
pub(crate) mod sealed {
use crate::capability::CapabilityBuilder;
use crate::error::BuildError;
#[allow(private_interfaces)]
pub trait Sealed {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError>;
}
}
pub trait FeatureSpec: sealed::Sealed {
type Marker: Request;
}
pub trait NotificationFeatureSpec: sealed::Sealed {
type Marker: Notification;
}
pub struct WillSaveWaitUntilFeature(());
pub fn will_save_wait_until() -> WillSaveWaitUntilFeature {
WillSaveWaitUntilFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for WillSaveWaitUntilFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_will_save_wait_until();
Ok(())
}
}
impl FeatureSpec for WillSaveWaitUntilFeature {
type Marker = WillSaveWaitUntil;
}
pub struct HoverFeature(());
pub fn hover() -> HoverFeature {
HoverFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for HoverFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_hover()
}
}
impl FeatureSpec for HoverFeature {
type Marker = HoverRequest;
}
pub struct SignatureHelpFeature {
options: SignatureHelpOptions,
}
pub fn signature_help(options: SignatureHelpOptions) -> SignatureHelpFeature {
SignatureHelpFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for SignatureHelpFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_signature_help(self.options.clone())
}
}
impl FeatureSpec for SignatureHelpFeature {
type Marker = SignatureHelpRequest;
}
pub struct DeclarationFeature {
options: DeclarationOptions,
}
pub fn declaration(options: DeclarationOptions) -> DeclarationFeature {
DeclarationFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DeclarationFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_declaration(self.options.clone())
}
}
impl FeatureSpec for DeclarationFeature {
type Marker = GotoDeclaration;
}
pub struct DefinitionFeature {
options: DefinitionOptions,
}
pub fn definition(options: DefinitionOptions) -> DefinitionFeature {
DefinitionFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DefinitionFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_definition(self.options.clone())
}
}
impl FeatureSpec for DefinitionFeature {
type Marker = GotoDefinition;
}
pub struct TypeDefinitionFeature {
options: StaticTextDocumentRegistrationOptions,
}
pub fn type_definition(options: StaticTextDocumentRegistrationOptions) -> TypeDefinitionFeature {
TypeDefinitionFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for TypeDefinitionFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_type_definition(self.options.clone())
}
}
impl FeatureSpec for TypeDefinitionFeature {
type Marker = GotoTypeDefinition;
}
pub struct ImplementationFeature {
options: StaticTextDocumentRegistrationOptions,
}
pub fn implementation(options: StaticTextDocumentRegistrationOptions) -> ImplementationFeature {
ImplementationFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for ImplementationFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_implementation(self.options.clone())
}
}
impl FeatureSpec for ImplementationFeature {
type Marker = GotoImplementation;
}
pub struct ReferencesFeature {
options: ReferencesOptions,
}
pub fn references(options: ReferencesOptions) -> ReferencesFeature {
ReferencesFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for ReferencesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_references(self.options.clone())
}
}
impl FeatureSpec for ReferencesFeature {
type Marker = References;
}
pub struct DocumentHighlightFeature {
options: DocumentHighlightOptions,
}
pub fn document_highlight(options: DocumentHighlightOptions) -> DocumentHighlightFeature {
DocumentHighlightFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DocumentHighlightFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_document_highlight(self.options.clone())
}
}
impl FeatureSpec for DocumentHighlightFeature {
type Marker = DocumentHighlightRequest;
}
pub struct DocumentSymbolFeature {
options: DocumentSymbolOptions,
}
pub fn document_symbol(options: DocumentSymbolOptions) -> DocumentSymbolFeature {
DocumentSymbolFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DocumentSymbolFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_document_symbol(self.options.clone())
}
}
impl FeatureSpec for DocumentSymbolFeature {
type Marker = DocumentSymbolRequest;
}
pub struct LinkedEditingRangeFeature {
options: LinkedEditingRangeOptions,
}
pub fn linked_editing_range(options: LinkedEditingRangeOptions) -> LinkedEditingRangeFeature {
LinkedEditingRangeFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for LinkedEditingRangeFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_linked_editing_range(self.options.clone())
}
}
impl FeatureSpec for LinkedEditingRangeFeature {
type Marker = LinkedEditingRange;
}
pub struct MonikerFeature {
options: MonikerOptions,
}
pub fn moniker(options: MonikerOptions) -> MonikerFeature {
MonikerFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for MonikerFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_moniker(self.options.clone())
}
}
impl FeatureSpec for MonikerFeature {
type Marker = MonikerRequest;
}
pub struct DocumentFormattingFeature {
options: DocumentFormattingOptions,
}
pub fn document_formatting(options: DocumentFormattingOptions) -> DocumentFormattingFeature {
DocumentFormattingFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DocumentFormattingFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_document_formatting(self.options.clone())
}
}
impl FeatureSpec for DocumentFormattingFeature {
type Marker = Formatting;
}
pub struct RangeFormattingFeature {
options: DocumentRangeFormattingOptions,
}
pub fn range_formatting(options: DocumentRangeFormattingOptions) -> RangeFormattingFeature {
RangeFormattingFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for RangeFormattingFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_range_formatting(self.options.clone())
}
}
impl FeatureSpec for RangeFormattingFeature {
type Marker = RangeFormatting;
}
pub struct OnTypeFormattingFeature {
options: DocumentOnTypeFormattingOptions,
}
pub fn on_type_formatting(options: DocumentOnTypeFormattingOptions) -> OnTypeFormattingFeature {
OnTypeFormattingFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for OnTypeFormattingFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_on_type_formatting(self.options.clone())
}
}
impl FeatureSpec for OnTypeFormattingFeature {
type Marker = OnTypeFormatting;
}
pub struct DocumentColorFeature {
options: ColorProviderOptions,
}
pub fn document_color(options: ColorProviderOptions) -> DocumentColorFeature {
DocumentColorFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DocumentColorFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_document_color(self.options.clone())
}
}
impl FeatureSpec for DocumentColorFeature {
type Marker = DocumentColor;
}
pub struct ColorPresentationFeature(());
pub fn color_presentation() -> ColorPresentationFeature {
ColorPresentationFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for ColorPresentationFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_color_presentation();
Ok(())
}
}
impl FeatureSpec for ColorPresentationFeature {
type Marker = ColorPresentationRequest;
}
pub struct FoldingRangeFeature {
options: FoldingProviderOptions,
}
pub fn folding_range(options: FoldingProviderOptions) -> FoldingRangeFeature {
FoldingRangeFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for FoldingRangeFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_folding_range(self.options.clone())
}
}
impl FeatureSpec for FoldingRangeFeature {
type Marker = FoldingRangeRequest;
}
pub struct SelectionRangeFeature {
options: SelectionRangeOptions,
}
pub fn selection_range(options: SelectionRangeOptions) -> SelectionRangeFeature {
SelectionRangeFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for SelectionRangeFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_selection_range(self.options.clone())
}
}
impl FeatureSpec for SelectionRangeFeature {
type Marker = SelectionRangeRequest;
}
pub struct InlineValueFeature {
options: InlineValueOptions,
}
pub fn inline_value(options: InlineValueOptions) -> InlineValueFeature {
InlineValueFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for InlineValueFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_inline_value(self.options.clone())
}
}
impl FeatureSpec for InlineValueFeature {
type Marker = InlineValueRequest;
}
pub struct CallHierarchyPrepareFeature {
options: CallHierarchyOptions,
}
pub fn call_hierarchy_prepare(options: CallHierarchyOptions) -> CallHierarchyPrepareFeature {
CallHierarchyPrepareFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for CallHierarchyPrepareFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_call_hierarchy(self.options)
}
}
impl FeatureSpec for CallHierarchyPrepareFeature {
type Marker = CallHierarchyPrepare;
}
pub struct CallHierarchyIncomingCallsFeature(());
pub fn call_hierarchy_incoming_calls() -> CallHierarchyIncomingCallsFeature {
CallHierarchyIncomingCallsFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for CallHierarchyIncomingCallsFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_call_hierarchy_incoming_calls();
Ok(())
}
}
impl FeatureSpec for CallHierarchyIncomingCallsFeature {
type Marker = CallHierarchyIncomingCalls;
}
pub struct CallHierarchyOutgoingCallsFeature(());
pub fn call_hierarchy_outgoing_calls() -> CallHierarchyOutgoingCallsFeature {
CallHierarchyOutgoingCallsFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for CallHierarchyOutgoingCallsFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_call_hierarchy_outgoing_calls();
Ok(())
}
}
impl FeatureSpec for CallHierarchyOutgoingCallsFeature {
type Marker = CallHierarchyOutgoingCalls;
}
pub struct TypeHierarchyPrepareFeature {
options: TypeHierarchyOptions,
}
pub fn type_hierarchy_prepare(options: TypeHierarchyOptions) -> TypeHierarchyPrepareFeature {
TypeHierarchyPrepareFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for TypeHierarchyPrepareFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_type_hierarchy(self.options.clone())
}
}
impl FeatureSpec for TypeHierarchyPrepareFeature {
type Marker = TypeHierarchyPrepare;
}
pub struct TypeHierarchySupertypesFeature(());
pub fn type_hierarchy_supertypes() -> TypeHierarchySupertypesFeature {
TypeHierarchySupertypesFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for TypeHierarchySupertypesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_type_hierarchy_supertypes();
Ok(())
}
}
impl FeatureSpec for TypeHierarchySupertypesFeature {
type Marker = TypeHierarchySupertypes;
}
pub struct TypeHierarchySubtypesFeature(());
pub fn type_hierarchy_subtypes() -> TypeHierarchySubtypesFeature {
TypeHierarchySubtypesFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for TypeHierarchySubtypesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_type_hierarchy_subtypes();
Ok(())
}
}
impl FeatureSpec for TypeHierarchySubtypesFeature {
type Marker = TypeHierarchySubtypes;
}
pub struct SemanticTokensFullFeature {
options: SemanticTokensOptions,
}
pub fn semantic_tokens_full(options: SemanticTokensOptions) -> SemanticTokensFullFeature {
SemanticTokensFullFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for SemanticTokensFullFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_semantic_tokens_full(self.options.clone())
}
}
impl FeatureSpec for SemanticTokensFullFeature {
type Marker = SemanticTokensFullRequest;
}
pub struct SemanticTokensFullDeltaFeature {
options: SemanticTokensOptions,
}
pub fn semantic_tokens_full_delta(
options: SemanticTokensOptions,
) -> SemanticTokensFullDeltaFeature {
SemanticTokensFullDeltaFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for SemanticTokensFullDeltaFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_semantic_tokens_full_delta(self.options.clone())
}
}
impl FeatureSpec for SemanticTokensFullDeltaFeature {
type Marker = SemanticTokensFullDeltaRequest;
}
pub struct SemanticTokensRangeFeature {
options: SemanticTokensOptions,
}
pub fn semantic_tokens_range(options: SemanticTokensOptions) -> SemanticTokensRangeFeature {
SemanticTokensRangeFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for SemanticTokensRangeFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_semantic_tokens_range(self.options.clone())
}
}
impl FeatureSpec for SemanticTokensRangeFeature {
type Marker = SemanticTokensRangeRequest;
}
pub struct CompletionFeature {
options: CompletionOptions,
}
pub fn completion(options: CompletionOptions) -> CompletionFeature {
CompletionFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for CompletionFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_completion(self.options.clone())
}
}
impl FeatureSpec for CompletionFeature {
type Marker = Completion;
}
pub struct CompletionResolveFeature(());
pub fn completion_resolve() -> CompletionResolveFeature {
CompletionResolveFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for CompletionResolveFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_completion_resolve();
Ok(())
}
}
impl FeatureSpec for CompletionResolveFeature {
type Marker = ResolveCompletionItem;
}
pub struct DocumentDiagnosticFeature {
options: DiagnosticOptions,
}
pub fn document_diagnostic(options: DiagnosticOptions) -> DocumentDiagnosticFeature {
DocumentDiagnosticFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DocumentDiagnosticFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_diagnostics(self.options.clone())
}
}
impl FeatureSpec for DocumentDiagnosticFeature {
type Marker = DocumentDiagnosticRequest;
}
pub struct WorkspaceDiagnosticFeature {
options: DiagnosticOptions,
}
pub fn workspace_diagnostic(options: DiagnosticOptions) -> WorkspaceDiagnosticFeature {
WorkspaceDiagnosticFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for WorkspaceDiagnosticFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_diagnostics(self.options.clone())
}
}
impl FeatureSpec for WorkspaceDiagnosticFeature {
type Marker = WorkspaceDiagnosticRequest;
}
pub struct WorkspaceSymbolFeature {
options: WorkspaceSymbolOptions,
}
pub fn workspace_symbol(options: WorkspaceSymbolOptions) -> WorkspaceSymbolFeature {
WorkspaceSymbolFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for WorkspaceSymbolFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_workspace_symbol(self.options.clone())
}
}
impl FeatureSpec for WorkspaceSymbolFeature {
type Marker = WorkspaceSymbolRequest;
}
pub struct WorkspaceSymbolResolveFeature(());
pub fn workspace_symbol_resolve() -> WorkspaceSymbolResolveFeature {
WorkspaceSymbolResolveFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for WorkspaceSymbolResolveFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_workspace_symbol_resolve();
Ok(())
}
}
impl FeatureSpec for WorkspaceSymbolResolveFeature {
type Marker = WorkspaceSymbolResolve;
}
pub struct RenameFeature {
options: RenameOptions,
}
pub fn rename(options: RenameOptions) -> RenameFeature {
RenameFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for RenameFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_rename(self.options.clone())
}
}
impl FeatureSpec for RenameFeature {
type Marker = Rename;
}
pub struct PrepareRenameFeature(());
pub fn prepare_rename() -> PrepareRenameFeature {
PrepareRenameFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for PrepareRenameFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_prepare_rename();
Ok(())
}
}
impl FeatureSpec for PrepareRenameFeature {
type Marker = PrepareRenameRequest;
}
pub struct CodeActionFeature {
options: CodeActionOptions,
}
pub fn code_action(options: CodeActionOptions) -> CodeActionFeature {
CodeActionFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for CodeActionFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_code_action(self.options.clone())
}
}
impl FeatureSpec for CodeActionFeature {
type Marker = CodeActionRequest;
}
pub struct CodeActionResolveFeature(());
pub fn code_action_resolve() -> CodeActionResolveFeature {
CodeActionResolveFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for CodeActionResolveFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_code_action_resolve();
Ok(())
}
}
impl FeatureSpec for CodeActionResolveFeature {
type Marker = CodeActionResolveRequest;
}
pub struct CodeLensFeature {
options: CodeLensOptions,
}
pub fn code_lens(options: CodeLensOptions) -> CodeLensFeature {
CodeLensFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for CodeLensFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_code_lens(self.options)
}
}
impl FeatureSpec for CodeLensFeature {
type Marker = CodeLensRequest;
}
pub struct CodeLensResolveFeature(());
pub fn code_lens_resolve() -> CodeLensResolveFeature {
CodeLensResolveFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for CodeLensResolveFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_code_lens_resolve();
Ok(())
}
}
impl FeatureSpec for CodeLensResolveFeature {
type Marker = CodeLensResolve;
}
pub struct DocumentLinkFeature {
options: DocumentLinkOptions,
}
pub fn document_link(options: DocumentLinkOptions) -> DocumentLinkFeature {
DocumentLinkFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DocumentLinkFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_document_link(self.options.clone())
}
}
impl FeatureSpec for DocumentLinkFeature {
type Marker = DocumentLinkRequest;
}
pub struct DocumentLinkResolveFeature(());
pub fn document_link_resolve() -> DocumentLinkResolveFeature {
DocumentLinkResolveFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for DocumentLinkResolveFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_document_link_resolve();
Ok(())
}
}
impl FeatureSpec for DocumentLinkResolveFeature {
type Marker = DocumentLinkResolve;
}
pub struct InlayHintFeature {
options: InlayHintOptions,
}
pub fn inlay_hint(options: InlayHintOptions) -> InlayHintFeature {
InlayHintFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for InlayHintFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_inlay_hint(self.options.clone())
}
}
impl FeatureSpec for InlayHintFeature {
type Marker = InlayHintRequest;
}
pub struct InlayHintResolveFeature(());
pub fn inlay_hint_resolve() -> InlayHintResolveFeature {
InlayHintResolveFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for InlayHintResolveFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_inlay_hint_resolve();
Ok(())
}
}
impl FeatureSpec for InlayHintResolveFeature {
type Marker = InlayHintResolveRequest;
}
pub struct WillCreateFilesFeature {
options: FileOperationRegistrationOptions,
}
pub fn will_create_files(options: FileOperationRegistrationOptions) -> WillCreateFilesFeature {
WillCreateFilesFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for WillCreateFilesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_will_create(self.options.clone())
}
}
impl FeatureSpec for WillCreateFilesFeature {
type Marker = WillCreateFiles;
}
pub struct WillRenameFilesFeature {
options: FileOperationRegistrationOptions,
}
pub fn will_rename_files(options: FileOperationRegistrationOptions) -> WillRenameFilesFeature {
WillRenameFilesFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for WillRenameFilesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_will_rename(self.options.clone())
}
}
impl FeatureSpec for WillRenameFilesFeature {
type Marker = WillRenameFiles;
}
pub struct WillDeleteFilesFeature {
options: FileOperationRegistrationOptions,
}
pub fn will_delete_files(options: FileOperationRegistrationOptions) -> WillDeleteFilesFeature {
WillDeleteFilesFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for WillDeleteFilesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_will_delete(self.options.clone())
}
}
impl FeatureSpec for WillDeleteFilesFeature {
type Marker = WillDeleteFiles;
}
pub struct DidChangeWatchedFilesFeature(());
pub fn did_change_watched_files() -> DidChangeWatchedFilesFeature {
DidChangeWatchedFilesFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for DidChangeWatchedFilesFeature {
fn contribute(&self, _caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
Ok(())
}
}
impl NotificationFeatureSpec for DidChangeWatchedFilesFeature {
type Marker = DidChangeWatchedFiles;
}
pub struct DidCreateFilesFeature {
options: FileOperationRegistrationOptions,
}
pub fn did_create_files(options: FileOperationRegistrationOptions) -> DidCreateFilesFeature {
DidCreateFilesFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DidCreateFilesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_did_create(self.options.clone())
}
}
impl NotificationFeatureSpec for DidCreateFilesFeature {
type Marker = DidCreateFiles;
}
pub struct DidRenameFilesFeature {
options: FileOperationRegistrationOptions,
}
pub fn did_rename_files(options: FileOperationRegistrationOptions) -> DidRenameFilesFeature {
DidRenameFilesFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DidRenameFilesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_did_rename(self.options.clone())
}
}
impl NotificationFeatureSpec for DidRenameFilesFeature {
type Marker = DidRenameFiles;
}
pub struct DidDeleteFilesFeature {
options: FileOperationRegistrationOptions,
}
pub fn did_delete_files(options: FileOperationRegistrationOptions) -> DidDeleteFilesFeature {
DidDeleteFilesFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for DidDeleteFilesFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_did_delete(self.options.clone())
}
}
impl NotificationFeatureSpec for DidDeleteFilesFeature {
type Marker = DidDeleteFiles;
}
#[cfg(test)]
mod tests {
use super::*;
use lsp_types::notification::{DidChangeWatchedFiles, DidCreateFiles};
use lsp_types::request::{
CallHierarchyIncomingCalls, CallHierarchyOutgoingCalls, CallHierarchyPrepare,
CodeActionRequest, CodeActionResolveRequest, CodeLensRequest, CodeLensResolve,
ColorPresentationRequest, DocumentColor, DocumentDiagnosticRequest,
DocumentHighlightRequest, DocumentLinkRequest, DocumentLinkResolve, DocumentSymbolRequest,
FoldingRangeRequest, Formatting, GotoDeclaration, GotoDeclarationParams,
GotoDeclarationResponse, GotoDefinition, GotoImplementation, GotoImplementationParams,
GotoImplementationResponse, GotoTypeDefinition, GotoTypeDefinitionParams,
GotoTypeDefinitionResponse, InlayHintRequest, InlayHintResolveRequest, InlineValueRequest,
LinkedEditingRange, MonikerRequest, OnTypeFormatting, PrepareRenameRequest,
RangeFormatting, References, Rename, SelectionRangeRequest, SemanticTokensFullDeltaRequest,
SemanticTokensFullRequest, SemanticTokensRangeRequest, SignatureHelpRequest,
TypeHierarchyPrepare, TypeHierarchySubtypes, TypeHierarchySupertypes,
WorkspaceDiagnosticRequest,
};
use lsp_types::{
CallHierarchyIncomingCall, CallHierarchyIncomingCallsParams, CallHierarchyItem,
CallHierarchyOutgoingCall, CallHierarchyOutgoingCallsParams, CallHierarchyPrepareParams,
CodeAction, CodeActionOptions, CodeActionParams, CodeActionResponse, CodeLens,
CodeLensOptions, CodeLensParams, ColorInformation, ColorPresentation,
ColorPresentationParams, ColorProviderOptions, CreateFilesParams, DeclarationOptions,
DefinitionOptions, DeleteFilesParams, DiagnosticOptions, DidChangeWatchedFilesParams,
DocumentColorParams, DocumentDiagnosticParams, DocumentDiagnosticReportResult,
DocumentFormattingOptions, DocumentFormattingParams, DocumentHighlight,
DocumentHighlightOptions, DocumentHighlightParams, DocumentLink, DocumentLinkOptions,
DocumentLinkParams, DocumentOnTypeFormattingOptions, DocumentOnTypeFormattingParams,
DocumentRangeFormattingOptions, DocumentRangeFormattingParams, DocumentSymbolOptions,
DocumentSymbolParams, DocumentSymbolResponse, FoldingProviderOptions, FoldingRange,
FoldingRangeParams, GotoDefinitionParams, GotoDefinitionResponse, InlayHint,
InlayHintOptions, InlayHintParams, InlineValue, InlineValueOptions, InlineValueParams,
LinkedEditingRangeOptions, LinkedEditingRangeParams, LinkedEditingRanges, Location,
Moniker, MonikerOptions, MonikerParams, PrepareRenameResponse, ReferenceParams,
ReferencesOptions, RenameFilesParams, RenameOptions, RenameParams, SelectionRange,
SelectionRangeOptions, SelectionRangeParams, SemanticTokensDeltaParams,
SemanticTokensFullDeltaResult, SemanticTokensParams, SemanticTokensRangeParams,
SemanticTokensRangeResult, SemanticTokensResult, SignatureHelp, SignatureHelpOptions,
SignatureHelpParams, StaticTextDocumentRegistrationOptions, TextDocumentPositionParams,
TextEdit, TypeHierarchyItem, TypeHierarchyPrepareParams, TypeHierarchySubtypesParams,
TypeHierarchySupertypesParams, WorkspaceDiagnosticParams, WorkspaceDiagnosticReportResult,
WorkspaceEdit, WorkspaceSymbol, WorkspaceSymbolParams, WorkspaceSymbolResponse,
};
fn assert_formatting_descriptor<F: FeatureSpec<Marker = Formatting>>(_: F) {}
fn assert_range_formatting_descriptor<F: FeatureSpec<Marker = RangeFormatting>>(_: F) {}
fn assert_on_type_formatting_descriptor<F: FeatureSpec<Marker = OnTypeFormatting>>(_: F) {}
fn assert_formatting_contract<R>()
where
R: Request<Params = DocumentFormattingParams, Result = Option<Vec<TextEdit>>>,
{
}
fn assert_range_formatting_contract<R>()
where
R: Request<Params = DocumentRangeFormattingParams, Result = Option<Vec<TextEdit>>>,
{
}
fn assert_on_type_formatting_contract<R>()
where
R: Request<Params = DocumentOnTypeFormattingParams, Result = Option<Vec<TextEdit>>>,
{
}
#[test]
fn formatting_descriptors_fix_the_exact_lsp_types_contracts() {
assert_formatting_descriptor(document_formatting(DocumentFormattingOptions::default()));
assert_range_formatting_descriptor(range_formatting(DocumentRangeFormattingOptions {
work_done_progress_options: Default::default(),
}));
assert_on_type_formatting_descriptor(on_type_formatting(
DocumentOnTypeFormattingOptions::default(),
));
assert_formatting_contract::<Formatting>();
assert_range_formatting_contract::<RangeFormatting>();
assert_on_type_formatting_contract::<OnTypeFormatting>();
assert_eq!(<Formatting as Request>::METHOD, "textDocument/formatting");
assert_eq!(
<RangeFormatting as Request>::METHOD,
"textDocument/rangeFormatting"
);
assert_eq!(
<OnTypeFormatting as Request>::METHOD,
"textDocument/onTypeFormatting"
);
}
fn assert_document_color_descriptor<F: FeatureSpec<Marker = DocumentColor>>(_: F) {}
fn assert_color_presentation_descriptor<F: FeatureSpec<Marker = ColorPresentationRequest>>(
_: F,
) {
}
fn assert_folding_range_descriptor<F: FeatureSpec<Marker = FoldingRangeRequest>>(_: F) {}
fn assert_selection_range_descriptor<F: FeatureSpec<Marker = SelectionRangeRequest>>(_: F) {}
fn assert_inline_value_descriptor<F: FeatureSpec<Marker = InlineValueRequest>>(_: F) {}
fn assert_document_color_contract<R>()
where
R: Request<Params = DocumentColorParams, Result = Vec<ColorInformation>>,
{
}
fn assert_color_presentation_contract<R>()
where
R: Request<Params = ColorPresentationParams, Result = Vec<ColorPresentation>>,
{
}
fn assert_folding_range_contract<R>()
where
R: Request<Params = FoldingRangeParams, Result = Option<Vec<FoldingRange>>>,
{
}
fn assert_selection_range_contract<R>()
where
R: Request<Params = SelectionRangeParams, Result = Option<Vec<SelectionRange>>>,
{
}
fn assert_inline_value_contract<R>()
where
R: Request<Params = InlineValueParams, Result = Option<Vec<InlineValue>>>,
{
}
#[test]
fn presentation_descriptors_fix_the_exact_lsp_types_contracts() {
assert_document_color_descriptor(document_color(ColorProviderOptions {}));
assert_color_presentation_descriptor(color_presentation());
assert_folding_range_descriptor(folding_range(FoldingProviderOptions {}));
assert_selection_range_descriptor(selection_range(SelectionRangeOptions::default()));
assert_inline_value_descriptor(inline_value(InlineValueOptions::default()));
assert_document_color_contract::<DocumentColor>();
assert_color_presentation_contract::<ColorPresentationRequest>();
assert_folding_range_contract::<FoldingRangeRequest>();
assert_selection_range_contract::<SelectionRangeRequest>();
assert_inline_value_contract::<InlineValueRequest>();
assert_eq!(
<DocumentColor as Request>::METHOD,
"textDocument/documentColor"
);
assert_eq!(
<ColorPresentationRequest as Request>::METHOD,
"textDocument/colorPresentation"
);
assert_eq!(
<FoldingRangeRequest as Request>::METHOD,
"textDocument/foldingRange"
);
assert_eq!(
<SelectionRangeRequest as Request>::METHOD,
"textDocument/selectionRange"
);
assert_eq!(
<InlineValueRequest as Request>::METHOD,
"textDocument/inlineValue"
);
}
#[test]
fn editing_and_presentation_descriptors_contribute_only_their_capabilities() {
let formatting = DocumentFormattingOptions::default();
let range = DocumentRangeFormattingOptions {
work_done_progress_options: Default::default(),
};
let on_type = DocumentOnTypeFormattingOptions {
first_trigger_character: "}".to_string(),
more_trigger_character: Some(vec![";".to_string()]),
};
let selection = SelectionRangeOptions::default();
let inline = InlineValueOptions::default();
let mut caps = CapabilityBuilder::default();
sealed::Sealed::contribute(&document_formatting(formatting.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&range_formatting(range.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&on_type_formatting(on_type.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&document_color(ColorProviderOptions {}), &mut caps).unwrap();
sealed::Sealed::contribute(&color_presentation(), &mut caps).unwrap();
sealed::Sealed::contribute(&folding_range(FoldingProviderOptions {}), &mut caps).unwrap();
sealed::Sealed::contribute(&selection_range(selection.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&inline_value(inline.clone()), &mut caps).unwrap();
caps.validate().unwrap();
assert_eq!(
caps.finish(),
lsp_types::ServerCapabilities {
document_formatting_provider: Some(lsp_types::OneOf::Right(formatting)),
document_range_formatting_provider: Some(lsp_types::OneOf::Right(range)),
document_on_type_formatting_provider: Some(on_type),
color_provider: Some(lsp_types::ColorProviderCapability::ColorProvider(
ColorProviderOptions {},
)),
folding_range_provider: Some(
lsp_types::FoldingRangeProviderCapability::FoldingProvider(
FoldingProviderOptions {},
),
),
selection_range_provider: Some(
lsp_types::SelectionRangeProviderCapability::Options(selection),
),
inline_value_provider: Some(lsp_types::OneOf::Right(
lsp_types::InlineValueServerCapabilities::Options(inline),
)),
..lsp_types::ServerCapabilities::default()
}
);
}
fn assert_call_prepare_descriptor<F: FeatureSpec<Marker = CallHierarchyPrepare>>(_: F) {}
fn assert_call_incoming_descriptor<F: FeatureSpec<Marker = CallHierarchyIncomingCalls>>(_: F) {}
fn assert_call_outgoing_descriptor<F: FeatureSpec<Marker = CallHierarchyOutgoingCalls>>(_: F) {}
fn assert_call_prepare_contract<R>()
where
R: Request<Params = CallHierarchyPrepareParams, Result = Option<Vec<CallHierarchyItem>>>,
{
}
fn assert_call_incoming_contract<R>()
where
R: Request<
Params = CallHierarchyIncomingCallsParams,
Result = Option<Vec<CallHierarchyIncomingCall>>,
>,
{
}
fn assert_call_outgoing_contract<R>()
where
R: Request<
Params = CallHierarchyOutgoingCallsParams,
Result = Option<Vec<CallHierarchyOutgoingCall>>,
>,
{
}
#[test]
fn call_hierarchy_descriptors_fix_the_exact_lsp_types_contracts() {
assert_call_prepare_descriptor(call_hierarchy_prepare(CallHierarchyOptions::default()));
assert_call_incoming_descriptor(call_hierarchy_incoming_calls());
assert_call_outgoing_descriptor(call_hierarchy_outgoing_calls());
assert_call_prepare_contract::<CallHierarchyPrepare>();
assert_call_incoming_contract::<CallHierarchyIncomingCalls>();
assert_call_outgoing_contract::<CallHierarchyOutgoingCalls>();
assert_eq!(
<CallHierarchyPrepare as Request>::METHOD,
"textDocument/prepareCallHierarchy"
);
assert_eq!(
<CallHierarchyIncomingCalls as Request>::METHOD,
"callHierarchy/incomingCalls"
);
assert_eq!(
<CallHierarchyOutgoingCalls as Request>::METHOD,
"callHierarchy/outgoingCalls"
);
}
fn assert_type_prepare_descriptor<F: FeatureSpec<Marker = TypeHierarchyPrepare>>(_: F) {}
fn assert_type_supertypes_descriptor<F: FeatureSpec<Marker = TypeHierarchySupertypes>>(_: F) {}
fn assert_type_subtypes_descriptor<F: FeatureSpec<Marker = TypeHierarchySubtypes>>(_: F) {}
fn assert_type_prepare_contract<R>()
where
R: Request<Params = TypeHierarchyPrepareParams, Result = Option<Vec<TypeHierarchyItem>>>,
{
}
fn assert_type_supertypes_contract<R>()
where
R: Request<Params = TypeHierarchySupertypesParams, Result = Option<Vec<TypeHierarchyItem>>>,
{
}
fn assert_type_subtypes_contract<R>()
where
R: Request<Params = TypeHierarchySubtypesParams, Result = Option<Vec<TypeHierarchyItem>>>,
{
}
#[test]
fn type_hierarchy_descriptors_fix_the_exact_lsp_types_contracts() {
assert_type_prepare_descriptor(type_hierarchy_prepare(TypeHierarchyOptions::default()));
assert_type_supertypes_descriptor(type_hierarchy_supertypes());
assert_type_subtypes_descriptor(type_hierarchy_subtypes());
assert_type_prepare_contract::<TypeHierarchyPrepare>();
assert_type_supertypes_contract::<TypeHierarchySupertypes>();
assert_type_subtypes_contract::<TypeHierarchySubtypes>();
assert_eq!(
<TypeHierarchyPrepare as Request>::METHOD,
"textDocument/prepareTypeHierarchy"
);
assert_eq!(
<TypeHierarchySupertypes as Request>::METHOD,
"typeHierarchy/supertypes"
);
assert_eq!(
<TypeHierarchySubtypes as Request>::METHOD,
"typeHierarchy/subtypes"
);
}
fn assert_semantic_full_descriptor<F: FeatureSpec<Marker = SemanticTokensFullRequest>>(_: F) {}
fn assert_semantic_delta_descriptor<F: FeatureSpec<Marker = SemanticTokensFullDeltaRequest>>(
_: F,
) {
}
fn assert_semantic_range_descriptor<F: FeatureSpec<Marker = SemanticTokensRangeRequest>>(_: F) {
}
fn assert_semantic_full_contract<R>()
where
R: Request<Params = SemanticTokensParams, Result = Option<SemanticTokensResult>>,
{
}
fn assert_semantic_delta_contract<R>()
where
R: Request<
Params = SemanticTokensDeltaParams,
Result = Option<SemanticTokensFullDeltaResult>,
>,
{
}
fn assert_semantic_range_contract<R>()
where
R: Request<Params = SemanticTokensRangeParams, Result = Option<SemanticTokensRangeResult>>,
{
}
#[test]
fn semantic_token_descriptors_fix_the_exact_lsp_types_contracts() {
let options = SemanticTokensOptions::default();
assert_semantic_full_descriptor(semantic_tokens_full(options.clone()));
assert_semantic_delta_descriptor(semantic_tokens_full_delta(options.clone()));
assert_semantic_range_descriptor(semantic_tokens_range(options));
assert_semantic_full_contract::<SemanticTokensFullRequest>();
assert_semantic_delta_contract::<SemanticTokensFullDeltaRequest>();
assert_semantic_range_contract::<SemanticTokensRangeRequest>();
assert_eq!(
<SemanticTokensFullRequest as Request>::METHOD,
"textDocument/semanticTokens/full"
);
assert_eq!(
<SemanticTokensFullDeltaRequest as Request>::METHOD,
"textDocument/semanticTokens/full/delta"
);
assert_eq!(
<SemanticTokensRangeRequest as Request>::METHOD,
"textDocument/semanticTokens/range"
);
}
fn assert_document_descriptor<F: FeatureSpec<Marker = DocumentDiagnosticRequest>>(_: F) {}
fn assert_will_save_wait_until_descriptor<F: FeatureSpec<Marker = WillSaveWaitUntil>>(_: F) {}
#[test]
fn will_save_wait_until_descriptor_fixes_the_typed_request_contract() {
assert_will_save_wait_until_descriptor(will_save_wait_until());
assert_eq!(
<WillSaveWaitUntil as Request>::METHOD,
"textDocument/willSaveWaitUntil"
);
}
fn assert_workspace_descriptor<F: FeatureSpec<Marker = WorkspaceDiagnosticRequest>>(_: F) {}
fn assert_document_contract<R>()
where
R: Request<Params = DocumentDiagnosticParams, Result = DocumentDiagnosticReportResult>,
{
}
fn assert_workspace_contract<R>()
where
R: Request<Params = WorkspaceDiagnosticParams, Result = WorkspaceDiagnosticReportResult>,
{
}
#[test]
fn diagnostic_descriptors_fix_the_exact_lsp_types_contracts() {
assert_document_descriptor(document_diagnostic(DiagnosticOptions::default()));
assert_workspace_descriptor(workspace_diagnostic(DiagnosticOptions::default()));
assert_document_contract::<DocumentDiagnosticRequest>();
assert_workspace_contract::<WorkspaceDiagnosticRequest>();
assert_eq!(
<DocumentDiagnosticRequest as Request>::METHOD,
"textDocument/diagnostic"
);
assert_eq!(
<WorkspaceDiagnosticRequest as Request>::METHOD,
"workspace/diagnostic"
);
}
fn assert_workspace_symbol_descriptor<F: FeatureSpec<Marker = WorkspaceSymbolRequest>>(_: F) {}
fn assert_workspace_symbol_resolve_descriptor<
F: FeatureSpec<Marker = WorkspaceSymbolResolve>,
>(
_: F,
) {
}
fn assert_will_create_descriptor<F: FeatureSpec<Marker = WillCreateFiles>>(_: F) {}
fn assert_will_rename_descriptor<F: FeatureSpec<Marker = WillRenameFiles>>(_: F) {}
fn assert_will_delete_descriptor<F: FeatureSpec<Marker = WillDeleteFiles>>(_: F) {}
fn assert_did_change_watched_descriptor<
F: NotificationFeatureSpec<Marker = DidChangeWatchedFiles>,
>(
_: F,
) {
}
fn assert_did_create_descriptor<F: NotificationFeatureSpec<Marker = DidCreateFiles>>(_: F) {}
fn assert_workspace_symbol_contract<R>()
where
R: Request<Params = WorkspaceSymbolParams, Result = Option<WorkspaceSymbolResponse>>,
{
}
fn assert_workspace_symbol_resolve_contract<R>()
where
R: Request<Params = WorkspaceSymbol, Result = WorkspaceSymbol>,
{
}
fn assert_will_create_contract<R>()
where
R: Request<Params = CreateFilesParams, Result = Option<WorkspaceEdit>>,
{
}
fn assert_will_rename_contract<R>()
where
R: Request<Params = RenameFilesParams, Result = Option<WorkspaceEdit>>,
{
}
fn assert_will_delete_contract<R>()
where
R: Request<Params = DeleteFilesParams, Result = Option<WorkspaceEdit>>,
{
}
fn assert_did_change_watched_contract<N>()
where
N: Notification<Params = DidChangeWatchedFilesParams>,
{
}
fn assert_did_create_contract<N>()
where
N: Notification<Params = CreateFilesParams>,
{
}
fn workspace_symbol_options() -> WorkspaceSymbolOptions {
WorkspaceSymbolOptions {
work_done_progress_options: Default::default(),
resolve_provider: None,
}
}
#[test]
fn workspace_symbol_descriptors_fix_the_exact_lsp_types_contracts() {
assert_workspace_symbol_descriptor(workspace_symbol(workspace_symbol_options()));
assert_workspace_symbol_resolve_descriptor(workspace_symbol_resolve());
assert_workspace_symbol_contract::<WorkspaceSymbolRequest>();
assert_workspace_symbol_resolve_contract::<WorkspaceSymbolResolve>();
assert_eq!(
<WorkspaceSymbolRequest as Request>::METHOD,
"workspace/symbol"
);
assert_eq!(
<WorkspaceSymbolResolve as Request>::METHOD,
"workspaceSymbol/resolve"
);
}
#[test]
fn file_operation_descriptors_fix_the_exact_lsp_types_contracts() {
let options = || FileOperationRegistrationOptions::default();
assert_will_create_descriptor(will_create_files(options()));
assert_will_rename_descriptor(will_rename_files(options()));
assert_will_delete_descriptor(will_delete_files(options()));
assert_did_change_watched_descriptor(did_change_watched_files());
assert_did_create_descriptor(did_create_files(options()));
assert_will_create_contract::<WillCreateFiles>();
assert_will_rename_contract::<WillRenameFiles>();
assert_will_delete_contract::<WillDeleteFiles>();
assert_did_change_watched_contract::<DidChangeWatchedFiles>();
assert_did_create_contract::<DidCreateFiles>();
assert_eq!(
<WillCreateFiles as Request>::METHOD,
"workspace/willCreateFiles"
);
assert_eq!(
<WillRenameFiles as Request>::METHOD,
"workspace/willRenameFiles"
);
assert_eq!(
<WillDeleteFiles as Request>::METHOD,
"workspace/willDeleteFiles"
);
assert_eq!(
<DidChangeWatchedFiles as Notification>::METHOD,
"workspace/didChangeWatchedFiles"
);
assert_eq!(
<DidCreateFiles as Notification>::METHOD,
"workspace/didCreateFiles"
);
assert_eq!(
<DidRenameFiles as Notification>::METHOD,
"workspace/didRenameFiles"
);
assert_eq!(
<DidDeleteFiles as Notification>::METHOD,
"workspace/didDeleteFiles"
);
}
fn assert_rename_descriptor<F: FeatureSpec<Marker = Rename>>(_: F) {}
fn assert_prepare_rename_descriptor<F: FeatureSpec<Marker = PrepareRenameRequest>>(_: F) {}
fn assert_rename_contract<R>()
where
R: Request<Params = RenameParams, Result = Option<WorkspaceEdit>>,
{
}
fn assert_prepare_rename_contract<R>()
where
R: Request<Params = TextDocumentPositionParams, Result = Option<PrepareRenameResponse>>,
{
}
#[test]
fn rename_descriptors_fix_the_exact_lsp_types_contracts() {
assert_rename_descriptor(rename(RenameOptions {
prepare_provider: None,
work_done_progress_options: Default::default(),
}));
assert_prepare_rename_descriptor(prepare_rename());
assert_rename_contract::<Rename>();
assert_prepare_rename_contract::<PrepareRenameRequest>();
assert_eq!(<Rename as Request>::METHOD, "textDocument/rename");
assert_eq!(
<PrepareRenameRequest as Request>::METHOD,
"textDocument/prepareRename"
);
}
fn assert_code_action_descriptor<F: FeatureSpec<Marker = CodeActionRequest>>(_: F) {}
fn assert_code_action_resolve_descriptor<F: FeatureSpec<Marker = CodeActionResolveRequest>>(
_: F,
) {
}
fn assert_code_action_contract<R>()
where
R: Request<Params = CodeActionParams, Result = Option<CodeActionResponse>>,
{
}
fn assert_code_action_resolve_contract<R>()
where
R: Request<Params = CodeAction, Result = CodeAction>,
{
}
#[test]
fn code_action_descriptors_fix_the_exact_lsp_types_contracts() {
assert_code_action_descriptor(code_action(CodeActionOptions::default()));
assert_code_action_resolve_descriptor(code_action_resolve());
assert_code_action_contract::<CodeActionRequest>();
assert_code_action_resolve_contract::<CodeActionResolveRequest>();
assert_eq!(
<CodeActionRequest as Request>::METHOD,
"textDocument/codeAction"
);
assert_eq!(
<CodeActionResolveRequest as Request>::METHOD,
"codeAction/resolve"
);
}
fn assert_code_lens_descriptor<F: FeatureSpec<Marker = CodeLensRequest>>(_: F) {}
fn assert_code_lens_resolve_descriptor<F: FeatureSpec<Marker = CodeLensResolve>>(_: F) {}
fn assert_code_lens_contract<R>()
where
R: Request<Params = CodeLensParams, Result = Option<Vec<CodeLens>>>,
{
}
fn assert_code_lens_resolve_contract<R>()
where
R: Request<Params = CodeLens, Result = CodeLens>,
{
}
#[test]
fn code_lens_descriptors_fix_the_exact_lsp_types_contracts() {
assert_code_lens_descriptor(code_lens(CodeLensOptions {
resolve_provider: None,
}));
assert_code_lens_resolve_descriptor(code_lens_resolve());
assert_code_lens_contract::<CodeLensRequest>();
assert_code_lens_resolve_contract::<CodeLensResolve>();
assert_eq!(
<CodeLensRequest as Request>::METHOD,
"textDocument/codeLens"
);
assert_eq!(<CodeLensResolve as Request>::METHOD, "codeLens/resolve");
}
fn assert_document_link_descriptor<F: FeatureSpec<Marker = DocumentLinkRequest>>(_: F) {}
fn assert_document_link_resolve_descriptor<F: FeatureSpec<Marker = DocumentLinkResolve>>(_: F) {
}
fn assert_document_link_contract<R>()
where
R: Request<Params = DocumentLinkParams, Result = Option<Vec<DocumentLink>>>,
{
}
fn assert_document_link_resolve_contract<R>()
where
R: Request<Params = DocumentLink, Result = DocumentLink>,
{
}
#[test]
fn document_link_descriptors_fix_the_exact_lsp_types_contracts() {
assert_document_link_descriptor(document_link(DocumentLinkOptions {
resolve_provider: None,
work_done_progress_options: Default::default(),
}));
assert_document_link_resolve_descriptor(document_link_resolve());
assert_document_link_contract::<DocumentLinkRequest>();
assert_document_link_resolve_contract::<DocumentLinkResolve>();
assert_eq!(
<DocumentLinkRequest as Request>::METHOD,
"textDocument/documentLink"
);
assert_eq!(
<DocumentLinkResolve as Request>::METHOD,
"documentLink/resolve"
);
}
fn assert_inlay_hint_descriptor<F: FeatureSpec<Marker = InlayHintRequest>>(_: F) {}
fn assert_inlay_hint_resolve_descriptor<F: FeatureSpec<Marker = InlayHintResolveRequest>>(
_: F,
) {
}
fn assert_inlay_hint_contract<R>()
where
R: Request<Params = InlayHintParams, Result = Option<Vec<InlayHint>>>,
{
}
fn assert_inlay_hint_resolve_contract<R>()
where
R: Request<Params = InlayHint, Result = InlayHint>,
{
}
#[test]
fn inlay_hint_descriptors_fix_the_exact_lsp_types_contracts() {
assert_inlay_hint_descriptor(inlay_hint(InlayHintOptions::default()));
assert_inlay_hint_resolve_descriptor(inlay_hint_resolve());
assert_inlay_hint_contract::<InlayHintRequest>();
assert_inlay_hint_resolve_contract::<InlayHintResolveRequest>();
assert_eq!(
<InlayHintRequest as Request>::METHOD,
"textDocument/inlayHint"
);
assert_eq!(
<InlayHintResolveRequest as Request>::METHOD,
"inlayHint/resolve"
);
}
fn assert_signature_help_descriptor<F: FeatureSpec<Marker = SignatureHelpRequest>>(_: F) {}
fn assert_declaration_descriptor<F: FeatureSpec<Marker = GotoDeclaration>>(_: F) {}
fn assert_definition_descriptor<F: FeatureSpec<Marker = GotoDefinition>>(_: F) {}
fn assert_type_definition_descriptor<F: FeatureSpec<Marker = GotoTypeDefinition>>(_: F) {}
fn assert_implementation_descriptor<F: FeatureSpec<Marker = GotoImplementation>>(_: F) {}
fn assert_references_descriptor<F: FeatureSpec<Marker = References>>(_: F) {}
fn assert_document_highlight_descriptor<F: FeatureSpec<Marker = DocumentHighlightRequest>>(
_: F,
) {
}
fn assert_document_symbol_descriptor<F: FeatureSpec<Marker = DocumentSymbolRequest>>(_: F) {}
fn assert_linked_editing_range_descriptor<F: FeatureSpec<Marker = LinkedEditingRange>>(_: F) {}
fn assert_moniker_descriptor<F: FeatureSpec<Marker = MonikerRequest>>(_: F) {}
fn assert_signature_help_contract<R>()
where
R: Request<Params = SignatureHelpParams, Result = Option<SignatureHelp>>,
{
}
fn assert_declaration_contract<R>()
where
R: Request<Params = GotoDeclarationParams, Result = Option<GotoDeclarationResponse>>,
{
}
fn assert_definition_contract<R>()
where
R: Request<Params = GotoDefinitionParams, Result = Option<GotoDefinitionResponse>>,
{
}
fn assert_type_definition_contract<R>()
where
R: Request<Params = GotoTypeDefinitionParams, Result = Option<GotoTypeDefinitionResponse>>,
{
}
fn assert_implementation_contract<R>()
where
R: Request<Params = GotoImplementationParams, Result = Option<GotoImplementationResponse>>,
{
}
fn assert_references_contract<R>()
where
R: Request<Params = ReferenceParams, Result = Option<Vec<Location>>>,
{
}
fn assert_document_highlight_contract<R>()
where
R: Request<Params = DocumentHighlightParams, Result = Option<Vec<DocumentHighlight>>>,
{
}
fn assert_document_symbol_contract<R>()
where
R: Request<Params = DocumentSymbolParams, Result = Option<DocumentSymbolResponse>>,
{
}
fn assert_linked_editing_range_contract<R>()
where
R: Request<Params = LinkedEditingRangeParams, Result = Option<LinkedEditingRanges>>,
{
}
fn assert_moniker_contract<R>()
where
R: Request<Params = MonikerParams, Result = Option<Vec<Moniker>>>,
{
}
fn progress(value: Option<bool>) -> lsp_types::WorkDoneProgressOptions {
lsp_types::WorkDoneProgressOptions {
work_done_progress: value,
}
}
fn static_text_document_registration_options() -> StaticTextDocumentRegistrationOptions {
StaticTextDocumentRegistrationOptions {
document_selector: None,
id: Some("nav".to_string()),
}
}
#[test]
fn navigation_and_lookup_descriptors_fix_the_exact_lsp_types_contracts() {
assert_signature_help_descriptor(signature_help(SignatureHelpOptions::default()));
assert_declaration_descriptor(declaration(DeclarationOptions {
work_done_progress_options: progress(Some(true)),
}));
assert_definition_descriptor(definition(DefinitionOptions {
work_done_progress_options: progress(Some(true)),
}));
assert_type_definition_descriptor(type_definition(
static_text_document_registration_options(),
));
assert_implementation_descriptor(implementation(
static_text_document_registration_options(),
));
assert_references_descriptor(references(ReferencesOptions {
work_done_progress_options: progress(Some(true)),
}));
assert_document_highlight_descriptor(document_highlight(DocumentHighlightOptions {
work_done_progress_options: progress(Some(true)),
}));
assert_document_symbol_descriptor(document_symbol(DocumentSymbolOptions {
label: Some("outline".to_string()),
work_done_progress_options: progress(Some(true)),
}));
assert_linked_editing_range_descriptor(linked_editing_range(LinkedEditingRangeOptions {
work_done_progress_options: progress(Some(true)),
}));
assert_moniker_descriptor(moniker(MonikerOptions {
work_done_progress_options: progress(Some(true)),
}));
assert_signature_help_contract::<SignatureHelpRequest>();
assert_declaration_contract::<GotoDeclaration>();
assert_definition_contract::<GotoDefinition>();
assert_type_definition_contract::<GotoTypeDefinition>();
assert_implementation_contract::<GotoImplementation>();
assert_references_contract::<References>();
assert_document_highlight_contract::<DocumentHighlightRequest>();
assert_document_symbol_contract::<DocumentSymbolRequest>();
assert_linked_editing_range_contract::<LinkedEditingRange>();
assert_moniker_contract::<MonikerRequest>();
assert_eq!(
<SignatureHelpRequest as Request>::METHOD,
"textDocument/signatureHelp"
);
assert_eq!(
<GotoDeclaration as Request>::METHOD,
"textDocument/declaration"
);
assert_eq!(
<GotoDefinition as Request>::METHOD,
"textDocument/definition"
);
assert_eq!(
<GotoTypeDefinition as Request>::METHOD,
"textDocument/typeDefinition"
);
assert_eq!(
<GotoImplementation as Request>::METHOD,
"textDocument/implementation"
);
assert_eq!(<References as Request>::METHOD, "textDocument/references");
assert_eq!(
<DocumentHighlightRequest as Request>::METHOD,
"textDocument/documentHighlight"
);
assert_eq!(
<DocumentSymbolRequest as Request>::METHOD,
"textDocument/documentSymbol"
);
assert_eq!(
<LinkedEditingRange as Request>::METHOD,
"textDocument/linkedEditingRange"
);
assert_eq!(<MonikerRequest as Request>::METHOD, "textDocument/moniker");
}
#[test]
fn navigation_and_lookup_descriptors_contribute_only_their_capabilities() {
let signature_options = SignatureHelpOptions {
trigger_characters: Some(vec!["(".to_string()]),
retrigger_characters: None,
work_done_progress_options: Default::default(),
};
let declaration_options = DeclarationOptions {
work_done_progress_options: progress(Some(true)),
};
let definition_options = DefinitionOptions {
work_done_progress_options: progress(Some(true)),
};
let type_definition_options = static_text_document_registration_options();
let implementation_options = static_text_document_registration_options();
let references_options = ReferencesOptions {
work_done_progress_options: progress(Some(true)),
};
let highlight_options = DocumentHighlightOptions {
work_done_progress_options: progress(Some(true)),
};
let symbols_options = DocumentSymbolOptions {
label: Some("outline".to_string()),
work_done_progress_options: progress(Some(true)),
};
let linked_options = LinkedEditingRangeOptions {
work_done_progress_options: progress(Some(true)),
};
let moniker_options = MonikerOptions {
work_done_progress_options: progress(Some(true)),
};
let mut caps = CapabilityBuilder::default();
sealed::Sealed::contribute(&signature_help(signature_options.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&declaration(declaration_options.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&definition(definition_options.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&type_definition(type_definition_options.clone()), &mut caps)
.unwrap();
sealed::Sealed::contribute(&implementation(implementation_options.clone()), &mut caps)
.unwrap();
sealed::Sealed::contribute(&references(references_options.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&document_highlight(highlight_options.clone()), &mut caps)
.unwrap();
sealed::Sealed::contribute(&document_symbol(symbols_options.clone()), &mut caps).unwrap();
sealed::Sealed::contribute(&linked_editing_range(linked_options.clone()), &mut caps)
.unwrap();
sealed::Sealed::contribute(&moniker(moniker_options.clone()), &mut caps).unwrap();
caps.validate().unwrap();
assert_eq!(
caps.finish(),
lsp_types::ServerCapabilities {
signature_help_provider: Some(signature_options),
declaration_provider: Some(lsp_types::DeclarationCapability::Options(
declaration_options
)),
definition_provider: Some(lsp_types::OneOf::Right(definition_options)),
type_definition_provider: Some(
lsp_types::TypeDefinitionProviderCapability::Options(type_definition_options)
),
implementation_provider: Some(
lsp_types::ImplementationProviderCapability::Options(implementation_options)
),
references_provider: Some(lsp_types::OneOf::Right(references_options)),
document_highlight_provider: Some(lsp_types::OneOf::Right(highlight_options)),
document_symbol_provider: Some(lsp_types::OneOf::Right(symbols_options)),
linked_editing_range_provider: Some(
lsp_types::LinkedEditingRangeServerCapabilities::Options(linked_options),
),
moniker_provider: Some(lsp_types::OneOf::Right(
lsp_types::MonikerServerCapabilities::Options(moniker_options),
)),
..lsp_types::ServerCapabilities::default()
}
);
}
#[test]
fn no_request_descriptor_fixes_the_execute_command_method() {
for method in [
<HoverRequest as Request>::METHOD,
<Completion as Request>::METHOD,
<ResolveCompletionItem as Request>::METHOD,
<DocumentDiagnosticRequest as Request>::METHOD,
<WorkspaceDiagnosticRequest as Request>::METHOD,
<WorkspaceSymbolRequest as Request>::METHOD,
<WorkspaceSymbolResolve as Request>::METHOD,
<Rename as Request>::METHOD,
<PrepareRenameRequest as Request>::METHOD,
<CodeActionRequest as Request>::METHOD,
<CodeActionResolveRequest as Request>::METHOD,
<CodeLensRequest as Request>::METHOD,
<CodeLensResolve as Request>::METHOD,
<DocumentLinkRequest as Request>::METHOD,
<DocumentLinkResolve as Request>::METHOD,
<InlayHintRequest as Request>::METHOD,
<InlayHintResolveRequest as Request>::METHOD,
<WillCreateFiles as Request>::METHOD,
<WillRenameFiles as Request>::METHOD,
<WillDeleteFiles as Request>::METHOD,
] {
assert_ne!(method, "workspace/executeCommand");
}
}
}