Remove top-level `EXTENSION_STATE`

finchie
Jan 2, 2026, 12:44 PM
GEWUG74N3O7YAOFPPJV6LHPAVKPAXCRMAIT7HPVB4KSMTA4OD6OAC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] 72K45XKD Refactor inline credit to improve hover messages
  • [4] T4NQUSRP Emit events on file decoration change
  • [5] IAMJPC2Q Include extension build info at compile time
  • [6] 3YGYMEXV Create `event_loop` module
  • [7] NB2MF3MY Add `OpenWorkspaceFolder` event
  • [8] OUADGWKR Create fully-initialized `SourceControl` object in `event_loop`
  • [9] SLTXBK5G Recursively discover repositories when handling `OpenWorkspaceFolder` event
  • [10] QY4Z5ZXZ Refactor `event_loop/threadsafe_function` file into `event_loop::js_function` module
  • [11] IBVCQSSG Use `External` to wrap `initialize_source_control` arguments
  • [12] IDY5SNLO Update source control resource states in event loop
  • [13] D3V6U7N6 Use untyped promises as return value for `FileDecorationProvider`
  • [14] 3RNQI5RX Refactor `provide_file_decoration` to return a `Promise` resolved by `event_loop`
  • [15] ISLSD6AR Use `UriAbsoluteString` instead of `String` for `Event::OpenWorkspaceFolder`
  • [16] 3TWMKU4M Add `RequestInlineCredit` event
  • [17] XRFRJHZM Add `ChangedFilesystemContents` event
  • [18] 6AUGQLIK Add basic panic handling
  • [19] VKCHFDMC Create simple `FileSystemWatcher`
  • [20] 57DXWD6G Handle file rename/move events in VS Code extension
  • [21] WHONMLLS Remove calls to `ExtensionState::get()` in event handlers
  • [22] MGJ23FHF Assign repository URI to source control in `OpenWorkspaceFolder` events
  • [23] POA32CUW Add `uri` module
  • [24] NEAR63OC Implement base64 URI encoding/decoding for Pijul URIs
  • [*] 2ZAM5V35 Move event handling into modules

