Fix snippets from extensions being listed twice (#28940)

redforks created

lookup_snippets() merges global snippets and extension snippets, but
global_snippets::lookup_snippets() also returns extension snippets, make
them double

Closes #28661 

Release Notes:

- Fixed a bug where extension provided snippets were being displayed in
duplicate.

Change summary

Cargo.lock                         |  1 
crates/snippet_provider/Cargo.toml |  5 +++
crates/snippet_provider/src/lib.rs | 47 +++++++++++++++++++++++++++----
3 files changed, 47 insertions(+), 6 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -13330,6 +13330,7 @@ dependencies = [
  "fs",
  "futures 0.3.31",
  "gpui",
+ "indoc",
  "parking_lot",
  "paths",
  "schemars",

crates/snippet_provider/Cargo.toml 🔗

@@ -23,3 +23,8 @@ snippet.workspace = true
 util.workspace = true
 schemars.workspace = true
 workspace-hack.workspace = true
+
+[dev-dependencies]
+fs = { workspace = true, features = ["test-support"] }
+gpui = { workspace = true, features = ["test-support"] }
+indoc.workspace = true

crates/snippet_provider/src/lib.rs 🔗

@@ -222,14 +222,14 @@ impl SnippetProvider {
                         .lookup_snippets::<false>(language, cx),
                 );
             }
-        }
 
-        let Some(registry) = SnippetRegistry::try_global(cx) else {
-            return user_snippets;
-        };
+            let Some(registry) = SnippetRegistry::try_global(cx) else {
+                return user_snippets;
+            };
 
-        let registry_snippets = registry.get_snippets(language);
-        user_snippets.extend(registry_snippets);
+            let registry_snippets = registry.get_snippets(language);
+            user_snippets.extend(registry_snippets);
+        }
 
         user_snippets
     }
@@ -244,3 +244,38 @@ impl SnippetProvider {
         requested_snippets
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use fs::FakeFs;
+    use gpui;
+    use gpui::TestAppContext;
+    use indoc::indoc;
+
+    #[gpui::test]
+    fn test_lookup_snippets_dup_registry_snippets(cx: &mut TestAppContext) {
+        let fs = FakeFs::new(cx.background_executor.clone());
+        cx.update(|cx| {
+            SnippetRegistry::init_global(cx);
+            SnippetRegistry::global(cx)
+                .register_snippets(
+                    "ruby".as_ref(),
+                    indoc! {r#"
+                    {
+                      "Log to console": {
+                        "prefix": "log",
+                        "body": ["console.info(\"Hello, ${1:World}!\")", "$0"],
+                        "description": "Logs to console"
+                      }
+                    }
+            "#},
+                )
+                .unwrap();
+            let provider = SnippetProvider::new(fs.clone(), Default::default(), cx);
+            cx.update_entity(&provider, |provider, cx| {
+                assert_eq!(1, provider.snippets_for(Some("ruby".to_owned()), cx).len());
+            });
+        });
+    }
+}