Performance fixture: real-world Rust file pair from zed-industries/zed (crates/workspace/src/tasks.rs, commit 0698eccebb3ddd89e00081af3a8aab540478d220) that takes diff_code roughly 1.3 seconds on a combined AST of 4075 nodes (before file 4.5KB, after file 11.7KB - a large insertion). Captured via research/diff_pairs_benchmark_rust.csv; useful for regression-testing and profiling diff_code's worst-case behavior on larger real-world inputs.

This mapping has 1 multi-map group: several pairings are equally correct there. The code view shows one arbitrary valid pairing, not the only one.

Before

1use std::process::ExitStatus;
2
3use anyhow::Result;
4use gpui::{AppContext, Context, Entity, Task};
5use language::Buffer;
6use project::{TaskSourceKind, WorktreeId};
7use remote::ConnectionState;
8use task::{
9 DebugScenario, ResolvedTask, SharedTaskContext, SpawnInTerminal, TaskContext, TaskTemplate,
10};
11use ui::Window;
12
13use crate::{Toast, Workspace, notifications::NotificationId};
14
15impl Workspace {
16 pub fn schedule_task(
17 self: &mut Workspace,
18 task_source_kind: TaskSourceKind,
19 task_to_resolve: &TaskTemplate,
…lines 20–69 unchanged (50 lines)
70 inventory.task_scheduled(task_source_kind, resolved_task);
71 })
72 }
73 });
74 }
75
76 if let Some(terminal_provider) = self.terminal_provider.as_ref() {
77 let task_status = terminal_provider.spawn(spawn_in_terminal, window, cx);
78
79 let task = cx.spawn(async |w, cx| {
80 let res = cx.background_spawn(task_status).await;
81 match res {
82 Some(Ok(status)) => {
83 if status.success() {
84 log::debug!("Task spawn succeeded");
85 } else {
86 log::debug!("Task spawn failed, code: {:?}", status.code());
87 }
88 }
89 Some(Err(e)) => {
90 log::error!("Task spawn failed: {e:#}");
91 _ = w.update(cx, |w, cx| {
92 let id = NotificationId::unique::<ResolvedTask>();
93 w.show_toast(Toast::new(id, format!("Task spawn failed: {e}")), cx);
94 })
95 }
96 None => log::debug!("Task spawn got cancelled"),
97 };
98 });
99 self.scheduled_tasks.push(task);
100 }
101 }
102
103 pub fn start_debug_session(
…lines 104–130 unchanged (27 lines)
131 terminal_provider.spawn(spawn_in_terminal, window, cx)
132 } else {
133 Task::ready(None)
134 }
135 }
136}
137

After

