/// <summary>
        /// Combine all the different clauses for a set of overloaded functions into a OverloadedFunctionDefinition (which can be further transformed presently)
        /// </summary>
        /// <param name="functionSignature">the common signature on which this overload group is based</param>
        /// <param name="functionDefinitions">the original functions</param>
        /// <returns></returns>
        private IFunctionDefinition TransformOverloadGroup(IFunctionSignature functionSignature,
                                                           List <IFunctionDefinition> functionDefinitions)
        {
            var orderedFuns = functionDefinitions.OrderBy(fd => fd.Line).ToList();
            var firstClause = orderedFuns.First();
            var result      = new OverloadedFunctionDefinition(orderedFuns, functionSignature)
                              .CameFromSameSourceLocation(firstClause)
                              .HasSameParentAs(functionDefinitions.First());

            result.Name       = firstClause.Name;
            result.ReturnType = firstClause.ReturnType;
            result.Typename   = firstClause.Typename;
            var ctx        = functionDefinitions.Last();
            var paramDecls = new List <IParameterListItem>();

            if (ctx.ParameterDeclarations?.ParameterDeclarations.Any() ?? false)
            {
                foreach (var pd in ctx.ParameterDeclarations.ParameterDeclarations)
                {
                    paramDecls.Add(new ParameterDeclaration(new Identifier(pd.ParameterName.Value), pd.TypeName, null));
                }
            }

            result.ParameterDeclarations = new ParameterDeclarationList(paramDecls);
            return(result);
        }
        public void ProcessOverloadedFunctionDefinition(OverloadedFunctionDefinition ctx)
        {
            clauseCounter = 1;
            var clauses = new List <(Expression, IFunctionDefinition)>();

            foreach (var clause in ctx.OverloadClauses)
            {
                var precondition      = GetPrecondition(clause);
                var subClauseFunction = GetSubclauseFunction(clause);
                clauseCounter++;
                clauses.Add((precondition, subClauseFunction));
            }

            var guardFunction = GenerateGuardFunction(ctx, clauses);
            var newFunctions  = clauses.Select(c => c.Item2);

            newFunctions = newFunctions.Prepend(guardFunction);
            SubstituteFunctionDefinitions((IFunctionCollection)ctx.ParentNode, new[] { ctx }, newFunctions);
        }
 private IFunctionDefinition GenerateGuardFunction(OverloadedFunctionDefinition ctx, List <(Expression, IFunctionDefinition)> clauses)