in sdk/Sdk.Generators/FunctionMetadataProviderGenerator/FunctionMetadataProviderGenerator.CardinalityParser.cs [161:204]
private DataType ResolveIEnumerableOfT(IParameterSymbol parameterSymbol, out bool hasError)
{
var result = DataType.Undefined;
hasError = false;
var currSymbol = parameterSymbol.Type;
INamedTypeSymbol? finalSymbol = null;
while (currSymbol != null)
{
INamedTypeSymbol? genericInterfaceSymbol = null;
if (currSymbol.IsOrDerivedFrom(_knownTypes.IEnumerableGeneric) && currSymbol is INamedTypeSymbol currNamedSymbol)
{
finalSymbol = currNamedSymbol;
break;
}
genericInterfaceSymbol = currSymbol.Interfaces.FirstOrDefault(i => i.IsOrDerivedFrom(_knownTypes.IEnumerableGeneric));
if (genericInterfaceSymbol != null)
{
finalSymbol = genericInterfaceSymbol;
break;
}
currSymbol = currSymbol.BaseType;
}
if (finalSymbol is null)
{
hasError = true;
return result;
}
var argument = finalSymbol.TypeArguments.FirstOrDefault(); // we've already checked and discarded mapping types by this point - should be a single argument
if (argument is null)
{
hasError = true;
return result;
}
return _dataTypeParser.GetDataType(argument);
}