84 lines · 2.6 KB · Rust
RawDownload
//! Provides support for language toolchains.//!//! A language can have associated toolchains,//! which is a set of tools used to interact with the projects written in said language.//! For example, a Python project can have an associated virtual environment; a Rust project can have a toolchain override. use std::{path::PathBuf, sync::Arc}; use async_trait::async_trait;use collections::HashMap; use futures::future::BoxFuture;use gpui::{App, AsyncApp};use settings::WorktreeId;use task::ShellKind;use util::rel_path::RelPath; use crate::LanguageName; // Re-export core data types from language_core.pub use language_core::{Toolchain, ToolchainList, ToolchainMetadata, ToolchainScope}; #[async_trait]pub trait ToolchainLister: Send + Sync + 'static {    /// List all available toolchains for a given path.    async fn list(        &self,        worktree_root: PathBuf,        subroot_relative_path: Arc<RelPath>,        project_env: Option<HashMap<String, String>>,    ) -> ToolchainList;     /// Given a user-created toolchain, resolve lister-specific details.    /// Put another way: fill in the details of the toolchain so the user does not have to.    async fn resolve(        &self,        path: PathBuf,        project_env: Option<HashMap<String, String>>,    ) -> anyhow::Result<Toolchain>;     fn activation_script(        &self,        toolchain: &Toolchain,        shell: ShellKind,        cx: &App,    ) -> BoxFuture<'static, Vec<String>>;     /// Returns various "static" bits of information about this toolchain lister. This function should be pure.    fn meta(&self) -> ToolchainMetadata;} #[async_trait(?Send)]pub trait LanguageToolchainStore: Send + Sync + 'static {    async fn active_toolchain(        self: Arc<Self>,        worktree_id: WorktreeId,        relative_path: Arc<RelPath>,        language_name: LanguageName,        cx: &mut AsyncApp,    ) -> Option<Toolchain>;} pub trait LocalLanguageToolchainStore: Send + Sync + 'static {    fn active_toolchain(        self: Arc<Self>,        worktree_id: WorktreeId,        relative_path: &Arc<RelPath>,        language_name: LanguageName,        cx: &mut AsyncApp,    ) -> Option<Toolchain>;} #[async_trait(?Send)]impl<T: LocalLanguageToolchainStore> LanguageToolchainStore for T {    async fn active_toolchain(        self: Arc<Self>,        worktree_id: WorktreeId,        relative_path: Arc<RelPath>,        language_name: LanguageName,        cx: &mut AsyncApp,    ) -> Option<Toolchain> {        self.active_toolchain(worktree_id, &relative_path, language_name, cx)    }}