Index: experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/SolutionListenerForProjectReferenceUpdate.cs |
diff --git a/experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/SolutionListenerForProjectReferenceUpdate.cs b/experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/SolutionListenerForProjectReferenceUpdate.cs |
deleted file mode 100644 |
index 0560ad2971393714109a5546c6d2c13a6506c8f6..0000000000000000000000000000000000000000 |
--- a/experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/SolutionListenerForProjectReferenceUpdate.cs |
+++ /dev/null |
@@ -1,226 +0,0 @@ |
-/// Copyright (c) Microsoft Corporation. All rights reserved. |
- |
-using System; |
-using System.Collections.Generic; |
-using System.Diagnostics; |
-using System.IO; |
-using System.Runtime.InteropServices; |
-using Microsoft.VisualStudio; |
-using Microsoft.VisualStudio.Shell.Interop; |
-using IServiceProvider = System.IServiceProvider; |
- |
-namespace Microsoft.VisualStudio.Project |
-{ |
- [CLSCompliant(false)] |
- public class SolutionListenerForProjectReferenceUpdate : SolutionListener |
- { |
- |
- #region ctor |
- public SolutionListenerForProjectReferenceUpdate(IServiceProvider serviceProvider) |
- : base(serviceProvider) |
- { |
- } |
- #endregion |
- |
- #region overridden methods |
- /// <summary> |
- /// Delete this project from the references of projects of this type, if it is found. |
- /// </summary> |
- /// <param name="hierarchy"></param> |
- /// <param name="removed"></param> |
- /// <returns></returns> |
- public override int OnBeforeCloseProject(IVsHierarchy hierarchy, int removed) |
- { |
- if(removed != 0) |
- { |
- List<ProjectReferenceNode> projectReferences = this.GetProjectReferencesContainingThisProject(hierarchy); |
- |
- foreach(ProjectReferenceNode projectReference in projectReferences) |
- { |
- projectReference.Remove(false); |
- // Set back the remove state on the project refererence. The reason why we are doing this is that the OnBeforeUnloadProject immedaitely calls |
- // OnBeforeCloseProject, thus we would be deleting references when we should not. Unload should not remove references. |
- projectReference.CanRemoveReference = true; |
- } |
- } |
- |
- return VSConstants.S_OK; |
- } |
- |
- |
- /// <summary> |
- /// Needs to update the dangling reference on projects that contain this hierarchy as project reference. |
- /// </summary> |
- /// <param name="stubHierarchy"></param> |
- /// <param name="realHierarchy"></param> |
- /// <returns></returns> |
- public override int OnAfterLoadProject(IVsHierarchy stubHierarchy, IVsHierarchy realHierarchy) |
- { |
- List<ProjectReferenceNode> projectReferences = this.GetProjectReferencesContainingThisProject(realHierarchy); |
- |
- // Refersh the project reference node. That should trigger the drawing of the normal project reference icon. |
- foreach(ProjectReferenceNode projectReference in projectReferences) |
- { |
- projectReference.CanRemoveReference = true; |
- |
- projectReference.OnInvalidateItems(projectReference.Parent); |
- } |
- |
- return VSConstants.S_OK; |
- } |
- |
- |
- public override int OnAfterRenameProject(IVsHierarchy hierarchy) |
- { |
- if(hierarchy == null) |
- { |
- return VSConstants.E_INVALIDARG; |
- } |
- |
- try |
- { |
- List<ProjectReferenceNode> projectReferences = this.GetProjectReferencesContainingThisProject(hierarchy); |
- |
- // Collect data that is needed to initialize the new project reference node. |
- string projectRef; |
- ErrorHandler.ThrowOnFailure(this.Solution.GetProjrefOfProject(hierarchy, out projectRef)); |
- |
- object nameAsObject; |
- ErrorHandler.ThrowOnFailure(hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_Name, out nameAsObject)); |
- string projectName = (string)nameAsObject; |
- |
- string projectPath = String.Empty; |
- |
- IVsProject3 project = hierarchy as IVsProject3; |
- |
- if(project != null) |
- { |
- ErrorHandler.ThrowOnFailure(project.GetMkDocument(VSConstants.VSITEMID_ROOT, out projectPath)); |
- projectPath = Path.GetDirectoryName(projectPath); |
- } |
- |
- // Remove and re add the node. |
- foreach(ProjectReferenceNode projectReference in projectReferences) |
- { |
- ProjectNode projectMgr = projectReference.ProjectMgr; |
- IReferenceContainer refContainer = projectMgr.GetReferenceContainer(); |
- projectReference.Remove(false); |
- |
- VSCOMPONENTSELECTORDATA selectorData = new VSCOMPONENTSELECTORDATA(); |
- selectorData.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project; |
- selectorData.bstrTitle = projectName; |
- selectorData.bstrFile = projectPath; |
- selectorData.bstrProjRef = projectRef; |
- refContainer.AddReferenceFromSelectorData(selectorData); |
- } |
- } |
- catch(COMException e) |
- { |
- return e.ErrorCode; |
- } |
- |
- return VSConstants.S_OK; |
- } |
- |
- |
- public override int OnBeforeUnloadProject(IVsHierarchy realHierarchy, IVsHierarchy stubHierarchy) |
- { |
- List<ProjectReferenceNode> projectReferences = this.GetProjectReferencesContainingThisProject(realHierarchy); |
- |
- // Refresh the project reference node. That should trigger the drawing of the dangling project reference icon. |
- foreach(ProjectReferenceNode projectReference in projectReferences) |
- { |
- projectReference.IsNodeValid = true; |
- projectReference.OnInvalidateItems(projectReference.Parent); |
- projectReference.CanRemoveReference = false; |
- projectReference.IsNodeValid = false; |
- projectReference.ReferencedProjectObject = null; |
- } |
- |
- return VSConstants.S_OK; |
- |
- } |
- |
- #endregion |
- |
- #region helper methods |
- private List<ProjectReferenceNode> GetProjectReferencesContainingThisProject(IVsHierarchy inputHierarchy) |
- { |
- List<ProjectReferenceNode> projectReferences = new List<ProjectReferenceNode>(); |
- if(this.Solution == null || inputHierarchy == null) |
- { |
- return projectReferences; |
- } |
- |
- uint flags = (uint)(__VSENUMPROJFLAGS.EPF_ALLPROJECTS | __VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION); |
- Guid enumOnlyThisType = Guid.Empty; |
- IEnumHierarchies enumHierarchies = null; |
- |
- ErrorHandler.ThrowOnFailure(this.Solution.GetProjectEnum(flags, ref enumOnlyThisType, out enumHierarchies)); |
- Debug.Assert(enumHierarchies != null, "Could not get list of hierarchies in solution"); |
- |
- IVsHierarchy[] hierarchies = new IVsHierarchy[1]; |
- uint fetched; |
- int returnValue = VSConstants.S_OK; |
- do |
- { |
- returnValue = enumHierarchies.Next(1, hierarchies, out fetched); |
- Debug.Assert(fetched <= 1, "We asked one project to be fetched VSCore gave more than one. We cannot handle that"); |
- if(returnValue == VSConstants.S_OK && fetched == 1) |
- { |
- IVsHierarchy hierarchy = hierarchies[0]; |
- Debug.Assert(hierarchy != null, "Could not retrieve a hierarchy"); |
- IReferenceContainerProvider provider = hierarchy as IReferenceContainerProvider; |
- if(provider != null) |
- { |
- IReferenceContainer referenceContainer = provider.GetReferenceContainer(); |
- |
- Debug.Assert(referenceContainer != null, "Could not found the References virtual node"); |
- ProjectReferenceNode projectReferenceNode = GetProjectReferenceOnNodeForHierarchy(referenceContainer.EnumReferences(), inputHierarchy); |
- if(projectReferenceNode != null) |
- { |
- projectReferences.Add(projectReferenceNode); |
- } |
- } |
- } |
- } while(returnValue == VSConstants.S_OK && fetched == 1); |
- |
- return projectReferences; |
- } |
- |
- private static ProjectReferenceNode GetProjectReferenceOnNodeForHierarchy(IList<ReferenceNode> references, IVsHierarchy inputHierarchy) |
- { |
- if(references == null) |
- { |
- return null; |
- } |
- |
- Guid projectGuid; |
- ErrorHandler.ThrowOnFailure(inputHierarchy.GetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, out projectGuid)); |
- |
- string canonicalName; |
- ErrorHandler.ThrowOnFailure(inputHierarchy.GetCanonicalName(VSConstants.VSITEMID_ROOT, out canonicalName)); |
- foreach(ReferenceNode refNode in references) |
- { |
- ProjectReferenceNode projRefNode = refNode as ProjectReferenceNode; |
- if(projRefNode != null) |
- { |
- if(projRefNode.ReferencedProjectGuid == projectGuid) |
- { |
- return projRefNode; |
- } |
- |
- // Try with canonical names, if the project that is removed is an unloaded project than the above criteria will not pass. |
- if(!String.IsNullOrEmpty(projRefNode.Url) && NativeMethods.IsSamePath(projRefNode.Url, canonicalName)) |
- { |
- return projRefNode; |
- } |
- } |
- } |
- |
- return null; |
- |
- } |
- #endregion |
- } |
-} |