in lib/src/builder.dart [408:472]
static Iterable<_MockTarget> _mockTargetsFromGenerateMocks(
ElementAnnotation annotation, LibraryElement entryLib) {
final generateMocksValue = annotation.computeConstantValue()!;
final classesField = generateMocksValue.getField('classes')!;
if (classesField.isNull) {
throw InvalidMockitoAnnotationException(
'The GenerateMocks "classes" argument is missing, includes an '
'unknown type, or includes an extension');
}
final mockTargets = <_MockTarget>[];
for (var objectToMock in classesField.toListValue()!) {
final typeToMock = objectToMock.toTypeValue();
if (typeToMock == null) {
throw InvalidMockitoAnnotationException(
'The "classes" argument includes a non-type: $objectToMock');
}
if (typeToMock.isDynamic) {
throw InvalidMockitoAnnotationException(
'Mockito cannot mock `dynamic`');
}
final type = _determineDartType(typeToMock, entryLib.typeProvider);
// For a generic class like `Foo<T>` or `Foo<T extends num>`, a type
// literal (`Foo`) cannot express type arguments. The type argument(s) on
// `type` have been instantiated to bounds here. Switch to the
// declaration, which will be an uninstantiated type.
final declarationType =
(type.element.declaration as ClassElement).thisType;
final mockName = 'Mock${declarationType.element.name}';
mockTargets.add(_MockTarget(declarationType, mockName,
returnNullOnMissingStub: false, fallbackGenerators: {}));
}
final customMocksField = generateMocksValue.getField('customMocks');
if (customMocksField != null && !customMocksField.isNull) {
for (var mockSpec in customMocksField.toListValue()!) {
final mockSpecType = mockSpec.type as analyzer.InterfaceType;
assert(mockSpecType.typeArguments.length == 1);
final typeToMock = mockSpecType.typeArguments.single;
if (typeToMock.isDynamic) {
throw InvalidMockitoAnnotationException(
'Mockito cannot mock `dynamic`; be sure to declare type '
'arguments on MockSpec(), in @GenerateMocks.');
}
var type = _determineDartType(typeToMock, entryLib.typeProvider);
if (!type.hasExplicitTypeArguments) {
// We assume the type was given without explicit type arguments. In
// this case the type argument(s) on `type` have been instantiated to
// bounds. Switch to the declaration, which will be an uninstantiated
// type.
type = (type.element.declaration as ClassElement).thisType;
}
final mockName = mockSpec.getField('mockName')!.toSymbolValue() ??
'Mock${type.element.name}';
final returnNullOnMissingStub =
mockSpec.getField('returnNullOnMissingStub')!.toBoolValue()!;
final fallbackGeneratorObjects =
mockSpec.getField('fallbackGenerators')!.toMapValue()!;
mockTargets.add(_MockTarget(type, mockName,
returnNullOnMissingStub: returnNullOnMissingStub,
fallbackGenerators:
_extractFallbackGenerators(fallbackGeneratorObjects)));
}
}
return mockTargets;
}