Exemplo n.º 1
0
        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}";
        }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 3
0
        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}";
        }
Exemplo n.º 4
0
        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;
        }
Exemplo n.º 5
0
        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}";
        }
Exemplo n.º 6
0
 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);