diff --git a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/FileBasedPrograms/FileBasedProgramsProjectSystem.cs b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/FileBasedPrograms/FileBasedProgramsProjectSystem.cs index 01f6754bd709f..bc5dbcb48237f 100644 --- a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/FileBasedPrograms/FileBasedProgramsProjectSystem.cs +++ b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/FileBasedPrograms/FileBasedProgramsProjectSystem.cs @@ -137,8 +137,7 @@ public async ValueTask TryRemoveMiscellaneousDocumentAsync(DocumentUri uri, bool var content = await _projectXmlProvider.GetVirtualProjectContentAsync(documentPath, _logger, cancellationToken); if (content is not var (virtualProjectContent, diagnostics)) { - // https://github.com/dotnet/roslyn/issues/78618: falling back to this until dotnet run-api is more widely available - _logger.LogInformation($"Failed to obtain virtual project for '{documentPath}' using dotnet run-api. Falling back to directly creating the virtual project."); + _logger.LogError($"Failed to obtain virtual project for '{documentPath}' using dotnet run-api. Falling back to directly creating the virtual project."); virtualProjectContent = VirtualProjectXmlProvider.MakeVirtualProjectContent_DirectFallback(documentPath); diagnostics = []; } @@ -168,6 +167,7 @@ public async ValueTask TryRemoveMiscellaneousDocumentAsync(DocumentUri uri, bool ProjectFactory: isFileBasedProgram ? _workspaceFactory.HostProjectFactory : _workspaceFactory.MiscellaneousFilesWorkspaceProjectFactory, IsMiscellaneousFile: !isFileBasedProgram, Preferred: buildHostKind, - Actual: buildHostKind); + Actual: buildHostKind, + HasLoadErrors: content is null); } } diff --git a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectLoader.cs b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectLoader.cs index 5dbc51ba3f3de..e385df3bfadb2 100644 --- a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectLoader.cs +++ b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectLoader.cs @@ -174,7 +174,12 @@ private async ValueTask ReloadProjectsAsync(ImmutableSegmentedList + /// Whether there were errors in the process of loading the project file itself. + /// When this is true, we may still want to proceed with design-time build in order to provide partial information about the project. + /// When this is false, also needs to be separately checked, to decide if evaluation was successful. + /// + protected sealed record RemoteProjectLoadResult(RemoteProjectFile ProjectFile, ProjectSystemProjectFactory ProjectFactory, bool IsMiscellaneousFile, BuildHostProcessKind Preferred, BuildHostProcessKind Actual, bool HasLoadErrors); /// Loads a project in the MSBuild host. /// Caller needs to catch exceptions to avoid bringing down the project loader queue. @@ -209,7 +214,7 @@ private async Task ReloadProjectAsync(ProjectToLoad projectToLoad, ToastEr return false; } - (RemoteProjectFile remoteProjectFile, ProjectSystemProjectFactory projectFactory, bool isMiscellaneousFile, BuildHostProcessKind preferredBuildHostKind, BuildHostProcessKind actualBuildHostKind) = remoteProjectLoadResult; + (RemoteProjectFile remoteProjectFile, ProjectSystemProjectFactory projectFactory, bool isMiscellaneousFile, BuildHostProcessKind preferredBuildHostKind, BuildHostProcessKind actualBuildHostKind, bool hasLoadErrors) = remoteProjectLoadResult; if (preferredBuildHostKind != actualBuildHostKind) preferredBuildHostKindThatWeDidNotGet = preferredBuildHostKind; @@ -289,7 +294,7 @@ private async Task ReloadProjectAsync(ProjectToLoad projectToLoad, ToastEr } diagnosticLogItems = await remoteProjectFile.GetDiagnosticLogItemsAsync(cancellationToken); - if (diagnosticLogItems.Any()) + if (hasLoadErrors || diagnosticLogItems.Any()) { await LogDiagnosticsAsync(diagnosticLogItems); } diff --git a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectSystem.cs b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectSystem.cs index 7e86d7845f54d..a1d4c93ba6798 100644 --- a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectSystem.cs +++ b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/HostWorkspace/LanguageServerProjectSystem.cs @@ -90,6 +90,6 @@ public async Task OpenProjectsAsync(ImmutableArray projectFilePaths) var (buildHost, actualBuildHostKind) = await buildHostProcessManager.GetBuildHostWithFallbackAsync(preferredBuildHostKind, projectPath, cancellationToken); var loadedFile = await buildHost.LoadProjectFileAsync(projectPath, languageName, cancellationToken); - return new RemoteProjectLoadResult(loadedFile, _hostProjectFactory, IsMiscellaneousFile: false, preferredBuildHostKind, actualBuildHostKind); + return new RemoteProjectLoadResult(loadedFile, _hostProjectFactory, IsMiscellaneousFile: false, preferredBuildHostKind, actualBuildHostKind, HasLoadErrors: false); } }