public FunctionOverload(string name, ReturnTypeBuilderDelegate returnTypeBuilder, TypeSymbol returnType, int minimumArgumentCount, int?maximumArgumentCount, IEnumerable <TypeSymbol> fixedParameterTypes, TypeSymbol?variableParameterType, FunctionFlags flags = FunctionFlags.Default) { if (maximumArgumentCount.HasValue && maximumArgumentCount.Value < minimumArgumentCount) { throw new ArgumentException($"{nameof(maximumArgumentCount.Value)} cannot be less than {nameof(minimumArgumentCount)}."); } var fixedTypes = fixedParameterTypes.ToImmutableArray(); if (fixedTypes.Length < minimumArgumentCount && variableParameterType == null) { throw new ArgumentException("Not enough argument types are specified."); } this.Name = name; this.ReturnTypeBuilder = returnTypeBuilder; this.MinimumArgumentCount = minimumArgumentCount; this.MaximumArgumentCount = maximumArgumentCount; this.FixedParameterTypes = fixedTypes; this.VariableParameterType = variableParameterType; this.Flags = flags; this.ParameterTypeSignatures = fixedTypes .Select((parameterType, i) => $"param{i}: {parameterType}") .ToImmutableArray(); if (variableParameterType != null) { var restParameterType = variableParameterType.TypeKind == TypeKind.Union ? $"({variableParameterType})[]": $"{variableParameterType}[]"; this.ParameterTypeSignatures.Add($"...rest: {restParameterType}"); } this.TypeSignature = $"({string.Join(", ", this.ParameterTypeSignatures)}): {returnType}"; }
public FunctionWildcardOverload( string name, string description, Regex wildcardRegex, ReturnTypeBuilderDelegate returnTypeBuilder, TypeSymbol returnType, IEnumerable <FixedFunctionParameter> fixedArgumentTypes, VariableFunctionParameter?variableArgumentType, FunctionFlags flags = FunctionFlags.Default) : base(name, description, returnTypeBuilder, returnType, fixedArgumentTypes, variableArgumentType, flags) { WildcardRegex = wildcardRegex; }
public FunctionOverload(string name, string description, ReturnTypeBuilderDelegate returnTypeBuilder, TypeSymbol returnType, IEnumerable <FixedFunctionParameter> fixedParameters, VariableFunctionParameter?variableParameter, FunctionFlags flags = FunctionFlags.Default) { this.Name = name; this.Description = description; this.ReturnTypeBuilder = returnTypeBuilder; this.FixedParameters = fixedParameters.ToImmutableArray(); this.VariableParameter = variableParameter; this.Flags = flags; this.MinimumArgumentCount = this.FixedParameters.Count(fp => fp.Required) + (this.VariableParameter?.MinimumCount ?? 0); this.MaximumArgumentCount = this.VariableParameter == null ? this.FixedParameters.Length : (int?)null; this.TypeSignature = $"({string.Join(", ", this.ParameterTypeSignatures)}): {returnType}"; }
public FunctionOverload(string name, string description, ReturnTypeBuilderDelegate returnTypeBuilder, TypeSymbol signatureType, IEnumerable <FixedFunctionParameter> fixedParameters, VariableFunctionParameter?variableParameter, EvaluatorDelegate?evaluator, FunctionFlags flags = FunctionFlags.Default) { Name = name; Description = description; ReturnTypeBuilder = returnTypeBuilder; Evaluator = evaluator; FixedParameters = fixedParameters.ToImmutableArray(); VariableParameter = variableParameter; Flags = flags; MinimumArgumentCount = FixedParameters.Count(fp => fp.Required) + (VariableParameter?.MinimumCount ?? 0); MaximumArgumentCount = VariableParameter == null ? FixedParameters.Length : (int?)null; TypeSignature = $"({string.Join(", ", ParameterTypeSignatures)}): {signatureType}"; TypeSignatureSymbol = signatureType; }
public FunctionOverload(string name, ReturnTypeBuilderDelegate returnTypeBuilder, TypeSymbol returnType, int minimumArgumentCount, int?maximumArgumentCount, IEnumerable <TypeSymbol> fixedParameterTypes, TypeSymbol?variableParameterType, FunctionFlags flags = FunctionFlags.Default) { if (maximumArgumentCount.HasValue && maximumArgumentCount.Value < minimumArgumentCount) { throw new ArgumentException($"{nameof(maximumArgumentCount.Value)} cannot be less than {nameof(minimumArgumentCount)}."); } var fixedTypes = fixedParameterTypes.ToImmutableArray(); if (fixedTypes.Length < minimumArgumentCount && variableParameterType == null) { throw new ArgumentException("Not enough argument types are specified."); } this.Name = name; this.ReturnTypeBuilder = returnTypeBuilder; this.MinimumArgumentCount = minimumArgumentCount; this.MaximumArgumentCount = maximumArgumentCount; this.FixedParameterTypes = fixedTypes; this.VariableParameterType = variableParameterType; this.Flags = flags; var builder = ImmutableArray.CreateBuilder <string>(); for (int i = 0; i < fixedTypes.Length; i++) { builder.Add($"param{i}: {fixedTypes[i]}"); } if (variableParameterType != null) { builder.Add($"... : {variableParameterType}"); } this.ParameterTypeSignatures = builder.ToImmutable(); this.TypeSignature = $"({string.Join(", ", this.ParameterTypeSignatures)}): {returnType}"; }
public static FunctionOverload CreateFixed(string name, ReturnTypeBuilderDelegate returnTypeBuilder, params TypeSymbol[] argumentTypes) => new FunctionOverload(name, returnTypeBuilder, returnTypeBuilder(Enumerable.Empty <FunctionArgumentSyntax>()), argumentTypes.Length, argumentTypes.Length, argumentTypes, variableParameterType: null);