private async Task ExtendModelWithRelatedNodesRecursiveAsync( IRoslynModelNode roslynModelNode, DirectedModelRelationshipType?directedModelRelationshipType, CancellationToken cancellationToken, IIncrementalProgress progress, bool recursive, HashSet <ModelNodeId> alreadyDiscoveredNodes) { var relatedSymbolPairs = await roslynModelNode.FindRelatedSymbolsAsync(_roslynModelProvider, directedModelRelationshipType); var presentableRelatedSymbolPairs = relatedSymbolPairs .Select(GetOriginalDefinition) .Where(i => !IsHidden(i.RelatedSymbol)) .ToList(); foreach (var relatedSymbolPair in presentableRelatedSymbolPairs) { 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); await ExtendModelWithRelatedNodesRecursiveAsync( relatedNode, directedModelRelationshipType, cancellationToken, progress, true, alreadyDiscoveredNodes); } }