From 52fc6a1d45bf2a21ede0d1908d4c29801e8c657a Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Fri, 24 May 2024 16:11:02 -0700 Subject: [PATCH 1/2] feat: enable attaching symbols to chat via `#` --- .../browser/actions/chatContextActions.ts | 22 ++++++++++++++++--- .../search/browser/symbolsQuickAccess.ts | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts index 70c5651e73ad1..062e23b132504 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts @@ -28,12 +28,13 @@ import { IChatRequestVariableEntry } from 'vs/workbench/contrib/chat/common/chat import { ChatRequestAgentPart } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import { AnythingQuickAccessProvider } from 'vs/workbench/contrib/search/browser/anythingQuickAccess'; +import { ISymbolQuickPickItem, SymbolsQuickAccessProvider } from 'vs/workbench/contrib/search/browser/symbolsQuickAccess'; export function registerChatContextActions() { registerAction2(AttachContextAction); } -export type IChatContextQuickPickItem = IFileQuickPickItem | IDynamicVariableQuickPickItem | IStaticVariableQuickPickItem | IGotoSymbolQuickPickItem; +export type IChatContextQuickPickItem = IFileQuickPickItem | IDynamicVariableQuickPickItem | IStaticVariableQuickPickItem | IGotoSymbolQuickPickItem | ISymbolQuickPickItem; export interface IFileQuickPickItem extends IQuickPickItem { kind: 'file'; @@ -124,11 +125,21 @@ class AttachContextAction extends Action2 { // Apply the original icon with the new name fullName: `${pick.icon ? `$(${pick.icon.id}) ` : ''}${selection}` }); - } else if (pick && typeof pick === 'object' && 'resource' in pick) { + } else if ('symbol' in pick && pick.symbol) { + // Symbol + toAttach.push({ + ...pick, + id: this._getFileContextId(pick.symbol.location), + value: pick.symbol.location, + fullName: pick.label, + name: pick.symbol.name, + isDynamic: true + }); + } else if (pick && typeof pick === 'object' && 'resource' in pick && pick.resource) { // #file variable toAttach.push({ ...pick, - id: this._getFileContextId(pick), + id: this._getFileContextId({ resource: pick.resource }), value: pick.resource, name: pick.label, isFile: true, @@ -212,6 +223,7 @@ class AttachContextAction extends Action2 { quickInputService.quickAccess.show('', { enabledProviderPrefixes: [ AnythingQuickAccessProvider.PREFIX, + SymbolsQuickAccessProvider.PREFIX, AbstractGotoSymbolQuickAccessProvider.PREFIX ], placeholder: localize('chatContext.attach.placeholder', 'Search attachments'), @@ -225,6 +237,10 @@ class AttachContextAction extends Action2 { // Avoid attaching the same context twice const attachedContext = widget.getContrib(ChatContextAttachments.ID)?.getContext() ?? new Set(); + if ('symbol' in item && item.symbol) { + return !attachedContext.has(this._getFileContextId(item.symbol.location)); + } + if (item && typeof item === 'object' && 'resource' in item && URI.isUri(item.resource)) { return [Schemas.file, Schemas.vscodeRemote].includes(item.resource.scheme) && !attachedContext.has(this._getFileContextId({ resource: item.resource })); // Hack because Typescript doesn't narrow this type correctly diff --git a/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts b/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts index 175175d87843e..3ec70181227fd 100644 --- a/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts +++ b/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts @@ -25,7 +25,7 @@ import { IMatch } from 'vs/base/common/filters'; import { Codicon } from 'vs/base/common/codicons'; import { ThemeIcon } from 'vs/base/common/themables'; -interface ISymbolQuickPickItem extends IPickerQuickAccessItem, IQuickPickItemWithResource { +export interface ISymbolQuickPickItem extends IPickerQuickAccessItem, IQuickPickItemWithResource { score?: number; symbol?: IWorkspaceSymbol; } From 14d51f00a71a68910640602fdcf2350d1ea5073d Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Fri, 24 May 2024 16:36:51 -0700 Subject: [PATCH 2/2] feat: add `Symbol...` to Attach Context picker --- .../browser/actions/chatContextActions.ts | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts index 062e23b132504..ae0beeb27f7d9 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts @@ -34,7 +34,7 @@ export function registerChatContextActions() { registerAction2(AttachContextAction); } -export type IChatContextQuickPickItem = IFileQuickPickItem | IDynamicVariableQuickPickItem | IStaticVariableQuickPickItem | IGotoSymbolQuickPickItem | ISymbolQuickPickItem; +export type IChatContextQuickPickItem = IFileQuickPickItem | IDynamicVariableQuickPickItem | IStaticVariableQuickPickItem | IGotoSymbolQuickPickItem | ISymbolQuickPickItem | IQuickAccessQuickPickItem; export interface IFileQuickPickItem extends IQuickPickItem { kind: 'file'; @@ -67,6 +67,15 @@ export interface IStaticVariableQuickPickItem extends IQuickPickItem { icon?: ThemeIcon; } +export interface IQuickAccessQuickPickItem extends IQuickPickItem { + kind: 'quickaccess'; + id: string; + name: string; + value: string; + + prefix: string; +} + class AttachContextAction extends Action2 { static readonly ID = 'workbench.action.chat.attachContext'; @@ -220,7 +229,17 @@ class AttachContextAction extends Action2 { } - quickInputService.quickAccess.show('', { + quickPickItems.push({ + label: localize('chatContext.symbol', '{0} Symbol...', `$(${Codicon.symbolField.id})`), + icon: ThemeIcon.fromId(Codicon.symbolField.id), + prefix: SymbolsQuickAccessProvider.PREFIX + }); + + this._show(quickInputService, commandService, widget, quickPickItems); + } + + private _show(quickInputService: IQuickInputService, commandService: ICommandService, widget: IChatWidget, quickPickItems: (IChatContextQuickPickItem | QuickPickItem)[], query: string = '') { + quickInputService.quickAccess.show(query, { enabledProviderPrefixes: [ AnythingQuickAccessProvider.PREFIX, SymbolsQuickAccessProvider.PREFIX, @@ -229,10 +248,13 @@ class AttachContextAction extends Action2 { placeholder: localize('chatContext.attach.placeholder', 'Search attachments'), providerOptions: { handleAccept: (item: IChatContextQuickPickItem) => { - this._attachContext(widget, commandService, item); + if ('prefix' in item) { + this._show(quickInputService, commandService, widget, quickPickItems, item.prefix); + } else { + this._attachContext(widget, commandService, item); + } }, additionPicks: quickPickItems, - includeSymbols: false, filter: (item: IChatContextQuickPickItem) => { // Avoid attaching the same context twice const attachedContext = widget.getContrib(ChatContextAttachments.ID)?.getContext() ?? new Set();