/// <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)