From 18098cbdeed835c4a278cadcea8265749fb6a295 Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Tue, 14 Jun 2022 13:35:11 -0700 Subject: [PATCH 01/10] adding more code action telemetry --- .../codeAction/browser/codeActionCommands.ts | 18 ++++++++++-------- .../contrib/codeAction/browser/codeActionUi.ts | 4 ++-- .../editor/contrib/codeAction/browser/types.ts | 2 ++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index 7be66230fcc..ca0847f7845 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -39,7 +39,7 @@ function contextKeyForSupportedActions(kind: CodeActionKind) { new RegExp('(\\s|^)' + escapeRegExpCharacters(kind.value) + '\\b')); } -function RefactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean) { +function RefactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean, context: string) { const args = CodeActionCommandArgs.fromUser(userArgs, { kind: CodeActionKind.Refactor, apply: CodeActionAutoApply.Never @@ -56,7 +56,7 @@ function RefactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean) { include: CodeActionKind.Refactor.contains(args.kind) ? args.kind : CodeActionKind.None, onlyIncludePreferredActions: args.preferred }, - args.apply, preview); + args.apply, preview, context); } const argsSchema: IJSONSchema = { @@ -140,7 +140,8 @@ export class QuickFixController extends Disposable implements IEditorContributio notAvailableMessage: string, filter?: CodeActionFilter, autoApply?: CodeActionAutoApply, - preview?: boolean + preview?: boolean, + triggerAction?: string, ): void { if (!this._editor.hasModel()) { return; @@ -148,7 +149,7 @@ export class QuickFixController extends Disposable implements IEditorContributio MessageController.get(this._editor)?.closeMessage(); const triggerPosition = this._editor.getPosition(); - this._trigger({ type: CodeActionTriggerType.Invoke, filter, autoApply, context: { notAvailableMessage, position: triggerPosition }, preview }); + this._trigger({ type: CodeActionTriggerType.Invoke, filter, autoApply, context: { notAvailableMessage, position: triggerPosition }, preview, triggerAction }); } private _trigger(trigger: CodeActionTrigger) { @@ -240,12 +241,13 @@ function triggerCodeActionsForEditorSelection( notAvailableMessage: string, filter: CodeActionFilter | undefined, autoApply: CodeActionAutoApply | undefined, - preview: boolean = false + preview: boolean = false, + triggerAction: string = 'default' ): void { if (editor.hasModel()) { const controller = QuickFixController.get(editor); if (controller) { - controller.manualTriggerAtCurrentPosition(notAvailableMessage, filter, autoApply, preview); + controller.manualTriggerAtCurrentPosition(notAvailableMessage, filter, autoApply, preview, triggerAction); } } } @@ -340,7 +342,7 @@ export class RefactorAction extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor, userArgs: any): void { - return RefactorTrigger(editor, userArgs, false); + return RefactorTrigger(editor, userArgs, false, 'from: refactor'); } } @@ -360,7 +362,7 @@ export class RefactorPreview extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor, userArgs: any): void { - return RefactorTrigger(editor, userArgs, true); + return RefactorTrigger(editor, userArgs, true, 'from: refactor preview'); } } diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts b/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts index 09c82ccd2ea..51b503d0da0 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts @@ -39,7 +39,7 @@ export class CodeActionUi extends Disposable { this._codeActionWidget = new Lazy(() => { return this._register(instantiationService.createInstance(CodeActionMenu, this._editor, { - onSelectCodeAction: async (action, trigger) => { + onSelectCodeAction: async (action, trigger, context) => { this.delegate.applyCodeAction(action, /* retrigger */ true, Boolean(trigger.preview)); } })); @@ -47,7 +47,7 @@ export class CodeActionUi extends Disposable { this._lightBulbWidget = new Lazy(() => { const widget = this._register(instantiationService.createInstance(LightBulbWidget, this._editor, quickFixActionId, preferredFixActionId)); - this._register(widget.onClick(e => this.showCodeActionList(e.trigger, e.actions, e, { includeDisabledActions: false }))); + this._register(widget.onClick(e => this.showCodeActionList(e.trigger, e.actions, e, { includeDisabledActions: false, from: 'lightbulb' }))); return widget; }); } diff --git a/src/vs/editor/contrib/codeAction/browser/types.ts b/src/vs/editor/contrib/codeAction/browser/types.ts index cfc6d344980..43bf9bc6626 100644 --- a/src/vs/editor/contrib/codeAction/browser/types.ts +++ b/src/vs/editor/contrib/codeAction/browser/types.ts @@ -121,8 +121,10 @@ export interface CodeActionTrigger { readonly context?: { readonly notAvailableMessage: string; readonly position: Position; + readonly triggerAction?: string; }; readonly preview?: boolean; + readonly triggerAction?: string; } export class CodeActionCommandArgs { From d0815be66964d9c446d6d9db15fb79021b3032ea Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Tue, 14 Jun 2022 13:35:11 -0700 Subject: [PATCH 02/10] adding more code action telemetry --- .../services/extensions/common/extensionsApiProposals.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index a99692ce7cb..95125aec658 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -48,7 +48,6 @@ export const allApiProposals = Object.freeze({ scmActionButton: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmActionButton.d.ts', scmSelectedProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts', scmValidation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmValidation.d.ts', - snippetWorkspaceEdit: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts', taskPresentationGroup: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.taskPresentationGroup.d.ts', telemetry: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.telemetry.d.ts', terminalDataWriteEvent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDataWriteEvent.d.ts', From 4a2f130eec47813d79cc75701a27c1fa2e1918be Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Thu, 16 Jun 2022 12:02:10 -0700 Subject: [PATCH 03/10] added teleemtry on codeactions --- .../codeAction/browser/codeActionCommands.ts | 52 ++++++++++++------- .../codeAction/browser/codeActionMenu.ts | 32 ++++++++++-- .../codeAction/browser/codeActionUi.ts | 6 +-- .../contrib/codeAction/browser/types.ts | 4 +- 4 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index 3dd93bbaa48..19d216c5c1e 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -39,7 +39,7 @@ function contextKeyForSupportedActions(kind: CodeActionKind) { new RegExp('(\\s|^)' + escapeRegExpCharacters(kind.value) + '\\b')); } -function RefactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean, context: string) { +function RefactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean, codeActionFrom: CodeMenuOpenedFrom) { const args = CodeActionCommandArgs.fromUser(userArgs, { kind: CodeActionKind.Refactor, apply: CodeActionAutoApply.Never @@ -56,7 +56,7 @@ function RefactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean, c include: CodeActionKind.Refactor.contains(args.kind) ? args.kind : CodeActionKind.None, onlyIncludePreferredActions: args.preferred }, - args.apply, preview, context); + args.apply, preview, codeActionFrom); } const argsSchema: IJSONSchema = { @@ -115,9 +115,9 @@ export class QuickFixController extends Disposable implements IEditorContributio this._ui = new Lazy(() => this._register(new CodeActionUi(editor, QuickFixAction.Id, AutoFixAction.Id, { - applyCodeAction: async (action, retrigger, preview) => { + applyCodeAction: async (action, retrigger, preview, openedFrom, length) => { try { - await this._applyCodeAction(action, preview); + await this._applyCodeAction(action, preview, openedFrom, length); } finally { if (retrigger) { this._trigger({ type: CodeActionTriggerType.Auto, filter: {} }); @@ -133,7 +133,7 @@ export class QuickFixController extends Disposable implements IEditorContributio } public showCodeActions(trigger: CodeActionTrigger, actions: CodeActionSet, at: IAnchor | IPosition) { - return this._ui.getValue().showCodeActionList(trigger, actions, at, { includeDisabledActions: false }); + return this._ui.getValue().showCodeActionList(trigger, actions, at, { includeDisabledActions: false, from: false }); } public manualTriggerAtCurrentPosition( @@ -141,7 +141,7 @@ export class QuickFixController extends Disposable implements IEditorContributio filter?: CodeActionFilter, autoApply?: CodeActionAutoApply, preview?: boolean, - triggerAction?: string, + triggerAction?: CodeMenuOpenedFrom, ): void { if (!this._editor.hasModel()) { return; @@ -156,8 +156,8 @@ export class QuickFixController extends Disposable implements IEditorContributio return this._model.trigger(trigger); } - private _applyCodeAction(action: CodeActionItem, preview: boolean): Promise { - return this._instantiationService.invokeFunction(applyCodeAction, action, ApplyCodeActionReason.FromCodeActions, { preview, editor: this._editor }); + private _applyCodeAction(action: CodeActionItem, preview: boolean, openedFrom: CodeMenuOpenedFrom, length: any): Promise { + return this._instantiationService.invokeFunction(applyCodeAction, action, ApplyCodeActionReason.FromCodeActions, { preview, editor: this._editor, menuOpenedFrom: openedFrom, validActionsLength: length }); } } @@ -167,11 +167,23 @@ export enum ApplyCodeActionReason { FromCodeActions = 'fromCodeActions' } +export enum CodeMenuOpenedFrom { + Refactor = 'from: refactor', + RefactorPreview = 'from: refactor preview', + Lightbulb = 'from: lightbulb', + Default = 'from: other (default)', + SourceAction = 'from: source action', + QuickFix = 'from: quick fix', + FixAll = 'from: fix all', + OrganizeImports = 'from: organize imports', + AutoFix = 'from: auto fix' +} + export async function applyCodeAction( accessor: ServicesAccessor, item: CodeActionItem, codeActionReason: ApplyCodeActionReason, - options?: { preview?: boolean; editor?: ICodeEditor }, + options?: { preview?: boolean; editor?: ICodeEditor; menuOpenedFrom?: CodeMenuOpenedFrom; validActionsLength?: any }, ): Promise { const bulkEditService = accessor.get(IBulkEditService); const commandService = accessor.get(ICommandService); @@ -182,13 +194,13 @@ export async function applyCodeAction( codeActionTitle: string; codeActionKind: string | undefined; codeActionIsPreferred: boolean; - reason?: ApplyCodeActionReason; + reason: ApplyCodeActionReason; }; type ApplyCodeEventClassification = { codeActionTitle: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The display label of the applied code action' }; codeActionKind: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The kind (refactor, quickfix) of the applied code action' }; codeActionIsPreferred: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Was the code action marked as being a preferred action?' }; - reason?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The kind of action used to trigger apply code action.' }; + reason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The kind of action used to trigger apply code action.' }; owner: 'mjbvz'; comment: 'Event used to gain insights into which code actions are being triggered'; }; @@ -197,7 +209,7 @@ export async function applyCodeAction( codeActionTitle: item.action.title, codeActionKind: item.action.kind, codeActionIsPreferred: !!item.action.isPreferred, - reason: codeActionReason + reason: codeActionReason, }); await item.resolve(CancellationToken.None); @@ -242,7 +254,7 @@ function triggerCodeActionsForEditorSelection( filter: CodeActionFilter | undefined, autoApply: CodeActionAutoApply | undefined, preview: boolean = false, - triggerAction: string = 'default' + triggerAction: CodeMenuOpenedFrom = CodeMenuOpenedFrom.Default ): void { if (editor.hasModel()) { const controller = QuickFixController.get(editor); @@ -269,7 +281,7 @@ export class QuickFixAction extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor): void { - return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.quickFix.noneMessage', "No code actions available"), undefined, undefined); + return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.quickFix.noneMessage', "No code actions available"), undefined, undefined, CodeMenuOpenedFrom.QuickFix); } } @@ -340,7 +352,7 @@ export class RefactorAction extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor, userArgs: any): void { - return RefactorTrigger(editor, userArgs, false, 'from: refactor'); + return RefactorTrigger(editor, userArgs, false, CodeMenuOpenedFrom.Refactor); } } @@ -360,7 +372,7 @@ export class RefactorPreview extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor, userArgs: any): void { - return RefactorTrigger(editor, userArgs, true, 'from: refactor preview'); + return RefactorTrigger(editor, userArgs, true, CodeMenuOpenedFrom.RefactorPreview); } } @@ -404,7 +416,7 @@ export class SourceAction extends EditorAction { includeSourceActions: true, onlyIncludePreferredActions: args.preferred, }, - args.apply); + args.apply, undefined, CodeMenuOpenedFrom.SourceAction); } } @@ -430,7 +442,7 @@ export class OrganizeImportsAction extends EditorAction { return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.organize.noneMessage', "No organize imports action available"), { include: CodeActionKind.SourceOrganizeImports, includeSourceActions: true }, - CodeActionAutoApply.IfSingle); + CodeActionAutoApply.IfSingle, undefined, CodeMenuOpenedFrom.OrganizeImports); } } @@ -451,7 +463,7 @@ export class FixAllAction extends EditorAction { return triggerCodeActionsForEditorSelection(editor, nls.localize('fixAll.noneMessage', "No fix all action available"), { include: CodeActionKind.SourceFixAll, includeSourceActions: true }, - CodeActionAutoApply.IfSingle); + CodeActionAutoApply.IfSingle, undefined, CodeMenuOpenedFrom.FixAll); } } @@ -485,6 +497,6 @@ export class AutoFixAction extends EditorAction { include: CodeActionKind.QuickFix, onlyIncludePreferredActions: true }, - CodeActionAutoApply.IfSingle); + CodeActionAutoApply.IfSingle, undefined, CodeMenuOpenedFrom.AutoFix); } } diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts index 56da9f50fb3..02d57d095d4 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts @@ -17,13 +17,15 @@ import { ScrollType } from 'vs/editor/common/editorCommon'; import { CodeAction, Command } from 'vs/editor/common/languages'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { codeActionCommandId, CodeActionItem, CodeActionSet, fixAllCommandId, organizeImportsCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionKind, CodeActionTrigger } from 'vs/editor/contrib/codeAction/browser/types'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; interface CodeActionWidgetDelegate { - onSelectCodeAction: (action: CodeActionItem, trigger: CodeActionTrigger) => Promise; + onSelectCodeAction: (action: CodeActionItem, trigger: CodeActionTrigger, fromLightbulb: boolean, validActions: any) => Promise; } interface ResolveCodeActionKeybinding { @@ -47,6 +49,7 @@ function stripNewlines(str: string): string { export interface CodeActionShowOptions { readonly includeDisabledActions: boolean; + readonly fromLightbulb: boolean; } export class CodeActionMenu extends Disposable { @@ -62,6 +65,7 @@ export class CodeActionMenu extends Disposable { @IContextMenuService private readonly _contextMenuService: IContextMenuService, @IKeybindingService keybindingService: IKeybindingService, @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, + @ITelemetryService private readonly _telemetryService: ITelemetryService ) { super(); @@ -101,7 +105,30 @@ export class CodeActionMenu extends Disposable { domForShadowRoot: useShadowDOM ? this._editor.getDomNode()! : undefined, getAnchor: () => anchor, getActions: () => menuActions, - onHide: () => { + onHide: (didCancel) => { + const openedFromString = (options.fromLightbulb) ? CodeMenuOpenedFrom.Lightbulb : trigger.triggerAction; + + type ApplyCodeActionEvent = { + codeActionFrom: CodeMenuOpenedFrom; + validCodeActions: any; + cancelled: boolean; + }; + + type ApplyCodeEventClassification = { + codeActionFrom: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The kind of action used to opened the code action.' }; + validCodeActions: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The total number of valid actions that are highlighted and can be used.' }; + cancelled: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The indicator if the menu was selected or cancelled.' }; + owner: 'mjbvz'; + comment: 'Event used to gain insights into which code actions are being triggered'; + }; + + this._telemetryService.publicLog2('codeAction.applyCodeAction', { + codeActionFrom: openedFromString, + validCodeActions: codeActions.validActions.length, + cancelled: didCancel, + + }); + this._visible = false; this._editor.focus(); }, @@ -116,7 +143,6 @@ export class CodeActionMenu extends Disposable { documentation: readonly Command[] ): IAction[] { const toCodeActionAction = (item: CodeActionItem): CodeActionAction => new CodeActionAction(item.action, () => this._delegate.onSelectCodeAction(item, trigger)); - const result: IAction[] = actionsToShow .map(toCodeActionAction); diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts b/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts index 51b503d0da0..0f8cd9b237d 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts @@ -39,7 +39,7 @@ export class CodeActionUi extends Disposable { this._codeActionWidget = new Lazy(() => { return this._register(instantiationService.createInstance(CodeActionMenu, this._editor, { - onSelectCodeAction: async (action, trigger, context) => { + onSelectCodeAction: async (action, trigger) => { this.delegate.applyCodeAction(action, /* retrigger */ true, Boolean(trigger.preview)); } })); @@ -47,7 +47,7 @@ export class CodeActionUi extends Disposable { this._lightBulbWidget = new Lazy(() => { const widget = this._register(instantiationService.createInstance(LightBulbWidget, this._editor, quickFixActionId, preferredFixActionId)); - this._register(widget.onClick(e => this.showCodeActionList(e.trigger, e.actions, e, { includeDisabledActions: false, from: 'lightbulb' }))); + this._register(widget.onClick(e => this.showCodeActionList(e.trigger, e.actions, e, { includeDisabledActions: false, fromLightbulb: true }))); return widget; }); } @@ -114,7 +114,7 @@ export class CodeActionUi extends Disposable { } this._activeCodeActions.value = actions; - this._codeActionWidget.getValue().show(newState.trigger, actions, newState.position, { includeDisabledActions }); + this._codeActionWidget.getValue().show(newState.trigger, actions, newState.position, { includeDisabledActions, fromLightbulb: false }); } else { // auto magically triggered if (this._codeActionWidget.getValue().isVisible) { diff --git a/src/vs/editor/contrib/codeAction/browser/types.ts b/src/vs/editor/contrib/codeAction/browser/types.ts index 43bf9bc6626..59736911f2d 100644 --- a/src/vs/editor/contrib/codeAction/browser/types.ts +++ b/src/vs/editor/contrib/codeAction/browser/types.ts @@ -5,6 +5,7 @@ import { Position } from 'vs/editor/common/core/position'; import { CodeAction, CodeActionTriggerType } from 'vs/editor/common/languages'; +import { CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; export class CodeActionKind { private static readonly sep = '.'; @@ -121,10 +122,9 @@ export interface CodeActionTrigger { readonly context?: { readonly notAvailableMessage: string; readonly position: Position; - readonly triggerAction?: string; }; readonly preview?: boolean; - readonly triggerAction?: string; + readonly triggerAction?: CodeMenuOpenedFrom; } export class CodeActionCommandArgs { From fbd0fc70678c8ae31e2cc34fd895150300b76663 Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Thu, 16 Jun 2022 12:25:04 -0700 Subject: [PATCH 04/10] added telemetry and git fix --- .../services/extensions/common/extensionsApiProposals.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index 95125aec658..a99692ce7cb 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -48,6 +48,7 @@ export const allApiProposals = Object.freeze({ scmActionButton: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmActionButton.d.ts', scmSelectedProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts', scmValidation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmValidation.d.ts', + snippetWorkspaceEdit: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts', taskPresentationGroup: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.taskPresentationGroup.d.ts', telemetry: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.telemetry.d.ts', terminalDataWriteEvent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDataWriteEvent.d.ts', From 6af3e7b01e5a555574f5741ff599cd50b4365b3e Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Thu, 16 Jun 2022 13:08:01 -0700 Subject: [PATCH 05/10] fixed telemetry with code actions and git bug fix? --- src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts | 2 +- src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index 19d216c5c1e..8a8695f0432 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -281,7 +281,7 @@ export class QuickFixAction extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor): void { - return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.quickFix.noneMessage', "No code actions available"), undefined, undefined, CodeMenuOpenedFrom.QuickFix); + return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.quickFix.noneMessage', "No code actions available"), undefined, undefined, false, CodeMenuOpenedFrom.QuickFix); } } diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts index 02d57d095d4..80c5fb804ee 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts @@ -25,7 +25,7 @@ import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKe import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; interface CodeActionWidgetDelegate { - onSelectCodeAction: (action: CodeActionItem, trigger: CodeActionTrigger, fromLightbulb: boolean, validActions: any) => Promise; + onSelectCodeAction: (action: CodeActionItem, trigger: CodeActionTrigger) => Promise; } interface ResolveCodeActionKeybinding { From d8a07fd4aae239324f573785d9b4a2a4f28159a0 Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Thu, 16 Jun 2022 13:19:28 -0700 Subject: [PATCH 06/10] fix on telemety on code action commands --- .../contrib/codeAction/browser/codeActionCommands.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index 8a8695f0432..29e82c80383 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -115,9 +115,9 @@ export class QuickFixController extends Disposable implements IEditorContributio this._ui = new Lazy(() => this._register(new CodeActionUi(editor, QuickFixAction.Id, AutoFixAction.Id, { - applyCodeAction: async (action, retrigger, preview, openedFrom, length) => { + applyCodeAction: async (action, retrigger, preview) => { try { - await this._applyCodeAction(action, preview, openedFrom, length); + await this._applyCodeAction(action, preview); } finally { if (retrigger) { this._trigger({ type: CodeActionTriggerType.Auto, filter: {} }); @@ -133,7 +133,7 @@ export class QuickFixController extends Disposable implements IEditorContributio } public showCodeActions(trigger: CodeActionTrigger, actions: CodeActionSet, at: IAnchor | IPosition) { - return this._ui.getValue().showCodeActionList(trigger, actions, at, { includeDisabledActions: false, from: false }); + return this._ui.getValue().showCodeActionList(trigger, actions, at, { includeDisabledActions: false, fromLightbulb: false }); } public manualTriggerAtCurrentPosition( @@ -156,8 +156,8 @@ export class QuickFixController extends Disposable implements IEditorContributio return this._model.trigger(trigger); } - private _applyCodeAction(action: CodeActionItem, preview: boolean, openedFrom: CodeMenuOpenedFrom, length: any): Promise { - return this._instantiationService.invokeFunction(applyCodeAction, action, ApplyCodeActionReason.FromCodeActions, { preview, editor: this._editor, menuOpenedFrom: openedFrom, validActionsLength: length }); + private _applyCodeAction(action: CodeActionItem, preview: boolean): Promise { + return this._instantiationService.invokeFunction(applyCodeAction, action, ApplyCodeActionReason.FromCodeActions, { preview, editor: this._editor }); } } From e7e3c0c3f9179e3f81b7b806aae625bfa134e4f5 Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Thu, 16 Jun 2022 15:10:13 -0700 Subject: [PATCH 07/10] fixed some of the commented issues (naming, unused variables) --- .../codeAction/browser/codeActionCommands.ts | 25 ++++++++++--------- .../codeAction/browser/codeActionMenu.ts | 4 +-- .../codeAction/browser/codeMenuOpenedFrom.ts | 15 +++++++++++ 3 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index 29e82c80383..4b31c740267 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -138,10 +138,11 @@ export class QuickFixController extends Disposable implements IEditorContributio public manualTriggerAtCurrentPosition( notAvailableMessage: string, + triggerAction: CodeMenuOpenedFrom, filter?: CodeActionFilter, autoApply?: CodeActionAutoApply, preview?: boolean, - triggerAction?: CodeMenuOpenedFrom, + ): void { if (!this._editor.hasModel()) { return; @@ -168,22 +169,22 @@ export enum ApplyCodeActionReason { } export enum CodeMenuOpenedFrom { - Refactor = 'from: refactor', - RefactorPreview = 'from: refactor preview', - Lightbulb = 'from: lightbulb', - Default = 'from: other (default)', - SourceAction = 'from: source action', - QuickFix = 'from: quick fix', - FixAll = 'from: fix all', - OrganizeImports = 'from: organize imports', - AutoFix = 'from: auto fix' + Refactor = 'refactor', + RefactorPreview = 'refactor preview', + Lightbulb = 'lightbulb', + Default = 'other (default)', + SourceAction = 'source action', + QuickFix = 'quick fix', + FixAll = 'fix all', + OrganizeImports = 'organize imports', + AutoFix = 'auto fix' } export async function applyCodeAction( accessor: ServicesAccessor, item: CodeActionItem, codeActionReason: ApplyCodeActionReason, - options?: { preview?: boolean; editor?: ICodeEditor; menuOpenedFrom?: CodeMenuOpenedFrom; validActionsLength?: any }, + options?: { preview?: boolean; editor?: ICodeEditor }, ): Promise { const bulkEditService = accessor.get(IBulkEditService); const commandService = accessor.get(ICommandService); @@ -258,7 +259,7 @@ function triggerCodeActionsForEditorSelection( ): void { if (editor.hasModel()) { const controller = QuickFixController.get(editor); - controller?.manualTriggerAtCurrentPosition(notAvailableMessage, filter, autoApply, preview, triggerAction); + controller?.manualTriggerAtCurrentPosition(notAvailableMessage, triggerAction, filter, autoApply, preview); } } diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts index 80c5fb804ee..f2fd84f51e8 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts @@ -110,7 +110,7 @@ export class CodeActionMenu extends Disposable { type ApplyCodeActionEvent = { codeActionFrom: CodeMenuOpenedFrom; - validCodeActions: any; + validCodeActions: number; cancelled: boolean; }; @@ -119,7 +119,7 @@ export class CodeActionMenu extends Disposable { validCodeActions: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The total number of valid actions that are highlighted and can be used.' }; cancelled: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The indicator if the menu was selected or cancelled.' }; owner: 'mjbvz'; - comment: 'Event used to gain insights into which code actions are being triggered'; + comment: 'Event used to gain insights into how code actions are being triggered'; }; this._telemetryService.publicLog2('codeAction.applyCodeAction', { diff --git a/src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts b/src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts new file mode 100644 index 00000000000..1dfb6d1ff6c --- /dev/null +++ b/src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +export enum CodeMenuOpenedFrom { + Refactor = 'from: refactor', + RefactorPreview = 'from: refactor preview', + Lightbulb = 'from: lightbulb', + Default = 'from: other (default)', + SourceAction = 'from: source action', + QuickFix = 'from: quick fix', + FixAll = 'from: fix all', + OrganizeImports = 'from: organize imports', + AutoFix = 'from: auto fix' +} From be568a58208291f6b278a368fffcdf2fd5647e81 Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Thu, 16 Jun 2022 16:20:49 -0700 Subject: [PATCH 08/10] added telemetry tracking for quickfixes on hover, fixed import cycle error, and cleaned up code --- .../codeAction/browser/codeActionCommands.ts | 18 ++++-------------- .../codeAction/browser/codeActionMenu.ts | 3 +-- .../codeAction/browser/codeMenuOpenedFrom.ts | 15 --------------- .../editor/contrib/codeAction/browser/types.ts | 14 +++++++++++++- .../hover/browser/markerHoverParticipant.ts | 5 +++-- 5 files changed, 21 insertions(+), 34 deletions(-) delete mode 100644 src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index 4b31c740267..a53d9988a81 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -31,7 +31,7 @@ import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CodeActionModel, CodeActionsState, SUPPORTED_CODE_ACTIONS } from './codeActionModel'; -import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionFilter, CodeActionKind, CodeActionTrigger } from './types'; +import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionFilter, CodeActionKind, CodeActionTrigger, CodeMenuOpenedFrom } from './types'; function contextKeyForSupportedActions(kind: CodeActionKind) { return ContextKeyExpr.regex( @@ -120,7 +120,7 @@ export class QuickFixController extends Disposable implements IEditorContributio await this._applyCodeAction(action, preview); } finally { if (retrigger) { - this._trigger({ type: CodeActionTriggerType.Auto, filter: {} }); + this._trigger({ type: CodeActionTriggerType.Auto, triggerAction: CodeMenuOpenedFrom.QuickFix, filter: {} }); } } } @@ -150,7 +150,7 @@ export class QuickFixController extends Disposable implements IEditorContributio MessageController.get(this._editor)?.closeMessage(); const triggerPosition = this._editor.getPosition(); - this._trigger({ type: CodeActionTriggerType.Invoke, filter, autoApply, context: { notAvailableMessage, position: triggerPosition }, preview, triggerAction }); + this._trigger({ type: CodeActionTriggerType.Invoke, triggerAction, filter, autoApply, context: { notAvailableMessage, position: triggerPosition }, preview }); } private _trigger(trigger: CodeActionTrigger) { @@ -168,17 +168,7 @@ export enum ApplyCodeActionReason { FromCodeActions = 'fromCodeActions' } -export enum CodeMenuOpenedFrom { - Refactor = 'refactor', - RefactorPreview = 'refactor preview', - Lightbulb = 'lightbulb', - Default = 'other (default)', - SourceAction = 'source action', - QuickFix = 'quick fix', - FixAll = 'fix all', - OrganizeImports = 'organize imports', - AutoFix = 'auto fix' -} + export async function applyCodeAction( accessor: ServicesAccessor, diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts index f2fd84f51e8..35fcb8cec3a 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts @@ -17,8 +17,7 @@ import { ScrollType } from 'vs/editor/common/editorCommon'; import { CodeAction, Command } from 'vs/editor/common/languages'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { codeActionCommandId, CodeActionItem, CodeActionSet, fixAllCommandId, organizeImportsCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; -import { CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; -import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionKind, CodeActionTrigger } from 'vs/editor/contrib/codeAction/browser/types'; +import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionKind, CodeActionTrigger, CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/types'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; diff --git a/src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts b/src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts deleted file mode 100644 index 1dfb6d1ff6c..00000000000 --- a/src/vs/editor/contrib/codeAction/browser/codeMenuOpenedFrom.ts +++ /dev/null @@ -1,15 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -export enum CodeMenuOpenedFrom { - Refactor = 'from: refactor', - RefactorPreview = 'from: refactor preview', - Lightbulb = 'from: lightbulb', - Default = 'from: other (default)', - SourceAction = 'from: source action', - QuickFix = 'from: quick fix', - FixAll = 'from: fix all', - OrganizeImports = 'from: organize imports', - AutoFix = 'from: auto fix' -} diff --git a/src/vs/editor/contrib/codeAction/browser/types.ts b/src/vs/editor/contrib/codeAction/browser/types.ts index 59736911f2d..981f0bf012c 100644 --- a/src/vs/editor/contrib/codeAction/browser/types.ts +++ b/src/vs/editor/contrib/codeAction/browser/types.ts @@ -5,7 +5,6 @@ import { Position } from 'vs/editor/common/core/position'; import { CodeAction, CodeActionTriggerType } from 'vs/editor/common/languages'; -import { CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; export class CodeActionKind { private static readonly sep = '.'; @@ -45,6 +44,19 @@ export const enum CodeActionAutoApply { Never = 'never', } +export enum CodeMenuOpenedFrom { + Refactor = 'refactor', + RefactorPreview = 'refactor preview', + Lightbulb = 'lightbulb', + Default = 'other (default)', + SourceAction = 'source action', + QuickFix = 'quick fix action', + FixAll = 'fix all', + OrganizeImports = 'organize imports', + AutoFix = 'auto fix', + QuickFixHover = 'quick fix hover window' +} + export interface CodeActionFilter { readonly include?: CodeActionKind; readonly excludes?: readonly CodeActionKind[]; diff --git a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts index 8816b84f9e5..279ed5598a2 100644 --- a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts @@ -17,7 +17,7 @@ import { CodeActionTriggerType } from 'vs/editor/common/languages'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markerDecorations'; import { CodeActionSet, getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; import { QuickFixAction, QuickFixController } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; -import { CodeActionKind, CodeActionTrigger } from 'vs/editor/contrib/codeAction/browser/types'; +import { CodeActionKind, CodeActionTrigger, CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/types'; import { MarkerController, NextMarkerAction } from 'vs/editor/contrib/gotoError/browser/gotoError'; import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; import * as nls from 'vs/nls'; @@ -50,7 +50,8 @@ export class MarkerHover implements IHoverPart { const markerCodeActionTrigger: CodeActionTrigger = { type: CodeActionTriggerType.Invoke, - filter: { include: CodeActionKind.QuickFix } + filter: { include: CodeActionKind.QuickFix }, + triggerAction: CodeMenuOpenedFrom.QuickFixHover }; export class MarkerHoverParticipant implements IEditorHoverParticipant { From a25887eb39bd31f79982fcbbd6cf023c3ab43408 Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Fri, 17 Jun 2022 12:28:11 -0700 Subject: [PATCH 09/10] added fixes from comments and added required property on triggerAction --- .../contrib/codeAction/browser/codeAction.ts | 5 ++-- .../codeAction/browser/codeActionCommands.ts | 25 +++++++++---------- .../codeAction/browser/codeActionMenu.ts | 10 ++++---- .../codeAction/browser/codeActionModel.ts | 8 +++--- .../contrib/codeAction/browser/types.ts | 8 +++--- .../test/browser/codeAction.test.ts | 22 ++++++++-------- .../hover/browser/markerHoverParticipant.ts | 4 +-- .../codeEditor/browser/saveParticipants.ts | 3 ++- .../markers/browser/markersTreeViewer.ts | 4 +-- 9 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/browser/codeAction.ts b/src/vs/editor/contrib/codeAction/browser/codeAction.ts index 72d71d496f0..ff3e5abdb7b 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeAction.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeAction.ts @@ -16,7 +16,7 @@ import * as languages from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IProgress, Progress } from 'vs/platform/progress/common/progress'; -import { CodeActionFilter, CodeActionKind, CodeActionTrigger, filtersAction, mayIncludeActionsOfKind } from './types'; +import { CodeActionFilter, CodeActionKind, CodeActionTrigger, CodeActionTriggerSource, filtersAction, mayIncludeActionsOfKind } from './types'; import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; @@ -224,7 +224,6 @@ function getDocumentation( } } } - return undefined; } @@ -254,7 +253,7 @@ CommandsRegistry.registerCommand('_executeCodeActionProvider', async function (a codeActionProvider, model, validatedRangeOrSelection, - { type: languages.CodeActionTriggerType.Invoke, filter: { includeSourceActions: true, include } }, + { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default, filter: { includeSourceActions: true, include } }, Progress.None, CancellationToken.None); diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index a53d9988a81..408079626e5 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -31,7 +31,7 @@ import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CodeActionModel, CodeActionsState, SUPPORTED_CODE_ACTIONS } from './codeActionModel'; -import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionFilter, CodeActionKind, CodeActionTrigger, CodeMenuOpenedFrom } from './types'; +import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionFilter, CodeActionKind, CodeActionTrigger, CodeActionTriggerSource } from './types'; function contextKeyForSupportedActions(kind: CodeActionKind) { return ContextKeyExpr.regex( @@ -39,7 +39,7 @@ function contextKeyForSupportedActions(kind: CodeActionKind) { new RegExp('(\\s|^)' + escapeRegExpCharacters(kind.value) + '\\b')); } -function RefactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean, codeActionFrom: CodeMenuOpenedFrom) { +function refactorTrigger(editor: ICodeEditor, userArgs: any, preview: boolean, codeActionFrom: CodeActionTriggerSource) { const args = CodeActionCommandArgs.fromUser(userArgs, { kind: CodeActionKind.Refactor, apply: CodeActionAutoApply.Never @@ -120,7 +120,7 @@ export class QuickFixController extends Disposable implements IEditorContributio await this._applyCodeAction(action, preview); } finally { if (retrigger) { - this._trigger({ type: CodeActionTriggerType.Auto, triggerAction: CodeMenuOpenedFrom.QuickFix, filter: {} }); + this._trigger({ type: CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.QuickFix, filter: {} }); } } } @@ -138,7 +138,7 @@ export class QuickFixController extends Disposable implements IEditorContributio public manualTriggerAtCurrentPosition( notAvailableMessage: string, - triggerAction: CodeMenuOpenedFrom, + triggerAction: CodeActionTriggerSource, filter?: CodeActionFilter, autoApply?: CodeActionAutoApply, preview?: boolean, @@ -169,7 +169,6 @@ export enum ApplyCodeActionReason { } - export async function applyCodeAction( accessor: ServicesAccessor, item: CodeActionItem, @@ -245,7 +244,7 @@ function triggerCodeActionsForEditorSelection( filter: CodeActionFilter | undefined, autoApply: CodeActionAutoApply | undefined, preview: boolean = false, - triggerAction: CodeMenuOpenedFrom = CodeMenuOpenedFrom.Default + triggerAction: CodeActionTriggerSource = CodeActionTriggerSource.Default ): void { if (editor.hasModel()) { const controller = QuickFixController.get(editor); @@ -272,7 +271,7 @@ export class QuickFixAction extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor): void { - return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.quickFix.noneMessage', "No code actions available"), undefined, undefined, false, CodeMenuOpenedFrom.QuickFix); + return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.quickFix.noneMessage', "No code actions available"), undefined, undefined, false, CodeActionTriggerSource.QuickFix); } } @@ -343,7 +342,7 @@ export class RefactorAction extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor, userArgs: any): void { - return RefactorTrigger(editor, userArgs, false, CodeMenuOpenedFrom.Refactor); + return refactorTrigger(editor, userArgs, false, CodeActionTriggerSource.Refactor); } } @@ -363,7 +362,7 @@ export class RefactorPreview extends EditorAction { } public run(_accessor: ServicesAccessor, editor: ICodeEditor, userArgs: any): void { - return RefactorTrigger(editor, userArgs, true, CodeMenuOpenedFrom.RefactorPreview); + return refactorTrigger(editor, userArgs, true, CodeActionTriggerSource.RefactorPreview); } } @@ -407,7 +406,7 @@ export class SourceAction extends EditorAction { includeSourceActions: true, onlyIncludePreferredActions: args.preferred, }, - args.apply, undefined, CodeMenuOpenedFrom.SourceAction); + args.apply, undefined, CodeActionTriggerSource.SourceAction); } } @@ -433,7 +432,7 @@ export class OrganizeImportsAction extends EditorAction { return triggerCodeActionsForEditorSelection(editor, nls.localize('editor.action.organize.noneMessage', "No organize imports action available"), { include: CodeActionKind.SourceOrganizeImports, includeSourceActions: true }, - CodeActionAutoApply.IfSingle, undefined, CodeMenuOpenedFrom.OrganizeImports); + CodeActionAutoApply.IfSingle, undefined, CodeActionTriggerSource.OrganizeImports); } } @@ -454,7 +453,7 @@ export class FixAllAction extends EditorAction { return triggerCodeActionsForEditorSelection(editor, nls.localize('fixAll.noneMessage', "No fix all action available"), { include: CodeActionKind.SourceFixAll, includeSourceActions: true }, - CodeActionAutoApply.IfSingle, undefined, CodeMenuOpenedFrom.FixAll); + CodeActionAutoApply.IfSingle, undefined, CodeActionTriggerSource.FixAll); } } @@ -488,6 +487,6 @@ export class AutoFixAction extends EditorAction { include: CodeActionKind.QuickFix, onlyIncludePreferredActions: true }, - CodeActionAutoApply.IfSingle, undefined, CodeMenuOpenedFrom.AutoFix); + CodeActionAutoApply.IfSingle, undefined, CodeActionTriggerSource.AutoFix); } } diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts index 35fcb8cec3a..5536c1c1a45 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts @@ -17,7 +17,7 @@ import { ScrollType } from 'vs/editor/common/editorCommon'; import { CodeAction, Command } from 'vs/editor/common/languages'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { codeActionCommandId, CodeActionItem, CodeActionSet, fixAllCommandId, organizeImportsCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; -import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionKind, CodeActionTrigger, CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/types'; +import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionKind, CodeActionTrigger, CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/browser/types'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; @@ -48,7 +48,7 @@ function stripNewlines(str: string): string { export interface CodeActionShowOptions { readonly includeDisabledActions: boolean; - readonly fromLightbulb: boolean; + readonly fromLightbulb?: boolean; } export class CodeActionMenu extends Disposable { @@ -105,10 +105,10 @@ export class CodeActionMenu extends Disposable { getAnchor: () => anchor, getActions: () => menuActions, onHide: (didCancel) => { - const openedFromString = (options.fromLightbulb) ? CodeMenuOpenedFrom.Lightbulb : trigger.triggerAction; + const openedFromString = (options.fromLightbulb) ? CodeActionTriggerSource.Lightbulb : trigger.triggerAction; type ApplyCodeActionEvent = { - codeActionFrom: CodeMenuOpenedFrom; + codeActionFrom: CodeActionTriggerSource; validCodeActions: number; cancelled: boolean; }; @@ -122,7 +122,7 @@ export class CodeActionMenu extends Disposable { }; this._telemetryService.publicLog2('codeAction.applyCodeAction', { - codeActionFrom: openedFromString, + codeActionFrom: openedFromString, validCodeActions: codeActions.validActions.length, cancelled: didCancel, diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionModel.ts b/src/vs/editor/contrib/codeAction/browser/codeActionModel.ts index 6eb46ebab45..d2eeb268d1d 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionModel.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionModel.ts @@ -20,7 +20,7 @@ import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/cont import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEditorProgressService, Progress } from 'vs/platform/progress/common/progress'; import { CodeActionSet, getCodeActions } from './codeAction'; -import { CodeActionTrigger } from './types'; +import { CodeActionTrigger, CodeActionTriggerSource } from './types'; export const SUPPORTED_CODE_ACTIONS = new RawContextKey('supportedCodeAction', ''); @@ -58,14 +58,14 @@ class CodeActionOracle extends Disposable { if (resources.some(resource => isEqual(resource, model.uri))) { this._autoTriggerTimer.cancelAndSet(() => { - this.trigger({ type: CodeActionTriggerType.Auto }); + this.trigger({ type: CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default }); }, this._delay); } } private _onCursorChange(): void { this._autoTriggerTimer.cancelAndSet(() => { - this.trigger({ type: CodeActionTriggerType.Auto }); + this.trigger({ type: CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default }); }, this._delay); } @@ -256,7 +256,7 @@ export class CodeActionModel extends Disposable { this.setState(new CodeActionsState.Triggered(trigger.trigger, trigger.selection, trigger.position, actions)); }, undefined); - this._codeActionOracle.value.trigger({ type: CodeActionTriggerType.Auto }); + this._codeActionOracle.value.trigger({ type: CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default }); } else { this._supportedCodeActions.reset(); } diff --git a/src/vs/editor/contrib/codeAction/browser/types.ts b/src/vs/editor/contrib/codeAction/browser/types.ts index 981f0bf012c..b5c4199d390 100644 --- a/src/vs/editor/contrib/codeAction/browser/types.ts +++ b/src/vs/editor/contrib/codeAction/browser/types.ts @@ -44,7 +44,7 @@ export const enum CodeActionAutoApply { Never = 'never', } -export enum CodeMenuOpenedFrom { +export enum CodeActionTriggerSource { Refactor = 'refactor', RefactorPreview = 'refactor preview', Lightbulb = 'lightbulb', @@ -54,7 +54,9 @@ export enum CodeMenuOpenedFrom { FixAll = 'fix all', OrganizeImports = 'organize imports', AutoFix = 'auto fix', - QuickFixHover = 'quick fix hover window' + QuickFixHover = 'quick fix hover window', + OnSave = 'save participants', + ProblemsView = 'problems view' } export interface CodeActionFilter { @@ -129,6 +131,7 @@ function excludesAction(providedKind: CodeActionKind, exclude: CodeActionKind, i export interface CodeActionTrigger { readonly type: CodeActionTriggerType; + readonly triggerAction: CodeActionTriggerSource; readonly filter?: CodeActionFilter; readonly autoApply?: CodeActionAutoApply; readonly context?: { @@ -136,7 +139,6 @@ export interface CodeActionTrigger { readonly position: Position; }; readonly preview?: boolean; - readonly triggerAction?: CodeMenuOpenedFrom; } export class CodeActionCommandArgs { diff --git a/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts index 44e44b5fae5..d1be6b9d645 100644 --- a/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts @@ -11,7 +11,7 @@ import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistr import * as languages from 'vs/editor/common/languages'; import { TextModel } from 'vs/editor/common/model/textModel'; import { CodeActionItem, getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; +import { CodeActionKind, CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/browser/types'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { Progress } from 'vs/platform/progress/common/progress'; @@ -130,7 +130,7 @@ suite('CodeAction', () => { new CodeActionItem(testData.tsLint.abc, provider) ]; - const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 6); assert.deepStrictEqual(actions, expected); }); @@ -145,20 +145,20 @@ suite('CodeAction', () => { disposables.add(registry.register('fooLang', provider)); { - const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 2); assert.strictEqual(actions[0].action.title, 'a'); assert.strictEqual(actions[1].action.title, 'a.b'); } { - const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a.b') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default, filter: { include: new CodeActionKind('a.b') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'a.b'); } { - const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a.b.c') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default, filter: { include: new CodeActionKind('a.b.c') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 0); } }); @@ -177,7 +177,7 @@ suite('CodeAction', () => { disposables.add(registry.register('fooLang', provider)); - const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'a'); }); @@ -191,13 +191,13 @@ suite('CodeAction', () => { disposables.add(registry.register('fooLang', provider)); { - const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.SourceAction }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'b'); } { - const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: CodeActionKind.Source, includeSourceActions: true } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Default, filter: { include: CodeActionKind.Source, includeSourceActions: true } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'a'); } @@ -214,7 +214,7 @@ suite('CodeAction', () => { { const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { - type: languages.CodeActionTriggerType.Auto, filter: { + type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.SourceAction, filter: { include: CodeActionKind.Source.append('test'), excludes: [CodeActionKind.Source], includeSourceActions: true, @@ -251,7 +251,7 @@ suite('CodeAction', () => { { const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { - type: languages.CodeActionTriggerType.Auto, filter: { + type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Refactor, filter: { include: baseType, excludes: [subType], } @@ -276,7 +276,7 @@ suite('CodeAction', () => { disposables.add(registry.register('fooLang', provider)); const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { - type: languages.CodeActionTriggerType.Auto, + type: languages.CodeActionTriggerType.Auto, triggerAction: CodeActionTriggerSource.Refactor, filter: { include: CodeActionKind.QuickFix } diff --git a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts index 279ed5598a2..813dad2d6b6 100644 --- a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts @@ -17,7 +17,7 @@ import { CodeActionTriggerType } from 'vs/editor/common/languages'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markerDecorations'; import { CodeActionSet, getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; import { QuickFixAction, QuickFixController } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; -import { CodeActionKind, CodeActionTrigger, CodeMenuOpenedFrom } from 'vs/editor/contrib/codeAction/browser/types'; +import { CodeActionKind, CodeActionTrigger, CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/browser/types'; import { MarkerController, NextMarkerAction } from 'vs/editor/contrib/gotoError/browser/gotoError'; import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; import * as nls from 'vs/nls'; @@ -51,7 +51,7 @@ export class MarkerHover implements IHoverPart { const markerCodeActionTrigger: CodeActionTrigger = { type: CodeActionTriggerType.Invoke, filter: { include: CodeActionKind.QuickFix }, - triggerAction: CodeMenuOpenedFrom.QuickFixHover + triggerAction: CodeActionTriggerSource.QuickFixHover }; export class MarkerHoverParticipant implements IEditorHoverParticipant { diff --git a/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts b/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts index 9041f5e39de..4b966ec9bd1 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts @@ -16,7 +16,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { CodeActionTriggerType, CodeActionProvider } from 'vs/editor/common/languages'; import { getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; import { applyCodeAction, ApplyCodeActionReason } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; +import { CodeActionKind, CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/browser/types'; import { formatDocumentRangesWithSelectedProvider, formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/browser/format'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { localize } from 'vs/nls'; @@ -375,6 +375,7 @@ class CodeActionOnSaveParticipant implements ITextFileSaveParticipant { private getActionsToRun(model: ITextModel, codeActionKind: CodeActionKind, excludes: readonly CodeActionKind[], progress: IProgress, token: CancellationToken) { return getCodeActions(this.languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: CodeActionTriggerType.Auto, + triggerAction: CodeActionTriggerSource.OnSave, filter: { include: codeActionKind, excludes: excludes, includeSourceActions: true }, }, progress, token); } diff --git a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts index e363e609335..1652365c097 100644 --- a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts @@ -34,7 +34,7 @@ import { CancelablePromise, createCancelablePromise, Delayer } from 'vs/base/com import { IModelService } from 'vs/editor/common/services/model'; import { Range } from 'vs/editor/common/core/range'; import { getCodeActions, CodeActionSet } from 'vs/editor/contrib/codeAction/browser/codeAction'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; +import { CodeActionKind, CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/browser/types'; import { ITextModel } from 'vs/editor/common/model'; import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { applyCodeAction, ApplyCodeActionReason } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; @@ -627,7 +627,7 @@ export class MarkerViewModel extends Disposable { if (!this.codeActionsPromise) { this.codeActionsPromise = createCancelablePromise(cancellationToken => { return getCodeActions(this.languageFeaturesService.codeActionProvider, model, new Range(this.marker.range.startLineNumber, this.marker.range.startColumn, this.marker.range.endLineNumber, this.marker.range.endColumn), { - type: CodeActionTriggerType.Invoke, filter: { include: CodeActionKind.QuickFix } + type: CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.ProblemsView, filter: { include: CodeActionKind.QuickFix } }, Progress.None, cancellationToken).then(actions => { return this._register(actions); }); From 081bcdca40108b723b1b81b4ab2f2f26dbe225b9 Mon Sep 17 00:00:00 2001 From: Justin Chen Date: Fri, 17 Jun 2022 12:47:59 -0700 Subject: [PATCH 10/10] fixed tests in extHostLanguageFeatures --- .../api/test/browser/extHostLanguageFeatures.test.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts index 7112f97075f..c0246ecc81a 100644 --- a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts @@ -53,6 +53,7 @@ import { URITransformerService } from 'vs/workbench/api/common/extHostUriTransfo import { OutlineModel } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/browser/types'; suite('ExtHostLanguageFeatures', function () { @@ -628,7 +629,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.QuickFix }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 2); const [first, second] = actions; assert.strictEqual(first.action.title, 'Testing1'); @@ -652,7 +653,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); const [first] = actions; assert.strictEqual(first.action.title, 'Testing1'); @@ -675,7 +676,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); }); @@ -693,7 +694,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.QuickFix }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); });