Fix the bugs

Kirill Bulatov created

Change summary

crates/prettier/src/prettier.rs | 11 ++++
crates/project/src/project.rs   | 72 +++++++++++++++++++---------------
2 files changed, 50 insertions(+), 33 deletions(-)

Detailed changes

crates/prettier/src/prettier.rs 🔗

@@ -63,6 +63,15 @@ impl Prettier {
             .components()
             .take_while(|component| !is_node_modules(component))
             .collect::<PathBuf>();
+        let path_to_check_metadata = fs
+            .metadata(&path_to_check)
+            .await
+            .with_context(|| format!("failed to get metadata for initial path {path_to_check:?}"))?
+            .with_context(|| format!("empty metadata for initial path {path_to_check:?}"))?;
+        if !path_to_check_metadata.is_dir {
+            path_to_check.pop();
+        }
+
         let mut project_path_with_prettier_dependency = None;
         loop {
             if installed_prettiers.contains(&path_to_check) {
@@ -361,7 +370,7 @@ async fn read_package_json(
     if let Some(package_json_metadata) = fs
         .metadata(&possible_package_json)
         .await
-        .with_context(|| format!("Fetching metadata for {possible_package_json:?}"))?
+        .with_context(|| format!("fetching metadata for package json {possible_package_json:?}"))?
     {
         if !package_json_metadata.is_dir && !package_json_metadata.is_symlink {
             let package_json_contents = fs

crates/project/src/project.rs 🔗

@@ -8464,9 +8464,9 @@ impl Project {
                             Err(e) => {
                                 return Some((
                                     None,
-                                    Task::ready(Err(Arc::new(e.context(
-                                        "determining prettier path for worktree {worktree_path:?}",
-                                    ))))
+                                    Task::ready(Err(Arc::new(
+                                        e.context("determining prettier path"),
+                                    )))
                                     .shared(),
                                 ));
                             }
@@ -8481,7 +8481,7 @@ impl Project {
 
                                 log::info!("Found prettier in {prettier_dir:?}, starting.");
                                 let task_prettier_dir = prettier_dir.clone();
-                                let weak_project = project.downgrade();
+                                let task_project = project.clone();
                                 let new_server_id = project.update(&mut cx, |this, _| {
                                     this.languages.next_language_server_id()
                                 });
@@ -8496,33 +8496,12 @@ impl Project {
                                         .await
                                         .context("prettier start")
                                         .map_err(Arc::new)?;
-                                        log::info!(
-                                            "Started prettier in {:?}",
-                                            prettier.prettier_dir()
+                                        register_new_prettier(
+                                            &task_project,
+                                            &prettier,
+                                            new_server_id,
+                                            &mut cx,
                                         );
-
-                                        if let Some((project, prettier_server)) =
-                                            weak_project.upgrade(&mut cx).zip(prettier.server())
-                                        {
-                                            project.update(&mut cx, |project, cx| {
-                                                let name = if prettier.is_default() {
-                                                    LanguageServerName(Arc::from(
-                                                        "prettier (default)",
-                                                    ))
-                                                } else {
-                                                    LanguageServerName(Arc::from(format!(
-                                                        "prettier ({})",
-                                                        prettier.prettier_dir().display(),
-                                                    )))
-                                                };
-
-                                                project.supplementary_language_servers.insert(
-                                                    new_server_id,
-                                                    (name, Arc::clone(prettier_server)),
-                                                );
-                                                cx.emit(Event::LanguageServerAdded(new_server_id));
-                                            });
-                                        }
                                         Ok(Arc::new(prettier)).map_err(Arc::new)
                                     })
                                     .shared();
@@ -8678,6 +8657,31 @@ impl Project {
     }
 }
 
+fn register_new_prettier(
+    project: &ModelHandle<Project>,
+    prettier: &Prettier,
+    new_server_id: LanguageServerId,
+    cx: &mut AsyncAppContext,
+) {
+    log::info!("Started prettier in {:?}", prettier.prettier_dir());
+    if let Some(prettier_server) = prettier.server() {
+        project.update(cx, |project, cx| {
+            let name = if prettier.is_default() {
+                LanguageServerName(Arc::from("prettier (default)"))
+            } else {
+                LanguageServerName(Arc::from(format!(
+                    "prettier ({})",
+                    prettier.prettier_dir().display(),
+                )))
+            };
+            project
+                .supplementary_language_servers
+                .insert(new_server_id, (name, Arc::clone(prettier_server)));
+            cx.emit(Event::LanguageServerAdded(new_server_id));
+        });
+    }
+}
+
 fn spawn_default_prettier(
     node: Arc<dyn NodeRuntime>,
     cx: &mut ModelContext<'_, Project>,
@@ -8686,7 +8690,7 @@ fn spawn_default_prettier(
         let new_server_id = project.update(&mut cx, |project, _| {
             project.languages.next_language_server_id()
         });
-        Prettier::start(
+        let new_prettier = Prettier::start(
             new_server_id,
             DEFAULT_PRETTIER_DIR.clone(),
             node,
@@ -8695,7 +8699,11 @@ fn spawn_default_prettier(
         .await
         .context("default prettier spawn")
         .map(Arc::new)
-        .map_err(Arc::new)
+        .map_err(Arc::new)?;
+
+        register_new_prettier(&project, &new_prettier, new_server_id, &mut cx);
+
+        Ok(new_prettier)
     })
     .shared()
 }