in openapi-diff/src/modeler/AutoRest.Swagger/Model/Operation.cs [327:373]
private void DetectChangedParameterOrder(
ComparisonContext<ServiceDefinition> context,
List<(SwaggerParameter param, bool isGlobal)> currParamsInfo,
List<(SwaggerParameter param, bool isGlobal)> priorParamsInfo)
{
SwaggerParameter[] currParamsResolvedOrdered =
currParamsInfo.Where(ParamOrderMatters).Select(paramInfo => paramInfo.param).ToArray();
SwaggerParameter[] priorParamsResolvedOrdered =
priorParamsInfo.Where(ParamOrderMatters).Select(paramInfo => paramInfo.param).ToArray();
int currParamsCount = currParamsResolvedOrdered.Length;
int priorParamsCount = priorParamsResolvedOrdered.Length;
int paramIndex = 0;
while (paramIndex < priorParamsCount)
{
SwaggerParameter currParamAtIndex =
paramIndex < currParamsCount ? currParamsResolvedOrdered[paramIndex] : null;
SwaggerParameter priorParamAtIndex = priorParamsResolvedOrdered[paramIndex];
if (!ParamsAreSame(currParamAtIndex, priorParamAtIndex))
{
int newParamIndex = FindParameterIndex(priorParamAtIndex, currParamsResolvedOrdered);
bool paramOrderDoesMatterInNewSpec = newParamIndex != -1;
if (paramOrderDoesMatterInNewSpec)
{
context.LogBreakingChange(
ComparisonMessages.ChangedParameterOrder,
priorParamAtIndex.Name,
priorParamAtIndex.In,
paramIndex,
newParamIndex);
}
else
{
// If param order does not matter in the new spec we not report ComparisonMessages.ChangedParameterOrder breaking change.
// However, it is still a breaking change to a) change the parameter location so that its order doesn't matter,
// OR b) to remove a parameter altogether.
// We expect other breaking changes to be reported in such case like e.g. ComparisonMessages.ParameterLocationHasChanged.
}
}
paramIndex++;
}
}