Skip to content

Commit 0b19a4e

Browse files
committed
Support inlay hints for parameter names
Signed-off-by: sheche <sheche@microsoft.com>
1 parent 8fbc1fa commit 0b19a4e

File tree

7 files changed

+130
-27
lines changed

7 files changed

+130
-27
lines changed

package-lock.json

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

package.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,22 @@
857857
"default": "line",
858858
"description": "Show quickfixes at the problem or line level.",
859859
"scope": "window"
860+
},
861+
"java.inlayHints.parameterNames.enabled": {
862+
"type": "string",
863+
"enum": [
864+
"none",
865+
"literals",
866+
"all"
867+
],
868+
"enumDescriptions": [
869+
"Disable parameter name hints",
870+
"Enable parameter name hints only for literal arguments",
871+
"Enable parameter name hints for literal and non-literal arguments"
872+
],
873+
"default": "literals",
874+
"markdownDescription": "Enable/disable inlay hints for parameter names:\n```java\n\nInteger.valueOf(/* s: */ '123', /* radix: */ 10)\n \n```\n",
875+
"scope": "window"
860876
}
861877
}
862878
},
@@ -1141,7 +1157,7 @@
11411157
"@types/mocha": "^5.2.5",
11421158
"@types/node": "^8.10.51",
11431159
"@types/semver": "^7.3.8",
1144-
"@types/vscode": "^1.53.0",
1160+
"@types/vscode": "^1.65.0",
11451161
"@types/winreg": "^1.2.30",
11461162
"@types/winston": "^2.4.4",
11471163
"gulp": "^4.0.2",

src/commands.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,4 +246,6 @@ export namespace Commands {
246246
export const RUNTIME_VALIDATION_OPEN = 'java.runtimeValidation.open';
247247

248248
export const RESOLVE_WORKSPACE_SYMBOL = 'java.project.resolveWorkspaceSymbol';
249+
250+
export const JAVA_EDIT_INLAY_HINTS = 'java.edit.inlayHints';
249251
}

src/extension.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as path from 'path';
44
import * as os from 'os';
55
import * as fs from 'fs';
66
import * as fse from 'fs-extra';
7-
import { workspace, extensions, ExtensionContext, window, commands, ViewColumn, Uri, languages, IndentAction, InputBoxOptions, EventEmitter, OutputChannel, TextDocument, RelativePattern, ConfigurationTarget, WorkspaceConfiguration, env, UIKind, CodeActionContext, Diagnostic } from 'vscode';
7+
import { workspace, extensions, ExtensionContext, window, commands, ViewColumn, Uri, languages, IndentAction, InputBoxOptions, EventEmitter, OutputChannel, TextDocument, RelativePattern, ConfigurationTarget, WorkspaceConfiguration, env, UIKind, CodeActionContext, Diagnostic, CodeActionTriggerKind } from 'vscode';
88
import { ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn, ErrorHandler, Message, ErrorAction, CloseAction, DidChangeConfigurationNotification, CancellationToken, CodeActionRequest, CodeActionParams, Command } from 'vscode-languageclient';
99
import { LanguageClient } from 'vscode-languageclient/node';
1010
import { collectJavaExtensions, isContributedPartUpdated } from './plugin';
@@ -134,6 +134,11 @@ export class OutputInfoCollector implements OutputChannel {
134134
this.channel.appendLine(value);
135135
}
136136

137+
replace(value: string): void {
138+
this.clear();
139+
this.append(value);
140+
}
141+
137142
clear(): void {
138143
this.channel.clear();
139144
}
@@ -239,7 +244,8 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
239244
resolveAdditionalTextEditsSupport: true,
240245
advancedIntroduceParameterRefactoringSupport: true,
241246
actionableRuntimeNotificationSupport: true,
242-
shouldLanguageServerExitOnShutdown: true
247+
shouldLanguageServerExitOnShutdown: true,
248+
inlayHintsSupport: true,
243249
},
244250
triggerFiles,
245251
},
@@ -279,6 +285,7 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
279285
const codeActionContext: CodeActionContext = {
280286
diagnostics: allDiagnostics,
281287
only: context.only,
288+
triggerKind: CodeActionTriggerKind.Invoke,
282289
};
283290
params.context = client.code2ProtocolConverter.asCodeActionContext(codeActionContext);
284291
}

