private static ImmutableArray GetNamedTypes()

in src/TemplateRefGenerator/Generators/MarkdownGenerator.cs [654:715]


    private static ImmutableArray<NamedType> GetNamedTypes(ResourceMetadata resource)
    {
        HashSet<TypeBase> visited = new();
        Queue<TypeBase> queue = new();
        List<NamedType> namedTypes = new();

        queue.Enqueue(resource.Type);

        while (queue.Any())
        {
            var type = queue.Dequeue();
            if (visited.Contains(type))
            {
                continue;
            }
            visited.Add(type);

            switch (type)
            {
                case ResourceType resourceType:
                    queue.Enqueue(resourceType.Body.Type);
                    break;

                case ObjectType objectType:
                    namedTypes.Add(new(objectType.Name, type));
                    foreach (var (_, prop) in GetOrderedWritableProperties(objectType.Properties))
                    {
                        queue.Enqueue(prop.Type.Type);
                    }
                    if (objectType.AdditionalProperties != null)
                    {
                        queue.Enqueue(objectType.AdditionalProperties.Type);
                    }
                    break;
                case DiscriminatedObjectType discObjectType:
                    namedTypes.Add(new(discObjectType.Name, type));
                    foreach (var (_, prop) in GetOrderedWritableProperties(discObjectType.BaseProperties))
                    {
                        queue.Enqueue(prop.Type.Type);
                    }
                    foreach (var element in discObjectType.Elements.Values)
                    {
                        queue.Enqueue(element.Type);
                    }
                    break;
                case ArrayType arrayType:
                    if (arrayType.ItemType != null)
                    {
                        queue.Enqueue(arrayType.ItemType.Type);
                    }
                    break;
                case UnionType unionType:
                    foreach (var element in unionType.Elements)
                    {
                        queue.Enqueue(element.Type);
                    }
                    break;                
            }
        }

        return [.. namedTypes];
    }