diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index 77e96ff31f..b56dca3336 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -234,14 +234,6 @@ mixin Aliased implements ElementType { _aliasArguments ??= type.aliasArguments .map((f) => ElementType.from(f, library, packageGraph)) .toList(growable: false); - - Iterable _typeArguments; - @override - Iterable get typeArguments => - _typeArguments ??= (type as ParameterizedType) - .typeArguments - .map((f) => ElementType.from(f, library, packageGraph)) - .toList(growable: false); } class AliasedElementType extends ParameterizedElementType with Aliased { @@ -251,6 +243,9 @@ class AliasedElementType extends ParameterizedElementType with Aliased { assert(type.aliasElement != null); } + @override + ParameterizedType get type; + /// Parameters, if available, for the underlying typedef. List get aliasedParameters => modelElement.isCallable ? modelElement.parameters : []; diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index f1134d9e7b..344c38364e 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -4068,6 +4068,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, TopLevelVariable nodocGetter, nodocSetter; TopLevelVariable complicatedReturn; TopLevelVariable meaningOfLife, importantComputations; + TopLevelVariable genericTypedefCombo; setUpAll(() { v = exLibrary.properties.firstWhere((p) => p.name == 'number'); @@ -4090,6 +4091,19 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, fakeLibrary.properties.firstWhere((p) => p.name == 'setAndGet'); mapWithDynamicKeys = fakeLibrary.properties .firstWhere((p) => p.name == 'mapWithDynamicKeys'); + genericTypedefCombo = fakeLibrary.properties + .firstWhere((p) => p.name == 'genericTypedefCombo'); + }); + + test( + 'Verify that combos with a generic typedef modelType can render correctly', + () { + // TODO(jcollins-g): After analyzer 2.0.0, this can be `isEmpty`. + expect(genericTypedefCombo.modelType.typeArguments, isNotNull); + expect( + genericTypedefCombo.modelType.linkedName, + equals( + 'NewGenericTypedef')); }); test('Verify that final and late show up (or not) appropriately', () { @@ -4554,9 +4568,9 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, expect( oldgeneric.modelType.linkedName, isIn([ + 'T Function(T input)', + // Remove following after analyzer 2.0.0 'T Function(T input)', - // Remove below option after analyzer 1.6.0. - 'Function(T) → T' ])); expect( generic.modelType.linkedName, diff --git a/testing/test_package/lib/fake.dart b/testing/test_package/lib/fake.dart index 79c536d0dc..b04ab28462 100644 --- a/testing/test_package/lib/fake.dart +++ b/testing/test_package/lib/fake.dart @@ -301,6 +301,9 @@ typedef T GenericTypedef(T input); /// A typedef with the new style generic function syntax. typedef NewGenericTypedef = List Function(T, int, bool); +/// A top level variable with a generic typedef type. +NewGenericTypedef genericTypedefCombo; + /// A complicated type parameter to ATypeTakingClass. ATypeTakingClass get complicatedReturn => null;