in lib/src/builder.dart [973:1045]
void _buildOverridingMethod(MethodBuilder builder, MethodElement method) {
var name = method.displayName;
if (method.isOperator) name = 'operator$name';
builder
..name = name
..annotations.addAll([refer('override')])
..returns = _typeReference(method.returnType);
if (method.typeParameters != null) {
builder.types.addAll(method.typeParameters.map(_typeParameterReference));
}
// These two variables store the arguments that will be passed to the
// [Invocation] built for `noSuchMethod`.
final invocationPositionalArgs = <Expression>[];
final invocationNamedArgs = <Expression, Expression>{};
for (final parameter in method.parameters) {
if (parameter.isRequiredPositional) {
builder.requiredParameters
.add(_matchingParameter(parameter, forceNullable: true));
invocationPositionalArgs.add(refer(parameter.displayName));
} else if (parameter.isOptionalPositional) {
builder.optionalParameters
.add(_matchingParameter(parameter, forceNullable: true));
invocationPositionalArgs.add(refer(parameter.displayName));
} else if (parameter.isNamed) {
builder.optionalParameters
.add(_matchingParameter(parameter, forceNullable: true));
invocationNamedArgs[refer('#${parameter.displayName}')] =
refer(parameter.displayName);
}
}
if (name == 'toString') {
// We cannot call `super.noSuchMethod` here; we must use [Mock]'s
// implementation.
builder.body = refer('super').property('toString').call([]).code;
return;
}
final invocation = refer('Invocation').property('method').call([
refer('#${method.displayName}'),
literalList(invocationPositionalArgs),
if (invocationNamedArgs.isNotEmpty) literalMap(invocationNamedArgs),
]);
Expression? returnValueForMissingStub;
if (method.returnType.isVoid) {
returnValueForMissingStub = refer('null');
} else if (method.returnType.isFutureOfVoid) {
returnValueForMissingStub =
_futureReference(refer('void')).property('value').call([]);
}
final fallbackGenerator = fallbackGenerators[method.name];
final namedArgs = {
if (fallbackGenerator != null)
'returnValue': _fallbackGeneratorCode(method, fallbackGenerator)
else if (typeSystem._returnTypeIsNonNullable(method))
'returnValue': _dummyValue(method.returnType),
if (returnValueForMissingStub != null)
'returnValueForMissingStub': returnValueForMissingStub,
};
var superNoSuchMethod =
refer('super').property('noSuchMethod').call([invocation], namedArgs);
if (!method.returnType.isVoid && !method.returnType.isDynamic) {
superNoSuchMethod =
superNoSuchMethod.asA(_typeReference(method.returnType));
}
builder.body = superNoSuchMethod.code;
}