extension: Make provides a method on ExtensionManifest (#49234)

This PR takes the `extension_provides` method from the `extension_cli`
and makes it a method on `ExtensionManifest`.

Release Notes:

- N/A
This commit is contained in:
Marshall Bowers authored and GitHub committed 2026-02-15 12:12:09 -05:00
1 parent 28c82ecad6
commit 2ccbed0a5e
4 files changed
+53 -52

No files matched your search

Generated
+1
View File
@@ -5937,6 +5937,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"cloud_api_types",
"collections",
"dap",
"fs",
+1
View File
@@ -14,6 +14,7 @@ path = "src/extension.rs"
[dependencies]
anyhow.workspace = true
async-trait.workspace = true
cloud_api_types.workspace = true
collections.workspace = true
dap.workspace = true
fs.workspace = true
+49 -7
View File
@@ -1,16 +1,16 @@
use std::ffi::OsStr;
use std::fmt;
use std::path::{Path, PathBuf};
use std::sync::Arc;
use anyhow::{Context as _, Result, anyhow, bail};
use collections::{BTreeMap, HashMap};
use cloud_api_types::ExtensionProvides;
use collections::{BTreeMap, BTreeSet, HashMap};
use fs::Fs;
use language::LanguageName;
use lsp::LanguageServerName;
use semver::Version;
use serde::{Deserialize, Serialize};
use std::{
ffi::OsStr,
fmt,
path::{Path, PathBuf},
sync::Arc,
};
use crate::ExtensionCapability;
@@ -122,6 +122,48 @@ pub struct ExtensionManifest {
}
impl ExtensionManifest {
/// Returns the set of features provided by the extension.
pub fn provides(&self) -> BTreeSet<ExtensionProvides> {
let mut provides = BTreeSet::default();
if !self.themes.is_empty() {
provides.insert(ExtensionProvides::Themes);
}
if !self.icon_themes.is_empty() {
provides.insert(ExtensionProvides::IconThemes);
}
if !self.languages.is_empty() {
provides.insert(ExtensionProvides::Languages);
}
if !self.grammars.is_empty() {
provides.insert(ExtensionProvides::Grammars);
}
if !self.language_servers.is_empty() {
provides.insert(ExtensionProvides::LanguageServers);
}
if !self.context_servers.is_empty() {
provides.insert(ExtensionProvides::ContextServers);
}
if !self.agent_servers.is_empty() {
provides.insert(ExtensionProvides::AgentServers);
}
if self.snippets.is_some() {
provides.insert(ExtensionProvides::Snippets);
}
if !self.debug_adapters.is_empty() {
provides.insert(ExtensionProvides::DebugAdapters);
}
provides
}
pub fn allow_exec(
&self,
desired_command: &str,
+2 -45
View File
@@ -1,4 +1,4 @@
use std::collections::{BTreeSet, HashMap};
use std::collections::HashMap;
use std::env;
use std::fs;
use std::path::{Path, PathBuf};
@@ -7,7 +7,6 @@ use std::sync::Arc;
use ::fs::{CopyOptions, Fs, RealFs, copy_recursive};
use anyhow::{Context as _, Result, anyhow, bail};
use clap::Parser;
use cloud_api_types::ExtensionProvides;
use extension::extension_builder::{CompileExtensionOptions, ExtensionBuilder};
use extension::{ExtensionManifest, ExtensionSnippets};
use language::LanguageConfig;
@@ -78,7 +77,7 @@ async fn main() -> Result<()> {
.await
.context("failed to compile extension")?;
let extension_provides = extension_provides(&manifest);
let extension_provides = manifest.provides();
if extension_provides.is_empty() {
bail!("extension does not provide any features");
@@ -126,48 +125,6 @@ async fn main() -> Result<()> {
Ok(())
}
/// Returns the set of features provided by the extension.
fn extension_provides(manifest: &ExtensionManifest) -> BTreeSet<ExtensionProvides> {
let mut provides = BTreeSet::default();
if !manifest.themes.is_empty() {
provides.insert(ExtensionProvides::Themes);
}
if !manifest.icon_themes.is_empty() {
provides.insert(ExtensionProvides::IconThemes);
}
if !manifest.languages.is_empty() {
provides.insert(ExtensionProvides::Languages);
}
if !manifest.grammars.is_empty() {
provides.insert(ExtensionProvides::Grammars);
}
if !manifest.language_servers.is_empty() {
provides.insert(ExtensionProvides::LanguageServers);
}
if !manifest.context_servers.is_empty() {
provides.insert(ExtensionProvides::ContextServers);
}
if !manifest.agent_servers.is_empty() {
provides.insert(ExtensionProvides::AgentServers);
}
if manifest.snippets.is_some() {
provides.insert(ExtensionProvides::Snippets);
}
if !manifest.debug_adapters.is_empty() {
provides.insert(ExtensionProvides::DebugAdapters);
}
provides
}
async fn copy_extension_resources(
manifest: &ExtensionManifest,
extension_path: &Path,