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.rs28
1 files changed, 16 insertions, 12 deletions
diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs
index 304a53b8b..e80851429 100644
--- a/cli/lsp/config.rs
+++ b/cli/lsp/config.rs
@@ -777,11 +777,12 @@ impl ConfigSnapshot {
pub struct Settings {
pub unscoped: WorkspaceSettings,
pub by_workspace_folder: BTreeMap<ModuleSpecifier, Option<WorkspaceSettings>>,
+ pub first_folder: Option<ModuleSpecifier>,
}
impl Settings {
pub fn first_root_uri(&self) -> Option<&ModuleSpecifier> {
- self.by_workspace_folder.first_key_value().map(|e| e.0)
+ self.first_folder.as_ref()
}
/// Returns `None` if the value should be deferred to the presence of a
@@ -836,13 +837,11 @@ impl Settings {
let Ok(path) = specifier_to_file_path(specifier) else {
return (&self.unscoped, None);
};
- let mut is_first_folder = true;
for (folder_uri, settings) in self.by_workspace_folder.iter().rev() {
let mut settings = settings.as_ref();
- if is_first_folder {
+ if self.first_folder.as_ref() == Some(folder_uri) {
settings = settings.or(Some(&self.unscoped));
}
- is_first_folder = false;
if let Some(settings) = settings {
let Ok(folder_path) = specifier_to_file_path(folder_uri) else {
continue;
@@ -870,6 +869,7 @@ impl Settings {
.map(|s| (&s.enable, &s.enable_paths, &s.disable_paths)),
);
}
+ hasher.write_hashable(&self.first_folder);
hasher.finish()
}
}
@@ -908,6 +908,7 @@ impl Config {
) {
self.settings.by_workspace_folder =
folders.iter().map(|(s, _)| (s.clone(), None)).collect();
+ self.settings.first_folder = folders.first().map(|(s, _)| s.clone());
self.workspace_folders = folders;
}
@@ -1125,6 +1126,7 @@ pub struct ConfigData {
pub lockfile: Option<Arc<Mutex<Lockfile>>>,
pub package_json: Option<Arc<PackageJson>>,
pub import_map: Option<Arc<ImportMap>>,
+ pub import_map_from_settings: bool,
watched_files: HashMap<ModuleSpecifier, ConfigWatchedFileType>,
}
@@ -1317,6 +1319,7 @@ impl ConfigData {
let mut import_map = None;
let mut import_map_value = None;
let mut import_map_specifier = None;
+ let mut import_map_from_settings = false;
if let Some(config_file) = &config_file {
if config_file.is_an_import_map() {
import_map_value = Some(config_file.to_import_map_value_from_imports());
@@ -1325,15 +1328,15 @@ impl ConfigData {
{
import_map_specifier = Some(specifier);
}
- } else if let Some(import_map_str) = &settings.import_map {
- if let Ok(specifier) = Url::parse(import_map_str) {
- import_map_specifier = Some(specifier);
- } else if let Some(folder_uri) = workspace_folder {
- if let Ok(specifier) = folder_uri.join(import_map_str) {
- import_map_specifier = Some(specifier);
- }
- }
}
+ import_map_specifier = import_map_specifier.or_else(|| {
+ let import_map_str = settings.import_map.as_ref()?;
+ let specifier = Url::parse(import_map_str)
+ .ok()
+ .or_else(|| workspace_folder?.join(import_map_str).ok())?;
+ import_map_from_settings = true;
+ Some(specifier)
+ });
if let Some(specifier) = &import_map_specifier {
if let Ok(path) = specifier_to_file_path(specifier) {
watched_files
@@ -1416,6 +1419,7 @@ impl ConfigData {
lockfile: lockfile.map(Mutex::new).map(Arc::new),
package_json: package_json.map(Arc::new),
import_map: import_map.map(Arc::new),
+ import_map_from_settings,
watched_files,
}
}