Refactor event handling to support both namespaces and objects
Dependencies
Change contents
- replacement in extensions/vscode/src/vscode_sys/workspace.rs at line 4
use super::macros::{event_handler, namespace_field_getter, namespace_function, register_provider};use super::macros::{namespace_event_handler, namespace_field_getter, namespace_function, register_provider,}; - replacement in extensions/vscode/src/vscode_sys/workspace.rs at line 12
event_handler!("workspace","onDidChangeTextDocument",on_did_change_text_document(TextDocumentChangeEvent));event_handler!("workspace","onDidChangeWorkspaceFolders",on_did_change_workspace_folders(WorkspaceFoldersChangeEvent));namespace_event_handler! {"workspace" {"onDidChangeTextDocument": on_did_change_text_document(TextDocumentChangeEvent);"onDidChangeWorkspaceFolders": on_did_change_workspace_folders(WorkspaceFoldersChangeEvent);}} - replacement in extensions/vscode/src/vscode_sys/window.rs at line 4
use super::macros::{event_handler, namespace_field_getter, namespace_function, register_provider};use super::macros::{namespace_event_handler, namespace_field_getter, namespace_function, register_provider,}; - replacement in extensions/vscode/src/vscode_sys/window.rs at line 12
event_handler!("window","onDidChangeTextEditorSelection",on_did_change_text_editor_selections(TextEditorSelectionChangeEvent));event_handler!("window","onDidChangeVisibleTextEditors",on_did_change_visible_text_editors(Vec<TextEditor>));namespace_event_handler! {"window" {"onDidChangeTextEditorSelection": on_did_change_text_editor_selections(TextEditorSelectionChangeEvent);"onDidChangeVisibleTextEditors": on_did_change_visible_text_editors(Vec<TextEditor>);}} - edit in extensions/vscode/src/vscode_sys/macros/object/mod.rs at line 1
pub mod event_handler; - file addition: event_handler.rs[2.69613]
macro_rules! object_event_handler {($interface_name:ident {$($function_js_name:literal: $function_rust_name:ident($event_type:ty);)*}) => {impl<'env> $interface_name<'env> {$(pub fn $function_rust_name<F>(&self,env: &napi::Env,handler: F,// TODO: generic errors) -> Result<(), napi::Error>whereF: for<'function_context> Fn(&'function_context napi::Env,$event_type,) -> Result<(), napi::Error>+ std::panic::RefUnwindSafe+ 'static,{crate::vscode_sys::macros::event_handler_body! {env,handler,self.inner,$function_js_name,$function_rust_name($event_type)}})*}};}pub(crate) use object_event_handler; - edit in extensions/vscode/src/vscode_sys/macros/namespace/mod.rs at line 1
pub mod event_handler; - file addition: event_handler.rs[2.75327]
macro_rules! namespace_event_handler {($namespace:literal {$($function_js_name:literal: $function_rust_name:ident($event_type:ty);)*}) => {$(pub fn $function_rust_name<F>(env: &napi::Env,handler: F,// TODO: generic errors) -> Result<(), napi::Error>whereF: for<'function_context> Fn(&'function_context napi::Env,$event_type,) -> Result<(), napi::Error>+ std::panic::RefUnwindSafe+ 'static,{let vscode_object = super::VscodeContext::vscode(env)?;let event_container: bindgen_prelude::Object =vscode_object.get_named_property($namespace)?;crate::vscode_sys::macros::event_handler_body! {env,handler,event_container,$function_js_name,$function_rust_name($event_type)}})*};}pub(crate) use namespace_event_handler; - replacement in extensions/vscode/src/vscode_sys/macros/mod.rs at line 11
pub(super) use event_handler::event_handler;pub(super) use event_handler::event_handler_body; - edit in extensions/vscode/src/vscode_sys/macros/mod.rs at line 13
pub(super) use namespace::event_handler::namespace_event_handler; - edit in extensions/vscode/src/vscode_sys/macros/mod.rs at line 16
pub(super) use object::event_handler::object_event_handler; - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 1
macro_rules! event_handler {macro_rules! event_handler_body { - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 3
$namespace:literal, $function_js_name:literal, $function_rust_name:ident($event_type:ty)$env:ident, $handler:ident, $event_container:expr, $function_js_name:literal, $function_rust_name:ident($event_type:ty) - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 5[2.84049]→[2.84049:84398](∅→∅),[2.84398]→[3.1044:1088](∅→∅),[3.1088]→[2.84398:84650](∅→∅),[2.84398]→[2.84398:84650](∅→∅)
pub fn $function_rust_name<F>(env: &napi::Env,handler: F,// TODO: generic errors) -> Result<(), napi::Error>whereF: for<'function_context> Fn(&'function_context napi::Env,$event_type,) -> Result<(), napi::Error>+ std::panic::RefUnwindSafe+ 'static,{let extension_context = super::VscodeContext::extension_context(env)?;let mut subscriptions: bindgen_prelude::Array =extension_context.get_named_property("subscriptions")?;let extension_context = crate::vscode_sys::VscodeContext::extension_context($env)?;let mut subscriptions: bindgen_prelude::Array =extension_context.get_named_property("subscriptions")?;let event_creator: bindgen_prelude::Function<bindgen_prelude::Function<$event_type, ()>,// TODO: disposablebindgen_prelude::Object,> = $event_container.get_named_property($function_js_name)?;let event_handler_fn: bindgen_prelude::Function<$event_type, ()> = $env.create_function_from_closure($function_js_name, move |function_context| {let parent_span = tracing::span!(tracing::Level::TRACE, "event_handler");let _entered_span = parent_span.enter(); - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 19
let vscode_object = super::VscodeContext::vscode(env)?;let namespace: bindgen_prelude::Object =vscode_object.get_named_property($namespace)?;let event_creator: bindgen_prelude::Function<bindgen_prelude::Function<$event_type, ()>,// TODO: disposablebindgen_prelude::Object,> = namespace.get_named_property($function_js_name)?;let event_handler_fn: bindgen_prelude::Function<$event_type, ()> = env.create_function_from_closure($function_js_name, move |function_context| {let parent_span = tracing::span!(tracing::Level::TRACE, "event_handler");let _entered_span = parent_span.enter();let event = match function_context.args::<($event_type,)>() {Ok((event,)) => event,Err(error) => {tracing::error!(message = "Invalid arguments provided to event handler",event_handler = $function_js_name,?error); - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 28
let event = match function_context.args::<($event_type,)>() {Ok((event,)) => event,return Err(napi::Error::from_reason("Invalid arguments provided to event handler",));}};match std::panic::catch_unwind(|| $handler(function_context.env, event)) {Ok(handler_result) => match handler_result {Ok(result) => Ok(result), - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 39
message = "Invalid arguments provided to event handler",message = "Event handler returned an error", - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 44
return Err(napi::Error::from_reason("Invalid arguments provided to event handler",));Err(napi::Error::from_reason("Event handler returned an error")) - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 46
};},Err(panic_payload) => {tracing::error!(message = "Event handler panicked",event_handler = $function_js_name,?panic_payload); - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 54[2.85933]→[3.1357:1897](∅→∅),[3.1897]→[2.86271:86272](∅→∅),[2.86271]→[2.86271:86272](∅→∅),[2.86272]→[3.1898:2469](∅→∅)
match std::panic::catch_unwind(|| handler(function_context.env, event)) {Ok(handler_result) => match handler_result {Ok(result) => Ok(result),Err(error) => {tracing::error!(message = "Event handler returned an error",event_handler = $function_js_name,?error);Err(napi::Error::from_reason("Event handler returned an error"))}},Err(panic_payload) => {tracing::error!(message = "Event handler panicked",event_handler = $function_js_name,?panic_payload);Err(napi::Error::from_reason("Event handler panicked"))}Err(napi::Error::from_reason("Event handler panicked")) - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 56
})?;}})?; - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 59
let handler_subscription: bindgen_prelude::Object =event_creator.call(event_handler_fn)?;subscriptions.insert(handler_subscription)?;let handler_subscription: bindgen_prelude::Object = event_creator.call(event_handler_fn)?;subscriptions.insert(handler_subscription)?; - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 62
Ok(())}Ok(()) - replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 66
pub(crate) use event_handler;[2.86537]pub(crate) use event_handler_body;