summaryrefslogtreecommitdiff
path: root/cli/lsp/language_server.rs
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2021-06-24 22:41:04 +1000
committerGitHub <noreply@github.com>2021-06-24 22:41:04 +1000
commit8ed83cba7e2eeabb3af1fd65579dacd782f50644 (patch)
tree30d93dbea20fd4a20cd5dc262a069fdcb456fdb0 /cli/lsp/language_server.rs
parent40310eaebfaa38eff929213f2d6b912b87ad3edf (diff)
fix(lsp): handle invalid config setting better (#11104)
Fixes #11100 Fixes #10808
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r--cli/lsp/language_server.rs95
1 files changed, 57 insertions, 38 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index 3e30d2d69..6fc450b1e 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -324,6 +324,59 @@ impl Inner {
Ok(navigation_tree)
}
+ fn merge_user_tsconfig(
+ &mut self,
+ maybe_config: &Option<String>,
+ maybe_root_uri: &Option<Url>,
+ tsconfig: &mut TsConfig,
+ ) -> Result<(), AnyError> {
+ self.maybe_config_file = None;
+ self.maybe_config_uri = None;
+ if let Some(config_str) = maybe_config {
+ if !config_str.is_empty() {
+ info!("Updating TypeScript configuration from: \"{}\"", config_str);
+ let config_url = if let Ok(url) = Url::from_file_path(config_str) {
+ Ok(url)
+ } else if let Some(root_uri) = maybe_root_uri {
+ let root_path = root_uri
+ .to_file_path()
+ .map_err(|_| anyhow!("Bad root_uri: {}", root_uri))?;
+ let config_path = root_path.join(config_str);
+ Url::from_file_path(config_path).map_err(|_| {
+ anyhow!("Bad file path for configuration file: \"{}\"", config_str)
+ })
+ } else {
+ Err(anyhow!(
+ "The path to the configuration file (\"{}\") is not resolvable.",
+ config_str
+ ))
+ }?;
+ info!(" Resolved configuration file: \"{}\"", config_url);
+
+ let config_file = {
+ let buffer = config_url
+ .to_file_path()
+ .map_err(|_| anyhow!("Bad uri: \"{}\"", config_url))?;
+ let path = buffer
+ .to_str()
+ .ok_or_else(|| anyhow!("Bad uri: \"{}\"", config_url))?;
+ ConfigFile::read(path)?
+ };
+ let (value, maybe_ignored_options) =
+ config_file.as_compiler_options()?;
+ tsconfig.merge(&value);
+ self.maybe_config_file = Some(config_file);
+ self.maybe_config_uri = Some(config_url);
+ if let Some(ignored_options) = maybe_ignored_options {
+ // TODO(@kitsonk) turn these into diagnostics that can be sent to the
+ // client
+ warn!("{}", ignored_options);
+ }
+ }
+ }
+ Ok(())
+ }
+
pub(crate) fn snapshot(&self) -> LspResult<StateSnapshot> {
Ok(StateSnapshot {
assets: self.assets.clone(),
@@ -453,44 +506,10 @@ impl Inner {
}
(workspace_settings.config, config.root_uri.clone())
};
- if let Some(config_str) = &maybe_config {
- info!("Updating TypeScript configuration from: \"{}\"", config_str);
- let config_url = if let Ok(url) = Url::from_file_path(config_str) {
- Ok(url)
- } else if let Some(root_uri) = &maybe_root_uri {
- let root_path = root_uri
- .to_file_path()
- .map_err(|_| anyhow!("Bad root_uri: {}", root_uri))?;
- let config_path = root_path.join(config_str);
- Url::from_file_path(config_path).map_err(|_| {
- anyhow!("Bad file path for configuration file: \"{}\"", config_str)
- })
- } else {
- Err(anyhow!(
- "The path to the configuration file (\"{}\") is not resolvable.",
- config_str
- ))
- }?;
- info!(" Resolved configuration file: \"{}\"", config_url);
-
- let config_file = {
- let buffer = config_url
- .to_file_path()
- .map_err(|_| anyhow!("Bad uri: \"{}\"", config_url))?;
- let path = buffer
- .to_str()
- .ok_or_else(|| anyhow!("Bad uri: \"{}\"", config_url))?;
- ConfigFile::read(path)?
- };
- let (value, maybe_ignored_options) = config_file.as_compiler_options()?;
- tsconfig.merge(&value);
- self.maybe_config_file = Some(config_file);
- self.maybe_config_uri = Some(config_url);
- if let Some(ignored_options) = maybe_ignored_options {
- // TODO(@kitsonk) turn these into diagnostics that can be sent to the
- // client
- warn!("{}", ignored_options);
- }
+ if let Err(err) =
+ self.merge_user_tsconfig(&maybe_config, &maybe_root_uri, &mut tsconfig)
+ {
+ self.client.show_message(MessageType::Warning, err).await;
}
let _ok: bool = self
.ts_server