Skip to content

Commit 115ba07

Browse files
jasonmalinowskidibarbet
authored andcommitted
Add a TextDocumentContentProvider for source-generated files
This allows the Roslyn LSP to return document references with a roslyn-source-generated URI, and we'll turn around and ask the LSP for those files when they're opened. For now we don't worry about refreshing files if they've changed, just to keep this simple.
1 parent b58d85e commit 115ba07

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

src/lsptoolshost/roslynLanguageServer.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import {
7474
showErrorMessage,
7575
showInformationMessage,
7676
} from '../shared/observers/utils/showMessage';
77+
import { registerSourceGeneratedFilesContentProvider } from './sourceGeneratedFilesContentProvider';
7778

7879
let _channel: vscode.OutputChannel;
7980
let _traceChannel: vscode.OutputChannel;
@@ -1068,6 +1069,8 @@ export async function activateRoslynLanguageServer(
10681069

10691070
registerRestoreCommands(context, languageServer, dotnetChannel);
10701071

1072+
registerSourceGeneratedFilesContentProvider(context, languageServer);
1073+
10711074
context.subscriptions.push(registerLanguageServerOptionChanges(optionObservable));
10721075

10731076
return languageServer;

src/lsptoolshost/roslynProtocol.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,14 @@ export interface CopilotRelatedDocumentsReport {
230230
_vs_file_paths?: string[];
231231
}
232232

233+
export interface SourceGeneratorGetRequestParams {
234+
textDocument: lsp.TextDocumentIdentifier;
235+
}
236+
237+
export interface SourceGeneratedDocumentText {
238+
text: string;
239+
}
240+
233241
export namespace WorkspaceDebugConfigurationRequest {
234242
export const method = 'workspace/debugConfiguration';
235243
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.clientToServer;
@@ -351,3 +359,9 @@ export namespace CopilotRelatedDocumentsRequest {
351359
void
352360
>(method);
353361
}
362+
363+
export namespace SourceGeneratorGetTextRequest {
364+
export const method = 'sourceGeneratedFile/_roslyn_getText';
365+
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.clientToServer;
366+
export const type = new lsp.RequestType<SourceGeneratorGetRequestParams, SourceGeneratedDocumentText, void>(method);
367+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import * as vscode from 'vscode';
7+
import * as RoslynProtocol from './roslynProtocol';
8+
import { RoslynLanguageServer } from './roslynLanguageServer';
9+
import { UriConverter } from './uriConverter';
10+
import * as lsp from 'vscode-languageserver-protocol';
11+
12+
export function registerSourceGeneratedFilesContentProvider(
13+
context: vscode.ExtensionContext,
14+
languageServer: RoslynLanguageServer
15+
) {
16+
context.subscriptions.push(
17+
vscode.workspace.registerTextDocumentContentProvider(
18+
'roslyn-source-generated',
19+
new (class implements vscode.TextDocumentContentProvider {
20+
async provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): Promise<string> {
21+
const result = await languageServer.sendRequest(
22+
RoslynProtocol.SourceGeneratorGetTextRequest.type,
23+
{ textDocument: lsp.TextDocumentIdentifier.create(UriConverter.serialize(uri)) },
24+
token
25+
);
26+
return result.text;
27+
}
28+
})()
29+
)
30+
);
31+
}

0 commit comments

Comments
 (0)