diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index f0b9934fcff..4689f472001 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -367,6 +367,10 @@ export let completionKindFromString: { }; })(); +export const enum CompletionItemKindModifier { + Deprecated = 1 +} + export const enum CompletionItemInsertTextRule { /** * Adjust whitespace/indentation of multiline insert texts to @@ -397,9 +401,10 @@ export interface CompletionItem { */ kind: CompletionItemKind; /** - * Indicates if this item is deprecated. + * A modifier to the `kind` which affect how the item + * is rendered, e.g. Deprecated is rendered with a strikeout */ - deprecated?: boolean; + kindModifier?: CompletionItemKindModifier; /** * A human-readable string with additional information * about this item, like type or symbol information. @@ -468,7 +473,7 @@ export interface CompletionItem { /** * @internal */ - [key: string]: any; + _id?: [number, number]; } export interface CompletionList { diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index 46d295d2398..76ee0d96933 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -581,6 +581,10 @@ export enum CompletionItemKind { Snippet = 25 } +export enum CompletionItemKindModifier { + Deprecated = 1 +} + export enum CompletionItemInsertTextRule { /** * Adjust whitespace/indentation of multiline insert texts to diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 04ed87429ea..b5731357b0e 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -30,7 +30,7 @@ import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { TimeoutTimer, CancelablePromise, createCancelablePromise, disposableTimeout } from 'vs/base/common/async'; -import { CompletionItemKind, completionKindToCssClass } from 'vs/editor/common/modes'; +import { CompletionItemKind, completionKindToCssClass, CompletionItemKindModifier } from 'vs/editor/common/modes'; import { IconLabel, IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/modelService'; @@ -38,6 +38,7 @@ import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { FileKind } from 'vs/platform/files/common/files'; import { MarkdownString } from 'vs/base/common/htmlContent'; +import { flatten } from 'vs/base/common/arrays'; const expandSuggestionDocsByDefault = false; @@ -60,11 +61,6 @@ export const editorSuggestWidgetForeground = registerColor('editorSuggestWidget. export const editorSuggestWidgetSelectedBackground = registerColor('editorSuggestWidget.selectedBackground', { dark: listFocusBackground, light: listFocusBackground, hc: listFocusBackground }, nls.localize('editorSuggestWidgetSelectedBackground', 'Background color of the selected entry in the suggest widget.')); export const editorSuggestWidgetHighlightForeground = registerColor('editorSuggestWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hc: listHighlightForeground }, nls.localize('editorSuggestWidgetHighlightForeground', 'Color of the match highlights in the suggest widget.')); -/** - * Suggest widget styles - */ -const editorSuggestWidgetDeprecatedClassName = 'suggest-widget-deprecated'; - const colorRegExp = /^(#([\da-f]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))$/i; function extractColor(item: CompletionItem, out: string[]): boolean { if (item.completion.label.match(colorRegExp)) { @@ -177,18 +173,18 @@ class Renderer implements IListRenderer } else if (suggestion.kind === CompletionItemKind.File && this._themeService.getIconTheme().hasFileIcons) { // special logic for 'file' completion items data.icon.className = 'icon hide'; - labelOptions.extraClasses = ([] as string[]).concat( + labelOptions.extraClasses = flatten([ getIconClasses(this._modelService, this._modeService, URI.from({ scheme: 'fake', path: suggestion.label }), FileKind.FILE), getIconClasses(this._modelService, this._modeService, URI.from({ scheme: 'fake', path: suggestion.detail }), FileKind.FILE) - ); + ]); } else if (suggestion.kind === CompletionItemKind.Folder && this._themeService.getIconTheme().hasFolderIcons) { // special logic for 'folder' completion items data.icon.className = 'icon hide'; - labelOptions.extraClasses = ([] as string[]).concat( + labelOptions.extraClasses = flatten([ getIconClasses(this._modelService, this._modeService, URI.from({ scheme: 'fake', path: suggestion.label }), FileKind.FOLDER), getIconClasses(this._modelService, this._modeService, URI.from({ scheme: 'fake', path: suggestion.detail }), FileKind.FOLDER) - ); + ]); } else { // normal icon data.icon.className = 'icon hide'; @@ -197,8 +193,8 @@ class Renderer implements IListRenderer ]; } - if (suggestion.label && suggestion.deprecated) { - labelOptions.extraClasses = (labelOptions.extraClasses || []).concat([editorSuggestWidgetDeprecatedClassName]); + if (suggestion.kindModifier && suggestion.kindModifier & CompletionItemKindModifier.Deprecated) { + labelOptions.extraClasses = (labelOptions.extraClasses || []).concat(['suggest-widget-deprecated']); } data.iconLabel.setLabel(suggestion.label, undefined, labelOptions); diff --git a/src/vs/editor/standalone/browser/standaloneLanguages.ts b/src/vs/editor/standalone/browser/standaloneLanguages.ts index e8e9dffbe84..30209af005c 100644 --- a/src/vs/editor/standalone/browser/standaloneLanguages.ts +++ b/src/vs/editor/standalone/browser/standaloneLanguages.ts @@ -562,6 +562,7 @@ export function createMonacoLanguagesAPI(): typeof monaco.languages { // enums DocumentHighlightKind: standaloneEnums.DocumentHighlightKind, CompletionItemKind: standaloneEnums.CompletionItemKind, + CompletionItemKindModifier: standaloneEnums.CompletionItemKindModifier, CompletionItemInsertTextRule: standaloneEnums.CompletionItemInsertTextRule, SymbolKind: standaloneEnums.SymbolKind, IndentAction: standaloneEnums.IndentAction, diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index a1cf394ed39..545a3d799c3 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -4786,6 +4786,10 @@ declare namespace monaco.languages { Snippet = 25 } + export enum CompletionItemKindModifier { + Deprecated = 1 + } + export enum CompletionItemInsertTextRule { /** * Adjust whitespace/indentation of multiline insert texts to @@ -4815,9 +4819,10 @@ declare namespace monaco.languages { */ kind: CompletionItemKind; /** - * Indicates if this item is deprecated. + * A modifier to the `kind` which affect how the item + * is rendered, e.g. Deprecated is rendered with a strikeout */ - deprecated?: boolean; + kindModifier?: CompletionItemKindModifier; /** * A human-readable string with additional information * about this item, like type or symbol information. diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 2093d2e34ce..769df9337d9 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -330,6 +330,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha return { label: data.a, kind: data.b, + kindModifier: data.n ? modes.CompletionItemKindModifier.Deprecated : undefined, detail: data.c, documentation: data.d, sortText: data.e, @@ -341,7 +342,6 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha commitCharacters: data.k, additionalTextEdits: data.l, command: data.m, - deprecated: data.n, // not-standard _id: data.x, }; @@ -366,7 +366,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha }; if (supportsResolveDetails) { provider.resolveCompletionItem = (model, position, suggestion, token) => { - return this._proxy.$resolveCompletionItem(handle, model.uri, position, suggestion._id, token).then(result => { + return this._proxy.$resolveCompletionItem(handle, model.uri, position, suggestion._id!, token).then(result => { if (!result) { return suggestion; }