Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
LanguageFeatures.rs

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