Skip to content

Commit 6f239a5

Browse files
committed
Extension types and rendering
1 parent a197abb commit 6f239a5

File tree

5 files changed

+39
-4
lines changed

5 files changed

+39
-4
lines changed

editors/code/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,11 @@
333333
"default": true,
334334
"description": "Whether to show inlay type hints"
335335
},
336+
"rust-analyzer.inlayHints.chainingHints": {
337+
"type": "boolean",
338+
"default": true,
339+
"description": "Whether to show inlay type hints for method chains"
340+
},
336341
"rust-analyzer.inlayHints.parameterHints": {
337342
"type": "boolean",
338343
"default": true,

editors/code/src/client.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export async function createClient(config: Config, serverPath: string): Promise<
3232

3333
inlayHintsType: config.inlayHints.typeHints,
3434
inlayHintsParameter: config.inlayHints.parameterHints,
35+
inlayHintsChaining: config.inlayHints.chainingHints,
3536
inlayHintsMaxLength: config.inlayHints.maxLength,
3637

3738
cargoWatchEnable: cargoWatchOpts.enable,

editors/code/src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export class Config {
8888
return {
8989
typeHints: this.cfg.get<boolean>("inlayHints.typeHints")!,
9090
parameterHints: this.cfg.get<boolean>("inlayHints.parameterHints")!,
91+
chainingHints: this.cfg.get<boolean>("inlayHints.chainingHints")!,
9192
maxLength: this.cfg.get<null | number>("inlayHints.maxLength")!,
9293
};
9394
}

editors/code/src/inlay_hints.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ export function activateInlayHints(ctx: Ctx) {
1010
const maybeUpdater = {
1111
updater: null as null | HintsUpdater,
1212
onConfigChange() {
13-
if (!ctx.config.inlayHints.typeHints && !ctx.config.inlayHints.parameterHints) {
13+
if (
14+
!ctx.config.inlayHints.typeHints &&
15+
!ctx.config.inlayHints.parameterHints &&
16+
!ctx.config.inlayHints.chainingHints
17+
) {
1418
return this.dispose();
1519
}
1620
if (!this.updater) this.updater = new HintsUpdater(ctx);
@@ -63,6 +67,22 @@ const paramHints = {
6367
}
6468
};
6569

70+
const chainingHints = {
71+
decorationType: vscode.window.createTextEditorDecorationType({
72+
after: {
73+
color: new vscode.ThemeColor('rust_analyzer.inlayHint'),
74+
fontStyle: "normal",
75+
}
76+
}),
77+
78+
toDecoration(hint: ra.InlayHint.ChainingHint, conv: lc.Protocol2CodeConverter): vscode.DecorationOptions {
79+
return {
80+
range: conv.asRange(hint.range),
81+
renderOptions: { after: { contentText: ` ${hint.label}` } }
82+
};
83+
}
84+
};
85+
6686
class HintsUpdater implements Disposable {
6787
private sourceFiles = new Map<string, RustSourceFile>(); // map Uri -> RustSourceFile
6888
private readonly disposables: Disposable[] = [];
@@ -95,7 +115,7 @@ class HintsUpdater implements Disposable {
95115

96116
dispose() {
97117
this.sourceFiles.forEach(file => file.inlaysRequest?.cancel());
98-
this.ctx.visibleRustEditors.forEach(editor => this.renderDecorations(editor, { param: [], type: [] }));
118+
this.ctx.visibleRustEditors.forEach(editor => this.renderDecorations(editor, { param: [], type: [], chaining: [] }));
99119
this.disposables.forEach(d => d.dispose());
100120
}
101121

@@ -154,10 +174,11 @@ class HintsUpdater implements Disposable {
154174
private renderDecorations(editor: RustEditor, decorations: InlaysDecorations) {
155175
editor.setDecorations(typeHints.decorationType, decorations.type);
156176
editor.setDecorations(paramHints.decorationType, decorations.param);
177+
editor.setDecorations(chainingHints.decorationType, decorations.chaining);
157178
}
158179

159180
private hintsToDecorations(hints: ra.InlayHint[]): InlaysDecorations {
160-
const decorations: InlaysDecorations = { type: [], param: [] };
181+
const decorations: InlaysDecorations = { type: [], param: [], chaining: [] };
161182
const conv = this.ctx.client.protocol2CodeConverter;
162183

163184
for (const hint of hints) {
@@ -170,6 +191,10 @@ class HintsUpdater implements Disposable {
170191
decorations.param.push(paramHints.toDecoration(hint, conv));
171192
continue;
172193
}
194+
case ra.InlayHint.Kind.ChainingHint: {
195+
decorations.chaining.push(chainingHints.toDecoration(hint, conv));
196+
continue;
197+
}
173198
}
174199
}
175200
return decorations;
@@ -196,6 +221,7 @@ class HintsUpdater implements Disposable {
196221
interface InlaysDecorations {
197222
type: vscode.DecorationOptions[];
198223
param: vscode.DecorationOptions[];
224+
chaining: vscode.DecorationOptions[];
199225
}
200226

201227
interface RustSourceFile {

editors/code/src/rust-analyzer-api.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,21 @@ export interface Runnable {
8686
}
8787
export const runnables = request<RunnablesParams, Vec<Runnable>>("runnables");
8888

89-
export type InlayHint = InlayHint.TypeHint | InlayHint.ParamHint;
89+
export type InlayHint = InlayHint.TypeHint | InlayHint.ParamHint | InlayHint.ChainingHint;
9090

9191
export namespace InlayHint {
9292
export const enum Kind {
9393
TypeHint = "TypeHint",
9494
ParamHint = "ParameterHint",
95+
ChainingHint = "ChainingHint",
9596
}
9697
interface Common {
9798
range: lc.Range;
9899
label: string;
99100
}
100101
export type TypeHint = Common & { kind: Kind.TypeHint };
101102
export type ParamHint = Common & { kind: Kind.ParamHint };
103+
export type ChainingHint = Common & { kind: Kind.ChainingHint };
102104
}
103105
export interface InlayHintsParams {
104106
textDocument: lc.TextDocumentIdentifier;

0 commit comments

Comments
 (0)