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