src/hoverAction.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ class JavaHoverProvider implements HoverProvider {
7575

7676
const contributed = new MarkdownString(contributedCommands.map((command) => this.convertCommandToMarkdown(command)).join(' | '));
7777
contributed.isTrusted = true;
78-
let contents: MarkedString[] = [ contributed ];
78+
let contents: MarkdownString[] = [ contributed ];
7979
let range;
8080
if (serverHover && serverHover.contents) {
81-
contents = contents.concat(serverHover.contents);
81+
contents = contents.concat(serverHover.contents as MarkdownString[]);
8282
range = serverHover.range;
8383
}
8484
return new Hover(contents, range);

src/inlayHintsProvider.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { performance } from "perf_hooks";
2+
import { CancellationToken, commands, EventEmitter, ExtensionContext, InlayHint, InlayHintKind, InlayHintsProvider, Range, TextDocument, workspace } from "vscode";
3+
import { Commands } from "./commands";
4+
5+
export class JavaInlayHintsProvider implements InlayHintsProvider {
6+
7+
private onDidChange = new EventEmitter<void>();
8+
public onDidChangeInlayHints = this.onDidChange.event;
9+
10+
constructor(context: ExtensionContext) {
11+
context.subscriptions.push(workspace.onDidChangeConfiguration(e => {
12+
if (e.affectsConfiguration("java.inlayHints.parameterNames.enabled")) {
13+
this.onDidChange.fire();
14+
}
15+
}));
16+
}
17+
18+
public async provideInlayHints(document: TextDocument, range: Range, token: CancellationToken): Promise<InlayHint[]> {
19+
const start = performance.now();
20+
const hints = await commands.executeCommand<InlayHint[]>(Commands.EXECUTE_WORKSPACE_COMMAND,
21+
Commands.JAVA_EDIT_INLAY_HINTS,
22+
document.uri.toString(),
23+
range.start.line,
24+
range.start.character,
25+
range.end.line,
26+
range.end.character,
27+
token
28+
);
29+
console.log(performance.now() - start);
30+
for (const hint of hints) {
31+
hint.paddingRight = true;
32+
hint.kind = InlayHintKind.Parameter;
33+
}
34+
35+
return hints;
36+
}
37+
}

src/standardLanguageClient.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { TypeHierarchyDirection, TypeHierarchyItem } from "./typeHierarchy/proto
3333
import { buildFilePatterns } from './plugin';
3434
import { pomCodeActionMetadata, PomCodeActionProvider } from "./pom/pomCodeActionProvider";
3535
import { findRuntimes, IJavaRuntime } from "jdk-utils";
36+
import { JavaInlayHintsProvider } from "./inlayHintsProvider";
3637

3738
const extensionName = 'Language Support for Java';
3839
const GRADLE_CHECKSUM = "gradle/checksum/prompt";
@@ -498,6 +499,14 @@ export class StandardLanguageClient {
498499
scheme: "file",
499500
pattern: "**/pom.xml"
500501
}, new PomCodeActionProvider(context), pomCodeActionMetadata);
502+
503+
if (languages.registerInlayHintsProvider) {
504+
context.subscriptions.push(languages.registerInlayHintsProvider([
505+
{ scheme: "file", language: "java", pattern: "**/*.java" },
506+
{ scheme: "jdt", language: "java", pattern: "**/*.class" },
507+
{ scheme: "untitled", language: "java", pattern: "**/*.java" }
508+
], new JavaInlayHintsProvider(context)));
509+
}
501510
});
502511
}
503512

0 commit comments

Comments
 (0)