Add `ChangedFilesystemContents` event
Dependencies
- [2]
WFWTKCJNCreate initial Visual Studio Code extension - [3]
72K45XKDRefactor inline credit to improve hover messages - [4]
VKCHFDMCCreate simple `FileSystemWatcher` - [5]
T4NQUSRPEmit events on file decoration change - [6]
57DXWD6GHandle file rename/move events in VS Code extension - [7]
3YGYMEXVCreate `event_loop` module - [8]
NB2MF3MYAdd `OpenWorkspaceFolder` event - [9]
OUADGWKRCreate fully-initialized `SourceControl` object in `event_loop` - [10]
2ZAM5V35Move event handling into modules - [11]
QY4Z5ZXZRefactor `event_loop/threadsafe_function` file into `event_loop::js_function` module - [12]
IBVCQSSGUse `External` to wrap `initialize_source_control` arguments - [13]
IDY5SNLOUpdate source control resource states in event loop - [14]
3RNQI5RXRefactor `provide_file_decoration` to return a `Promise` resolved by `event_loop` - [15]
M5RW5PN4Add `OpenTextEditor` event - [16]
QY4DF3NMAdd `ChangeEditorContents` event - [17]
3TWMKU4MAdd `RequestInlineCredit` event - [18]
MGJ23FHFAssign repository URI to source control in `OpenWorkspaceFolder` events - [19]
XDFSAPI7Create a tokio runtime directly instead of `#[tokio::main]`
Change contents
- edit in editors/vscode/src/lib.rs at line 38
decoration_change_event_emitter: vscode_sys::reference::EventEmitterRef, - replacement in editors/vscode/src/lib.rs at line 251
pub fn handle_fs_watcher_event(env: &napi::Env, uri: vscode_sys::Uri) -> Result<(), napi::Error> {let mut extension_state = crate::ExtensionState::get()?;let decoration_change_event_emitter = extension_state.decoration_change_event_emitter.get_inner(env)?;pub fn handle_fs_watcher_event(_env: &napi::Env,vscode_uri: vscode_sys::Uri,) -> Result<(), napi::Error> {let uri = uri::from_vscode(&vscode_uri)?;event_loop::send(Event::ChangedFilesystemContents { uri }); - edit in editors/vscode/src/lib.rs at line 258[4.814]→[4.814:1367](∅→∅),[4.1367]→[2.117875:117876](∅→∅),[2.117875]→[2.117875:117876](∅→∅),[2.117876]→[4.1368:1607](∅→∅),[4.1607]→[5.2271:2329](∅→∅),[5.2329]→[4.1607:1679](∅→∅),[4.1607]→[4.1607:1679](∅→∅),[4.1679]→[6.574:580](∅→∅),[6.580]→[6.580:581](∅→∅)
if let Some((repository_path, open_repository)) = extension_state.repositories.get_open_repository_mut(env, &uri)?{let absolute_file_path = Utf8PathBuf::from(uri.get_fs_path()?);let relative_file_path = absolute_file_path.strip_prefix(&repository_path).map_err(|error| {napi::Error::from_reason(format!("Failed to strip prefix {repository_path} from {absolute_file_path}: {error}"))})?.to_path_buf();open_repository.repository.update_path_state(relative_file_path).map_err(|error| {napi::Error::from_reason(format!("Failed to update path state: {error:?}"))})?;decoration_change_event_emitter.fire(uri.inner)?;open_repository.update_resource_states(env, &repository_path)?;} - edit in editors/vscode/src/lib.rs at line 267
let decoration_change_event_emitter = extension_state.decoration_change_event_emitter.get_inner(env)?; - edit in editors/vscode/src/lib.rs at line 305
decoration_change_event_emitter.fire(new_uri.inner)?; - edit in editors/vscode/src/lib.rs at line 337
let decoration_change_event_emitter = vscode_sys::EventEmitter::new(env)?;let decoration_change_event = decoration_change_event_emitter.get_event()?; - replacement in editors/vscode/src/lib.rs at line 341
event_loop::start(env, &vscode_object)?;event_loop::start(env, &vscode_object, decoration_change_event_emitter)?; - replacement in editors/vscode/src/lib.rs at line 357[5.2331]→[5.2331:2490](∅→∅),[3.947]→[2.118947:118948](∅→∅),[5.2490]→[2.118947:118948](∅→∅),[2.118947]→[2.118947:118948](∅→∅),[2.118948]→[2.118948:118991](∅→∅),[2.119047]→[5.2491:2579](∅→∅),[5.2579]→[2.119047:119076](∅→∅),[2.119047]→[2.119047:119076](∅→∅)
let decoration_change_event_emitter = vscode_sys::EventEmitter::new(env)?;let decoration_change_event = decoration_change_event_emitter.get_event()?;let extension_state = ExtensionState {decoration_change_event_emitter: decoration_change_event_emitter.create_ref()?,repositories,};let extension_state = ExtensionState { repositories }; - edit in editors/vscode/src/event_loop/mod.rs at line 30
decoration_change_event_emitter: Rc<vscode_sys::reference::EventEmitterRef>, - edit in editors/vscode/src/event_loop/mod.rs at line 89
decoration_change_event_emitter: vscode_sys::reference::EventEmitterRef, - edit in editors/vscode/src/event_loop/mod.rs at line 98
decoration_change_event_emitter: Rc::new(decoration_change_event_emitter), - edit in editors/vscode/src/event_loop/mod.rs at line 140
}Event::ChangedFilesystemContents { uri } => {event::changed_filesystem_contents::handle(uri,&mut extension_state,&js_functions,).await - edit in editors/vscode/src/event_loop/mod.rs at line 185
decoration_change_event_emitter: vscode_sys::EventEmitter, - edit in editors/vscode/src/event_loop/mod.rs at line 187
let decoration_change_event_emitter_ref = decoration_change_event_emitter.create_ref()?;let decoration_type = crate::inline_credit::create_decoration_type(env)?.create_ref()?; - edit in editors/vscode/src/event_loop/mod.rs at line 190
let decoration_type = crate::inline_credit::create_decoration_type(env)?.create_ref()?; - replacement in editors/vscode/src/event_loop/mod.rs at line 202
runtime.block_on(event_loop(decoration_type, js_functions, sender, receiver))runtime.block_on(event_loop(decoration_change_event_emitter_ref,decoration_type,js_functions,sender,receiver,)) - edit in editors/vscode/src/event_loop/js_function/mod.rs at line 4
use iri_string::types::UriAbsoluteString; - edit in editors/vscode/src/event_loop/js_function/mod.rs at line 10
pub mod fire_decoration_change_event; - edit in editors/vscode/src/event_loop/js_function/mod.rs at line 19
fire_decoration_change_event: fire_decoration_change_event::Prototype, - edit in editors/vscode/src/event_loop/js_function/mod.rs at line 32
fire_decoration_change_event: fire_decoration_change_event::build(env)?, - edit in editors/vscode/src/event_loop/js_function/mod.rs at line 43
pub async fn fire_decoration_change_event(&self,uri: UriAbsoluteString,event_emitter_reference: &Rc<vscode_sys::reference::EventEmitterRef>,) -> Result<(), napi::Error> {let arguments = fire_decoration_change_event::Arguments {uri,event_emitter_reference: Rc::clone(event_emitter_reference),};self.fire_decoration_change_event.call_async(External::new(arguments)).await} - file addition: fire_decoration_change_event.rs[11.435]
use std::rc::Rc;use iri_string::types::UriAbsoluteString;use napi::bindgen_prelude::{External, FunctionCallContext};use napi::threadsafe_function::ThreadsafeFunction;use crate::vscode_sys;pub struct Arguments {pub uri: UriAbsoluteString,pub event_emitter_reference: Rc<vscode_sys::reference::EventEmitterRef>,}pub type Prototype =ThreadsafeFunction<External<Arguments>, (), External<Arguments>, napi::Status, false, false, 0>;pub fn build(env: &napi::Env) -> Result<Prototype, napi::Error> {env.create_function_from_closure("fire_event", callback)?.build_threadsafe_function().build()}fn callback(function_call_context: FunctionCallContext) -> Result<(), napi::Error> {let (external,): (&External<Arguments>,) = function_call_context.args()?;let Arguments {uri,event_emitter_reference,} = &**external;let event_emitter = event_emitter_reference.get_inner(function_call_context.env)?;let vscode_uri = crate::uri::to_vscode(function_call_context.env, uri)?;event_emitter.fire(vscode_uri.inner)} - edit in editors/vscode/src/event_loop/event/mod.rs at line 7
pub mod changed_filesystem_contents; - edit in editors/vscode/src/event_loop/event/mod.rs at line 33
},ChangedFilesystemContents {uri: UriAbsoluteString, - file addition: changed_filesystem_contents.rs[10.332]
use iri_string::types::UriAbsoluteString;use crate::event_loop::ExtensionState;use crate::event_loop::js_function::Functions;#[tracing::instrument(skip(extension_state, js_functions))]pub async fn handle(uri: UriAbsoluteString,extension_state: &mut ExtensionState,js_functions: &Functions,) {let Some((_repository_path, relative_path, repository)) =extension_state.get_repository_mut(&uri)else {tracing::info!(message = "Ignoring filesystem changes");return;};match repository.repository.update_path_state(relative_path.to_path_buf()){Ok(()) => tracing::debug!(message = "Updated path state"),Err(error) => {tracing::error!(message = "Failed to update path states",?relative_path,?error);return;}}match js_functions.fire_decoration_change_event(uri, &extension_state.decoration_change_event_emitter).await{Ok(()) => {tracing::debug!(message = "Fired onDidChangeFileDecorations");}Err(error) => {tracing::warn!(message = "Failed to fire onDidChangeFileDecorations",?error);}}}