Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
LanguageFeatures.rs

1//! # LanguageFeatures Effect (CreateEffectForRequest)
2//!
3//! Effect constructors for LSP-like language feature provider registration.
4//! Each method maps to a `ProviderType` variant and delegates to the
5//! `LanguageFeatureProviderRegistry::RegisterProvider` trait method.
6//!
7//! ## Provider types covered
8//!
9//! Hover, Completion, Definition, References, CodeAction, DocumentHighlight,
10//! DocumentSymbol, WorkspaceSymbol, Rename, DocumentFormatting,
11//! DocumentRangeFormatting, OnTypeFormatting, SignatureHelp, CodeLens,
12//! FoldingRange, SelectionRange, SemanticTokens, InlayHint, TypeHierarchy,
13//! CallHierarchy, LinkedEditingRange, DocumentLink, Color, Implementation,
14//! TypeDefinition, Declaration, EvaluatableExpression, InlineValues.
15
16use std::sync::Arc;
17
18use CommonLibrary::{
19	Environment::Requires::Requires,
20	LanguageFeature::{
21		DTO::ProviderType::ProviderType,
22		LanguageFeatureProviderRegistry::LanguageFeatureProviderRegistry,
23	},
24};
25use serde_json::{Value, json};
26use tauri::Runtime;
27
28use crate::Track::Effect::{
29	CreateEffectForRequest::Utilities::Params::{obj_str, obj_val},
30	MappedEffectType::MappedEffect,
31};
32
33fn CreateProviderEffect(Parameters:Value, ProviderKind:ProviderType) -> Option<Result<MappedEffect, String>> {
34	crate::effect!(run_time, {
35		let provider:Arc<dyn LanguageFeatureProviderRegistry> = run_time.Environment.Require();
36
37		let id = obj_str(&Parameters, "handle").to_string();
38
39		let selector = obj_val(&Parameters, "language_selector");
40
41		let extension_id = obj_val(&Parameters, "extension_id");
42
43		let options = Parameters.get("options").cloned();
44
45		provider
46			.RegisterProvider(id, ProviderKind, selector, extension_id, options)
47			.await
48			.map(|handle| json!(handle))
49			.map_err(|e| e.to_string())
50	})
51}
52
53pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
54	match MethodName {
55		"register_hover_provider" => CreateProviderEffect(Parameters, ProviderType::Hover),
56
57		"register_completion_item_provider" => CreateProviderEffect(Parameters, ProviderType::Completion),
58
59		"register_definition_provider" => CreateProviderEffect(Parameters, ProviderType::Definition),
60
61		"register_reference_provider" => CreateProviderEffect(Parameters, ProviderType::References),
62
63		"register_code_actions_provider" => CreateProviderEffect(Parameters, ProviderType::CodeAction),
64
65		"register_document_highlight_provider" => CreateProviderEffect(Parameters, ProviderType::DocumentHighlight),
66
67		"register_document_symbol_provider" => CreateProviderEffect(Parameters, ProviderType::DocumentSymbol),
68
69		"register_workspace_symbol_provider" => CreateProviderEffect(Parameters, ProviderType::WorkspaceSymbol),
70
71		"register_rename_provider" => CreateProviderEffect(Parameters, ProviderType::Rename),
72
73		"register_document_formatting_provider" => CreateProviderEffect(Parameters, ProviderType::DocumentFormatting),
74
75		"register_document_range_formatting_provider" => {
76			CreateProviderEffect(Parameters, ProviderType::DocumentRangeFormatting)
77		},
78
79		"register_on_type_formatting_provider" => CreateProviderEffect(Parameters, ProviderType::OnTypeFormatting),
80
81		"register_signature_help_provider" => CreateProviderEffect(Parameters, ProviderType::SignatureHelp),
82
83		"register_code_lens_provider" => CreateProviderEffect(Parameters, ProviderType::CodeLens),
84
85		"register_folding_range_provider" => CreateProviderEffect(Parameters, ProviderType::FoldingRange),
86
87		"register_selection_range_provider" => CreateProviderEffect(Parameters, ProviderType::SelectionRange),
88
89		"register_semantic_tokens_provider" => CreateProviderEffect(Parameters, ProviderType::SemanticTokens),
90
91		"register_inlay_hints_provider" => CreateProviderEffect(Parameters, ProviderType::InlayHint),
92
93		"register_type_hierarchy_provider" => CreateProviderEffect(Parameters, ProviderType::TypeHierarchy),
94
95		"register_call_hierarchy_provider" => CreateProviderEffect(Parameters, ProviderType::CallHierarchy),
96
97		"register_linked_editing_range_provider" => CreateProviderEffect(Parameters, ProviderType::LinkedEditingRange),
98
99		"register_document_link_provider" => CreateProviderEffect(Parameters, ProviderType::DocumentLink),
100
101		"register_color_provider" => CreateProviderEffect(Parameters, ProviderType::Color),
102
103		"register_implementation_provider" => CreateProviderEffect(Parameters, ProviderType::Implementation),
104
105		"register_type_definition_provider" => CreateProviderEffect(Parameters, ProviderType::TypeDefinition),
106
107		"register_declaration_provider" => CreateProviderEffect(Parameters, ProviderType::Declaration),
108
109		"register_evaluatable_expression_provider" => {
110			CreateProviderEffect(Parameters, ProviderType::EvaluatableExpression)
111		},
112
113		"register_inline_values_provider" => CreateProviderEffect(Parameters, ProviderType::InlineValues),
114
115		// Providers added in VS Code ≥1.87 - registration wires the handle into
116		// the ProviderRegistration map so the Language Feature dispatch layer
117		// can proxy back to Cocoon for `$provideXxx` requests.
118		"register_inline_completion_item_provider" => CreateProviderEffect(Parameters, ProviderType::InlineCompletion),
119
120		"register_inline_edit_provider" => CreateProviderEffect(Parameters, ProviderType::InlineEdit),
121
122		"register_multi_document_highlight_provider" => {
123			CreateProviderEffect(Parameters, ProviderType::MultiDocumentHighlight)
124		},
125
126		"register_mapped_edits_provider" => CreateProviderEffect(Parameters, ProviderType::MappedEdits),
127
128		"register_document_paste_edit_provider" => CreateProviderEffect(Parameters, ProviderType::DocumentPasteEdit),
129
130		"register_document_drop_edit_provider" => CreateProviderEffect(Parameters, ProviderType::DocumentDropEdit),
131
132		_ => None,
133	}
134}