Skip to content

Commit 066dfef

Browse files
rdelinejrieken
authored andcommitted
Add Code Inset Feature
1 parent 292d51f commit 066dfef

28 files changed

Lines changed: 1032 additions & 35 deletions

src/vs/editor/common/config/editorOptions.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,11 @@ export interface IEditorOptions {
600600
* Defaults to true.
601601
*/
602602
codeLens?: boolean;
603+
/**
604+
* Show code insets
605+
* Defaults to true.
606+
*/
607+
codeInsets?: boolean;
603608
/**
604609
* Control the behavior and rendering of the code action lightbulb.
605610
*/
@@ -996,6 +1001,7 @@ export interface EditorContribOptions {
9961001
readonly selectionHighlight: boolean;
9971002
readonly occurrencesHighlight: boolean;
9981003
readonly codeLens: boolean;
1004+
readonly codeInsets: boolean;
9991005
readonly folding: boolean;
10001006
readonly foldingStrategy: 'auto' | 'indentation';
10011007
readonly showFoldingControls: 'always' | 'mouseover';
@@ -2051,6 +2057,7 @@ export class EditorOptionsValidator {
20512057
selectionHighlight: _boolean(opts.selectionHighlight, defaults.selectionHighlight),
20522058
occurrencesHighlight: _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight),
20532059
codeLens: _boolean(opts.codeLens, defaults.codeLens),
2060+
codeInsets: _boolean(opts.codeInsets, defaults.codeInsets),
20542061
folding: _boolean(opts.folding, defaults.folding),
20552062
foldingStrategy: _stringSet<'auto' | 'indentation'>(opts.foldingStrategy, defaults.foldingStrategy, ['auto', 'indentation']),
20562063
showFoldingControls: _stringSet<'always' | 'mouseover'>(opts.showFoldingControls, defaults.showFoldingControls, ['always', 'mouseover']),
@@ -2164,6 +2171,7 @@ export class InternalEditorOptionsFactory {
21642171
selectionHighlight: (accessibilityIsOn ? false : opts.contribInfo.selectionHighlight), // DISABLED WHEN SCREEN READER IS ATTACHED
21652172
occurrencesHighlight: (accessibilityIsOn ? false : opts.contribInfo.occurrencesHighlight), // DISABLED WHEN SCREEN READER IS ATTACHED
21662173
codeLens: (accessibilityIsOn ? false : opts.contribInfo.codeLens), // DISABLED WHEN SCREEN READER IS ATTACHED
2174+
codeInsets: (accessibilityIsOn ? false : opts.contribInfo.codeInsets),
21672175
folding: (accessibilityIsOn ? false : opts.contribInfo.folding), // DISABLED WHEN SCREEN READER IS ATTACHED
21682176
foldingStrategy: opts.contribInfo.foldingStrategy,
21692177
showFoldingControls: opts.contribInfo.showFoldingControls,
@@ -2653,6 +2661,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = {
26532661
selectionHighlight: true,
26542662
occurrencesHighlight: true,
26552663
codeLens: true,
2664+
codeInsets: true,
26562665
folding: true,
26572666
foldingStrategy: 'auto',
26582667
showFoldingControls: 'mouseover',

src/vs/editor/common/modes.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { Event } from 'vs/base/common/event';
99
import { IMarkdownString } from 'vs/base/common/htmlContent';
1010
import { IDisposable } from 'vs/base/common/lifecycle';
1111
import { isObject } from 'vs/base/common/types';
12-
import { URI } from 'vs/base/common/uri';
12+
import { URI, UriComponents } from 'vs/base/common/uri';
1313
import { Position } from 'vs/editor/common/core/position';
1414
import { IRange, Range } from 'vs/editor/common/core/range';
1515
import { Selection } from 'vs/editor/common/core/selection';
@@ -1321,6 +1321,19 @@ export interface CodeLensProvider {
13211321
resolveCodeLens?(model: model.ITextModel, codeLens: ICodeLensSymbol, token: CancellationToken): ProviderResult<ICodeLensSymbol>;
13221322
}
13231323

1324+
export interface ICodeInsetSymbol {
1325+
range: IRange;
1326+
id?: string;
1327+
height?: number;
1328+
webviewHandle?: string;
1329+
}
1330+
export interface CodeInsetProvider {
1331+
onDidChange?: Event<this>;
1332+
extensionLocation: UriComponents;
1333+
provideCodeInsets(model: model.ITextModel, token: CancellationToken): ProviderResult<ICodeInsetSymbol[]>;
1334+
resolveCodeInset?(model: model.ITextModel, codeInset: ICodeInsetSymbol, token: CancellationToken): ProviderResult<ICodeInsetSymbol>;
1335+
}
1336+
13241337
// --- feature registries ------
13251338

13261339
/**
@@ -1383,6 +1396,11 @@ export const TypeDefinitionProviderRegistry = new LanguageFeatureRegistry<TypeDe
13831396
*/
13841397
export const CodeLensProviderRegistry = new LanguageFeatureRegistry<CodeLensProvider>();
13851398

1399+
/**
1400+
* @internal
1401+
*/
1402+
export const CodeInsetProviderRegistry = new LanguageFeatureRegistry<CodeInsetProvider>();
1403+
13861404
/**
13871405
* @internal
13881406
*/

src/vs/editor/contrib/gotoError/gotoErrorWidget.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ export class MarkerNavigationWidget extends ZoneWidget {
188188
}
189189

190190
private _applyTheme(theme: ITheme) {
191-
this._backgroundColor = theme.getColor(editorMarkerNavigationBackground);
191+
this._backgroundColor = theme.getColor(editorMarkerNavigationBackground) || undefined;
192192
let colorId = editorMarkerNavigationError;
193193
if (this._severity === MarkerSeverity.Warning) {
194194
colorId = editorMarkerNavigationWarning;

src/vs/editor/contrib/referenceSearch/referencesWidget.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,8 @@ export class ReferenceWidget extends PeekViewWidget {
279279
arrowColor: borderColor,
280280
frameColor: borderColor,
281281
headerBackgroundColor: theme.getColor(peekViewTitleBackground) || Color.transparent,
282-
primaryHeadingColor: theme.getColor(peekViewTitleForeground),
283-
secondaryHeadingColor: theme.getColor(peekViewTitleInfoForeground)
282+
primaryHeadingColor: theme.getColor(peekViewTitleForeground) || undefined,
283+
secondaryHeadingColor: theme.getColor(peekViewTitleInfoForeground) || undefined
284284
});
285285
}
286286

src/vs/monaco.d.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,6 +2934,11 @@ declare namespace monaco.editor {
29342934
* Defaults to true.
29352935
*/
29362936
codeLens?: boolean;
2937+
/**
2938+
* Show code insets
2939+
* Defaults to true.
2940+
*/
2941+
codeInsets?: boolean;
29372942
/**
29382943
* Control the behavior and rendering of the code action lightbulb.
29392944
*/
@@ -3271,6 +3276,7 @@ declare namespace monaco.editor {
32713276
readonly selectionHighlight: boolean;
32723277
readonly occurrencesHighlight: boolean;
32733278
readonly codeLens: boolean;
3279+
readonly codeInsets: boolean;
32743280
readonly folding: boolean;
32753281
readonly foldingStrategy: 'auto' | 'indentation';
32763282
readonly showFoldingControls: 'always' | 'mouseover';
@@ -5414,6 +5420,20 @@ declare namespace monaco.languages {
54145420
resolveCodeLens?(model: editor.ITextModel, codeLens: ICodeLensSymbol, token: CancellationToken): ProviderResult<ICodeLensSymbol>;
54155421
}
54165422

5423+
export interface ICodeInsetSymbol {
5424+
range: IRange;
5425+
id?: string;
5426+
height?: number;
5427+
webviewHandle?: string;
5428+
}
5429+
5430+
export interface CodeInsetProvider {
5431+
onDidChange?: IEvent<this>;
5432+
extensionLocation: UriComponents;
5433+
provideCodeInsets(model: editor.ITextModel, token: CancellationToken): ProviderResult<ICodeInsetSymbol[]>;
5434+
resolveCodeInset?(model: editor.ITextModel, codeInset: ICodeInsetSymbol, token: CancellationToken): ProviderResult<ICodeInsetSymbol>;
5435+
}
5436+
54175437
export interface ILanguageExtensionPoint {
54185438
id: string;
54195439
extensions?: string[];

src/vs/vscode.d.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2235,6 +2235,24 @@ declare module 'vscode' {
22352235
resolveCodeLens?(codeLens: CodeLens, token: CancellationToken): ProviderResult<CodeLens>;
22362236
}
22372237

2238+
2239+
/**
2240+
*/
2241+
export class CodeInset {
2242+
range: Range;
2243+
height?: number;
2244+
constructor(range: Range, height?: number);
2245+
}
2246+
2247+
export interface CodeInsetProvider {
2248+
2249+
onDidChangeCodeInsets?: Event<void>;
2250+
2251+
provideCodeInsets(document: TextDocument, token: CancellationToken): ProviderResult<CodeInset[]>;
2252+
resolveCodeInset?(codeInset: CodeInset, webview: Webview, token: CancellationToken): ProviderResult<CodeInset>;
2253+
}
2254+
2255+
22382256
/**
22392257
* Information about where a symbol is defined.
22402258
*
@@ -7855,6 +7873,12 @@ declare module 'vscode' {
78557873
*/
78567874
export function registerCodeLensProvider(selector: DocumentSelector, provider: CodeLensProvider): Disposable;
78577875

7876+
/**
7877+
* Register a code inset provider.
7878+
*
7879+
*/
7880+
export function registerCodeInsetProvider(selector: DocumentSelector, provider: CodeInsetProvider): Disposable;
7881+
78587882
/**
78597883
* Register a definition provider.
78607884
*

src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import * as search from 'vs/workbench/contrib/search/common/search';
1111
import { CancellationToken } from 'vs/base/common/cancellation';
1212
import { Position as EditorPosition } from 'vs/editor/common/core/position';
1313
import { Range as EditorRange } from 'vs/editor/common/core/range';
14-
import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ISerializedLanguageConfiguration, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, LocationDto, WorkspaceSymbolDto, CodeActionDto, reviveWorkspaceEditDto, ISerializedDocumentFilter, DefinitionLinkDto, ISerializedSignatureHelpProviderMetadata } from '../node/extHost.protocol';
14+
import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ISerializedLanguageConfiguration, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, LocationDto, WorkspaceSymbolDto, CodeActionDto, reviveWorkspaceEditDto, ISerializedDocumentFilter, DefinitionLinkDto, ISerializedSignatureHelpProviderMetadata, CodeInsetDto } from '../node/extHost.protocol';
1515
import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry';
1616
import { LanguageConfiguration, IndentationRule, OnEnterRule } from 'vs/editor/common/modes/languageConfiguration';
1717
import { IHeapService } from './mainThreadHeapService';
@@ -20,6 +20,7 @@ import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostC
2020
import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters';
2121
import { URI } from 'vs/base/common/uri';
2222
import { Selection } from 'vs/editor/common/core/selection';
23+
import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
2324

2425
@extHostNamedCustomer(MainContext.MainThreadLanguageFeatures)
2526
export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesShape {
@@ -160,6 +161,36 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha
160161
}
161162
}
162163

164+
// -- code inset
165+
166+
$registerCodeInsetSupport(handle: number, selector: ISerializedDocumentFilter[], eventHandle: number, extension: IExtensionDescription): void {
167+
168+
const provider = <modes.CodeInsetProvider>{
169+
provideCodeInsets: (model: ITextModel, token: CancellationToken): CodeInsetDto[] | Thenable<CodeInsetDto[]> => {
170+
return this._proxy.$provideCodeInsets(handle, model.uri, token).then(dto => {
171+
if (dto) { dto.forEach(obj => this._heapService.trackObject(obj)); }
172+
return dto;
173+
});
174+
},
175+
resolveCodeInset: (model: ITextModel, codeInset: CodeInsetDto, token: CancellationToken): CodeInsetDto | Thenable<CodeInsetDto> => {
176+
return this._proxy.$resolveCodeInset(handle, model.uri, codeInset, token).then(obj => {
177+
this._heapService.trackObject(obj);
178+
return obj;
179+
});
180+
},
181+
extensionLocation: extension.extensionLocation
182+
};
183+
184+
if (typeof eventHandle === 'number') {
185+
const emitter = new Emitter<modes.CodeInsetProvider>();
186+
this._registrations[eventHandle] = emitter;
187+
provider.onDidChange = emitter.event;
188+
}
189+
190+
const langSelector = typeConverters.LanguageSelector.from(selector);
191+
this._registrations[handle] = modes.CodeInsetProviderRegistry.register(langSelector, provider);
192+
}
193+
163194
// --- declaration
164195

165196
$registerDefinitionSupport(handle: number, selector: ISerializedDocumentFilter[]): void {

src/vs/workbench/api/electron-browser/mainThreadWebview.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,14 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2222
import { onUnexpectedError } from 'vs/base/common/errors';
2323
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
2424

25+
26+
export let mainThreadWebviews: MainThreadWebviews;
27+
2528
@extHostNamedCustomer(MainContext.MainThreadWebviews)
2629
export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviver {
2730

31+
_serviceBrand: any;
32+
2833
private static readonly viewType = 'mainThreadWebview';
2934

3035
private static readonly standardSupportedLinkSchemes = ['http', 'https', 'mailto'];
@@ -49,6 +54,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv
4954
@IExtensionService private readonly _extensionService: IExtensionService,
5055
@ITelemetryService private readonly _telemetryService: ITelemetryService
5156
) {
57+
mainThreadWebviews = this;
5258
this._proxy = context.getProxy(ExtHostContext.ExtHostWebviews);
5359
_editorService.onDidActiveEditorChange(this.onActiveEditorChanged, this, this._toDispose);
5460
_editorService.onDidVisibleEditorsChange(this.onVisibleEditorsChanged, this, this._toDispose);
@@ -64,7 +70,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv
6470
this._toDispose = dispose(this._toDispose);
6571
}
6672

67-
public $createWebviewPanel(
73+
public $createWebview(
6874
handle: WebviewPanelHandle,
6975
viewType: string,
7076
title: string,
@@ -96,6 +102,23 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv
96102
this._telemetryService.publicLog('webviews:createWebviewPanel', { extensionId: extensionId.value });
97103
}
98104

105+
public createInsetWebview(
106+
handle: WebviewPanelHandle,
107+
parent: HTMLElement,
108+
options: WebviewInputOptions,
109+
extensionLocation: UriComponents
110+
): WebviewEditorInput {
111+
const webview = this._webviewService.createInsetWebview(parent, reviveWebviewOptions(options), URI.revive(extensionLocation), this.createWebviewEventDelegate(handle));
112+
webview.state = {
113+
viewType: webview.viewType,
114+
state: undefined
115+
};
116+
117+
this._webviews.set(handle, webview);
118+
this._activeWebview = handle;
119+
return webview;
120+
}
121+
99122
public $disposeWebview(handle: WebviewPanelHandle): void {
100123
const webview = this.getWebview(handle);
101124
webview.dispose();
@@ -289,7 +312,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv
289312
}
290313
}
291314

292-
private getWebview(handle: WebviewPanelHandle): WebviewEditorInput {
315+
public getWebview(handle: WebviewPanelHandle): WebviewEditorInput {
293316
const webview = this._webviews.get(handle);
294317
if (!webview) {
295318
throw new Error('Unknown webview handle:' + handle);

src/vs/workbench/api/node/extHost.api.impl.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,9 @@ export function createApiFactory(
304304
registerCodeLensProvider(selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable {
305305
return extHostLanguageFeatures.registerCodeLensProvider(extension, checkSelector(selector), provider);
306306
},
307+
registerCodeInsetProvider(selector: vscode.DocumentSelector, provider: vscode.CodeInsetProvider): vscode.Disposable {
308+
return extHostLanguageFeatures.registerCodeInsetProvider(extension, checkSelector(selector), provider);
309+
},
307310
registerDefinitionProvider(selector: vscode.DocumentSelector, provider: vscode.DefinitionProvider): vscode.Disposable {
308311
return extHostLanguageFeatures.registerDefinitionProvider(extension, checkSelector(selector), provider);
309312
},
@@ -754,6 +757,7 @@ export function createApiFactory(
754757
CodeActionKind: extHostTypes.CodeActionKind,
755758
CodeActionTrigger: extHostTypes.CodeActionTrigger,
756759
CodeLens: extHostTypes.CodeLens,
760+
CodeInset: extHostTypes.CodeInset,
757761
Color: extHostTypes.Color,
758762
ColorInformation: extHostTypes.ColorInformation,
759763
ColorPresentation: extHostTypes.ColorPresentation,

src/vs/workbench/api/node/extHost.protocol.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable {
299299
$unregister(handle: number): void;
300300
$registerDocumentSymbolProvider(handle: number, selector: ISerializedDocumentFilter[], label: string): void;
301301
$registerCodeLensSupport(handle: number, selector: ISerializedDocumentFilter[], eventHandle: number | undefined): void;
302+
$registerCodeInsetSupport(handle: number, selector: ISerializedDocumentFilter[], eventHandle: number, extension: IExtensionDescription): void;
302303
$emitCodeLensEvent(eventHandle: number, event?: any): void;
303304
$registerDefinitionSupport(handle: number, selector: ISerializedDocumentFilter[]): void;
304305
$registerDeclarationSupport(handle: number, selector: ISerializedDocumentFilter[]): void;
@@ -473,7 +474,7 @@ export interface WebviewPanelShowOptions {
473474
}
474475

475476
export interface MainThreadWebviewsShape extends IDisposable {
476-
$createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, showOptions: WebviewPanelShowOptions, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): void;
477+
$createWebview(handle: WebviewPanelHandle, viewType: string, title: string, showOptions: WebviewPanelShowOptions, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): void;
477478
$disposeWebview(handle: WebviewPanelHandle): void;
478479
$reveal(handle: WebviewPanelHandle, showOptions: WebviewPanelShowOptions): void;
479480
$setTitle(handle: WebviewPanelHandle, value: string): void;
@@ -499,6 +500,18 @@ export interface ExtHostWebviewsShape {
499500
$deserializeWebviewPanel(newWebviewHandle: WebviewPanelHandle, viewType: string, title: string, state: any, position: EditorViewColumn, options: vscode.WebviewOptions): Promise<void>;
500501
}
501502

503+
// export type CodeInsetWebviewHandle = string;
504+
505+
// export interface ExtHostCodeInsetWebviewsShape {
506+
// }
507+
508+
// export interface ExtHostCodeInsetWebviewShape extends IDisposable {
509+
// $setHtml(handle: WebviewPanelHandle, value: string): void;
510+
// $setOptions(handle: WebviewPanelHandle, options: vscode.WebviewOptions): void;
511+
// $postMessage(handle: WebviewPanelHandle, value: any): Promise<boolean>;
512+
// }
513+
514+
502515
export interface MainThreadUrlsShape extends IDisposable {
503516
$registerUriHandler(handle: number, extensionId: ExtensionIdentifier): Promise<void>;
504517
$unregisterUriHandler(handle: number): Promise<void>;
@@ -892,10 +905,14 @@ export interface CodeLensDto extends ObjectIdentifier {
892905
command?: CommandDto;
893906
}
894907

908+
export type CodeInsetDto = ObjectIdentifier & modes.ICodeInsetSymbol;
909+
895910
export interface ExtHostLanguageFeaturesShape {
896911
$provideDocumentSymbols(handle: number, resource: UriComponents, token: CancellationToken): Promise<modes.DocumentSymbol[] | undefined>;
897912
$provideCodeLenses(handle: number, resource: UriComponents, token: CancellationToken): Promise<CodeLensDto[]>;
898913
$resolveCodeLens(handle: number, resource: UriComponents, symbol: CodeLensDto, token: CancellationToken): Promise<CodeLensDto>;
914+
$provideCodeInsets(handle: number, resource: UriComponents, token: CancellationToken): Promise<CodeInsetDto[]>;
915+
$resolveCodeInset(handle: number, resource: UriComponents, symbol: CodeInsetDto, token: CancellationToken): Promise<CodeInsetDto>;
899916
$provideDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise<DefinitionLinkDto[]>;
900917
$provideDeclaration(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise<DefinitionLinkDto[]>;
901918
$provideImplementation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise<DefinitionLinkDto[]>;
@@ -1157,6 +1174,7 @@ export const ExtHostContext = {
11571174
ExtHostWorkspace: createExtId<ExtHostWorkspaceShape>('ExtHostWorkspace'),
11581175
ExtHostWindow: createExtId<ExtHostWindowShape>('ExtHostWindow'),
11591176
ExtHostWebviews: createExtId<ExtHostWebviewsShape>('ExtHostWebviews'),
1177+
// ExtHostCodeInsetWebviews: createExtId<ExtHostCodeInsetWebviewsShape>('ExtHostWebviews'),
11601178
ExtHostProgress: createMainId<ExtHostProgressShape>('ExtHostProgress'),
11611179
ExtHostComments: createMainId<ExtHostCommentsShape>('ExtHostComments'),
11621180
ExtHostStorage: createMainId<ExtHostStorageShape>('ExtHostStorage'),

0 commit comments

Comments
 (0)