Skip to content

Commit 582ea52

Browse files
committed
Add inlay hint support
1 parent 2a264b4 commit 582ea52

23 files changed

+733
-206
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Place your settings in this file to overwrite default and user settings.
22
{
33
"editor.insertSpaces": false,
4-
"[markdown]": {
4+
"[markdown][typescript]": {
55
"editor.rulers": [
66
80
77
]

client-node-tests/package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client-node-tests/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"description": "",
77
"version": "0.0.1",
88
"engines": {
9-
"vscode": "^1.63.0"
9+
"vscode": "^1.65.0"
1010
},
1111
"categories": [
1212
"Other"
@@ -40,7 +40,7 @@
4040
"@types/minimatch": "^3.0.5",
4141
"@types/sinon": "^10.0.2",
4242
"@types/uuid": "^8.3.1",
43-
"@types/vscode": "1.63.0",
43+
"@types/vscode": "1.65.0",
4444
"glob": "^7.1.7",
4545
"sinon": "^11.1.2",
4646
"uuid": "^8.3.2",

client-node-tests/src/integration.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ suite('Client integration', () => {
3131
const fsProvider = new MemoryFileSystemProvider();
3232
let fsProviderDisposable!: vscode.Disposable;
3333

34+
function positionEqual(pos: vscode.Position, l: number, c: number): void {
35+
assert.strictEqual(pos.line, l);
36+
assert.strictEqual(pos.character, c);
37+
}
38+
39+
3440
function rangeEqual(range: vscode.Range, sl: number, sc: number, el: number, ec: number): void {
3541
assert.strictEqual(range.start.line, sl);
3642
assert.strictEqual(range.start.character, sc);
@@ -153,6 +159,9 @@ suite('Client integration', () => {
153159
implementationProvider: true,
154160
selectionRangeProvider: true,
155161
inlineValuesProvider: {},
162+
inlayHintsProvider: {
163+
resolveProvider: true
164+
},
156165
typeDefinitionProvider: true,
157166
callHierarchyProvider: true,
158167
semanticTokensProvider: {
@@ -1280,6 +1289,35 @@ suite('Client integration', () => {
12801289
assert.strictEqual(middlewareCalled, true);
12811290
});
12821291

1292+
test('Inlay Hints', async () => {
1293+
const providerData = client.getFeature(lsclient.Proposed.InlayHintsRequest.method).getProvider(document);
1294+
isDefined(providerData);
1295+
const provider = providerData.provider;
1296+
const results = (await provider.provideInlayHints(document, range, tokenSource.token));
1297+
1298+
isArray(results, undefined, 2);
1299+
1300+
const hint = results[0];
1301+
positionEqual(hint.position, 1, 1);
1302+
assert.strictEqual(hint.kind, vscode.InlayHintKind.Type);
1303+
const label = hint.label;
1304+
isArray(label as [], vscode.InlayHintLabelPart, 1);
1305+
assert.strictEqual((label as vscode.InlayHintLabelPart[])[0].value, 'type');
1306+
1307+
let middlewareCalled: boolean = false;
1308+
middleware.provideInlayHints = (d, r, t, n) => {
1309+
middlewareCalled = true;
1310+
return n(d, r, t);
1311+
};
1312+
await provider.provideInlayHints(document, range, tokenSource.token);
1313+
middleware.provideInlayHints = undefined;
1314+
assert.strictEqual(middlewareCalled, true);
1315+
assert.ok(typeof provider.resolveInlayHint === 'function');
1316+
1317+
const resolvedHint = await provider.resolveInlayHint!(hint, tokenSource.token);
1318+
assert.strictEqual((resolvedHint?.label as vscode.InlayHintLabelPart[])[0].tooltip, 'tooltip');
1319+
});
1320+
12831321
test('Workspace symbols', async () => {
12841322
const providers = client.getFeature(lsclient.WorkspaceSymbolRequest.method).getProviders();
12851323
isDefined(providers);

client-node-tests/src/runTests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ async function go() {
4646
* Basic usage
4747
*/
4848
await runTests({
49-
version: '1.63.0',
49+
version: '1.65.0',
5050
extensionDevelopmentPath,
5151
extensionTestsPath,
5252
launchArgs: [

client-node-tests/src/servers/testServer.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616

1717
import { URI } from 'vscode-uri';
1818
import { $DiagnosticClientCapabilities } from 'vscode-languageserver-protocol/src/common/proposed.diagnostic';
19+
import { InlayHintLabelPart } from 'vscode';
1920

2021
const connection: ProposedFeatures.Connection = createConnection(ProposedFeatures.all);
2122

@@ -49,6 +50,9 @@ connection.onInitialize((params: InitializeParams): any => {
4950
assert.equal(params.capabilities.textDocument!.publishDiagnostics!.tagSupport!.valueSet[0], DiagnosticTag.Unnecessary);
5051
assert.equal(params.capabilities.textDocument!.publishDiagnostics!.tagSupport!.valueSet[1], DiagnosticTag.Deprecated);
5152
assert.equal(params.capabilities.textDocument!.documentLink!.tooltipSupport, true);
53+
assert.equal(params.capabilities.textDocument!.inlineValues!.dynamicRegistration, true);
54+
assert.equal(params.capabilities.textDocument!.inlayHints!.dynamicRegistration, true);
55+
assert.equal(params.capabilities.textDocument!.inlayHints!.inlayHint!.resolveSupport!.properties[0], 'label.tooltip');
5256

5357
const valueSet = params.capabilities.textDocument!.completion!.completionItemKind!.valueSet!;
5458
assert.equal(valueSet[0], 1);
@@ -93,6 +97,9 @@ connection.onInitialize((params: InitializeParams): any => {
9397
implementationProvider: true,
9498
selectionRangeProvider: true,
9599
inlineValuesProvider: {},
100+
inlayHintsProvider: {
101+
resolveProvider: true
102+
},
96103
typeDefinitionProvider: true,
97104
callHierarchyProvider: true,
98105
semanticTokensProvider: {
@@ -494,6 +501,18 @@ connection.languages.inlineValues.on((_params) => {
494501
];
495502
});
496503

504+
connection.languages.inlayHints.on(() => {
505+
return [
506+
Proposed.InlayHint.create(Position.create(1,1), [Proposed.InlayHintLabelPart.create('type')], Proposed.InlayHintKind.Type),
507+
Proposed.InlayHint.create(Position.create(2,2), [Proposed.InlayHintLabelPart.create('parameter')], Proposed.InlayHintKind.Parameter)
508+
];
509+
});
510+
511+
connection.languages.inlayHints.resolve((hint) => {
512+
(hint.label as InlayHintLabelPart[])[0].tooltip = 'tooltip';
513+
return hint;
514+
});
515+
497516
connection.onRequest(
498517
new ProtocolRequestType<null, null, never, any, any>('testing/sendSampleProgress'),
499518
async (_, __) => {

client-node-tests/tsconfig.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
"sourceMap": true,
88
"declaration": true,
99
"stripInternal": true,
10-
"target": "es2017",
10+
"target": "es2020",
1111
"module": "commonjs",
1212
"moduleResolution": "node",
13-
"lib": [ "es2017" ],
13+
"lib": [ "es2020" ],
1414
"rootDir": "src",
1515
"outDir": "lib",
1616
"baseUrl": "./src",

client/package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"author": "Microsoft Corporation",
66
"license": "MIT",
77
"engines": {
8-
"vscode": "^1.63.0"
8+
"vscode": "^1.65.0"
99
},
1010
"repository": {
1111
"type": "git",
@@ -28,7 +28,7 @@
2828
"devDependencies": {
2929
"@types/minimatch": "^3.0.5",
3030
"@types/semver": "^7.3.8",
31-
"@types/vscode": "1.63.0",
31+
"@types/vscode": "1.65.0",
3232
"shx": "^0.3.3"
3333
},
3434
"dependencies": {

client/src/common/client.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ import type { SemanticTokensMiddleware, SemanticTokensProviders } from './semant
7272
import type { FileOperationsMiddleware } from './fileOperations';
7373
import type { LinkedEditingRangeMiddleware } from './linkedEditingRange';
7474
import type { DiagnosticFeatureProvider } from './proposed.diagnostic';
75-
import type { InlineValuesProviderMiddleware, InlineValuesProviderData } from './proposed.inlineValues';
75+
import type { InlineValuesMiddleware, InlineValuesProviderShape } from './proposed.inlineValues';
76+
import type { InlayHintsMiddleware, InlayHintsProviderShape } from './proposed.inlayHints';
7677
import type { TypeHierarchyMiddleware } from './proposed.typeHierarchy';
7778
import type { $NotebookCellTextDocumentFilter, NotebookDocumentProviderFeature, NotebookDocumentMiddleware } from './proposed.notebooks';
7879

@@ -660,7 +661,7 @@ export interface _Middleware {
660661

661662
export type Middleware = _Middleware & TypeDefinitionMiddleware & ImplementationMiddleware & ColorProviderMiddleware &
662663
FoldingRangeProviderMiddleware & DeclarationMiddleware & SelectionRangeProviderMiddleware & CallHierarchyMiddleware & SemanticTokensMiddleware &
663-
LinkedEditingRangeMiddleware & TypeHierarchyMiddleware & InlineValuesProviderMiddleware & NotebookDocumentMiddleware;
664+
LinkedEditingRangeMiddleware & TypeHierarchyMiddleware & InlineValuesMiddleware & InlayHintsMiddleware & NotebookDocumentMiddleware;
664665

665666
export interface LanguageClientOptions {
666667
documentSelector?: DocumentSelector | string[];
@@ -3935,7 +3936,8 @@ export abstract class BaseLanguageClient {
39353936
public getFeature(request: typeof LinkedEditingRangeRequest.method): DynamicFeature<TextDocumentRegistrationOptions> & TextDocumentProviderFeature<LinkedEditingRangeProvider>;
39363937
public getFeature(request: typeof Proposed.DocumentDiagnosticRequest.method): DynamicFeature<TextDocumentRegistrationOptions> & TextDocumentProviderFeature<DiagnosticFeatureProvider>;
39373938
public getFeature(request: typeof Proposed.TypeHierarchyPrepareRequest.method): DynamicFeature<TextDocumentRegistrationOptions> & TextDocumentProviderFeature<VTypeHierarchyProvider>;
3938-
public getFeature(request: typeof Proposed.InlineValuesRequest.method): DynamicFeature<TextDocumentRegistrationOptions> & TextDocumentProviderFeature<InlineValuesProviderData>;
3939+
public getFeature(request: typeof Proposed.InlineValuesRequest.method): DynamicFeature<TextDocumentRegistrationOptions> & TextDocumentProviderFeature<InlineValuesProviderShape>;
3940+
public getFeature(request: typeof Proposed.InlayHintsRequest.method): DynamicFeature<TextDocumentRegistrationOptions> & TextDocumentProviderFeature<InlayHintsProviderShape>;
39393941
public getFeature(request: typeof Proposed.NotebookDocumentSyncRegistrationType.method): DynamicFeature<Proposed.NotebookDocumentSyncRegistrationOptions> & NotebookDocumentProviderFeature;
39403942

39413943
public getFeature(request: typeof WorkspaceSymbolRequest.method): DynamicFeature<TextDocumentRegistrationOptions> & WorkspaceProviderFeature<WorkspaceSymbolProvider>;

0 commit comments

Comments
 (0)