private GraphNodeId GetTopLevelGraphNodeId(string projectPath, IDependencyNode nodeInfo) { var partialValues = new List <GraphNodeId>(); partialValues.Add(GraphNodeId.GetPartial(CodeGraphNodeIdName.Assembly, new Uri(projectPath, UriKind.RelativeOrAbsolute))); if (nodeInfo.Flags.Contains(DependencyNode.GenericDependencyFlags)) { var projectFolder = Path.GetDirectoryName(projectPath)?.ToLowerInvariant(); if (nodeInfo.Flags.Contains(DependencyNode.CustomItemSpec)) { var name = DependencyNode.GetName(nodeInfo); if (name != null) { partialValues.Add(GraphNodeId.GetPartial( CodeGraphNodeIdName.File, new Uri(Path.Combine(projectFolder, name.ToLowerInvariant()), UriKind.RelativeOrAbsolute))); } } else { var fullItemSpecPath = MakeRooted(projectFolder, nodeInfo.Id.ItemSpec); if (!string.IsNullOrEmpty(fullItemSpecPath)) { partialValues.Add(GraphNodeId.GetPartial(CodeGraphNodeIdName.File, new Uri(fullItemSpecPath.ToLowerInvariant(), UriKind.RelativeOrAbsolute))); } } } else { partialValues.Add(GraphNodeId.GetPartial(CodeGraphNodeIdName.File, new Uri(nodeInfo.Id.ToString().ToLowerInvariant(), UriKind.RelativeOrAbsolute))); } return(GraphNodeId.GetNested(partialValues.ToArray())); }
private IProjectItemTree CreateProjectItemTreeNode(IProjectTree providerRootTreeNode, IDependencyNode nodeInfo, IProjectCatalogSnapshot catalogs) { var isGenericNodeType = nodeInfo.Flags.Contains(DependencyNode.GenericDependencyFlags); var properties = nodeInfo.Properties ?? ImmutableDictionary <string, string> .Empty .Add(Folder.IdentityProperty, nodeInfo.Caption) .Add(Folder.FullPathProperty, string.Empty); // For generic node types we do set correct, known item types, however for custom nodes // provided by third party extensions we can not guarantee that item type will be known. // Thus always set predefined itemType for all custom nodes. // TODO: generate specific xaml rule for generic Dependency nodes // tracking issue: https://github.com/dotnet/roslyn-project-system/issues/1102 var itemType = isGenericNodeType ? nodeInfo.Id.ItemType : Folder.SchemaName; // when itemSpec is not in valid absolute path format, property page does not show // item name correctly. Use real Name for the node here instead of caption, since caption // can have other info like version in it. var itemSpec = nodeInfo.Flags.Contains(DependencyNode.CustomItemSpec) ? DependencyNode.GetName(nodeInfo) : nodeInfo.Id.ItemSpec; var itemContext = ProjectPropertiesContext.GetContext(UnconfiguredProject, itemType, itemSpec); var configuredProjectExports = GetActiveConfiguredProjectExports(ActiveConfiguredProject); IRule rule = null; if (nodeInfo.Resolved || !isGenericNodeType) { rule = GetRuleForResolvableReference( itemContext, new KeyValuePair <string, IImmutableDictionary <string, string> >( itemSpec, properties), catalogs, configuredProjectExports, isGenericNodeType); } else { rule = GetRuleForUnresolvableReference( itemContext, catalogs, configuredProjectExports); } // Notify about tree changes to customization context var customTreePropertyContext = GetCustomPropertyContext(providerRootTreeNode); var customTreePropertyValues = new ReferencesProjectTreeCustomizablePropertyValues { Caption = nodeInfo.Caption, Flags = nodeInfo.Flags, Icon = nodeInfo.Icon.ToProjectSystemType() }; ApplyProjectTreePropertiesCustomization(customTreePropertyContext, customTreePropertyValues); var treeItemNode = NewTree(caption: nodeInfo.Caption, item: itemContext, propertySheet: null, visible: true, browseObjectProperties: rule, flags: nodeInfo.Flags, icon: nodeInfo.Icon.ToProjectSystemType(), expandedIcon: nodeInfo.ExpandedIcon.ToProjectSystemType()); return(treeItemNode); }