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);
            }
        }