提交 735d1c7e 编写于 作者: S Sam Harwell

Disable reference conversion during Solution Close operations

上级 5c2cacb2
......@@ -93,6 +93,11 @@ internal abstract partial class VisualStudioWorkspaceImpl : VisualStudioWorkspac
/// </summary>
private ImmutableHashSet<DocumentId> _documentsNotFromFiles = ImmutableHashSet<DocumentId>.Empty;
/// <summary>
/// Indicates whether the current solution is closing.
/// </summary>
private bool _solutionClosing;
[Obsolete("This is a compatibility shim for TypeScript; please do not use it.")]
internal VisualStudioProjectTracker? _projectTracker;
......@@ -185,7 +190,10 @@ internal void SubscribeExternalErrorDiagnosticUpdateSourceToSolutionBuildEvents(
public async Task InitializeUIAffinitizedServicesAsync(IAsyncServiceProvider asyncServiceProvider)
{
// Create services that are bound to the UI thread
await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync();
await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(_threadingContext.DisposalToken);
var solutionClosingContext = UIContext.FromUIContextGuid(VSConstants.UICONTEXT.SolutionClosing_guid);
solutionClosingContext.UIContextChanged += (_, e) => _solutionClosing = e.Activated;
var openFileTracker = await OpenFileTracker.CreateAsync(this, asyncServiceProvider).ConfigureAwait(true);
......@@ -1815,21 +1823,32 @@ public void RemoveProjectOutputPath(ProjectId projectId, string outputPath)
projectReferenceInformation.OutputPaths.Remove(outputPath);
_projectsByOutputPath.MultiRemove(outputPath, projectId);
if (_projectsByOutputPath.TryGetValue(outputPath, out var remainingProjectsForOutputPath))
// When a project is closed, we may need to convert project references to metadata references (or vice
// versa). Failure to convert the references could leave a project in the workspace with a project
// reference to a project which is not open.
//
// For the specific case where the entire solution is closing, we do not need to update the state for
// remaining projects as each project closes, because we know those projects will be closed without
// further use. Avoiding reference conversion when the solution is closing improves performance for both
// IDE close scenarios and solution reload scenarios that occur after complex branch switches.
if (!_solutionClosing)
{
var distinctRemainingProjects = remainingProjectsForOutputPath.Distinct();
if (distinctRemainingProjects.Count() == 1)
if (_projectsByOutputPath.TryGetValue(outputPath, out var remainingProjectsForOutputPath))
{
var distinctRemainingProjects = remainingProjectsForOutputPath.Distinct();
if (distinctRemainingProjects.Count() == 1)
{
// We had more than one project outputting to the same path. Now we're back down to one
// so we can reference that one again
ConvertMetadataReferencesToProjectReferences_NoLock(distinctRemainingProjects.Single(), outputPath);
}
}
else
{
// We had more than one project outputting to the same path. Now we're back down to one
// so we can reference that one again
ConvertMetadataReferencesToProjectReferences_NoLock(distinctRemainingProjects.Single(), outputPath);
// No projects left, we need to convert back to metadata references
ConvertProjectReferencesToMetadataReferences_NoLock(projectId, outputPath);
}
}
else
{
// No projects left, we need to convert back to metadata references
ConvertProjectReferencesToMetadataReferences_NoLock(projectId, outputPath);
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册