Detailed changes
@@ -30,7 +30,7 @@ use project::{Project, debugger::session::ThreadStatus};
use rpc::proto::{self};
use settings::Settings;
use std::sync::{Arc, LazyLock};
-use task::{DebugScenario, TaskContext};
+use task::{DebugScenario, SharedTaskContext};
use tree_sitter::{Query, StreamingIterator as _};
use ui::{
ContextMenu, Divider, PopoverMenu, PopoverMenuHandle, SplitButton, Tab, Tooltip, prelude::*,
@@ -176,7 +176,7 @@ impl DebugPanel {
pub fn start_session(
&mut self,
scenario: DebugScenario,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
active_buffer: Option<Entity<Buffer>>,
worktree_id: Option<WorktreeId>,
window: &mut Window,
@@ -227,9 +227,6 @@ impl DebugPanel {
inventory.update(cx, |inventory, _| {
inventory.scenario_scheduled(
scenario.clone(),
- // todo(debugger): Task context is cloned three times
- // once in Session,inventory, and in resolve scenario
- // we should wrap it in an RC instead to save some memory
task_context.clone(),
worktree_id,
active_buffer.as_ref().map(|buffer| buffer.downgrade()),
@@ -1957,7 +1954,7 @@ impl workspace::DebuggerProvider for DebuggerProvider {
fn start_session(
&self,
definition: DebugScenario,
- context: TaskContext,
+ context: SharedTaskContext,
buffer: Option<Entity<Buffer>>,
worktree_id: Option<WorktreeId>,
window: &mut Window,
@@ -21,7 +21,7 @@ use gpui::{
use itertools::Itertools as _;
use picker::{Picker, PickerDelegate, highlighted_match_with_paths::HighlightedMatch};
use project::{DebugScenarioContext, Project, TaskContexts, TaskSourceKind, task_store::TaskStore};
-use task::{DebugScenario, RevealTarget, VariableName, ZedDebugConfig};
+use task::{DebugScenario, RevealTarget, SharedTaskContext, VariableName, ZedDebugConfig};
use ui::{
ContextMenu, DropdownMenu, IconWithIndicator, Indicator, KeyBinding, ListItem, ListItemSpacing,
Switch, SwitchLabelPosition, ToggleButtonGroup, ToggleButtonSimple, ToggleState, Tooltip,
@@ -371,7 +371,11 @@ impl NewProcessModal {
return;
};
- let task_context = task_contexts.active_context().cloned().unwrap_or_default();
+ let task_context = task_contexts
+ .active_context()
+ .cloned()
+ .unwrap_or_default()
+ .into();
let worktree_id = task_contexts.worktree();
let mode = self.mode;
cx.spawn_in(window, async move |this, cx| {
@@ -1292,7 +1296,7 @@ impl PickerDelegate for DebugDelegate {
.as_ref()
.and_then(|task_contexts| {
Some((
- task_contexts.active_context().cloned()?,
+ SharedTaskContext::from(task_contexts.active_context().cloned()?),
task_contexts.worktree(),
))
})
@@ -1418,7 +1422,7 @@ impl PickerDelegate for DebugDelegate {
.as_ref()
.and_then(|task_contexts| {
Some(DebugScenarioContext {
- task_context: task_contexts.active_context().cloned()?,
+ task_context: task_contexts.active_context().cloned()?.into(),
active_buffer: None,
worktree_id: task_contexts.worktree(),
})
@@ -48,8 +48,8 @@ use serde_json::Value;
use settings::Settings;
use stack_frame_list::StackFrameList;
use task::{
- BuildTaskDefinition, DebugScenario, Shell, ShellBuilder, SpawnInTerminal, TaskContext,
- ZedDebugConfig, substitute_variables_in_str,
+ BuildTaskDefinition, DebugScenario, SharedTaskContext, Shell, ShellBuilder, SpawnInTerminal,
+ TaskContext, ZedDebugConfig, substitute_variables_in_str,
};
use terminal_view::TerminalView;
use ui::{
@@ -956,7 +956,7 @@ impl RunningState {
pub(crate) fn resolve_scenario(
&self,
scenario: DebugScenario,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
buffer: Option<Entity<Buffer>>,
worktree_id: Option<WorktreeId>,
window: &Window,
@@ -6,7 +6,7 @@ use dap::client::DebugAdapterClient;
use gpui::{Entity, TestAppContext, WindowHandle};
use project::{Project, debugger::session::Session};
use settings::SettingsStore;
-use task::TaskContext;
+use task::SharedTaskContext;
use terminal_view::terminal_panel::TerminalPanel;
use workspace::Workspace;
@@ -110,7 +110,7 @@ pub fn start_debug_session_with<T: Fn(&Arc<DebugAdapterClient>) + 'static>(
workspace.update(cx, |workspace, window, cx| {
workspace.start_debug_session(
config.to_scenario(),
- TaskContext::default(),
+ SharedTaskContext::default(),
None,
None,
window,
@@ -9,7 +9,7 @@ use gpui::{BackgroundExecutor, TestAppContext, VisualTestContext};
use menu::Confirm;
use project::{FakeFs, Project};
use serde_json::json;
-use task::AttachRequest;
+use task::{AttachRequest, SharedTaskContext};
use tests::{init_test, init_test_workspace};
use util::path;
@@ -220,7 +220,7 @@ async fn test_attach_with_pick_pid_variable(executor: BackgroundExecutor, cx: &m
tcp_connection: None,
}
.to_scenario(),
- task::TaskContext::default(),
+ SharedTaskContext::default(),
None,
None,
window,
@@ -5,7 +5,10 @@ use project::{FakeFs, Fs as _, Project};
use serde_json::json;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
-use task::{DebugRequest, DebugScenario, LaunchRequest, TaskContext, VariableName, ZedDebugConfig};
+use task::{
+ DebugRequest, DebugScenario, LaunchRequest, SharedTaskContext, TaskContext, VariableName,
+ ZedDebugConfig,
+};
use text::Point;
use util::path;
@@ -40,11 +43,12 @@ async fn test_debug_session_substitutes_variables_and_relativizes_paths(
.into_iter()
.collect();
- let task_context = TaskContext {
+ let task_context: SharedTaskContext = TaskContext {
cwd: None,
task_variables: test_variables,
project_env: Default::default(),
- };
+ }
+ .into();
let home_dir = paths::home_dir();
@@ -6840,7 +6840,7 @@ impl Editor {
}))
}
CodeActionsItem::DebugScenario(scenario) => {
- let context = actions_menu.actions.context;
+ let context = actions_menu.actions.context.into();
workspace.update(cx, |workspace, cx| {
dap::send_telemetry(&scenario, TelemetrySpawnLocation::Gutter, cx);
@@ -51,7 +51,7 @@ use std::{
path::{Path, PathBuf},
sync::{Arc, Once},
};
-use task::{DebugScenario, SpawnInTerminal, TaskContext, TaskTemplate};
+use task::{DebugScenario, SharedTaskContext, SpawnInTerminal, TaskTemplate};
use util::{ResultExt as _, rel_path::RelPath};
use worktree::Worktree;
@@ -451,7 +451,7 @@ impl DapStore {
&mut self,
label: Option<SharedString>,
adapter: DebugAdapterName,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
parent_session: Option<Entity<Session>>,
quirks: SessionQuirks,
cx: &mut Context<Self>,
@@ -61,7 +61,7 @@ use std::{
path::Path,
sync::Arc,
};
-use task::TaskContext;
+use task::SharedTaskContext;
use text::{PointUtf16, ToPointUtf16};
use url::Url;
use util::command::new_smol_command;
@@ -711,7 +711,7 @@ pub struct Session {
data_breakpoints: BTreeMap<String, DataBreakpointState>,
background_tasks: Vec<Task<()>>,
restart_task: Option<Task<()>>,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
memory: memory::Memory,
quirks: SessionQuirks,
remote_client: Option<Entity<RemoteClient>>,
@@ -833,7 +833,7 @@ impl Session {
parent_session: Option<Entity<Session>>,
label: Option<SharedString>,
adapter: DebugAdapterName,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
quirks: SessionQuirks,
remote_client: Option<Entity<RemoteClient>>,
node_runtime: Option<NodeRuntime>,
@@ -897,7 +897,7 @@ impl Session {
})
}
- pub fn task_context(&self) -> &TaskContext {
+ pub fn task_context(&self) -> &SharedTaskContext {
&self.task_context
}
@@ -21,8 +21,8 @@ use lsp::{LanguageServerId, LanguageServerName};
use paths::{debug_task_file_name, task_file_name};
use settings::{InvalidSettingsError, parse_json_with_comments};
use task::{
- DebugScenario, ResolvedTask, TaskContext, TaskId, TaskTemplate, TaskTemplates, TaskVariables,
- VariableName,
+ DebugScenario, ResolvedTask, SharedTaskContext, TaskContext, TaskId, TaskTemplate,
+ TaskTemplates, TaskVariables, VariableName,
};
use text::{BufferId, Point, ToPoint};
use util::{NumericPrefixWithSuffix, ResultExt as _, post_inc, rel_path::RelPath};
@@ -32,7 +32,7 @@ use crate::{task_store::TaskSettingsLocation, worktree_store::WorktreeStore};
#[derive(Clone, Debug, Default)]
pub struct DebugScenarioContext {
- pub task_context: TaskContext,
+ pub task_context: SharedTaskContext,
pub worktree_id: Option<WorktreeId>,
pub active_buffer: Option<WeakEntity<Buffer>>,
}
@@ -252,7 +252,7 @@ impl Inventory {
pub fn scenario_scheduled(
&mut self,
scenario: DebugScenario,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
worktree_id: Option<WorktreeId>,
active_buffer: Option<WeakEntity<Buffer>>,
) {
@@ -15,6 +15,7 @@ use serde::{Deserialize, Serialize};
use std::borrow::Cow;
use std::path::PathBuf;
use std::str::FromStr;
+use std::sync::Arc;
pub use adapter_schema::{AdapterSchema, AdapterSchemas};
pub use debug_format::{
@@ -316,6 +317,24 @@ pub struct TaskContext {
pub project_env: HashMap<String, String>,
}
+/// A shared reference to a [`TaskContext`], used to avoid cloning the context multiple times.
+#[derive(Clone, Debug, Default)]
+pub struct SharedTaskContext(Arc<TaskContext>);
+
+impl std::ops::Deref for SharedTaskContext {
+ type Target = TaskContext;
+
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+impl From<TaskContext> for SharedTaskContext {
+ fn from(context: TaskContext) -> Self {
+ Self(Arc::new(context))
+ }
+}
+
/// This is a new type representing a 'tag' on a 'runnable symbol', typically a test of main() function, found via treesitter.
#[derive(Clone, Debug)]
pub struct RunnableTag(pub SharedString);
@@ -5,7 +5,9 @@ use gpui::{AppContext, Context, Entity, Task};
use language::Buffer;
use project::{TaskSourceKind, WorktreeId};
use remote::ConnectionState;
-use task::{DebugScenario, ResolvedTask, SpawnInTerminal, TaskContext, TaskTemplate};
+use task::{
+ DebugScenario, ResolvedTask, SharedTaskContext, SpawnInTerminal, TaskContext, TaskTemplate,
+};
use ui::Window;
use crate::{Toast, Workspace, notifications::NotificationId};
@@ -101,7 +103,7 @@ impl Workspace {
pub fn start_debug_session(
&mut self,
scenario: DebugScenario,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
active_buffer: Option<Entity<Buffer>>,
worktree_id: Option<WorktreeId>,
window: &mut Window,
@@ -116,7 +116,7 @@ use std::{
},
time::Duration,
};
-use task::{DebugScenario, SpawnInTerminal, TaskContext};
+use task::{DebugScenario, SharedTaskContext, SpawnInTerminal};
use theme::{ActiveTheme, GlobalTheme, SystemAppearance, ThemeSettings};
pub use toolbar::{Toolbar, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView};
pub use ui;
@@ -178,7 +178,7 @@ pub trait DebuggerProvider {
fn start_session(
&self,
definition: DebugScenario,
- task_context: TaskContext,
+ task_context: SharedTaskContext,
active_buffer: Option<Entity<Buffer>>,
worktree_id: Option<WorktreeId>,
window: &mut Window,