diff options
| author | William Boman <william@redwill.se> | 2022-09-03 01:26:03 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-03 01:26:03 +0200 |
| commit | 73fb0ea926cf27f2107dfa1138f74a1f7999694d (patch) | |
| tree | ddf324bfbabab1b06d3a9d6c0c6522057810022a /lua | |
| parent | fix(fantomas): link correct fantomas binany name (#370) (diff) | |
| download | mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.gz mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.bz2 mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.lz mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.xz mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.zst mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.zip | |
fix(EventEmitter): properly deregister handlers, print errors that occur in handler (#373)
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/mason-core/EventEmitter.lua | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/lua/mason-core/EventEmitter.lua b/lua/mason-core/EventEmitter.lua index 5d7aeaa0..403628a0 100644 --- a/lua/mason-core/EventEmitter.lua +++ b/lua/mason-core/EventEmitter.lua @@ -1,3 +1,4 @@ +local log = require "mason-core.log" ---@class EventEmitter ---@field private __event_handlers table<any, table<fun(), fun()>> ---@field private __event_handlers_once table<any, table<fun(), fun()>> @@ -14,18 +15,31 @@ function EventEmitter.init(obj) end ---@param event any +---@param handler fun(...): any +local function call_handler(event, handler, ...) + local ok, err = pcall(handler, ...) + if not ok then + vim.schedule(function() + log.fmt_warn("EventEmitter handler failed for event %s with error %s", event, err) + vim.api.nvim_err_writeln(err) + end) + end +end + +---@param event any function EventEmitter:emit(event, ...) if self.__event_handlers[event] then for handler in pairs(self.__event_handlers[event]) do - pcall(handler, ...) + call_handler(event, handler, ...) end end if self.__event_handlers_once[event] then for handler in pairs(self.__event_handlers_once[event]) do - pcall(handler, ...) - self.__event_handlers_once[handler] = nil + call_handler(event, handler, ...) + self.__event_handlers_once[event][handler] = nil end end + return self end ---@param event any @@ -35,6 +49,7 @@ function EventEmitter:on(event, handler) self.__event_handlers[event] = {} end self.__event_handlers[event][handler] = handler + return self end ---@param event any @@ -44,16 +59,19 @@ function EventEmitter:once(event, handler) self.__event_handlers_once[event] = {} end self.__event_handlers_once[event][handler] = handler + return self end ---@param event any ---@param handler fun(payload: any) function EventEmitter:off(event, handler) - if vim.tbl_get(self.__event_handlers, { event, handler }) then + if self.__event_handlers[event] then self.__event_handlers[event][handler] = nil - return true end - return false + if self.__event_handlers_once[event] then + self.__event_handlers_once[event][handler] = nil + end + return self end ---@private |
