Add inlay hints support

pull/2748/head
Wenlu Wang 4 years ago
parent dda62a58b7
commit f40d79d54d

6
monaco.d.ts vendored

@ -413,6 +413,12 @@ declare namespace monaco.languages.typescript {
errorCodes: number[],
formatOptions: any
): Promise<ReadonlyArray<any>>;
/**
* Get inlay hints in the range of the file.
* @param fileName
* @returns `Promise<typescript.InlayHint[]>`
*/
provideInlayHints(fileName: string, start: number, end: number): Promise<ReadonlyArray<any>>;
}
export const typescriptVersion: string;
export const typescriptDefaults: LanguageServiceDefaults;

@ -1221,3 +1221,49 @@ export class RenameAdapter extends Adapter implements languages.RenameProvider {
return { edits };
}
}
// --- inlay hints ----
export class InlayHintsAdapter extends Adapter implements languages.InlayHintsProvider {
public async provideInlayHints(
model: editor.ITextModel,
range: Range,
token: CancellationToken
): Promise<languages.InlayHint[]> {
const resource = model.uri;
const fileName = resource.toString();
const start = model.getOffsetAt({
lineNumber: range.startLineNumber,
column: range.startColumn
});
const end = model.getOffsetAt({
lineNumber: range.endLineNumber,
column: range.endColumn
});
const worker = await this._worker(resource);
if (model.isDisposed()) {
return [];
}
const hints = await worker.provideInlayHints(fileName, start, end);
return hints.map(hint => {
return {
...hint,
position: model.getPositionAt(hint.position),
kind: this._convertHintKind(hint.kind)
}
})
}
private _convertHintKind (kind?: ts.InlayHintKind) {
switch (kind) {
case "Parameter":
return languages.InlayHintKind.Parameter;
case "Type":
return languages.InlayHintKind.Type;
default:
return languages.InlayHintKind.Other;
}
}
}

@ -452,6 +452,17 @@ export interface TypeScriptWorker {
errorCodes: number[],
formatOptions: any
): Promise<ReadonlyArray<any>>;
/**
* Get inlay hints in the range of the file.
* @param fileName
* @returns `Promise<typescript.InlayHint[]>`
*/
provideInlayHints(
fileName: string,
start: number,
end: number,
): Promise<ReadonlyArray<any>>;
}
// --- TypeScript configuration and defaults ---------

@ -81,7 +81,7 @@ function setupMode(
);
languages.registerCodeActionProvider(modeId, new languageFeatures.CodeActionAdaptor(worker));
languages.registerRenameProvider(modeId, new languageFeatures.RenameAdapter(worker));
languages.registerInlayHintsProvider(modeId, new languageFeatures.InlayHintsAdapter(worker));
new languageFeatures.DiagnosticsAdapter(libFiles, defaults, modeId, worker);
return worker;
}

@ -253,7 +253,7 @@ export class TypeScriptWorker implements ts.LanguageServiceHost, ITypeScriptWork
entry,
undefined,
undefined,
undefined,
undefined,
undefined
);
}
@ -415,6 +415,29 @@ export class TypeScriptWorker implements ts.LanguageServiceHost, ITypeScriptWork
async updateExtraLibs(extraLibs: IExtraLibs): Promise<void> {
this._extraLibs = extraLibs;
}
async provideInlayHints(fileName: string, start: number, end: number): Promise<readonly ts.InlayHint[]> {
if (fileNameIsLib(fileName)) {
return [];
}
const preferences: ts.InlayHintsOptions = {
includeInlayParameterNameHints: "all"
};
const span: ts.TextSpan = {
start,
length: end - start
}
try {
return this._languageService.provideInlayHints(
fileName,
span,
preferences
);
} catch {
return [];
}
}
}
export interface ICreateData {

Loading…
Cancel
Save