Handle file rename/move events in VS Code extension

finchie
Dec 17, 2025, 12:29 PM
57DXWD6GZPHURKSCV4Z6TN2FCY4VM4HLVQP7ZE75Y3EEDJ7IHJVAC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] YKBMKWDP Refactor event handling to support both namespaces and objects
  • [4] VKCHFDMC Create simple `FileSystemWatcher`

Change contents

  • replacement in extensions/vscode/src/vscode_sys/workspace.rs at line 8
    [2.54597][4.0:146]()
    FileSystemWatcher, TextDocument, TextDocumentChangeEvent, TextDocumentContentProvider, Uri,
    WorkspaceFolder, WorkspaceFoldersChangeEvent,
    [2.54597]
    [2.54724]
    FileRenameEvent, FileSystemWatcher, TextDocument, TextDocumentChangeEvent,
    TextDocumentContentProvider, Uri, WorkspaceFolder, WorkspaceFoldersChangeEvent,
  • edit in extensions/vscode/src/vscode_sys/workspace.rs at line 16
    [3.352]
    [3.352]
    "onDidRenameFiles": on_did_rename_files(FileRenameEvent);
  • edit in extensions/vscode/src/vscode_sys/mod.rs at line 202
    [4.414]
    [4.414]
    FileRenameEvent {}
    }
    field_getter! {
    FileRenameEvent {
    "files": get_files -> Vec<FileRenameEventItem<'env>>;
    }
    }
    interface_builder! {
    FileRenameEventItem {}
    }
    field_getter! {
    FileRenameEventItem {
    "oldUri": get_old_uri -> Uri<'env>;
    "newUri": get_new_uri -> Uri<'env>;
    }
    }
    interface_builder! {
  • edit in extensions/vscode/src/lib.rs at line 301
    [4.1679]
    [4.1679]
    }
    Ok(())
    }
    #[tracing::instrument(skip_all)]
    pub fn on_did_move_files(
    env: &napi::Env,
    event: vscode_sys::FileRenameEvent,
    ) -> Result<(), napi::Error> {
    let mut extension_state = ExtensionState::get()?;
    let decoration_change_event_emitter = extension_state
    .decoration_change_event_emitter
    .get_inner(env)?;
    for renamed_file in event.get_files()? {
    let old_uri = renamed_file.get_old_uri()?;
    let new_uri = renamed_file.get_new_uri()?;
    let old_absolute_path = Utf8PathBuf::from(old_uri.get_fs_path()?);
    let new_absolute_path = Utf8PathBuf::from(new_uri.get_fs_path()?);
    // TODO: handle renaming/moves across workspaces
    if let Some((workspace_path, open_repository)) = extension_state
    .repositories
    .get_open_repository_mut(env, &old_uri)?
    {
    let old_relative_path =
    old_absolute_path
    .strip_prefix(&workspace_path)
    .map_err(|error| {
    napi::Error::from_reason(format!(
    "Path {old_absolute_path} not in {workspace_path}: {error}"
    ))
    })?;
    let new_relative_path =
    new_absolute_path
    .strip_prefix(&workspace_path)
    .map_err(|error| {
    napi::Error::from_reason(format!(
    "Path {new_absolute_path} not in {workspace_path}: {error}"
    ))
    })?;
    open_repository
    .repository
    .move_path(old_relative_path, new_relative_path.to_path_buf())
    .map_err(|error| {
    napi::Error::from_reason(format!(
    "Unable to move {old_absolute_path} to {new_absolute_path}: {error:#?}"
    ))
    })?;
    decoration_change_event_emitter.fire(new_uri.inner)?;
    open_repository.update_resource_states(env, &workspace_path)?;
    } else {
    tracing::info!(
    message = "Ignoring move outside of workspace",
    ?old_absolute_path,
    ?new_absolute_path
    );
    }
  • edit in extensions/vscode/src/lib.rs at line 456
    [2.120996]
    [4.1701]
    vscode_sys::workspace::on_did_rename_files(env, on_did_move_files)?;