private SignatureResult GetSignatureResult()

in src/Kusto.Language/Binder/Binder.cs [1982:2100]


        private SignatureResult GetSignatureResult(
            Signature signature,
            IReadOnlyList<Expression> arguments,
            IReadOnlyList<TypeSymbol> argumentTypes,
            IReadOnlyList<Parameter> argumentParameters,
            List<Diagnostic> diagnostics = null)
        {
            if (arguments == null)
                throw new ArgumentNullException(nameof(arguments));

            if (argumentTypes == null)
                throw new ArgumentNullException(nameof(argumentTypes));

            if (argumentParameters == null)
                throw new ArgumentNullException(nameof(argumentParameters));

            switch (signature.ReturnKind)
            {
                case ReturnTypeKind.Declared:
                    return signature.DeclaredReturnType;

                case ReturnTypeKind.Computed:
                    return this.GetComputedSignatureResult(signature, arguments, argumentTypes);

                case ReturnTypeKind.Parameter0:
                    var iArg = argumentParameters.IndexOf(signature.Parameters[0]);
                    return iArg >= 0 && iArg < argumentTypes.Count ? argumentTypes[iArg] : ErrorSymbol.Instance;

                case ReturnTypeKind.Parameter1:
                    iArg = argumentParameters.IndexOf(signature.Parameters[1]);
                    return iArg >= 0 && iArg < argumentTypes.Count ? argumentTypes[iArg] : ErrorSymbol.Instance;

                case ReturnTypeKind.Parameter2:
                    iArg = argumentParameters.IndexOf(signature.Parameters[2]);
                    return iArg >= 0 && iArg < argumentTypes.Count ? argumentTypes[iArg] : ErrorSymbol.Instance;

                case ReturnTypeKind.ParameterN:
                    iArg = argumentParameters.IndexOf(signature.Parameters[signature.Parameters.Count - 1]);
                    return iArg >= 0 && iArg < argumentTypes.Count ? argumentTypes[iArg] : ErrorSymbol.Instance;

                case ReturnTypeKind.ParameterNLiteral:
                    iArg = argumentParameters.IndexOf(signature.Parameters[signature.Parameters.Count - 1]);
                    return iArg >= 0 && iArg < arguments.Count ? GetTypeOfType(arguments[iArg]) : ErrorSymbol.Instance;

                case ReturnTypeKind.Parameter0Promoted:
                    iArg = argumentParameters.IndexOf(signature.Parameters[0]);
                    return iArg >= 0 && iArg < argumentTypes.Count ? Promote(argumentTypes[iArg]) : ErrorSymbol.Instance;

                case ReturnTypeKind.Common:
                    return GetCommonArgumentType(argumentParameters, argumentTypes) ?? ErrorSymbol.Instance;

                case ReturnTypeKind.Widest:
                    return GetWidestArgumentType(signature, argumentTypes) ?? ErrorSymbol.Instance;

                case ReturnTypeKind.Parameter0Cluster:
                    iArg = argumentParameters.IndexOf(signature.Parameters[0]);
                    if (iArg >= 0 && iArg < arguments.Count
                        && TryGetLiteralStringValue(arguments[iArg], out var clusterName))
                    {
                        return GetClusterFunctionResult(clusterName, arguments[iArg], diagnostics);
                    }
                    else
                    {
                        return new ClusterSymbol("", null, isOpen: true);
                    }

                case ReturnTypeKind.Parameter0Database:
                    iArg = argumentParameters.IndexOf(signature.Parameters[0]);
                    if (iArg >= 0 && iArg < arguments.Count
                        && TryGetLiteralStringValue(arguments[iArg], out var databaseName))
                    {
                        return GetDatabaseFunctionResult(databaseName, arguments[iArg], diagnostics);
                    }
                    else
                    {
                        return new DatabaseSymbol("", null, isOpen: true);
                    }

                case ReturnTypeKind.Parameter0Table:
                    iArg = argumentParameters.IndexOf(signature.Parameters[0]);
                    if (iArg >= 0 && iArg < arguments.Count
                        && TryGetLiteralStringValue(arguments[iArg], out var tableName))
                    {
                        return GetTableFunctionResult(tableName, arguments[iArg], diagnostics);
                    }
                    else
                    {
                        return TableSymbol.Empty.WithIsOpen(true);
                    }

                case ReturnTypeKind.Parameter0ExternalTable:
                    iArg = argumentParameters.IndexOf(signature.Parameters[0]);
                    if (iArg >= 0 && iArg < arguments.Count
                        && TryGetLiteralStringValue(arguments[iArg], out var externalTableName))
                    {
                        return GetExternalTableFunctionResult(externalTableName, arguments[iArg], diagnostics);
                    }
                    else
                    {
                        return TableSymbol.Empty.WithIsOpen(true);
                    }
                case ReturnTypeKind.Parameter0MaterializedView:
                    iArg = argumentParameters.IndexOf(signature.Parameters[0]);
                    if (iArg >= 0 && iArg < arguments.Count
                        && TryGetLiteralStringValue(arguments[iArg], out var materializedViewName))
                    {
                        return GetMaterializedViewFunctionResult(materializedViewName, arguments[iArg], diagnostics);
                    }
                    else
                    {
                        return TableSymbol.Empty.WithIsOpen(true);
                    }
                case ReturnTypeKind.Custom:
                    return signature.CustomReturnType(_rowScope ?? TableSymbol.Empty, arguments, signature) ?? ErrorSymbol.Instance;

                default:
                    throw new NotImplementedException();
            }
        }