コード例 #1
0
        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()));
        }
コード例 #2
0
        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);
        }