From d1bfba1abbd09e4c70220bc9d82f10b6f61c5b28 Mon Sep 17 00:00:00 2001 From: Sandy Tao Date: Mon, 4 Aug 2025 11:30:59 -0700 Subject: [PATCH] feat(core): Add trailing space when completing an at completion suggestion (#5475) Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../cli/src/ui/hooks/useSlashCompletion.test.ts | 15 ++++++++++----- packages/cli/src/ui/hooks/useSlashCompletion.tsx | 8 ++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/ui/hooks/useSlashCompletion.test.ts b/packages/cli/src/ui/hooks/useSlashCompletion.test.ts index 206c4dc9..da4dc87b 100644 --- a/packages/cli/src/ui/hooks/useSlashCompletion.test.ts +++ b/packages/cli/src/ui/hooks/useSlashCompletion.test.ts @@ -7,7 +7,7 @@ /** @vitest-environment jsdom */ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'; -import { renderHook, act } from '@testing-library/react'; +import { renderHook, act, waitFor } from '@testing-library/react'; import { useSlashCompletion } from './useSlashCompletion.js'; import * as fs from 'fs/promises'; import * as path from 'path'; @@ -136,7 +136,7 @@ describe('useSlashCompletion', () => { expect(result.current.isLoadingSuggestions).toBe(false); }); - it('should reset all state to default values', () => { + it('should reset all state to default values', async () => { const slashCommands = [ { name: 'help', @@ -165,6 +165,11 @@ describe('useSlashCompletion', () => { result.current.resetCompletionState(); }); + // Wait for async suggestions clearing + await waitFor(() => { + expect(result.current.suggestions).toEqual([]); + }); + expect(result.current.suggestions).toEqual([]); expect(result.current.activeSuggestionIndex).toBe(-1); expect(result.current.visibleStartIndex).toBe(0); @@ -1288,7 +1293,7 @@ describe('useSlashCompletion', () => { result.current.handleAutocomplete(0); }); - expect(result.current.textBuffer.text).toBe('@src/file1.txt'); + expect(result.current.textBuffer.text).toBe('@src/file1.txt '); }); it('should complete a file path when cursor is not at the end of the line', () => { @@ -1318,7 +1323,7 @@ describe('useSlashCompletion', () => { result.current.handleAutocomplete(0); }); - expect(result.current.textBuffer.text).toBe('@src/file1.txt le.txt'); + expect(result.current.textBuffer.text).toBe('@src/file1.txt le.txt'); }); it('should complete the correct file path with multiple @-commands', () => { @@ -1347,7 +1352,7 @@ describe('useSlashCompletion', () => { result.current.handleAutocomplete(0); }); - expect(result.current.textBuffer.text).toBe('@file1.txt @src/file2.txt'); + expect(result.current.textBuffer.text).toBe('@file1.txt @src/file2.txt '); }); }); diff --git a/packages/cli/src/ui/hooks/useSlashCompletion.tsx b/packages/cli/src/ui/hooks/useSlashCompletion.tsx index c6821358..3b59bd45 100644 --- a/packages/cli/src/ui/hooks/useSlashCompletion.tsx +++ b/packages/cli/src/ui/hooks/useSlashCompletion.tsx @@ -111,7 +111,7 @@ export function useSlashCompletion( useEffect(() => { if (commandIndex === -1 || reverseSearchActive) { - resetCompletionState(); + setTimeout(resetCompletionState, 0); return; } @@ -631,17 +631,17 @@ export function useSlashCompletion( ) { suggestionText = ' ' + suggestionText; } - suggestionText += ' '; } + suggestionText += ' '; + buffer.replaceRangeByOffset( logicalPosToOffset(buffer.lines, cursorRow, completionStart.current), logicalPosToOffset(buffer.lines, cursorRow, completionEnd.current), suggestionText, ); - resetCompletionState(); }, - [cursorRow, resetCompletionState, buffer, suggestions, commandIndex], + [cursorRow, buffer, suggestions, commandIndex], ); return {