Преглед на файлове

Add inlay hints support

Wenlu Wang преди 4 години
родител
ревизия
f40d79d54d
променени са 5 файла, в които са добавени 88 реда и са изтрити 2 реда
  1. 6 0
      monaco.d.ts
  2. 46 0
      src/languageFeatures.ts
  3. 11 0
      src/monaco.contribution.ts
  4. 1 1
      src/tsMode.ts
  5. 24 1
      src/tsWorker.ts

+ 6 - 0
monaco.d.ts

@@ -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;

+ 46 - 0
src/languageFeatures.ts

@@ -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;
+		}
+	}
+}

+ 11 - 0
src/monaco.contribution.ts

@@ -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 ---------

+ 1 - 1
src/tsMode.ts

@@ -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;
 }

+ 24 - 1
src/tsWorker.ts

@@ -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 {