mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	fix(iter): ArrayIter:last returns nil when filtered to empty #34697
Problem: After filtering out all elements, ArrayIter:last still returns a stale element. Solution: Add check for self._head == self._tail and return nil early. Fix #34696
This commit is contained in:
		@@ -1010,6 +1010,9 @@ end
 | 
			
		||||
 | 
			
		||||
---@private
 | 
			
		||||
function ArrayIter:last()
 | 
			
		||||
  if self._head >= self._tail then
 | 
			
		||||
    return nil
 | 
			
		||||
  end
 | 
			
		||||
  local inc = self._head < self._tail and 1 or -1
 | 
			
		||||
  local v = self._table[self._tail - inc]
 | 
			
		||||
  self._head = self._tail
 | 
			
		||||
 
 | 
			
		||||
@@ -405,6 +405,15 @@ describe('vim.iter', function()
 | 
			
		||||
    local s = 'abcdefghijklmnopqrstuvwxyz'
 | 
			
		||||
    eq('z', vim.iter(vim.split(s, '')):last())
 | 
			
		||||
    eq('z', vim.iter(vim.gsplit(s, '')):last())
 | 
			
		||||
    eq(
 | 
			
		||||
      nil,
 | 
			
		||||
      vim
 | 
			
		||||
        .iter({ 1, 2, 3, 4, 5 })
 | 
			
		||||
        :filter(function()
 | 
			
		||||
          return false
 | 
			
		||||
        end)
 | 
			
		||||
        :last()
 | 
			
		||||
    )
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('enumerate()', function()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user