in lib/src/builder.dart [638:697]
List<String> _checkFunction(
analyzer.FunctionType function,
Element enclosingElement, {
bool isParameter = false,
bool hasDummyGenerator = false,
}) {
final errorMessages = <String>[];
final returnType = function.returnType;
if (returnType is analyzer.InterfaceType) {
if (returnType.element.isPrivate) {
errorMessages.add(
'${enclosingElement.fullName} features a private return type, and '
'cannot be stubbed.');
}
errorMessages.addAll(
_checkTypeArguments(returnType.typeArguments, enclosingElement));
} else if (returnType is analyzer.FunctionType) {
errorMessages.addAll(_checkFunction(returnType, enclosingElement));
} else if (returnType is analyzer.TypeParameterType) {
if (!isParameter &&
!hasDummyGenerator &&
_entryLib.typeSystem.isPotentiallyNonNullable(returnType)) {
errorMessages
.add('${enclosingElement.fullName} features a non-nullable unknown '
'return type, and cannot be stubbed without a dummy generator '
'specified on the MockSpec.');
}
}
for (var parameter in function.parameters) {
var parameterType = parameter.type;
if (parameterType is analyzer.InterfaceType) {
var parameterTypeElement = parameterType.element;
if (parameterTypeElement.isPrivate) {
// Technically, we can expand the type in the mock to something like
// `Object?`. However, until there is a decent use case, we will not
// generate such a mock.
errorMessages.add(
'${enclosingElement.fullName} features a private parameter type, '
"'${parameterTypeElement.name}', and cannot be stubbed.");
}
errorMessages.addAll(
_checkTypeArguments(parameterType.typeArguments, enclosingElement));
} else if (parameterType is analyzer.FunctionType) {
errorMessages.addAll(
_checkFunction(parameterType, enclosingElement, isParameter: true));
}
}
errorMessages
.addAll(_checkTypeParameters(function.typeFormals, enclosingElement));
var aliasArguments = function.alias?.typeArguments;
if (aliasArguments != null) {
errorMessages
.addAll(_checkTypeArguments(aliasArguments, enclosingElement));
}
return errorMessages;
}