private IItemContainer GetUnfoldParent(IProductElement element, VsTemplateType templateType) { var parentWithArtifactLink = element.Traverse( x => x.GetParent(), x => x.TryGetReference(ReferenceKindConstants.SolutionItem) != null); if (parentWithArtifactLink != null) { var referencedItems = SolutionArtifactLinkReference.GetResolvedReferences(parentWithArtifactLink, this.uriService); if (templateType == VsTemplateType.Project || templateType == VsTemplateType.ProjectGroup) { var parentItem = referencedItems.FirstOrDefault(item => item.Kind == ItemKind.Solution || item.Kind == ItemKind.SolutionFolder); if (parentItem != null) return parentItem; } else if (templateType == VsTemplateType.Item) { var parentItem = referencedItems.FirstOrDefault(item => item.Kind == ItemKind.Project || item.Kind == ItemKind.Folder); if (parentItem != null) return parentItem; } // Why not continue up??? For extension points it makes perfect sense! if (!(parentWithArtifactLink is IProduct)) { // The Traverse at the top first checks the stop condition on the source element itself, // meaning in our case that we would enter an infinite loop if were to get here again // and pass ourselves up. So we travel one element up for the traversal. return GetUnfoldParent(parentWithArtifactLink.GetParent(), templateType); } } return GetUnfoldParent(this.solution, templateType); }
private IItemContainer GetUnfoldParent(IProductElement element, VsTemplateType templateType) { var parentWithArtifactLink = element.Traverse( x => x.GetParent(), x => x.TryGetReference(ReferenceKindConstants.SolutionItem) != null); if (parentWithArtifactLink != null) { var referencedItems = SolutionArtifactLinkReference.GetResolvedReferences(parentWithArtifactLink, this.uriService); if (templateType == VsTemplateType.Project || templateType == VsTemplateType.ProjectGroup) { var parentItem = referencedItems.FirstOrDefault(item => item.Kind == ItemKind.Solution || item.Kind == ItemKind.SolutionFolder); if (parentItem != null) { return(parentItem); } } else if (templateType == VsTemplateType.Item) { var parentItem = referencedItems.FirstOrDefault(item => item.Kind == ItemKind.Project || item.Kind == ItemKind.Folder); if (parentItem != null) { return(parentItem); } } // Why not continue up??? For extension points it makes perfect sense! if (!(parentWithArtifactLink is IProduct)) { // The Traverse at the top first checks the stop condition on the source element itself, // meaning in our case that we would enter an infinite loop if were to get here again // and pass ourselves up. So we travel one element up for the traversal. return(GetUnfoldParent(parentWithArtifactLink.GetParent(), templateType)); } } return(GetUnfoldParent(this.solution, templateType)); }