summaryrefslogtreecommitdiff
path: root/cli/lsp/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/config.rs')
-rw-r--r--cli/lsp/config.rs109
1 files changed, 103 insertions, 6 deletions
diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs
index 63f04e3cf..7aca52a9b 100644
--- a/cli/lsp/config.rs
+++ b/cli/lsp/config.rs
@@ -4,11 +4,14 @@ use deno_core::serde::Deserialize;
use deno_core::serde_json;
use deno_core::serde_json::Value;
use deno_core::url::Url;
+use deno_core::ModuleSpecifier;
use lspower::jsonrpc::Error as LSPError;
use lspower::jsonrpc::Result as LSPResult;
use lspower::lsp;
use std::collections::HashMap;
+pub const SETTINGS_SECTION: &str = "deno";
+
#[derive(Debug, Clone, Default)]
pub struct ClientCapabilities {
pub status_notification: bool,
@@ -84,19 +87,43 @@ impl Default for ImportCompletionSettings {
}
}
+/// Deno language server specific settings that can be applied uniquely to a
+/// specifier.
+#[derive(Debug, Default, Clone, Deserialize)]
+pub struct SpecifierSettings {
+ /// A flag that indicates if Deno is enabled for this specifier or not.
+ pub enable: bool,
+}
+
+/// Deno language server specific settings that are applied to a workspace.
#[derive(Debug, Default, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceSettings {
+ /// A flag that indicates if Deno is enabled for the workspace.
pub enable: bool,
+
+ /// An option that points to a path string of the tsconfig file to apply to
+ /// code within the workspace.
pub config: Option<String>,
+
+ /// An option that points to a path string of the import map to apply to the
+ /// code within the workspace.
pub import_map: Option<String>,
+
+ /// Code lens specific settings for the workspace.
#[serde(default)]
pub code_lens: CodeLensSettings,
#[serde(default)]
+
+ /// Suggestion (auto-completion) settings for the workspace.
pub suggest: CompletionSettings,
+ /// A flag that indicates if linting is enabled for the workspace.
#[serde(default)]
pub lint: bool,
+
+ /// A flag that indicates if Dene should validate code against the unstable
+ /// APIs for the workspace.
#[serde(default)]
pub unstable: bool,
}
@@ -113,15 +140,21 @@ impl WorkspaceSettings {
pub struct Config {
pub client_capabilities: ClientCapabilities,
pub root_uri: Option<Url>,
- pub settings: WorkspaceSettings,
+ pub specifier_settings: HashMap<ModuleSpecifier, SpecifierSettings>,
+ pub workspace_settings: WorkspaceSettings,
}
impl Config {
- pub fn update(&mut self, value: Value) -> LSPResult<()> {
- let settings: WorkspaceSettings = serde_json::from_value(value)
- .map_err(|err| LSPError::invalid_params(err.to_string()))?;
- self.settings = settings;
- Ok(())
+ pub fn contains(&self, specifier: &ModuleSpecifier) -> bool {
+ self.specifier_settings.contains_key(specifier)
+ }
+
+ pub fn specifier_enabled(&self, specifier: &ModuleSpecifier) -> bool {
+ if let Some(settings) = self.specifier_settings.get(specifier) {
+ settings.enable
+ } else {
+ self.workspace_settings.enable
+ }
}
#[allow(clippy::redundant_closure_call)]
@@ -154,4 +187,68 @@ impl Config {
.unwrap_or(false);
}
}
+
+ pub fn update_specifier(
+ &mut self,
+ specifier: ModuleSpecifier,
+ value: Value,
+ ) -> LSPResult<()> {
+ let settings: SpecifierSettings = serde_json::from_value(value)
+ .map_err(|err| LSPError::invalid_params(err.to_string()))?;
+ self.specifier_settings.insert(specifier, settings);
+ Ok(())
+ }
+
+ pub fn update_workspace(&mut self, value: Value) -> LSPResult<()> {
+ let settings: WorkspaceSettings = serde_json::from_value(value)
+ .map_err(|err| LSPError::invalid_params(err.to_string()))?;
+ self.workspace_settings = settings;
+ self.specifier_settings = HashMap::new();
+ Ok(())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use deno_core::resolve_url;
+ use deno_core::serde_json::json;
+
+ #[test]
+ fn test_config_contains() {
+ let mut config = Config::default();
+ let specifier = resolve_url("https://deno.land/x/a.ts").unwrap();
+ assert!(!config.contains(&specifier));
+ config
+ .update_specifier(
+ specifier.clone(),
+ json!({
+ "enable": true
+ }),
+ )
+ .expect("could not update specifier");
+ assert!(config.contains(&specifier));
+ }
+
+ #[test]
+ fn test_config_specifier_enabled() {
+ let mut config = Config::default();
+ let specifier = resolve_url("file:///a.ts").unwrap();
+ assert!(!config.specifier_enabled(&specifier));
+ config
+ .update_workspace(json!({
+ "enable": true
+ }))
+ .expect("could not update");
+ assert!(config.specifier_enabled(&specifier));
+ config
+ .update_specifier(
+ specifier.clone(),
+ json!({
+ "enable": false
+ }),
+ )
+ .expect("could not update");
+ assert!(!config.specifier_enabled(&specifier));
+ }
}