Skip to content

Commit 47de8d4

Browse files
committed
Enable Project Context status item for Razor files
1 parent d7439d3 commit 47de8d4

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

src/lsptoolshost/languageStatusBar.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ class WorkspaceStatus {
5050

5151
class ProjectContextStatus {
5252
static createStatusItem(context: vscode.ExtensionContext, languageServer: RoslynLanguageServer) {
53+
const documentSelector = combineDocumentSelectors(
54+
languageServerOptions.documentSelector,
55+
RazorLanguage.documentSelector
56+
);
5357
const projectContextService = languageServer._projectContextService;
5458

55-
const item = vscode.languages.createLanguageStatusItem(
56-
'csharp.projectContextStatus',
57-
languageServerOptions.documentSelector
58-
);
59+
const item = vscode.languages.createLanguageStatusItem('csharp.projectContextStatus', documentSelector);
5960
item.name = vscode.l10n.t('C# Project Context Status');
6061
item.detail = vscode.l10n.t('Active File Context');
6162
context.subscriptions.push(item);

src/lsptoolshost/services/projectContextService.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { TextDocumentIdentifier } from 'vscode-languageserver-protocol';
1010
import { UriConverter } from '../uriConverter';
1111
import { LanguageServerEvents } from '../languageServerEvents';
1212
import { ServerState } from '../serverStateChange';
13+
import { DynamicFileInfoHandler } from '../../razor/src/dynamicFile/dynamicFileInfoHandler';
14+
import { ProvideDynamicFileResponse } from '../../razor/src/dynamicFile/provideDynamicFileResponse';
15+
import { ProvideDynamicFileParams } from '../../razor/src/dynamicFile/provideDynamicFileParams';
1316

1417
export interface ProjectContextChangeEvent {
1518
uri: vscode.Uri;
@@ -39,11 +42,22 @@ export class ProjectContextService {
3942

4043
public async refresh() {
4144
const textEditor = vscode.window.activeTextEditor;
42-
if (textEditor?.document?.languageId !== 'csharp') {
45+
const languageId = textEditor?.document?.languageId;
46+
if (languageId !== 'csharp' && languageId !== 'aspnetcorerazor') {
4347
return;
4448
}
4549

46-
const uri = textEditor.document.uri;
50+
let uri = textEditor!.document.uri;
51+
52+
// If the active document is a Razor file, we need to map it back to a C# file.
53+
if (languageId === 'aspnetcorerazor') {
54+
const virtualUri = await this.getVirtualCSharpUri(uri);
55+
if (!virtualUri) {
56+
return;
57+
}
58+
59+
uri = virtualUri;
60+
}
4761

4862
// If we have an open request, cancel it.
4963
this._source.cancel();
@@ -58,6 +72,20 @@ export class ProjectContextService {
5872
this._contextChangeEmitter.fire({ uri, context });
5973
}
6074

75+
private async getVirtualCSharpUri(uri: vscode.Uri): Promise<vscode.Uri | undefined> {
76+
const response = await vscode.commands.executeCommand<ProvideDynamicFileResponse>(
77+
DynamicFileInfoHandler.provideDynamicFileInfoCommand,
78+
new ProvideDynamicFileParams([uri.fsPath])
79+
);
80+
81+
const responseUri = response.generatedFiles[0];
82+
if (!responseUri) {
83+
return undefined;
84+
}
85+
86+
return UriConverter.deserialize(responseUri);
87+
}
88+
6189
private async getProjectContexts(
6290
uri: vscode.Uri,
6391
token: vscode.CancellationToken

0 commit comments

Comments
 (0)