about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/paths/src/lib.rs5
-rw-r--r--crates/project-model/src/manifest_path.rs5
-rw-r--r--crates/project-model/src/workspace.rs9
3 files changed, 12 insertions, 7 deletions
diff --git a/crates/paths/src/lib.rs b/crates/paths/src/lib.rs
index 6ae23ac841a..ac09121aedf 100644
--- a/crates/paths/src/lib.rs
+++ b/crates/paths/src/lib.rs
@@ -166,6 +166,11 @@ impl AbsPath {
         AbsPathBuf::try_from(self.0.to_path_buf()).unwrap()
     }
 
+    /// Equivalent of [`Path::canonicalize`] for `AbsPath`.
+    pub fn canonicalize(&self) -> Result<AbsPathBuf, std::io::Error> {
+        Ok(self.as_ref().canonicalize()?.try_into().unwrap())
+    }
+
     /// Equivalent of [`Path::strip_prefix`] for `AbsPath`.
     ///
     /// Returns a relative path.
diff --git a/crates/project-model/src/manifest_path.rs b/crates/project-model/src/manifest_path.rs
index 980d92d3df9..d6754116e60 100644
--- a/crates/project-model/src/manifest_path.rs
+++ b/crates/project-model/src/manifest_path.rs
@@ -34,6 +34,11 @@ impl ManifestPath {
     pub fn parent(&self) -> &AbsPath {
         self.file.parent().unwrap()
     }
+
+    /// Equivalent of [`Path::canonicalize`] for `ManifestPath`.
+    pub fn canonicalize(&self) -> Result<ManifestPath, std::io::Error> {
+        Ok((&**self).canonicalize()?.try_into().unwrap())
+    }
 }
 
 impl ops::Deref for ManifestPath {
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index 916447fdffa..199fa1e5c2c 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -4,7 +4,7 @@
 
 use std::{collections::VecDeque, fmt, fs, process::Command, sync::Arc};
 
-use anyhow::{bail, format_err, Context, Result};
+use anyhow::{format_err, Context, Result};
 use base_db::{
     CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency, Edition, Env,
     FileId, LangCrateOrigin, ProcMacroPaths, TargetLayoutLoadResult,
@@ -154,12 +154,7 @@ impl ProjectWorkspace {
     ) -> Result<ProjectWorkspace> {
         let res = match manifest {
             ProjectManifest::ProjectJson(project_json) => {
-                let metadata = fs::symlink_metadata(&project_json).with_context(|| {
-                    format!("Failed to read json file {}", project_json.display())
-                })?;
-                if metadata.is_symlink() {
-                    bail!("The project-json may not currently point to a symlink");
-                }
+                let project_json = project_json.canonicalize()?;
                 let file = fs::read_to_string(&project_json).with_context(|| {
                     format!("Failed to read json file {}", project_json.display())
                 })?;