Esempio n. 1
0
        private void ExtendModelWithRelatedNodesRecursive(IRoslynModelNode roslynModelNode, DirectedModelRelationshipType?directedModelRelationshipType,
                                                          CancellationToken cancellationToken, IIncrementalProgress progress, bool recursive, HashSet <ModelNodeId> alreadyDiscoveredNodes)
        {
            var relatedSymbolPairs = roslynModelNode
                                     .FindRelatedSymbols(_roslynModelProvider, directedModelRelationshipType)
                                     .Select(GetOriginalDefinition)
                                     .Where(i => !IsHidden(i.RelatedSymbol)).ToList();

            foreach (var relatedSymbolPair in relatedSymbolPairs)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var relatedSymbol = relatedSymbolPair.RelatedSymbol;
                var relatedNode   = GetOrAddNode(relatedSymbol, progress);
                AddRelationshipIfNotExists(relatedSymbolPair);

                if (!recursive)
                {
                    continue;
                }

                // Avoid infinite loop by stopping recursion when a node is already added.
                if (alreadyDiscoveredNodes.Contains(relatedNode.Id))
                {
                    continue;
                }

                alreadyDiscoveredNodes.Add(relatedNode.Id);
                ExtendModelWithRelatedNodesRecursive(relatedNode, directedModelRelationshipType,
                                                     cancellationToken, progress, true, alreadyDiscoveredNodes);
            }
        }