From 4b3df69efaecdd1af8471f6c1027580add0a5395 Mon Sep 17 00:00:00 2001 From: Boris Staletic Date: Wed, 4 Oct 2023 06:41:54 +0200 Subject: [PATCH] Handle possible errors from RangeVisibleInBuffer() First and more common error is that by the time we execute buffer = vim.buffers[ bufnr ] the buffer might not be there any more. This is because `RangeVisibleInBuffer()` is called asynchronously and the user may bwipeout a buffer in between polls. This regularly happens in our vim tests. In such a case, we get a nasty traceback from `vimsupport` module. The solution is to catch the KeyError and return None. However, `ScrollingBufferRange()` also was not ready to handle None values from `RangeVisibleInBuffer()`, even though `RangeVisibleInBuffer()` could return None even before, if a visible window for `bufnr` can not be found. --- python/ycm/scrolling_range.py | 7 +++++++ python/ycm/vimsupport.py | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/python/ycm/scrolling_range.py b/python/ycm/scrolling_range.py index 5dafb20c3c..0d0bd9ad2c 100644 --- a/python/ycm/scrolling_range.py +++ b/python/ycm/scrolling_range.py @@ -55,6 +55,13 @@ def Request( self, force=False ): # - look up the actual visible range, then call this function # - if not overlapping, do the factor expansion and request self._last_requested_range = vimsupport.RangeVisibleInBuffer( self._bufnr ) + # If this is false, either the self._bufnr is not a valid buffer number or + # the buffer is not visible in any window. + # Since this is called asynchronously, a user may bwipeout a buffer with + # self._bufnr number between polls. + if self._last_requested_range is None: + return False + self._tick = vimsupport.GetBufferChangedTick( self._bufnr ) # We'll never use the last response again, so clear it diff --git a/python/ycm/vimsupport.py b/python/ycm/vimsupport.py index 60616568fc..1479814598 100644 --- a/python/ycm/vimsupport.py +++ b/python/ycm/vimsupport.py @@ -206,7 +206,10 @@ class Range: start: Location = Location() end: Location = Location() - buffer = vim.buffers[ bufnr ] + try: + buffer = vim.buffers[ bufnr ] + except KeyError: + return None if not windows: return None