提交 4f05ff32 编写于 作者: B Balaji Krishnan

Merge pull request #1836 from balajikris/DocumentMonikerLookUpForSharedItemThatIsAContainedDocument

Document moniker look up for shared item that is a contained document
......@@ -152,5 +152,47 @@ private string GetActiveIntellisenseProjectContextInternal(IVsHierarchy hierarch
? intellisenseProjectName as string
: null;
}
public static bool TryGetSharedHierarchyAndItemId(IVsHierarchy hierarchy, uint itemId, out IVsHierarchy sharedHierarchy, out uint itemIdInSharedHierarchy)
{
return s_singleton.TryGetSharedHierarchyAndItemIdInternal(hierarchy, itemId, out sharedHierarchy, out itemIdInSharedHierarchy);
}
private bool TryGetSharedHierarchyAndItemIdInternal(IVsHierarchy hierarchy, uint itemId, out IVsHierarchy sharedHierarchy, out uint itemIdInSharedHierarchy)
{
AssertIsForeground();
sharedHierarchy = null;
itemIdInSharedHierarchy = (uint)VSConstants.VSITEMID.Nil;
if (hierarchy == null)
{
return false;
}
sharedHierarchy = s_singleton.GetSharedHierarchyForItemInternal(hierarchy, itemId);
return sharedHierarchy == null
? false
: s_singleton.TryGetItemIdInSharedHierarchyInternal(hierarchy, itemId, sharedHierarchy, out itemIdInSharedHierarchy);
}
private bool TryGetItemIdInSharedHierarchyInternal(IVsHierarchy hierarchy, uint itemId, IVsHierarchy sharedHierarchy, out uint itemIdInSharedHierarchy)
{
string fullPath;
int found;
VSDOCUMENTPRIORITY[] priority = new VSDOCUMENTPRIORITY[1];
if (ErrorHandler.Succeeded(((IVsProject)hierarchy).GetMkDocument(itemId, out fullPath))
&& ErrorHandler.Succeeded(((IVsProject)sharedHierarchy).IsDocumentInProject(fullPath, out found, priority, out itemIdInSharedHierarchy))
&& found != 0
&& itemIdInSharedHierarchy != (uint)VSConstants.VSITEMID.Nil)
{
return true;
}
itemIdInSharedHierarchy = (uint)VSConstants.VSITEMID.Nil;
return false;
}
}
}
......@@ -2,7 +2,6 @@
using System;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Utilities
......@@ -51,8 +50,13 @@ public static string GetMonikerForHierarchyAndItemId(this IVsRunningDocumentTabl
}
}
// Uh, OK, that's probably not good that we're supposedly an open file but not in the RDT. We'll fall back
// to the IVsHierarchy's name property for this item.
// Uh, OK, that's probably not good that we're supposedly an open file but not in the RDT.
return null;
}
// Gets the IVsHierarchy's name property for this item.
public static string GetDocumentNameForHierarchyAndItemId(this IVsHierarchy hierarchy, uint itemid)
{
object property;
Marshal.ThrowExceptionForHR(hierarchy.GetProperty(itemid, (int)__VSHPROPID.VSHPROPID_Name, out property));
return (string)property;
......
......@@ -70,6 +70,7 @@ internal sealed class ContainedDocument : ForegroundThreadAffinitizedObject, IVi
private readonly ReiteratedVersionSnapshotTracker _snapshotTracker;
private readonly IFormattingRule _vbHelperFormattingRule;
private readonly string _itemMoniker;
private readonly IVsHierarchy _sharedHierarchy;
public AbstractProject Project { get { return _containedLanguage.Project; } }
public bool SupportsRename { get { return _hostType == HostType.Razor; } }
......@@ -78,7 +79,14 @@ internal sealed class ContainedDocument : ForegroundThreadAffinitizedObject, IVi
public IReadOnlyList<string> Folders { get; }
public TextLoader Loader { get; }
public DocumentKey Key { get; }
public IVsHierarchy SharedHierarchy { get; }
public IVsHierarchy SharedHierarchy
{
get
{
return _sharedHierarchy;
}
}
public ContainedDocument(
AbstractContainedLanguage containedLanguage,
......@@ -99,9 +107,21 @@ internal sealed class ContainedDocument : ForegroundThreadAffinitizedObject, IVi
_hostType = GetHostType();
var rdt = (IVsRunningDocumentTable)componentModel.GetService<SVsServiceProvider>().GetService(typeof(SVsRunningDocumentTable));
var filePath = rdt.GetMonikerForHierarchyAndItemId(hierarchy, itemId);
this.SharedHierarchy = hierarchy == null ? null : LinkedFileUtilities.GetSharedHierarchyForItem(hierarchy, itemId);
uint itemIdInSharedHierarchy;
var isSharedHierarchy = LinkedFileUtilities.TryGetSharedHierarchyAndItemId(hierarchy, itemId, out _sharedHierarchy, out itemIdInSharedHierarchy);
var filePath = isSharedHierarchy
? rdt.GetMonikerForHierarchyAndItemId(_sharedHierarchy, itemIdInSharedHierarchy)
: rdt.GetMonikerForHierarchyAndItemId(hierarchy, itemId);
// we couldn't look up the document moniker in RDT for a hierarchy/item pair
// Since we only use this moniker as a key, we could fall back to something else, like the document name.
if (filePath == null)
{
Debug.Assert(false, "Could not get the document moniker for an item in its hierarchy.");
filePath = hierarchy.GetDocumentNameForHierarchyAndItemId(itemId);
}
if (Project.Hierarchy != null)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册