in openapi-diff/src/modeler/AutoRest.Swagger/Model/ServiceDefinition.cs [466:570]
private static void ReferenceTrackSchemas(ServiceDefinition service)
{
foreach (var schema in service.Definitions.Values)
{
schema.IsReferenced = false;
}
foreach (var path in service.Paths.Values)
{
foreach (var operation in path.Values)
{
foreach (var parameter in operation.Parameters)
{
if (parameter.Schema != null && !string.IsNullOrWhiteSpace(parameter.Schema.Reference))
{
var schema = FindReferencedSchema(parameter.Schema.Reference, service.Definitions);
schema.IsReferenced = true;
}
}
}
}
foreach (var path in service.CustomPaths.Values)
{
foreach (var operation in path.Values)
{
foreach (var parameter in operation.Parameters)
{
if (parameter.Schema != null && !string.IsNullOrWhiteSpace(parameter.Schema.Reference))
{
var schema = FindReferencedSchema(parameter.Schema.Reference, service.Definitions);
schema.IsReferenced = true;
}
}
}
}
foreach (var parameter in service.Parameters.Values)
{
if (parameter.Schema != null && !string.IsNullOrWhiteSpace(parameter.Schema.Reference))
{
var schema = FindReferencedSchema(parameter.Schema.Reference, service.Definitions);
schema.IsReferenced = true;
}
}
foreach (var response in service.Responses.Values)
{
if (response.Schema != null && !string.IsNullOrWhiteSpace(response.Schema.Reference))
{
var schema = FindReferencedSchema(response.Schema.Reference, service.Definitions);
schema.IsReferenced = true;
}
}
// detect the polymorphic concrecate model.
foreach (var schema in service.Definitions.Values.Where(d => !d.IsReferenced))
{
if (schema.Extensions != null && schema.Extensions.ContainsKey("x-ms-discriminator-value"))
{
schema.IsReferenced = true;
continue;
}
if (schema.AllOf == null)
{
continue;
}
foreach (var property in schema.AllOf)
{
if (!string.IsNullOrWhiteSpace(property.Reference))
{
if (FindDiscriminator(property.Reference, service.Definitions))
{
schema.IsReferenced = true;
break;
}
}
}
}
var changed = true;
while (changed)
{
changed = false;
foreach (var schema in service.Definitions.Values.Where(d => d.IsReferenced))
{
// If schema does not have properties then do not recurse
if (schema.Properties == null)
{
continue;
}
foreach (var property in schema.Properties.Values)
{
if (!string.IsNullOrWhiteSpace(property.Reference))
{
var s = FindReferencedSchema(property.Reference, service.Definitions);
changed = changed || !s.IsReferenced;
s.IsReferenced = true;
}
}
}
}
}