Make inlay hint length configurable

This commit is contained in:
Wilco Kusee 2019-10-18 13:40:03 +02:00
parent ce4fb06dec
commit 3b61acb4ae
No known key found for this signature in database
GPG key ID: D5B2BB5CDC3334BC
3 changed files with 37 additions and 14 deletions

View file

@ -260,6 +260,11 @@
"type": "boolean",
"default": true,
"description": "Display additional type information in the editor"
},
"rust-analyzer.maxInlayHintLength": {
"type": "number",
"default": 20,
"description": "Maximum length for inlay hints"
}
}
},

View file

@ -13,8 +13,6 @@ interface InlayHint {
label: string;
}
const maxHintLength = 20;
const typeHintDecorationType = vscode.window.createTextEditorDecorationType({
after: {
color: new vscode.ThemeColor('ralsp.inlayHint')
@ -86,12 +84,12 @@ export class HintsUpdater {
const newHints = await this.queryHints(editor.document.uri.toString());
if (newHints !== null) {
const newDecorations = newHints.map(hint => {
let label = hint.label.substring(0, maxHintLength);
if (hint.label.length > maxHintLength) {
label += '…';
}
const [label, range] = this.truncateHint(
hint.label,
hint.range
);
return {
range: this.truncateHint(hint.range),
range,
renderOptions: {
after: {
contentText: `: ${label}`
@ -106,16 +104,30 @@ export class HintsUpdater {
}
}
private truncateHint(range: Range): Range {
if (!range.isSingleLine) {
return range;
private truncateHint(
label: string,
range: vscode.Range
): [string, vscode.Range] {
if (!Server.config.maxInlayHintLength) {
return [label, range];
}
const maxEnd = new vscode.Position(
let newLabel = label.substring(0, Server.config.maxInlayHintLength);
if (label.length > Server.config.maxInlayHintLength) {
newLabel += '…';
}
range = new vscode.Range(
range.start.line,
range.start.character + maxHintLength
range.start.character,
range.end.line,
Math.min(
range.start.character + Server.config.maxInlayHintLength,
range.end.character
)
);
const end = range.end.isAfter(maxEnd) ? maxEnd : range.end;
return new Range(range.start, end);
return [newLabel, range];
}
private async queryHints(documentUri: string): Promise<InlayHint[] | null> {

View file

@ -22,6 +22,7 @@ export class Config {
public showWorkspaceLoadedNotification = true;
public lruCapacity: null | number = null;
public displayInlayHints = true;
public maxInlayHintLength: null | number = null;
public excludeGlobs = [];
public useClientWatching = false;
public featureFlags = {};
@ -131,6 +132,11 @@ export class Config {
if (config.has('displayInlayHints')) {
this.displayInlayHints = config.get('displayInlayHints') as boolean;
}
if (config.has('maxInlayHintLength')) {
this.maxInlayHintLength = config.get(
'maxInlayHintLength'
) as number;
}
if (config.has('excludeGlobs')) {
this.excludeGlobs = config.get('excludeGlobs') || [];
}