Require theme directly when creating language

Isaac Clayton created

Change summary

crates/language/src/language.rs  | 19 ++++++++++++-------
crates/project/src/project.rs    | 10 ++++++++--
crates/zed/src/main.rs           |  1 +
plugins/json_language/src/lib.rs |  5 -----
4 files changed, 21 insertions(+), 14 deletions(-)

Detailed changes

crates/language/src/language.rs 🔗

@@ -14,7 +14,7 @@ use futures::{
     future::{BoxFuture, Shared},
     FutureExt, TryFutureExt,
 };
-use gpui::{MutableAppContext, Task};
+use gpui::{AsyncAppContext, MutableAppContext, Task};
 use highlight_map::HighlightMap;
 use lazy_static::lazy_static;
 use parking_lot::{Mutex, RwLock};
@@ -339,8 +339,9 @@ impl LanguageRegistry {
         Self::new(Task::ready(()))
     }
 
-    pub fn add(&self, language: Arc<Language>) {
+    pub fn add(&self, language: Arc<Language>, theme: &SyntaxTheme) {
         self.languages.write().push(language.clone());
+        language.set_theme(theme);
         *self.subscription.write().0.borrow_mut() = ();
     }
 
@@ -387,11 +388,14 @@ impl LanguageRegistry {
             .read()
             .iter()
             .find(|language| {
-                language
-                    .config
-                    .path_suffixes
-                    .iter()
-                    .any(|suffix| dbg!(path_suffixes.contains(&Some(dbg!(suffix.as_str())))))
+                language.config.path_suffixes.iter().any(|suffix| {
+                    if path_suffixes.contains(&Some(suffix.as_str())) {
+                        dbg!(format!("found {}", suffix));
+                        true
+                    } else {
+                        false
+                    }
+                })
             })
             .cloned()
     }
@@ -713,6 +717,7 @@ impl Language {
             if let Some(highlights_query) = &grammar.highlights_query {
                 *grammar.highlight_map.lock() =
                     HighlightMap::new(highlights_query.capture_names(), theme);
+                dbg!("highlighting");
             }
         }
     }

crates/project/src/project.rs 🔗

@@ -2028,7 +2028,7 @@ impl Project {
     ) -> Task<()> {
         let mut subscription = languages.subscribe();
         cx.spawn_weak(|project, mut cx| async move {
-            while let Some(_) = subscription.next().await {
+            while let Some(()) = subscription.next().await {
                 if let Some(project) = project.upgrade(&cx) {
                     project.update(&mut cx, |project, cx| {
                         let mut buffers_without_language = Vec::new();
@@ -2041,8 +2041,10 @@ impl Project {
                         }
 
                         for buffer in buffers_without_language {
+                            dbg!("notified that new language was added");
                             project.assign_language_to_buffer(&buffer, cx);
                             project.register_buffer_with_language_server(&buffer, cx);
+                            dbg!(buffer.read(cx).language().map(|x| x.name()));
                         }
                     });
                 }
@@ -2055,6 +2057,7 @@ impl Project {
         buffer: &ModelHandle<Buffer>,
         cx: &mut ModelContext<Self>,
     ) -> Option<()> {
+        dbg!("assigning language to buffer");
         // If the buffer has a language, set it and start the language server if we haven't already.
         let full_path = buffer.read(cx).file()?.full_path(cx);
         let language = self.languages.select_language(&full_path)?;
@@ -2078,6 +2081,7 @@ impl Project {
         language: Arc<Language>,
         cx: &mut ModelContext<Self>,
     ) {
+        dbg!(format!("starting lsp for {:?}", language.name()));
         if !cx
             .global::<Settings>()
             .enable_language_server(Some(&language.name()))
@@ -2343,6 +2347,8 @@ impl Project {
 
                 server_id
             });
+
+        dbg!("Done starting lsp");
     }
 
     // Returns a list of all of the worktrees which no longer have a language server and the root path
@@ -3273,8 +3279,8 @@ impl Project {
         position: T,
         cx: &mut ModelContext<Self>,
     ) -> Task<Result<Vec<DocumentHighlight>>> {
+        // dbg!("getting highlights");
         let position = position.to_point_utf16(buffer.read(cx));
-
         self.request_lsp(buffer.clone(), GetDocumentHighlights { position }, cx)
     }
 

crates/zed/src/main.rs 🔗

@@ -226,6 +226,7 @@ fn main() {
             let languages = languages.clone();
             |cx| async move {
                 init_languages.await;
+                dbg!("all languages initialized, starting setting highlighting");
                 cx.read(|cx| languages.set_theme(&cx.global::<Settings>().theme.editor.syntax));
             }
         })

plugins/json_language/src/lib.rs 🔗

@@ -27,13 +27,8 @@ pub fn fetch_latest_server_version() -> Option<String> {
         versions: Vec<String>,
     }
 
-    // TODO: command returns error code
     let output =
         command("npm info vscode-json-languageserver --json").expect("could not run command");
-    // if !output.is_ok() {
-    //     return None;
-    // }
-
     let output = String::from_utf8(output).unwrap();
 
     let mut info: NpmInfo = serde_json::from_str(&output).ok()?;