未验证 提交 dba06e31 编写于 作者: J Jason Malinowski 提交者: GitHub

Merge pull request #26215 from jasonmalinowski/fix-sharedproject-contexts

Make sure we always subscribe to shared hierarchy eventing
......@@ -52,7 +52,6 @@ internal abstract partial class AbstractProject : ForegroundThreadAffinitizedObj
private readonly Dictionary<string, IVisualStudioHostDocument> _documentMonikers = new Dictionary<string, IVisualStudioHostDocument>(StringComparer.OrdinalIgnoreCase);
private readonly Dictionary<string, VisualStudioAnalyzer> _analyzers = new Dictionary<string, VisualStudioAnalyzer>(StringComparer.OrdinalIgnoreCase);
private readonly Dictionary<DocumentId, IVisualStudioHostDocument> _additionalDocuments = new Dictionary<DocumentId, IVisualStudioHostDocument>();
private readonly Dictionary<DocumentId, List<(IVsHierarchy hierarchy, uint cookie)>> _hierarchyEventSinks = new Dictionary<DocumentId, List<(IVsHierarchy hierarchy, uint cookie)>>();
/// <summary>
/// The list of files which have been added to the project but we aren't tracking since they
......@@ -866,31 +865,16 @@ private static void OnDocumentOpened(object sender, bool isCurrentContext)
if (project.PushingChangesToWorkspace)
{
project.ProjectTracker.NotifyWorkspace(workspace => workspace.OnDocumentOpened(document.Id, document.GetOpenTextBuffer().AsTextContainer(), isCurrentContext));
project.ProjectTracker.NotifyWorkspace(workspace =>
{
workspace.OnDocumentOpened(document.Id, document.GetOpenTextBuffer().AsTextContainer(), isCurrentContext);
(workspace as VisualStudioWorkspaceImpl)?.ConnectToSharedHierarchyEvents(document);
});
}
else
{
StartPushingToWorkspaceAndNotifyOfOpenDocuments(project);
}
var itemId = document.GetItemId();
if (itemId != (uint)VSConstants.VSITEMID.Nil)
{
var sharedHierarchy = LinkedFileUtilities.GetSharedHierarchyForItem(project.Hierarchy, itemId);
if (sharedHierarchy != null)
{
project.ProjectTracker.NotifyWorkspace(workspace =>
{
var eventSink = new HierarchyEventsSink((VisualStudioWorkspaceImpl)workspace, sharedHierarchy, document.Id);
if (ErrorHandler.Succeeded(sharedHierarchy.AdviseHierarchyEvents(eventSink, out var cookie)))
{
project._hierarchyEventSinks.MultiAdd(document.Id, (sharedHierarchy, cookie));
}
});
}
}
}
private static void OnDocumentClosing(object sender, bool updateActiveContext)
......@@ -905,16 +889,6 @@ private static void OnDocumentClosing(object sender, bool updateActiveContext)
{
projectTracker.NotifyWorkspace(workspace => workspace.OnDocumentClosed(document.Id, document.Loader, updateActiveContext));
}
if (project._hierarchyEventSinks.TryGetValue(document.Id, out var subscribedSinks))
{
foreach (var subscribedSink in subscribedSinks)
{
subscribedSink.hierarchy.UnadviseHierarchyEvents(subscribedSink.cookie);
}
project._hierarchyEventSinks.Remove(document.Id);
}
}
private static void OnDocumentUpdatedOnDisk(object sender, EventArgs e)
......@@ -1067,7 +1041,11 @@ internal void AddDocument(IVisualStudioHostDocument document, bool isCurrentCont
if (document.IsOpen)
{
this.ProjectTracker.NotifyWorkspace(workspace => workspace.OnDocumentOpened(document.Id, document.GetOpenTextBuffer().AsTextContainer(), isCurrentContext));
this.ProjectTracker.NotifyWorkspace(workspace =>
{
workspace.OnDocumentOpened(document.Id, document.GetOpenTextBuffer().AsTextContainer(), isCurrentContext);
(workspace as VisualStudioWorkspaceImpl)?.ConnectToSharedHierarchyEvents(document);
});
}
}
......
......@@ -316,10 +316,13 @@ void addToInOrderToPush(AbstractProject project)
if (document.IsOpen)
{
NotifyWorkspace(workspace =>
{
workspace.OnDocumentOpened(
document.Id,
document.GetOpenTextBuffer().AsTextContainer(),
isCurrentContext: LinkedFileUtilities.IsCurrentContextHierarchy(document, _runningDocumentTable)));
isCurrentContext: LinkedFileUtilities.IsCurrentContextHierarchy(document, _runningDocumentTable));
(workspace as VisualStudioWorkspaceImpl)?.ConnectToSharedHierarchyEvents(document);
});
}
}
}
......
......@@ -51,6 +51,8 @@ internal abstract partial class VisualStudioWorkspaceImpl : VisualStudioWorkspac
private readonly Lazy<ForegroundThreadAffinitizedObject> _foregroundObject
= new Lazy<ForegroundThreadAffinitizedObject>(() => new ForegroundThreadAffinitizedObject());
private readonly Dictionary<DocumentId, List<(IVsHierarchy hierarchy, uint cookie)>> _hierarchyEventSinks = new Dictionary<DocumentId, List<(IVsHierarchy hierarchy, uint cookie)>>();
/// <summary>
/// The <see cref="DeferredInitializationState"/> that consists of the <see cref="VisualStudioProjectTracker" />
/// and other UI-initialized types. It will be created as long as a single project has been created.
......@@ -981,6 +983,46 @@ internal void UpdateDocumentContextIfContainsDocument(IVsHierarchy sharedHierarc
OnDocumentContextUpdated(documentId);
}
internal void ConnectToSharedHierarchyEvents(IVisualStudioHostDocument document)
{
Contract.ThrowIfFalse(document.IsOpen);
var project = document.Project;
var itemId = document.GetItemId();
if (itemId != (uint)VSConstants.VSITEMID.Nil)
{
var sharedHierarchy = LinkedFileUtilities.GetSharedHierarchyForItem(project.Hierarchy, itemId);
if (sharedHierarchy != null)
{
ProjectTracker.NotifyWorkspace(workspace =>
{
var eventSink = new HierarchyEventsSink((VisualStudioWorkspaceImpl)workspace, sharedHierarchy, document.Id);
if (ErrorHandler.Succeeded(sharedHierarchy.AdviseHierarchyEvents(eventSink, out var cookie)))
{
_hierarchyEventSinks.MultiAdd(document.Id, (sharedHierarchy, cookie));
}
});
}
}
}
protected override void OnDocumentClosing(DocumentId documentId)
{
base.OnDocumentClosing(documentId);
if (_hierarchyEventSinks.TryGetValue(documentId, out var subscribedSinks))
{
foreach (var subscribedSink in subscribedSinks)
{
subscribedSink.hierarchy.UnadviseHierarchyEvents(subscribedSink.cookie);
}
_hierarchyEventSinks.Remove(documentId);
}
}
/// <summary>
/// Finds the <see cref="DocumentId"/> related to the given <see cref="DocumentId"/> that
/// is in the current context. For regular files (non-shared and non-linked) and closed
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册