1use std::process::ExitStatus;
2
3use anyhow::Result;
4use gpui::{AppContext, Context, Entity, Task};
5use language::Buffer;
6use project::{TaskSourceKind, WorktreeId};
7use remote::ConnectionState;
8use task::{
9 DebugScenario, ResolvedTask, SaveStrategy, SharedTaskContext, SpawnInTerminal, TaskContext,
10 TaskTemplate,
11};
12use ui::Window;
13use util::TryFutureExt;
14
15use crate::{SaveIntent, Toast, Workspace, notifications::NotificationId};
16
17impl Workspace {
18 pub fn schedule_task(
19 self: &mut Workspace,
20 task_source_kind: TaskSourceKind,
21 task_to_resolve: &TaskTemplate,
…lines 22–71 unchanged (50 lines)
72 inventory.task_scheduled(task_source_kind, resolved_task);
73 })
74 }
75 });
76 }
77
78 if self.terminal_provider.is_some() {
79 let task = cx.spawn_in(window, async move |workspace, cx| {
80 let save_action = match spawn_in_terminal.save {
81 SaveStrategy::All => {
82 let save_all = workspace.update_in(cx, |workspace, window, cx| {
83 let task = workspace.save_all_internal(SaveIntent::SaveAll, window, cx);
84 // Match the type of the other arm by ignoring the bool value returned
85 cx.background_spawn(async { task.await.map(|_| ()) })
86 });
87 save_all.ok()
88 }
89 SaveStrategy::Current => {
90 let save_current = workspace.update_in(cx, |workspace, window, cx| {
91 workspace.save_active_item(SaveIntent::SaveAll, window, cx)
92 });
93 save_current.ok()
94 }
95 SaveStrategy::None => None,
96 };
97 if let Some(save_action) = save_action {
98 save_action.log_err().await;
99 }
100
101 let spawn_task = workspace.update_in(cx, |workspace, window, cx| {
102 workspace
103 .terminal_provider
104 .as_ref()
105 .map(|terminal_provider| {
106 terminal_provider.spawn(spawn_in_terminal, window, cx)
107 })
108 });
109 if let Some(spawn_task) = spawn_task.ok().flatten() {
110 let res = cx.background_spawn(spawn_task).await;
111 match res {
112 Some(Ok(status)) => {
113 if status.success() {
114 log::debug!("Task spawn succeeded");
115 } else {
116 log::debug!("Task spawn failed, code: {:?}", status.code());
117 }
118 }
119 Some(Err(e)) => {
120 log::error!("Task spawn failed: {e:#}");
121 _ = workspace.update(cx, |w, cx| {
122 let id = NotificationId::unique::<ResolvedTask>();
123 w.show_toast(Toast::new(id, format!("Task spawn failed: {e}")), cx);
124 })
125 }
126 None => log::debug!("Task spawn got cancelled"),
127 };
128 }
129 });
130 self.scheduled_tasks.push(task);
131 }
132 }
133
134 pub fn start_debug_session(
…lines 135–162 unchanged (28 lines)
163 } else {
164 Task::ready(None)
165 }
166 }
167}
168
169#[cfg(test)]
170mod tests {
171 use super::*;
172 use crate::{
173 TerminalProvider,
174 item::test::{TestItem, TestProjectItem},
175 register_serializable_item,
176 };
177 use gpui::{App, TestAppContext};
178 use parking_lot::Mutex;
179 use project::{FakeFs, Project, TaskSourceKind};
180 use serde_json::json;
181 use std::sync::Arc;
182 use task::TaskTemplate;
183
184 struct Fixture {
185 workspace: Entity<Workspace>,
186 item: Entity<TestItem>,
187 task: ResolvedTask,
188 dirty_before_spawn: Arc<Mutex<Option<bool>>>,
189 }
190
191 #[gpui::test]
192 async fn test_schedule_resolved_task_save_all(cx: &mut TestAppContext) {
193 let (fixture, cx) = create_fixture(cx, SaveStrategy::All).await;
194 fixture.workspace.update_in(cx, |workspace, window, cx| {
195 workspace.schedule_resolved_task(
196 TaskSourceKind::UserInput,
197 fixture.task,
198 false,
199 window,
200 cx,
201 );
202 });
203 cx.executor().run_until_parked();
204
205 assert_eq!(*fixture.dirty_before_spawn.lock(), Some(false));
206 assert!(cx.read(|cx| !fixture.item.read(cx).is_dirty));
207 }
208
209 #[gpui::test]
210 async fn test_schedule_resolved_task_save_current(cx: &mut TestAppContext) {
211 let (fixture, cx) = create_fixture(cx, SaveStrategy::Current).await;
212 // Add a second inactive dirty item
213 let inactive = add_test_item(&fixture.workspace, "file2.txt", false, cx);
214 fixture.workspace.update_in(cx, |workspace, window, cx| {
215 workspace.schedule_resolved_task(
216 TaskSourceKind::UserInput,
217 fixture.task,
218 false,
219 window,
220 cx,
221 );
222 });
223 cx.executor().run_until_parked();
224
225 // The active item (fixture.item) should be saved
226 assert_eq!(*fixture.dirty_before_spawn.lock(), Some(false));
227 assert!(cx.read(|cx| !fixture.item.read(cx).is_dirty));
228 // The inactive item should not be saved
229 assert!(cx.read(|cx| inactive.read(cx).is_dirty));
230 }
231
232 #[gpui::test]
233 async fn test_schedule_resolved_task_save_none(cx: &mut TestAppContext) {
234 let (fixture, cx) = create_fixture(cx, SaveStrategy::None).await;
235 fixture.workspace.update_in(cx, |workspace, window, cx| {
236 workspace.schedule_resolved_task(
237 TaskSourceKind::UserInput,
238 fixture.task,
239 false,
240 window,
241 cx,
242 );
243 });
244 cx.executor().run_until_parked();
245
246 assert_eq!(*fixture.dirty_before_spawn.lock(), Some(true));
247 assert!(cx.read(|cx| fixture.item.read(cx).is_dirty));
248 }
249
250 async fn create_fixture(
251 cx: &mut TestAppContext,
252 save_strategy: SaveStrategy,
253 ) -> (Fixture, &mut gpui::VisualTestContext) {
254 cx.update(|cx| {
255 let settings_store = settings::SettingsStore::test(cx);
256 cx.set_global(settings_store);
257 theme::init(theme::LoadThemes::JustBase, cx);
258 register_serializable_item::<TestItem>(cx);
259 });
260 let fs = FakeFs::new(cx.executor());
261 fs.insert_tree("/root", json!({ "file.txt": "dirty" }))
262 .await;
263 let project = Project::test(fs.clone(), ["/root".as_ref()], cx).await;
264 let (workspace, cx) =
265 cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
266
267 // Add a dirty item to the workspace
268 let item = add_test_item(&workspace, "file.txt", true, cx);
269
270 let template = TaskTemplate {
271 label: "test".to_string(),
272 command: "echo".to_string(),
273 save: save_strategy,
274 ..Default::default()
275 };
276 let task = template
277 .resolve_task("test", &task::TaskContext::default())
278 .unwrap();
279 let dirty_before_spawn: Arc<Mutex<Option<bool>>> = Arc::default();
280 let terminal_provider = Box::new(TestTerminalProvider {
281 item: item.clone(),
282 dirty_before_spawn: dirty_before_spawn.clone(),
283 });
284 workspace.update(cx, |workspace, _| {
285 workspace.terminal_provider = Some(terminal_provider);
286 });
287 let fixture = Fixture {
288 workspace,
289 item,
290 task,
291 dirty_before_spawn,
292 };
293 (fixture, cx)
294 }
295
296 fn add_test_item(
297 workspace: &Entity<Workspace>,
298 name: &str,
299 active: bool,
300 cx: &mut gpui::VisualTestContext,
301 ) -> Entity<TestItem> {
302 let item = cx.new(|cx| {
303 TestItem::new(cx)
304 .with_dirty(true)
305 .with_project_items(&[TestProjectItem::new(1, name, cx)])
306 });
307 workspace.update_in(cx, |workspace, window, cx| {
308 let pane = workspace.active_pane().clone();
309 workspace.add_item(pane, Box::new(item.clone()), None, true, active, window, cx);
310 });
311 item
312 }
313
314 struct TestTerminalProvider {
315 item: Entity<TestItem>,
316 dirty_before_spawn: Arc<Mutex<Option<bool>>>,
317 }
318
319 impl TerminalProvider for TestTerminalProvider {
320 fn spawn(
321 &self,
322 _task: task::SpawnInTerminal,
323 _window: &mut ui::Window,
324 cx: &mut App,
325 ) -> Task<Option<Result<ExitStatus>>> {
326 *self.dirty_before_spawn.lock() = Some(cx.read_entity(&self.item, |e, _| e.is_dirty));
327 Task::ready(Some(Ok(ExitStatus::default())))
328 }
329 }
330}
331

Before

