MCPcopy
hub / github.com/dotnet/vscode-csharp / LanguageMiddlewareFeature

Class LanguageMiddlewareFeature

src/omnisharp/languageMiddlewareFeature.ts:33–87  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

31type RemapParameterType<M extends keyof RemapApi> = GetRemapType<NonNullable<RemapApi[M]>>;
32
33export class LanguageMiddlewareFeature implements IDisposable {
34 private readonly _middlewares: LanguageMiddleware[];
35 private _registration: IDisposable | undefined;
36
37 constructor() {
38 this._middlewares = [];
39 }
40
41 public dispose(): void {
42 // this._registration should always be defined, but just in case we never register...
43 this._registration?.dispose();
44 }
45
46 public register(): void {
47 this._registration = vscode.commands.registerCommand(
48 'omnisharp.registerLanguageMiddleware',
49 (middleware: LanguageMiddleware) => {
50 this._middlewares.push(middleware);
51 }
52 );
53 }
54
55 public getLanguageMiddlewares(): LanguageMiddleware[] {
56 return this._middlewares;
57 }
58
59 public async remap<M extends keyof RemapApi, P extends RemapParameterType<M>>(
60 remapType: M,
61 original: P,
62 token: vscode.CancellationToken
63 ): Promise<P> {
64 try {
65 const languageMiddlewares = this.getLanguageMiddlewares();
66 let remapped = original;
67
68 for (const middleware of languageMiddlewares) {
69 // Commit a type crime because we know better than the compiler
70 const method = <(p: P, c: vscode.CancellationToken) => vscode.ProviderResult<P>>middleware[remapType];
71 if (!method) {
72 continue;
73 }
74
75 const result = await method.call(middleware, remapped, token);
76 if (result) {
77 remapped = result;
78 }
79 }
80
81 return remapped;
82 } catch (_) {
83 // Something happened while remapping. Return the original.
84 return original;
85 }
86 }
87}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected