private void TryProcessOpenForDocCookie(uint docCookie) { string moniker = RunningDocumentTable.GetDocumentMoniker(docCookie); IVsHierarchy hierarchy; uint itemid; RunningDocumentTable.GetDocumentHierarchyItem(docCookie, out hierarchy, out itemid); foreach (var project in _projectContainer.GetProjects()) { var documentKey = new DocumentKey(project, moniker); if (_documentMap.ContainsKey(documentKey)) { var shimTextBuffer = RunningDocumentTable.GetDocumentData(docCookie) as IVsTextBuffer; if (shimTextBuffer != null) { var textBuffer = EditorAdaptersFactoryService.GetDocumentBuffer(shimTextBuffer); // If we already have an ITextBuffer for this document, then we can open it now. // Otherwise, setup an event handler that will do it when the buffer loads. if (textBuffer != null) { // We might already have this docCookie marked as open an older document. This can happen // if we're in the middle of a rename but this class hasn't gotten the notification yet but // another listener for RDT events got it if (_docCookiesToOpenDocumentKeys.ContainsKey(docCookie)) { CloseDocuments(docCookie, monikerToKeep: moniker); } if (hierarchy == project.Hierarchy) { // This is the current context NewBufferOpened(docCookie, textBuffer, documentKey, isCurrentContext: true); } else { // This is a non-current linked context NewBufferOpened(docCookie, textBuffer, documentKey, isCurrentContext: false); } } else { TextBufferDataEventsSink.HookupHandler(this, shimTextBuffer, documentKey); } } } } }
private void TryProcessOpenForDocCookie_NoLock(uint docCookie) { string moniker = _runningDocumentTable.GetDocumentMoniker(docCookie); _runningDocumentTable.GetDocumentHierarchyItem(docCookie, out var hierarchy, out var itemid); if (_runningDocumentTable.GetDocumentData(docCookie) is IVsTextBuffer shimTextBuffer) { var hasAssociatedRoslynDocument = false; foreach (var project in _projectTracker.ImmutableProjects) { var documentKey = new DocumentKey(project, moniker); if (_documentMap.ContainsKey(documentKey)) { hasAssociatedRoslynDocument = true; var textBuffer = _editorAdaptersFactoryService.GetDocumentBuffer(shimTextBuffer); // If we already have an ITextBuffer for this document, then we can open it now. // Otherwise, setup an event handler that will do it when the buffer loads. if (textBuffer != null) { // We might already have this docCookie marked as open an older document. This can happen // if we're in the middle of a rename but this class hasn't gotten the notification yet but // another listener for RDT events got it if (_docCookiesToOpenDocumentKeys.ContainsKey(docCookie)) { CloseDocuments_NoLock(docCookie, monikerToKeep: moniker); } if (hierarchy == project.Hierarchy) { // This is the current context NewBufferOpened_NoLock(docCookie, textBuffer, documentKey, isCurrentContext: true); } else { // This is a non-current linked context NewBufferOpened_NoLock(docCookie, textBuffer, documentKey, isCurrentContext: false); } } else { TextBufferDataEventsSink.HookupHandler(shimTextBuffer, onDocumentLoadCompleted: () => OnDocumentLoadCompleted(shimTextBuffer, documentKey, moniker)); } } } if (!hasAssociatedRoslynDocument && this._documentTrackingServiceOpt != null && !_docCookiesToNonRoslynDocumentBuffers.ContainsKey(docCookie)) { // Non-Roslyn document opened. var textBuffer = _editorAdaptersFactoryService.GetDocumentBuffer(shimTextBuffer); if (textBuffer != null) { OnNonRoslynBufferOpened_NoLock(textBuffer, docCookie); } else { TextBufferDataEventsSink.HookupHandler(shimTextBuffer, onDocumentLoadCompleted: () => OnDocumentLoadCompleted(shimTextBuffer, documentKeyOpt: null, moniker: moniker)); } } } else { // This is opening some other designer or property page. If it's tied to our IVsHierarchy, we should // let the workspace know foreach (var project in _projectTracker.ImmutableProjects) { if (hierarchy == project.Hierarchy) { _projectTracker.NotifyNonDocumentOpenedForProject(project); } } } }