Change contents

  • replacement in editors/vscode/src/vscode_sys/reference.rs at line 5
    [4.13][13.0:124]()
    EventEmitter, FileDecoration, SourceControl, SourceControlResourceGroup, TextEditor,
    TextEditorDecorationType, Uri,
    [4.13]
    [4.112]
    EventEmitter, FileDecoration, QuickDiffProvider, SourceControl, SourceControlResourceGroup,
    TextEditor, TextEditorDecorationType, Uri,
  • edit in editors/vscode/src/vscode_sys/reference.rs at line 11
    [13.179]
    [2.58128]
    object_reference!(QuickDiffProviderRef: QuickDiffProvider);
  • edit in editors/vscode/src/lib.rs at line 15
    [3.730][2.109259:109306](),[2.109259][2.109259:109306]()
    use std::sync::{Mutex, MutexGuard, OnceLock};
  • edit in editors/vscode/src/lib.rs at line 20
    [6.30][6.30:71]()
    use crate::repository::OpenRepositories;
  • edit in editors/vscode/src/lib.rs at line 28
    [5.94][2.109515:109592](),[2.109515][2.109515:109592]()
    static EXTENSION_STATE: OnceLock<Mutex<ExtensionState>> = OnceLock::new();
  • edit in editors/vscode/src/lib.rs at line 29
    [2.109632][2.109632:109657](),[4.2144][2.109730:110110](),[2.109730][2.109730:110110]()
    struct ExtensionState {
    repositories: OpenRepositories,
    }
    impl ExtensionState {
    fn get() -> Result<MutexGuard<'static, Self>, napi::Error> {
    EXTENSION_STATE
    .get()
    .ok_or_else(|| napi::Error::from_reason("Extension state is not set"))?
    .lock()
    .map_err(|_error| napi::Error::from_reason("Extension state mutex has been poisoned"))
    }
    }
  • replacement in editors/vscode/src/lib.rs at line 80
    [2.113857][2.113857:113878]()
    env: &napi::Env,
    [2.113857]
    [2.113878]
    _env: &napi::Env,
  • replacement in editors/vscode/src/lib.rs at line 225
    [2.118517][17.390:468]()
    event_loop::start(env, &vscode_object, decoration_change_event_emitter)?;
    [2.118517]
    [6.114]
    let mut file_decoration_provider =
    vscode_sys::FileDecorationProvider::new(env, provide_file_decoration)?;
    file_decoration_provider.set_on_did_change_file_decorations(decoration_change_event)?;
    vscode_sys::window::register_file_decoration_provider(
    env,
    &extension_context,
    file_decoration_provider,
    )?;
  • replacement in editors/vscode/src/lib.rs at line 234
    [6.115][2.118517:118569](),[2.118517][2.118517:118569]()
    let mut repositories = OpenRepositories::new();
    [6.115]
    [2.118569]
    let mut quick_diff_provider = vscode_sys::QuickDiffProvider::new(env)?;
    quick_diff_provider.set_provide_original_resource(env, provide_original_resource)?;
  • replacement in editors/vscode/src/lib.rs at line 237
    [2.118570][2.118570:118651](),[2.118651][2.118651:118719]()
    for workspace_folder in vscode_sys::workspace::get_workspace_folders(env)? {
    repositories.open_workspace_folder(env, workspace_folder)?;
    [2.118570]
    [15.171]
    event_loop::start(
    env,
    &vscode_object,
    decoration_change_event_emitter,
    quick_diff_provider,
    )?;
  • edit in editors/vscode/src/lib.rs at line 244
    [15.172]
    [15.172]
    for workspace_folder in vscode_sys::workspace::get_workspace_folders(env)? {
  • replacement in editors/vscode/src/lib.rs at line 252
    [2.118809][2.118809:118878](),[2.118878][17.469:528]()
    repositories.register_text_editors(env, visible_text_editors)?;
    let extension_state = ExtensionState { repositories };
    [2.118809]
    [2.119076]
    for text_editor in visible_text_editors {
    let document_uri = text_editor.get_document()?.get_uri()?;
    let uri = uri::from_vscode(&document_uri)?;
  • replacement in editors/vscode/src/lib.rs at line 256
    [2.119338][2.119338:119528]()
    EXTENSION_STATE
    .set(Mutex::new(extension_state))
    .map_err(|_existing_object| {
    napi::Error::from_reason("Extension state has already been set")
    })?;
    [2.119077]
    [2.119528]
    event_loop::send(Event::OpenTextEditor {
    uri,
    text_editor: text_editor.create_ref()?,
    });
    }
  • edit in editors/vscode/src/lib.rs at line 262
    [2.119529][4.2580:2619](),[4.2619][2.119564:119644](),[2.119564][2.119564:119644](),[2.119644][4.2620:2711](),[4.2711][2.119644:119787](),[2.119644][2.119644:119787]()
    let mut file_decoration_provider =
    vscode_sys::FileDecorationProvider::new(env, provide_file_decoration)?;
    file_decoration_provider.set_on_did_change_file_decorations(decoration_change_event)?;
    vscode_sys::window::register_file_decoration_provider(
    env,
    &extension_context,
    file_decoration_provider,
    )?;
  • edit in editors/vscode/src/lib.rs at line 271
    [2.120083][2.120083:120551]()
    let mut quick_diff_provider = vscode_sys::QuickDiffProvider::new(env)?;
    quick_diff_provider.set_provide_original_resource(env, provide_original_resource)?;
    let program_state = ExtensionState::get()?;
    for (_repository_path, open_repository) in program_state.repositories.iter_repositories() {
    let mut source_control = open_repository.source_control.get_inner(env)?;
    source_control.set_quick_diff_provider(quick_diff_provider)?;
    }
  • edit in editors/vscode/src/event_loop/mod.rs at line 33
    [16.1371]
    [14.605]
    quick_diff_provider: Rc<vscode_sys::reference::QuickDiffProviderRef>,
  • edit in editors/vscode/src/event_loop/mod.rs at line 92
    [16.1445]
    [12.201]
    quick_diff_provider: vscode_sys::reference::QuickDiffProviderRef,
  • edit in editors/vscode/src/event_loop/mod.rs at line 106
    [16.1634]
    [14.1221]
    quick_diff_provider: Rc::new(quick_diff_provider),
  • edit in editors/vscode/src/event_loop/mod.rs at line 192
    [17.1144]
    [8.5456]
    quick_diff_provider: vscode_sys::QuickDiffProvider,
  • edit in editors/vscode/src/event_loop/mod.rs at line 196
    [17.1330]
    [10.251]
    let quick_diff_provider_ref = quick_diff_provider.create_ref()?;
  • edit in editors/vscode/src/event_loop/mod.rs at line 213
    [17.1446]
    [17.1446]
    quick_diff_provider_ref,
  • replacement in editors/vscode/src/event_loop/js_function/mod.rs at line 99
    [7.1272][11.92:158]()
    repository_uri_ref: crate::vscode_sys::reference::UriRef,
    [7.1272]
    [8.537]
    repository_uri_ref: vscode_sys::reference::UriRef,
    quick_diff_provider_ref: &Rc<vscode_sys::reference::QuickDiffProviderRef>,
  • edit in editors/vscode/src/event_loop/js_function/mod.rs at line 107
    [11.320]
    [11.320]
    quick_diff_provider_ref: Rc::clone(quick_diff_provider_ref),
  • edit in editors/vscode/src/event_loop/js_function/initialize_source_control.rs at line 1
    [10.582]
    [11.522]
    use std::rc::Rc;
  • edit in editors/vscode/src/event_loop/js_function/initialize_source_control.rs at line 10
    [11.716]
    [11.716]
    pub quick_diff_provider_ref: Rc<vscode_sys::reference::QuickDiffProviderRef>,
  • edit in editors/vscode/src/event_loop/js_function/initialize_source_control.rs at line 42
    [11.1032]
    [11.1032]
    quick_diff_provider_ref,
  • replacement in editors/vscode/src/event_loop/js_function/initialize_source_control.rs at line 48
    [10.1522][10.1522:1587]()
    let source_control = vscode_sys::scm::create_source_control(
    [10.1522]
    [10.1587]
    let mut source_control = vscode_sys::scm::create_source_control(
  • edit in editors/vscode/src/event_loop/js_function/initialize_source_control.rs at line 54
    [10.1736]
    [10.1736]
    let quick_diff_provider = quick_diff_provider_ref.get_inner(function_call_context.env)?;
    source_control.set_quick_diff_provider(quick_diff_provider)?;
  • edit in editors/vscode/src/event_loop/event/open_workspace_folder.rs at line 91
    [9.2560]
    [9.2560]
    &extension_state.quick_diff_provider,