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();
}
}