source_file
use_declaration
use "use"
scoped_identifier
scoped_identifier
identifier "std"
:: "::"
identifier "process"
:: "::"
identifier "ExitStatus"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "anyhow"
:: "::"
identifier "Result"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "gpui"
:: "::"
use_list
{ "{"
identifier "AppContext"
, ","
identifier "Context"
, ","
identifier "Entity"
, ","
identifier "Task"
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "language"
:: "::"
identifier "Buffer"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "project"
:: "::"
use_list
{ "{"
identifier "TaskSourceKind"
, ","
identifier "WorktreeId"
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "remote"
:: "::"
identifier "ConnectionState"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "task"
:: "::"
use_list
{ "{"
identifier "DebugScenario"
, ","
identifier "ResolvedTask"
, "," any 1:2
identifier "SharedTaskContext"
, ","
identifier "SpawnInTerminal"
, ","
identifier "TaskContext"
, ","
identifier "TaskTemplate"
, ","
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "ui"
:: "::"
identifier "Window"
; ";"
use_declaration
use "use"
scoped_use_list
crate "crate"
:: "::"
use_list
{ "{"
identifier "Toast"
, ","
identifier "Workspace"
, ","
scoped_identifier
identifier "notifications"
:: "::"
identifier "NotificationId"
} "}"
; ";"
impl_item
impl "impl"
type_identifier "Workspace"
declaration_list
{ "{"
function_item (+213 nodes collapsed)
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "schedule_resolved_task"
parameters (+47 nodes collapsed)
block
{ "{"
let_declaration
let "let"
identifier "spawn_in_terminal"
= "="
call_expression
field_expression
field_expression
identifier "resolved_task"
. "."
field_identifier "resolved"
. "."
field_identifier "clone"
arguments
( "("
) ")"
; ";"
expression_statement (+151 nodes collapsed)
expression_statement
if_expression
if "if"
let_condition
let "let"
tuple_struct_pattern
identifier "Some"
( "("
identifier "terminal_provider"
) ")"
= "="
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "terminal_provider"
. "."
field_identifier "as_ref"
arguments
( "("
) ")"
block
{ "{"
let_declaration
let "let"
identifier "task_status"
= "="
call_expression
field_expression
identifier "terminal_provider"
. "."
field_identifier "spawn"
arguments
( "("
identifier "spawn_in_terminal"
, ","
identifier "window"
, ","
identifier "cx"
) ")"
; ";"
let_declaration
let "let"
identifier "task"
= "="
call_expression
field_expression
identifier "cx"
. "."
field_identifier "spawn"
arguments
( "("
closure_expression
async "async"
closure_parameters
| "|"
identifier "w"
, ","
identifier "cx"
| "|"
block
{ "{"
let_declaration
let "let"
identifier "res"
= "="
await_expression
call_expression
field_expression
identifier "cx"
. "."
field_identifier "background_spawn"
arguments
( "("
identifier "task_status"
) ")"
. "."
await "await"
; ";"
expression_statement
match_expression
match "match"
identifier "res"
match_block
{ "{"
match_arm (+71 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
identifier "Err"
( "("
identifier "e"
) ")"
) ")"
=> "=>"
block
{ "{"
expression_statement
macro_invocation
scoped_identifier
identifier "log"
:: "::"
identifier "error"
! "!"
token_tree
( "("
string_literal
" "\""
string_content "Task spawn failed: {e:#}"
" "\""
) ")"
; ";"
assignment_expression
identifier "_"
= "="
call_expression
field_expression
identifier "w"
. "."
field_identifier "update"
arguments (+66 nodes collapsed)
} "}"
match_arm
match_pattern
identifier "None"
=> "=>"
macro_invocation
scoped_identifier
identifier "log"
:: "::"
identifier "debug"
! "!"
token_tree
( "("
string_literal
" "\""
string_content "Task spawn got cancelled"
" "\""
) ")"
, ","
} "}"
empty_statement
; ";"
} "}"
) ")"
; ";"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "scheduled_tasks"
. "."
field_identifier "push"
arguments
( "("
identifier "task"
) ")"
; ";"
} "}"
} "}"
function_item (+117 nodes collapsed)
function_item (+114 nodes collapsed)
} "}"

After

source_file
use_declaration
use "use"
scoped_identifier
scoped_identifier
identifier "std"
:: "::"
identifier "process"
:: "::"
identifier "ExitStatus"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "anyhow"
:: "::"
identifier "Result"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "gpui"
:: "::"
use_list
{ "{"
identifier "AppContext"
, ","
identifier "Context"
, ","
identifier "Entity"
, ","
identifier "Task"
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "language"
:: "::"
identifier "Buffer"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "project"
:: "::"
use_list
{ "{"
identifier "TaskSourceKind"
, ","
identifier "WorktreeId"
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "remote"
:: "::"
identifier "ConnectionState"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "task"
:: "::"
use_list
{ "{"
identifier "DebugScenario"
, ","
identifier "ResolvedTask"
, "," any 1:2
identifier "SaveStrategy"
, "," any 1:2
identifier "SharedTaskContext"
, ","
identifier "SpawnInTerminal"
, ","
identifier "TaskContext"
, ","
identifier "TaskTemplate"
, ","
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "ui"
:: "::"
identifier "Window"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "util"
:: "::"
identifier "TryFutureExt"
; ";"
use_declaration
use "use"
scoped_use_list
crate "crate"
:: "::"
use_list
{ "{"
identifier "SaveIntent"
, ","
identifier "Toast"
, ","
identifier "Workspace"
, ","
scoped_identifier
identifier "notifications"
:: "::"
identifier "NotificationId"
} "}"
; ";"
impl_item
impl "impl"
type_identifier "Workspace"
declaration_list
{ "{"
function_item (+213 nodes collapsed)
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "schedule_resolved_task"
parameters (+47 nodes collapsed)
block
{ "{"
let_declaration
let "let"
identifier "spawn_in_terminal"
= "="
call_expression
field_expression
field_expression
identifier "resolved_task"
. "."
field_identifier "resolved"
. "."
field_identifier "clone"
arguments
( "("
) ")"
; ";"
expression_statement (+151 nodes collapsed)
expression_statement
if_expression
if "if"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "terminal_provider"
. "."
field_identifier "is_some"
arguments
( "("
) ")"
block
{ "{"
let_declaration
let "let"
identifier "task"
= "="
call_expression
field_expression
identifier "cx"
. "."
field_identifier "spawn_in"
arguments
( "("
identifier "window"
, ","
closure_expression
async "async"
move "move"
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "cx"
| "|"
block
{ "{"
let_declaration
let "let"
identifier "save_action"
= "="
match_expression
match "match"
field_expression
identifier "spawn_in_terminal"
. "."
field_identifier "save"
match_block
{ "{"
match_arm
match_pattern
scoped_identifier
identifier "SaveStrategy"
:: "::"
identifier "All"
=> "=>"
block
{ "{"
let_declaration
let "let"
identifier "save_all"
= "="
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "update_in"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "window"
, ","
identifier "cx"
| "|"
block
{ "{"
let_declaration
let "let"
identifier "task"
= "="
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "save_all_internal"
arguments
( "("
scoped_identifier
identifier "SaveIntent"
:: "::"
identifier "SaveAll"
, ","
identifier "window"
, ","
identifier "cx"
) ")"
; ";"
line_comment
// "//"
call_expression
field_expression
identifier "cx"
. "."
field_identifier "background_spawn"
arguments
( "("
async_block
async "async"
block
{ "{"
call_expression
field_expression
await_expression
identifier "task"
. "."
await "await"
. "."
field_identifier "map"
arguments
( "("
closure_expression
closure_parameters
| "|"
_ "_"
| "|"
unit_expression
( "("
) ")"
) ")"
} "}"
) ")"
} "}"
) ")"
; ";"
call_expression
field_expression
identifier "save_all"
. "."
field_identifier "ok"
arguments
( "("
) ")"
} "}"
match_arm
match_pattern
scoped_identifier
identifier "SaveStrategy"
:: "::"
identifier "Current"
=> "=>"
block
{ "{"
let_declaration
let "let"
identifier "save_current"
= "="
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "update_in"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "window"
, ","
identifier "cx"
| "|"
block
{ "{"
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "save_active_item"
arguments
( "("
scoped_identifier
identifier "SaveIntent"
:: "::"
identifier "SaveAll"
, ","
identifier "window"
, ","
identifier "cx"
) ")"
} "}"
) ")"
; ";"
call_expression
field_expression
identifier "save_current"
. "."
field_identifier "ok"
arguments
( "("
) ")"
} "}"
match_arm
match_pattern
scoped_identifier
identifier "SaveStrategy"
:: "::"
identifier "None"
=> "=>"
identifier "None"
, ","
} "}"
; ";"
expression_statement
if_expression
if "if"
let_condition
let "let"
tuple_struct_pattern
identifier "Some"
( "("
identifier "save_action"
) ")"
= "="
identifier "save_action"
block
{ "{"
expression_statement
await_expression
call_expression
field_expression
identifier "save_action"
. "."
field_identifier "log_err"
arguments
( "("
) ")"
. "."
await "await"
; ";"
} "}"
let_declaration
let "let"
identifier "spawn_task"
= "="
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "update_in"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "window"
, ","
identifier "cx"
| "|"
block
{ "{"
call_expression
field_expression
call_expression
field_expression
field_expression
identifier "workspace"
. "."
field_identifier "terminal_provider"
. "."
field_identifier "as_ref"
arguments
( "("
) ")"
. "."
field_identifier "map"
arguments
( "("
closure_expression
closure_parameters
| "|"
identifier "terminal_provider"
| "|"
block
{ "{"
call_expression
field_expression
identifier "terminal_provider"
. "."
field_identifier "spawn"
arguments
( "("
identifier "spawn_in_terminal"
, ","
identifier "window"
, ","
identifier "cx"
) ")"
} "}"
) ")"
} "}"
) ")"
; ";"
expression_statement
if_expression
if "if"
let_condition
let "let"
tuple_struct_pattern
identifier "Some"
( "("
identifier "spawn_task"
) ")"
= "="
call_expression
field_expression
call_expression
field_expression
identifier "spawn_task"
. "."
field_identifier "ok"
arguments
( "("
) ")"
. "."
field_identifier "flatten"
arguments
( "("
) ")"
block
{ "{"
let_declaration
let "let"
identifier "res"
= "="
await_expression
call_expression
field_expression
identifier "cx"
. "."
field_identifier "background_spawn"
arguments
( "("
identifier "spawn_task"
) ")"
. "."
await "await"
; ";"
expression_statement
match_expression
match "match"
identifier "res"
match_block
{ "{"
match_arm (+71 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
identifier "Err"
( "("
identifier "e"
) ")"
) ")"
=> "=>"
block
{ "{"
expression_statement
macro_invocation
scoped_identifier
identifier "log"
:: "::"
identifier "error"
! "!"
token_tree
( "("
string_literal
" "\""
string_content "Task spawn failed: {e:#}"
" "\""
) ")"
; ";"
assignment_expression
identifier "_"
= "="
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "update"
arguments (+66 nodes collapsed)
} "}"
match_arm
match_pattern
identifier "None"
=> "=>"
macro_invocation
scoped_identifier
identifier "log"
:: "::"
identifier "debug"
! "!"
token_tree
( "("
string_literal
" "\""
string_content "Task spawn got cancelled"
" "\""
) ")"
, ","
} "}"
empty_statement
; ";"
} "}"
} "}"
) ")"
; ";"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "scheduled_tasks"
. "."
field_identifier "push"
arguments
( "("
identifier "task"
) ")"
; ";"
} "}"
} "}"
function_item (+117 nodes collapsed)
function_item (+114 nodes collapsed)
} "}"
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "test"
) ")"
] "]"
mod_item
mod "mod"
identifier "tests"
declaration_list
{ "{"
use_declaration
use "use"
use_wildcard
super "super"
:: "::"
* "*"
; ";"
use_declaration
use "use"
scoped_use_list
crate "crate"
:: "::"
use_list
{ "{"
identifier "TerminalProvider"
, ","
scoped_use_list
scoped_identifier
identifier "item"
:: "::"
identifier "test"
:: "::"
use_list
{ "{"
identifier "TestItem"
, ","
identifier "TestProjectItem"
} "}"
, ","
identifier "register_serializable_item"
, ","
} "}"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "gpui"
:: "::"
use_list
{ "{"
identifier "App"
, ","
identifier "TestAppContext"
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "parking_lot"
:: "::"
identifier "Mutex"
; ";"
use_declaration
use "use"
scoped_use_list
identifier "project"
:: "::"
use_list
{ "{"
identifier "FakeFs"
, ","
identifier "Project"
, ","
identifier "TaskSourceKind"
} "}"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "serde_json"
:: "::"
identifier "json"
; ";"
use_declaration
use "use"
scoped_identifier
scoped_identifier
identifier "std"
:: "::"
identifier "sync"
:: "::"
identifier "Arc"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "task"
:: "::"
identifier "TaskTemplate"
; ";"
struct_item
struct "struct"
type_identifier "Fixture"
field_declaration_list
{ "{"
field_declaration
field_identifier "workspace"
: ":"
generic_type
type_identifier "Entity"
type_arguments
< "<"
type_identifier "Workspace"
> ">"
, ","
field_declaration
field_identifier "item"
: ":"
generic_type
type_identifier "Entity"
type_arguments
< "<"
type_identifier "TestItem"
> ">"
, ","
field_declaration
field_identifier "task"
: ":"
type_identifier "ResolvedTask"
, ","
field_declaration
field_identifier "dirty_before_spawn"
: ":"
generic_type
type_identifier "Arc"
type_arguments
< "<"
generic_type
type_identifier "Mutex"
type_arguments
< "<"
generic_type
type_identifier "Option"
type_arguments
< "<"
primitive_type "bool"
> ">"
> ">"
> ">"
, ","
} "}"
attribute_item
# "#"
[ "["
attribute
scoped_identifier
identifier "gpui"
:: "::"
identifier "test"
] "]"
function_item
function_modifiers
async "async"
fn "fn"
identifier "test_schedule_resolved_task_save_all"
parameters
( "("
parameter
identifier "cx"
: ":"
reference_type
& "&"
mutable_specifier "mut"
type_identifier "TestAppContext"
) ")"
block
{ "{"
let_declaration
let "let"
tuple_pattern
( "("
identifier "fixture"
, ","
identifier "cx"
) ")"
= "="
await_expression
call_expression
identifier "create_fixture"
arguments
( "("
identifier "cx"
, ","
scoped_identifier
identifier "SaveStrategy"
:: "::"
identifier "All"
) ")"
. "."
await "await"
; ";"
expression_statement
call_expression
field_expression
field_expression
identifier "fixture"
. "."
field_identifier "workspace"
. "."
field_identifier "update_in"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "window"
, ","
identifier "cx"
| "|"
block
{ "{"
expression_statement
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "schedule_resolved_task"
arguments
( "("
scoped_identifier
identifier "TaskSourceKind"
:: "::"
identifier "UserInput"
, ","
field_expression
identifier "fixture"
. "."
field_identifier "task"
, ","
boolean_literal
false "false"
, ","
identifier "window"
, ","
identifier "cx"
, ","
) ")"
; ";"
} "}"
) ")"
; ";"
expression_statement
call_expression
field_expression
call_expression
field_expression
identifier "cx"
. "."
field_identifier "executor"
arguments
( "("
) ")"
. "."
field_identifier "run_until_parked"
arguments
( "("
) ")"
; ";"
expression_statement
macro_invocation
identifier "assert_eq"
! "!"
token_tree
( "("
* "*"
identifier "fixture"
. "."
identifier "dirty_before_spawn"
. "."
identifier "lock"
token_tree
( "("
) ")"
, ","
identifier "Some"
token_tree
( "("
boolean_literal
false "false"
) ")"
) ")"
; ";"
expression_statement
macro_invocation
identifier "assert"
! "!"
token_tree
( "("
identifier "cx"
. "."
identifier "read"
token_tree
( "("
| "|"
identifier "cx"
| "|"
! "!"
identifier "fixture"
. "."
identifier "item"
. "."
identifier "read"
token_tree
( "("
identifier "cx"
) ")"
. "."
identifier "is_dirty"
) ")"
) ")"
; ";"
} "}"
attribute_item
# "#"
[ "["
attribute
scoped_identifier
identifier "gpui"
:: "::"
identifier "test"
] "]"
function_item
function_modifiers
async "async"
fn "fn"
identifier "test_schedule_resolved_task_save_current"
parameters
( "("
parameter
identifier "cx"
: ":"
reference_type
& "&"
mutable_specifier "mut"
type_identifier "TestAppContext"
) ")"
block
{ "{"
let_declaration
let "let"
tuple_pattern
( "("
identifier "fixture"
, ","
identifier "cx"
) ")"
= "="
await_expression
call_expression
identifier "create_fixture"
arguments
( "("
identifier "cx"
, ","
scoped_identifier
identifier "SaveStrategy"
:: "::"
identifier "Current"
) ")"
. "."
await "await"
; ";"
line_comment
// "//"
let_declaration
let "let"
identifier "inactive"
= "="
call_expression
identifier "add_test_item"
arguments
( "("
reference_expression
& "&"
field_expression
identifier "fixture"
. "."
field_identifier "workspace"
, ","
string_literal
" "\""
string_content "file2.txt"
" "\""
, ","
boolean_literal
false "false"
, ","
identifier "cx"
) ")"
; ";"
expression_statement
call_expression
field_expression
field_expression
identifier "fixture"
. "."
field_identifier "workspace"
. "."
field_identifier "update_in"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "window"
, ","
identifier "cx"
| "|"
block
{ "{"
expression_statement
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "schedule_resolved_task"
arguments
( "("
scoped_identifier
identifier "TaskSourceKind"
:: "::"
identifier "UserInput"
, ","
field_expression
identifier "fixture"
. "."
field_identifier "task"
, ","
boolean_literal
false "false"
, ","
identifier "window"
, ","
identifier "cx"
, ","
) ")"
; ";"
} "}"
) ")"
; ";"
expression_statement
call_expression
field_expression
call_expression
field_expression
identifier "cx"
. "."
field_identifier "executor"
arguments
( "("
) ")"
. "."
field_identifier "run_until_parked"
arguments
( "("
) ")"
; ";"
line_comment
// "//"
expression_statement
macro_invocation
identifier "assert_eq"
! "!"
token_tree
( "("
* "*"
identifier "fixture"
. "."
identifier "dirty_before_spawn"
. "."
identifier "lock"
token_tree
( "("
) ")"
, ","
identifier "Some"
token_tree
( "("
boolean_literal
false "false"
) ")"
) ")"
; ";"
expression_statement
macro_invocation
identifier "assert"
! "!"
token_tree
( "("
identifier "cx"
. "."
identifier "read"
token_tree
( "("
| "|"
identifier "cx"
| "|"
! "!"
identifier "fixture"
. "."
identifier "item"
. "."
identifier "read"
token_tree
( "("
identifier "cx"
) ")"
. "."
identifier "is_dirty"
) ")"
) ")"
; ";"
line_comment
// "//"
expression_statement
macro_invocation
identifier "assert"
! "!"
token_tree
( "("
identifier "cx"
. "."
identifier "read"
token_tree
( "("
| "|"
identifier "cx"
| "|"
identifier "inactive"
. "."
identifier "read"
token_tree
( "("
identifier "cx"
) ")"
. "."
identifier "is_dirty"
) ")"
) ")"
; ";"
} "}"
attribute_item
# "#"
[ "["
attribute
scoped_identifier
identifier "gpui"
:: "::"
identifier "test"
] "]"
function_item
function_modifiers
async "async"
fn "fn"
identifier "test_schedule_resolved_task_save_none"
parameters
( "("
parameter
identifier "cx"
: ":"
reference_type
& "&"
mutable_specifier "mut"
type_identifier "TestAppContext"
) ")"
block
{ "{"
let_declaration
let "let"
tuple_pattern
( "("
identifier "fixture"
, ","
identifier "cx"
) ")"
= "="
await_expression
call_expression
identifier "create_fixture"
arguments
( "("
identifier "cx"
, ","
scoped_identifier
identifier "SaveStrategy"
:: "::"
identifier "None"
) ")"
. "."
await "await"
; ";"
expression_statement
call_expression
field_expression
field_expression
identifier "fixture"
. "."
field_identifier "workspace"
. "."
field_identifier "update_in"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "window"
, ","
identifier "cx"
| "|"
block
{ "{"
expression_statement
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "schedule_resolved_task"
arguments
( "("
scoped_identifier
identifier "TaskSourceKind"
:: "::"
identifier "UserInput"
, ","
field_expression
identifier "fixture"
. "."
field_identifier "task"
, ","
boolean_literal
false "false"
, ","
identifier "window"
, ","
identifier "cx"
, ","
) ")"
; ";"
} "}"
) ")"
; ";"
expression_statement
call_expression
field_expression
call_expression
field_expression
identifier "cx"
. "."
field_identifier "executor"
arguments
( "("
) ")"
. "."
field_identifier "run_until_parked"
arguments
( "("
) ")"
; ";"
expression_statement
macro_invocation
identifier "assert_eq"
! "!"
token_tree
( "("
* "*"
identifier "fixture"
. "."
identifier "dirty_before_spawn"
. "."
identifier "lock"
token_tree
( "("
) ")"
, ","
identifier "Some"
token_tree
( "("
boolean_literal
true "true"
) ")"
) ")"
; ";"
expression_statement
macro_invocation
identifier "assert"
! "!"
token_tree
( "("
identifier "cx"
. "."
identifier "read"
token_tree
( "("
| "|"
identifier "cx"
| "|"
identifier "fixture"
. "."
identifier "item"
. "."
identifier "read"
token_tree
( "("
identifier "cx"
) ")"
. "."
identifier "is_dirty"
) ")"
) ")"
; ";"
} "}"
function_item
function_modifiers
async "async"
fn "fn"
identifier "create_fixture"
parameters
( "("
parameter
identifier "cx"
: ":"
reference_type
& "&"
mutable_specifier "mut"
type_identifier "TestAppContext"
, ","
parameter
identifier "save_strategy"
: ":"
type_identifier "SaveStrategy"
, ","
) ")"
-> "->"
tuple_type
( "("
type_identifier "Fixture"
, ","
reference_type
& "&"
mutable_specifier "mut"
scoped_type_identifier
identifier "gpui"
:: "::"
type_identifier "VisualTestContext"
) ")"
block
{ "{"
expression_statement
call_expression
field_expression
identifier "cx"
. "."
field_identifier "update"
arguments
( "("
closure_expression
closure_parameters
| "|"
identifier "cx"
| "|"
block
{ "{"
let_declaration
let "let"
identifier "settings_store"
= "="
call_expression
scoped_identifier
scoped_identifier
identifier "settings"
:: "::"
identifier "SettingsStore"
:: "::"
identifier "test"
arguments
( "("
identifier "cx"
) ")"
; ";"
expression_statement
call_expression
field_expression
identifier "cx"
. "."
field_identifier "set_global"
arguments
( "("
identifier "settings_store"
) ")"
; ";"
expression_statement
call_expression
scoped_identifier
identifier "theme"
:: "::"
identifier "init"
arguments
( "("
scoped_identifier
scoped_identifier
identifier "theme"
:: "::"
identifier "LoadThemes"
:: "::"
identifier "JustBase"
, ","
identifier "cx"
) ")"
; ";"
expression_statement
call_expression
generic_function
identifier "register_serializable_item"
:: "::"
type_arguments
< "<"
type_identifier "TestItem"
> ">"
arguments
( "("
identifier "cx"
) ")"
; ";"
} "}"
) ")"
; ";"
let_declaration
let "let"
identifier "fs"
= "="
call_expression
scoped_identifier
identifier "FakeFs"
:: "::"
identifier "new"
arguments
( "("
call_expression
field_expression
identifier "cx"
. "."
field_identifier "executor"
arguments
( "("
) ")"
) ")"
; ";"
expression_statement
await_expression
call_expression
field_expression
identifier "fs"
. "."
field_identifier "insert_tree"
arguments
( "("
string_literal
" "\""
string_content "/root"
" "\""
, ","
macro_invocation
identifier "json"
! "!"
token_tree
( "("
token_tree
{ "{"
string_literal
" "\""
string_content "file.txt"
" "\""
: ":"
string_literal
" "\""
string_content "dirty"
" "\""
} "}"
) ")"
) ")"
. "."
await "await"
; ";"
let_declaration
let "let"
identifier "project"
= "="
await_expression
call_expression
scoped_identifier
identifier "Project"
:: "::"
identifier "test"
arguments
( "("
call_expression
field_expression
identifier "fs"
. "."
field_identifier "clone"
arguments
( "("
) ")"
, ","
array_expression
[ "["
call_expression
field_expression
string_literal
" "\""
string_content "/root"
" "\""
. "."
field_identifier "as_ref"
arguments
( "("
) ")"
] "]"
, ","
identifier "cx"
) ")"
. "."
await "await"
; ";"
let_declaration
let "let"
tuple_pattern
( "("
identifier "workspace"
, ","
identifier "cx"
) ")"
= "="
call_expression
field_expression
identifier "cx"
. "."
field_identifier "add_window_view"
arguments
( "("
closure_expression
closure_parameters
| "|"
identifier "window"
, ","
identifier "cx"
| "|"
call_expression
scoped_identifier
identifier "Workspace"
:: "::"
identifier "test_new"
arguments
( "("
call_expression
field_expression
identifier "project"
. "."
field_identifier "clone"
arguments
( "("
) ")"
, ","
identifier "window"
, ","
identifier "cx"
) ")"
) ")"
; ";"
line_comment
// "//"
let_declaration
let "let"
identifier "item"
= "="
call_expression
identifier "add_test_item"
arguments
( "("
reference_expression
& "&"
identifier "workspace"
, ","
string_literal
" "\""
string_content "file.txt"
" "\""
, ","
boolean_literal
true "true"
, ","
identifier "cx"
) ")"
; ";"
let_declaration
let "let"
identifier "template"
= "="
struct_expression
type_identifier "TaskTemplate"
field_initializer_list
{ "{"
field_initializer
field_identifier "label"
: ":"
call_expression
field_expression
string_literal
" "\""
string_content "test"
" "\""
. "."
field_identifier "to_string"
arguments
( "("
) ")"
, ","
field_initializer
field_identifier "command"
: ":"
call_expression
field_expression
string_literal
" "\""
string_content "echo"
" "\""
. "."
field_identifier "to_string"
arguments
( "("
) ")"
, ","
field_initializer
field_identifier "save"
: ":"
identifier "save_strategy"
, ","
base_field_initializer
.. ".."
call_expression
scoped_identifier
identifier "Default"
:: "::"
identifier "default"
arguments
( "("
) ")"
} "}"
; ";"
let_declaration
let "let"
identifier "task"
= "="
call_expression
field_expression
call_expression
field_expression
identifier "template"
. "."
field_identifier "resolve_task"
arguments
( "("
string_literal
" "\""
string_content "test"
" "\""
, ","
reference_expression
& "&"
call_expression
scoped_identifier
scoped_identifier
identifier "task"
:: "::"
identifier "TaskContext"
:: "::"
identifier "default"
arguments
( "("
) ")"
) ")"
. "."
field_identifier "unwrap"
arguments
( "("
) ")"
; ";"
let_declaration
let "let"
identifier "dirty_before_spawn"
: ":"
generic_type
type_identifier "Arc"
type_arguments
< "<"
generic_type
type_identifier "Mutex"
type_arguments
< "<"
generic_type
type_identifier "Option"
type_arguments
< "<"
primitive_type "bool"
> ">"
> ">"
> ">"
= "="
call_expression
scoped_identifier
identifier "Arc"
:: "::"
identifier "default"
arguments
( "("
) ")"
; ";"
let_declaration
let "let"
identifier "terminal_provider"
= "="
call_expression
scoped_identifier
identifier "Box"
:: "::"
identifier "new"
arguments
( "("
struct_expression
type_identifier "TestTerminalProvider"
field_initializer_list
{ "{"
field_initializer
field_identifier "item"
: ":"
call_expression
field_expression
identifier "item"
. "."
field_identifier "clone"
arguments
( "("
) ")"
, ","
field_initializer
field_identifier "dirty_before_spawn"
: ":"
call_expression
field_expression
identifier "dirty_before_spawn"
. "."
field_identifier "clone"
arguments
( "("
) ")"
, ","
} "}"
) ")"
; ";"
expression_statement
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "update"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
_ "_"
| "|"
block
{ "{"
expression_statement
assignment_expression
field_expression
identifier "workspace"
. "."
field_identifier "terminal_provider"
= "="
call_expression
identifier "Some"
arguments
( "("
identifier "terminal_provider"
) ")"
; ";"
} "}"
) ")"
; ";"
let_declaration
let "let"
identifier "fixture"
= "="
struct_expression
type_identifier "Fixture"
field_initializer_list
{ "{"
shorthand_field_initializer
identifier "workspace"
, ","
shorthand_field_initializer
identifier "item"
, ","
shorthand_field_initializer
identifier "task"
, ","
shorthand_field_initializer
identifier "dirty_before_spawn"
, ","
} "}"
; ";"
tuple_expression
( "("
identifier "fixture"
, ","
identifier "cx"
) ")"
} "}"
function_item
fn "fn"
identifier "add_test_item"
parameters
( "("
parameter
identifier "workspace"
: ":"
reference_type
& "&"
generic_type
type_identifier "Entity"
type_arguments
< "<"
type_identifier "Workspace"
> ">"
, ","
parameter
identifier "name"
: ":"
reference_type
& "&"
primitive_type "str"
, ","
parameter
identifier "active"
: ":"
primitive_type "bool"
, ","
parameter
identifier "cx"
: ":"
reference_type
& "&"
mutable_specifier "mut"
scoped_type_identifier
identifier "gpui"
:: "::"
type_identifier "VisualTestContext"
, ","
) ")"
-> "->"
generic_type
type_identifier "Entity"
type_arguments
< "<"
type_identifier "TestItem"
> ">"
block
{ "{"
let_declaration
let "let"
identifier "item"
= "="
call_expression
field_expression
identifier "cx"
. "."
field_identifier "new"
arguments
( "("
closure_expression
closure_parameters
| "|"
identifier "cx"
| "|"
block
{ "{"
call_expression
field_expression
call_expression
field_expression
call_expression
scoped_identifier
identifier "TestItem"
:: "::"
identifier "new"
arguments
( "("
identifier "cx"
) ")"
. "."
field_identifier "with_dirty"
arguments
( "("
boolean_literal
true "true"
) ")"
. "."
field_identifier "with_project_items"
arguments
( "("
reference_expression
& "&"
array_expression
[ "["
call_expression
scoped_identifier
identifier "TestProjectItem"
:: "::"
identifier "new"
arguments
( "("
integer_literal "1"
, ","
identifier "name"
, ","
identifier "cx"
) ")"
] "]"
) ")"
} "}"
) ")"
; ";"
expression_statement
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "update_in"
arguments
( "("
identifier "cx"
, ","
closure_expression
closure_parameters
| "|"
identifier "workspace"
, ","
identifier "window"
, ","
identifier "cx"
| "|"
block
{ "{"
let_declaration
let "let"
identifier "pane"
= "="
call_expression
field_expression
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "active_pane"
arguments
( "("
) ")"
. "."
field_identifier "clone"
arguments
( "("
) ")"
; ";"
expression_statement
call_expression
field_expression
identifier "workspace"
. "."
field_identifier "add_item"
arguments
( "("
identifier "pane"
, ","
call_expression
scoped_identifier
identifier "Box"
:: "::"
identifier "new"
arguments
( "("
call_expression
field_expression
identifier "item"
. "."
field_identifier "clone"
arguments
( "("
) ")"
) ")"
, ","
identifier "None"
, ","
boolean_literal
true "true"
, ","
identifier "active"
, ","
identifier "window"
, ","
identifier "cx"
) ")"
; ";"
} "}"
) ")"
; ";"
identifier "item"
} "}"
struct_item
struct "struct"
type_identifier "TestTerminalProvider"
field_declaration_list
{ "{"
field_declaration
field_identifier "item"
: ":"
generic_type
type_identifier "Entity"
type_arguments
< "<"
type_identifier "TestItem"
> ">"
, ","
field_declaration
field_identifier "dirty_before_spawn"
: ":"
generic_type
type_identifier "Arc"
type_arguments
< "<"
generic_type
type_identifier "Mutex"
type_arguments
< "<"
generic_type
type_identifier "Option"
type_arguments
< "<"
primitive_type "bool"
> ">"
> ">"
> ">"
, ","
} "}"
impl_item
impl "impl"
type_identifier "TerminalProvider"
for "for"
type_identifier "TestTerminalProvider"
declaration_list
{ "{"
function_item
fn "fn"
identifier "spawn"
parameters
( "("
self_parameter
& "&"
self "self"
, ","
parameter
identifier "_task"
: ":"
scoped_type_identifier
identifier "task"
:: "::"
type_identifier "SpawnInTerminal"
, ","
parameter
identifier "_window"
: ":"
reference_type
& "&"
mutable_specifier "mut"
scoped_type_identifier
identifier "ui"
:: "::"
type_identifier "Window"
, ","
parameter
identifier "cx"
: ":"
reference_type
& "&"
mutable_specifier "mut"
type_identifier "App"
, ","
) ")"
-> "->"
generic_type
type_identifier "Task"
type_arguments
< "<"
generic_type
type_identifier "Option"
type_arguments
< "<"
generic_type
type_identifier "Result"
type_arguments
< "<"
type_identifier "ExitStatus"
> ">"
> ">"
> ">"
block
{ "{"
expression_statement
assignment_expression
unary_expression
* "*"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "dirty_before_spawn"
. "."
field_identifier "lock"
arguments
( "("
) ")"
= "="
call_expression
identifier "Some"
arguments
( "("
call_expression
field_expression
identifier "cx"
. "."
field_identifier "read_entity"
arguments
( "("
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "item"
, ","
closure_expression
closure_parameters
| "|"
identifier "e"
, ","
_ "_"
| "|"
field_expression
identifier "e"
. "."
field_identifier "is_dirty"
) ")"
) ")"
; ";"
call_expression
scoped_identifier
identifier "Task"
:: "::"
identifier "ready"
arguments
( "("
call_expression
identifier "Some"
arguments
( "("
call_expression
identifier "Ok"
arguments
( "("
call_expression
scoped_identifier
identifier "ExitStatus"
:: "::"
identifier "default"
arguments
( "("
) ")"
) ")"
) ")"
) ")"
} "}"
} "}"
} "}"