diff --git a/lib/src/builder.dart b/lib/src/builder.dart index 10afbf0e..8298149a 100644 --- a/lib/src/builder.dart +++ b/lib/src/builder.dart @@ -1315,8 +1315,8 @@ class _MockClassInfo { void _buildOverridingMethod(MethodBuilder builder, MethodElement method) { var name = method.displayName; if (method.isOperator) name = 'operator$name'; - final returnType = method.returnType; - _withTypeParameters(method.typeParameters, (typeParamsWithBounds, _) { + final returnType = method.type.returnType; + _withTypeParameters(method.type.typeFormals, (typeParamsWithBounds, _) { builder ..name = name ..annotations.add(referImported('override', 'dart:core')) @@ -1333,7 +1333,7 @@ class _MockClassInfo { final invocationNamedArgs = {}; var position = 0; - for (final parameter in method.parameters) { + for (final parameter in method.type.parameters) { if (parameter.isRequiredPositional || parameter.isOptionalPositional) { final superParameterType = _escapeCovariance(parameter, position: position); @@ -1370,7 +1370,7 @@ class _MockClassInfo { final fallbackGenerator = fallbackGenerators[method.name]; final parametersContainPrivateName = - method.parameters.any((p) => p.type.containsPrivateName); + method.type.parameters.any((p) => p.type.containsPrivateName); final throwsUnsupported = fallbackGenerator == null && (returnType.containsPrivateName || parametersContainPrivateName); @@ -1443,7 +1443,7 @@ class _MockClassInfo { ExecutableElement method, ExecutableElement function) { final positionalArguments = []; final namedArguments = {}; - for (final parameter in method.parameters) { + for (final parameter in method.type.parameters) { if (parameter.isPositional) { positionalArguments.add(refer(parameter.name)); } else if (parameter.isNamed) { @@ -1453,7 +1453,7 @@ class _MockClassInfo { final functionReference = referImported(function.name, _typeImport(function)); return functionReference.call(positionalArguments, namedArguments, [ - for (final t in method.typeParameters) + for (final t in method.type.typeFormals) _typeParameterReference(t, withBound: false) ]); } diff --git a/test/builder/custom_mocks_test.dart b/test/builder/custom_mocks_test.dart index 4a673e9a..d0de4b80 100644 --- a/test/builder/custom_mocks_test.dart +++ b/test/builder/custom_mocks_test.dart @@ -1843,6 +1843,29 @@ void main() { expect(mocksContent, contains('Iterable m1(X1 Function(X)? f)')); expect(mocksContent, contains('Iterable m2(X1 Function(X)? f)')); }); + test('We preserve nested generic bounded type arguments', () async { + final mocksContent = await buildWithNonNullable({ + ...annotationsAsset, + 'foo|lib/foo.dart': dedent(r''' + class Foo {} + abstract class Bar { + X m1, X>>(X Function(T)? f); + } + abstract class FooBar extends Bar {} + '''), + 'foo|test/foo_test.dart': ''' + import 'package:foo/foo.dart'; + import 'package:mockito/annotations.dart'; + + @GenerateMocks([FooBar]) + void main() {} + ''' + }); + expect( + mocksContent, + contains( + 'X1 m1, X1>>(X1 Function(X)? f)')); + }); } TypeMatcher> _containsAllOf(a, [b]) => decodedMatches(