Skip to content

Commit

Permalink
Merge pull request #7663 from dotnet/dev/jorobich/razor-doc-context
Browse files Browse the repository at this point in the history
Lookup Razor file context using its document uri.
  • Loading branch information
JoeRobich authored Oct 16, 2024
2 parents 3a4b66e + 99fd564 commit d8c096e
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 32 deletions.
8 changes: 6 additions & 2 deletions src/lsptoolshost/miscellaneousFileNotifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,12 @@ export function registerMiscellaneousFileNotifier(
languageServer: RoslynLanguageServer
) {
languageServer._projectContextService.onActiveFileContextChanged((e) => {
// Only warn for miscellaneous files when the workspace is fully initialized.
if (!e.context._vs_is_miscellaneous || languageServer.state !== ServerState.ProjectInitializationComplete) {
// Only warn for C# miscellaneous files when the workspace is fully initialized.
if (
e.languageId !== 'csharp' ||
!e.context._vs_is_miscellaneous ||
languageServer.state !== ServerState.ProjectInitializationComplete
) {
return;
}

Expand Down
35 changes: 5 additions & 30 deletions src/lsptoolshost/services/projectContextService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@ import { TextDocumentIdentifier } from 'vscode-languageserver-protocol';
import { UriConverter } from '../uriConverter';
import { LanguageServerEvents } from '../languageServerEvents';
import { ServerState } from '../serverStateChange';
import { DynamicFileInfoHandler } from '../../razor/src/dynamicFile/dynamicFileInfoHandler';
import { ProvideDynamicFileResponse } from '../../razor/src/dynamicFile/provideDynamicFileResponse';
import { ProvideDynamicFileParams } from '../../razor/src/dynamicFile/provideDynamicFileParams';

export interface ProjectContextChangeEvent {
languageId: string;
uri: vscode.Uri;
context: VSProjectContext;
}
Expand Down Expand Up @@ -57,44 +55,21 @@ export class ProjectContextService {
this._source.cancel();
this._source = new vscode.CancellationTokenSource();

let uri = textEditor!.document.uri;
const uri = textEditor!.document.uri;

if (!this._languageServer.isRunning()) {
this._contextChangeEmitter.fire({ uri, context: this._emptyProjectContext });
this._contextChangeEmitter.fire({ languageId, uri, context: this._emptyProjectContext });
return;
}

// If the active document is a Razor file, we need to map it back to a C# file.
if (languageId === 'aspnetcorerazor') {
const virtualUri = await this.getVirtualCSharpUri(uri);
if (!virtualUri) {
return;
}

uri = virtualUri;
}

const contextList = await this.getProjectContexts(uri, this._source.token);
if (!contextList) {
this._contextChangeEmitter.fire({ languageId, uri, context: this._emptyProjectContext });
return;
}

const context = contextList._vs_projectContexts[contextList._vs_defaultIndex];
this._contextChangeEmitter.fire({ uri, context });
}

private async getVirtualCSharpUri(uri: vscode.Uri): Promise<vscode.Uri | undefined> {
const response = await vscode.commands.executeCommand<ProvideDynamicFileResponse>(
DynamicFileInfoHandler.provideDynamicFileInfoCommand,
new ProvideDynamicFileParams({ uri: UriConverter.serialize(uri) })
);

const responseUri = response.csharpDocument?.uri;
if (!responseUri) {
return undefined;
}

return UriConverter.deserialize(responseUri);
this._contextChangeEmitter.fire({ languageId, uri, context });
}

private async getProjectContexts(
Expand Down

0 comments on commit d8c096e

Please sign in to comment.