Add inlay hints support

This commit is contained in:
Wenlu Wang 2021-06-29 13:15:15 +08:00
parent dda62a58b7
commit f40d79d54d
5 changed files with 88 additions and 2 deletions

6
monaco.d.ts vendored
View file

@ -413,6 +413,12 @@ declare namespace monaco.languages.typescript {
errorCodes: number[], errorCodes: number[],
formatOptions: any formatOptions: any
): Promise<ReadonlyArray<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 typescriptVersion: string;
export const typescriptDefaults: LanguageServiceDefaults; export const typescriptDefaults: LanguageServiceDefaults;

View file

@ -1221,3 +1221,49 @@ export class RenameAdapter extends Adapter implements languages.RenameProvider {
return { edits }; 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;
}
}
}

View file

@ -452,6 +452,17 @@ export interface TypeScriptWorker {
errorCodes: number[], errorCodes: number[],
formatOptions: any formatOptions: any
): Promise<ReadonlyArray<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 --------- // --- TypeScript configuration and defaults ---------

View file

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

View file

@ -253,7 +253,7 @@ export class TypeScriptWorker implements ts.LanguageServiceHost, ITypeScriptWork
entry, entry,
undefined, undefined,
undefined, undefined,
undefined, undefined,
undefined undefined
); );
} }
@ -415,6 +415,29 @@ export class TypeScriptWorker implements ts.LanguageServiceHost, ITypeScriptWork
async updateExtraLibs(extraLibs: IExtraLibs): Promise<void> { async updateExtraLibs(extraLibs: IExtraLibs): Promise<void> {
this._extraLibs = extraLibs; 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 { export interface ICreateData {