diff --git a/doc/dap.txt b/doc/dap.txt index 83a1e993..e39c250d 100644 --- a/doc/dap.txt +++ b/doc/dap.txt @@ -780,7 +780,8 @@ clear_breakpoints() *dap.clear_breakpoints()* Removes all breakpoints -set_exception_breakpoints({filters}, {exceptionOptions}) +set_exception_breakpoints({filters}, {exceptionOptions}, +{filterOptions}) *dap.set_exception_breakpoints()* Sets breakpoints on exceptions filtered by `filters`. If `filters` is not @@ -797,6 +798,9 @@ set_exception_breakpoints({filters}, {exceptionOptions}) {exceptionOptions} ExceptionOptions[]? (https://microsoft.github.io/debug-adapter-protocol/specification#Types_ExceptionOptions) + {filterOptions} ExceptionFilterOptions[]? + (https://microsoft.github.io/debug-adapter-protocol/specification#Types_ExceptionFilterOptions) + >lua -- Ask user to stop on which kinds of exceptions require'dap'.set_exception_breakpoints() diff --git a/lua/dap.lua b/lua/dap.lua index 1b4eb086..1f52bed9 100644 --- a/lua/dap.lua +++ b/lua/dap.lua @@ -147,6 +147,11 @@ M.defaults = setmetatable( { fallback = { exception_breakpoints = 'default'; + ---@type table[]|nil + exception_options = nil; + ---@type table[]|nil + exception_filter_options = nil; + ---@type "statement"|"line"|"instruction" stepping_granularity = 'statement'; @@ -952,15 +957,15 @@ end -- setExceptionBreakpoints (https://microsoft.github.io/debug-adapter-protocol/specification#Requests_SetExceptionBreakpoints) --- filters: string[] --- exceptionOptions: exceptionOptions?: ExceptionOptions[] (https://microsoft.github.io/debug-adapter-protocol/specification#Types_ExceptionOptions) -function M.set_exception_breakpoints(filters, exceptionOptions) +--- filterOptions: filterOptions?: ExceptionFilterOptions[] (https://microsoft.github.io/debug-adapter-protocol/specification#Types_ExceptionFilterOptions) +function M.set_exception_breakpoints(filters, exceptionOptions, filterOptions) if session then - session:set_exception_breakpoints(filters, exceptionOptions) + session:set_exception_breakpoints(filters, exceptionOptions, filterOptions) else notify('Cannot set exception breakpoints: No active session!', vim.log.levels.INFO) end end - function M.run_to_cursor() local lsession = session if not lsession then diff --git a/lua/dap/session.lua b/lua/dap/session.lua index 5668680f..0b390b35 100644 --- a/lua/dap/session.lua +++ b/lua/dap/session.lua @@ -327,7 +327,11 @@ function Session:event_initialized() local bps = breakpoints.get() self:set_breakpoints(bps, function() if self.capabilities.exceptionBreakpointFilters then - self:set_exception_breakpoints(dap().defaults[self.config.type].exception_breakpoints, nil, on_done) + self:set_exception_breakpoints( + dap().defaults[self.config.type].exception_breakpoints, + dap().defaults[self.config.type].exception_options, + dap().defaults[self.config.type].exception_filter_options, + on_done) else on_done() end @@ -991,7 +995,7 @@ do end end -function Session:set_exception_breakpoints(filters, exceptionOptions, on_done) +function Session:set_exception_breakpoints(filters, exceptionOptions, filterOptions, on_done) if not self.capabilities.exceptionBreakpointFilters then utils.notify("Debug adapter doesn't support exception breakpoints", vim.log.levels.INFO) return @@ -1021,12 +1025,18 @@ function Session:set_exception_breakpoints(filters, exceptionOptions, on_done) return end + if filterOptions and not self.capabilities.supportsExceptionFilterOptions then + utils.notify('Debug adapter does not support FilterOptions', vim.log.levels.INFO) + return + end + -- setExceptionBreakpoints (https://microsoft.github.io/debug-adapter-protocol/specification#Requests_SetExceptionBreakpoints) --- filters: string[] --- exceptionOptions: exceptionOptions?: ExceptionOptions[] (https://microsoft.github.io/debug-adapter-protocol/specification#Types_ExceptionOptions) + --- filterOptions: filterOptions?: ExceptionFilterOptions[] (https://microsoft.github.io/debug-adapter-protocol/specification#Types_ExceptionFilterOptions) self:request( 'setExceptionBreakpoints', - { filters = filters, exceptionOptions = exceptionOptions }, + { filters = filters, exceptionOptions = exceptionOptions, filterOptions = filterOptions }, function(err, _) if err then utils.notify('Error setting exception breakpoints: ' .. utils.fmt_error(err), vim.log.levels.ERROR)