private void CheckParameters()

in openapi-diff/src/modeler/AutoRest.Swagger/Model/Operation.cs [181:249]


        private void CheckParameters(ComparisonContext<ServiceDefinition> context, Operation priorOperation)
        {
            ServiceDefinition currentRoot = context.CurrentRoot;
            ServiceDefinition previousRoot = context.PreviousRoot;

            context.PushProperty("parameters");

            List<(SwaggerParameter param, bool isGlobal)> currParamsResolved =
                Parameters.Select(param => ResolveParam(param, currentRoot)).ToList();

            List<(SwaggerParameter param, bool isGlobal)> priorParamsResolved =
                priorOperation.Parameters.Select(param => ResolveParam(param, previousRoot)).ToList();

            DetectChangedParameterLocation(context, currParamsResolved, priorParamsResolved);
            DetectChangedParameterOrder(context, currParamsResolved, priorParamsResolved);

            foreach (var paramInfo in priorParamsResolved)
            {
                (SwaggerParameter oldParam, bool _) = paramInfo;
                SwaggerParameter newParam = FindParameterEx(oldParam, Parameters, currentRoot.Parameters);

                // we should use PushItemByName instead of PushProperty because Swagger `parameters` is
                // an array of parameters.
                context.PushItemByName(oldParam.Name);

                if (newParam != null)
                {
                    newParam.Compare(context, oldParam);
                }
                else if (oldParam.IsRequired)
                {
                    // Removed required parameter
                    context.LogBreakingChange(ComparisonMessages.RemovedRequiredParameter, oldParam.Name);
                } else {
                    // Removed optional parameter
                    context.LogBreakingChange(ComparisonMessages.RemovedOptionalParameter, oldParam.Name);
                }

                context.Pop();
            }

            // Check that no required or optional parameters were added.
            List<SwaggerParameter> allParameters = Parameters.Select(
                    param =>
                        string.IsNullOrWhiteSpace(param.Reference)
                            ? param
                            : FindReferencedParameter(param.Reference, currentRoot.Parameters))
                .Where(p => p != null).ToList();

            foreach (SwaggerParameter newParam in allParameters)
            {
                SwaggerParameter oldParam = FindParameterEx(newParam, priorOperation.Parameters, previousRoot.Parameters);

                if (oldParam != null)
                    continue;

                // Did not find required parameter in the old swagger i.e. required parameter is added
                context.PushItemByName(newParam.Name);

                context.LogBreakingChange(
                    newParam.IsRequired
                        ? ComparisonMessages.AddingRequiredParameter
                        : ComparisonMessages.AddingOptionalParameter,
                    newParam.Name);

                context.Pop();
            }
            context.Pop();
        }