summaryrefslogtreecommitdiff
path: root/cli/lsp
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-09-11 00:20:03 +0100
committerGitHub <noreply@github.com>2024-09-11 00:20:03 +0100
commitf959297dcd382b25bdedd0ff6aa27e8fb40e7ecd (patch)
treef30f58be88150fb49b6207aee79058714197f3aa /cli/lsp
parent4865ae13e1a637a86de1266f1f5147b6142872c6 (diff)
feat(lsp): unstable setting as list (#25552)
Diffstat (limited to 'cli/lsp')
-rw-r--r--cli/lsp/config.rs56
-rw-r--r--cli/lsp/language_server.rs6
-rw-r--r--cli/lsp/repl.rs2
-rw-r--r--cli/lsp/testing/execution.rs41
4 files changed, 83 insertions, 22 deletions
diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs
index c9729a5e5..c5d064285 100644
--- a/cli/lsp/config.rs
+++ b/cli/lsp/config.rs
@@ -43,6 +43,8 @@ use indexmap::IndexSet;
use lsp_types::ClientCapabilities;
use std::collections::BTreeMap;
use std::collections::HashMap;
+use std::ops::Deref;
+use std::ops::DerefMut;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
@@ -70,6 +72,54 @@ fn is_true() -> bool {
true
}
+/// Wrapper that defaults if it fails to deserialize. Good for individual
+/// settings.
+#[derive(Debug, Default, Clone, Eq, PartialEq)]
+pub struct SafeValue<T> {
+ inner: T,
+}
+
+impl<'de, T: Default + for<'de2> Deserialize<'de2>> Deserialize<'de>
+ for SafeValue<T>
+{
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: serde::Deserializer<'de>,
+ {
+ Ok(Self {
+ inner: Deserialize::deserialize(deserializer).unwrap_or_default(),
+ })
+ }
+}
+
+impl<T: Serialize> Serialize for SafeValue<T> {
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ where
+ S: serde::Serializer,
+ {
+ self.inner.serialize(serializer)
+ }
+}
+
+impl<T> Deref for SafeValue<T> {
+ type Target = T;
+ fn deref(&self) -> &Self::Target {
+ &self.inner
+ }
+}
+
+impl<T> DerefMut for SafeValue<T> {
+ fn deref_mut(&mut self) -> &mut T {
+ &mut self.inner
+ }
+}
+
+impl<T> SafeValue<T> {
+ pub fn as_deref(&self) -> &T {
+ &self.inner
+ }
+}
+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CodeLensSettings {
@@ -538,7 +588,7 @@ pub struct WorkspaceSettings {
pub unsafely_ignore_certificate_errors: Option<Vec<String>>,
#[serde(default)]
- pub unstable: bool,
+ pub unstable: SafeValue<Vec<String>>,
#[serde(default)]
pub javascript: LanguageWorkspaceSettings,
@@ -568,7 +618,7 @@ impl Default for WorkspaceSettings {
testing: Default::default(),
tls_certificate: None,
unsafely_ignore_certificate_errors: None,
- unstable: false,
+ unstable: Default::default(),
javascript: Default::default(),
typescript: Default::default(),
}
@@ -2141,7 +2191,7 @@ mod tests {
},
tls_certificate: None,
unsafely_ignore_certificate_errors: None,
- unstable: false,
+ unstable: Default::default(),
javascript: LanguageWorkspaceSettings {
inlay_hints: InlayHintsSettings {
parameter_names: InlayHintsParamNamesOptions {
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index 2bb13e5e4..d025d35a8 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -3859,7 +3859,11 @@ impl Inner {
</details>
"#,
- serde_json::to_string_pretty(&workspace_settings).unwrap(),
+ serde_json::to_string_pretty(&workspace_settings)
+ .inspect_err(|e| {
+ dbg!(e);
+ })
+ .unwrap(),
documents_specifiers.len(),
documents_specifiers
.into_iter()
diff --git a/cli/lsp/repl.rs b/cli/lsp/repl.rs
index 85d3a022e..a238a22cc 100644
--- a/cli/lsp/repl.rs
+++ b/cli/lsp/repl.rs
@@ -311,7 +311,7 @@ pub fn get_repl_workspace_settings() -> WorkspaceSettings {
document_preload_limit: 0, // don't pre-load any modules as it's expensive and not useful for the repl
tls_certificate: None,
unsafely_ignore_certificate_errors: None,
- unstable: false,
+ unstable: Default::default(),
suggest: DenoCompletionSettings {
imports: ImportCompletionSettings {
auto_discover: false,
diff --git a/cli/lsp/testing/execution.rs b/cli/lsp/testing/execution.rs
index 4ac565aa0..a952f2c49 100644
--- a/cli/lsp/testing/execution.rs
+++ b/cli/lsp/testing/execution.rs
@@ -33,6 +33,7 @@ use deno_runtime::deno_permissions::Permissions;
use deno_runtime::tokio_util::create_and_run_current_thread;
use indexmap::IndexMap;
use lsp_types::Uri;
+use std::borrow::Cow;
use std::collections::HashMap;
use std::collections::HashSet;
use std::num::NonZeroUsize;
@@ -219,8 +220,9 @@ impl TestRun {
) -> Result<(), AnyError> {
let args = self.get_args();
lsp_log!("Executing test run with arguments: {}", args.join(" "));
- let flags =
- Arc::new(flags_from_vec(args.into_iter().map(From::from).collect())?);
+ let flags = Arc::new(flags_from_vec(
+ args.into_iter().map(|s| From::from(s.as_ref())).collect(),
+ )?);
let factory = CliFactory::from_flags(flags);
let cli_options = factory.cli_options()?;
// Various test files should not share the same permissions in terms of
@@ -452,37 +454,42 @@ impl TestRun {
Ok(())
}
- fn get_args(&self) -> Vec<&str> {
- let mut args = vec!["deno", "test"];
+ fn get_args(&self) -> Vec<Cow<str>> {
+ let mut args = vec![Cow::Borrowed("deno"), Cow::Borrowed("test")];
args.extend(
self
.workspace_settings
.testing
.args
.iter()
- .map(|s| s.as_str()),
+ .map(|s| Cow::Borrowed(s.as_str())),
);
- args.push("--trace-leaks");
- if self.workspace_settings.unstable && !args.contains(&"--unstable") {
- args.push("--unstable");
+ args.push(Cow::Borrowed("--trace-leaks"));
+ for unstable_feature in self.workspace_settings.unstable.as_deref() {
+ let flag = format!("--unstable-{unstable_feature}");
+ if !args.contains(&Cow::Borrowed(&flag)) {
+ args.push(Cow::Owned(flag));
+ }
}
if let Some(config) = &self.workspace_settings.config {
- if !args.contains(&"--config") && !args.contains(&"-c") {
- args.push("--config");
- args.push(config.as_str());
+ if !args.contains(&Cow::Borrowed("--config"))
+ && !args.contains(&Cow::Borrowed("-c"))
+ {
+ args.push(Cow::Borrowed("--config"));
+ args.push(Cow::Borrowed(config.as_str()));
}
}
if let Some(import_map) = &self.workspace_settings.import_map {
- if !args.contains(&"--import-map") {
- args.push("--import-map");
- args.push(import_map.as_str());
+ if !args.contains(&Cow::Borrowed("--import-map")) {
+ args.push(Cow::Borrowed("--import-map"));
+ args.push(Cow::Borrowed(import_map.as_str()));
}
}
if self.kind == lsp_custom::TestRunKind::Debug
- && !args.contains(&"--inspect")
- && !args.contains(&"--inspect-brk")
+ && !args.contains(&Cow::Borrowed("--inspect"))
+ && !args.contains(&Cow::Borrowed("--inspect-brk"))
{
- args.push("--inspect");
+ args.push(Cow::Borrowed("--inspect"));
}
args
}