@@ -250,6 +250,12 @@ class _TypeVisitor extends RecursiveElementVisitor<void> {
250250 super .visitClassElement (element);
251251 }
252252
253+ @override
254+ void visitEnumElement (EnumElement element) {
255+ _elements.add (element);
256+ super .visitEnumElement (element);
257+ }
258+
253259 @override
254260 void visitFieldElement (FieldElement element) {
255261 _addType (element.type);
@@ -262,6 +268,12 @@ class _TypeVisitor extends RecursiveElementVisitor<void> {
262268 super .visitMethodElement (element);
263269 }
264270
271+ @override
272+ void visitMixinElement (MixinElement element) {
273+ _elements.add (element);
274+ super .visitMixinElement (element);
275+ }
276+
265277 @override
266278 void visitParameterElement (ParameterElement element) {
267279 _addType (element.type);
@@ -391,7 +403,7 @@ class _MockTarget {
391403 this .hasExplicitTypeArguments = false ,
392404 });
393405
394- InterfaceElement get classElement => classType.element2;
406+ InterfaceElement get interfaceElement => classType.element2;
395407}
396408
397409/// This class gathers and verifies mock targets referenced in `GenerateMocks`
@@ -491,7 +503,7 @@ class _MockTargetGatherer {
491503 // `type` have been instantiated to bounds here. Switch to the
492504 // declaration, which will be an uninstantiated type.
493505 final declarationType =
494- (type.element2.declaration as ClassElement ).thisType;
506+ (type.element2.declaration as InterfaceElement ).thisType;
495507 final mockName = 'Mock${declarationType .element2 .name }' ;
496508 mockTargets.add (_MockTarget (
497509 declarationType,
@@ -545,7 +557,7 @@ class _MockTargetGatherer {
545557 // this case the type argument(s) on `type` have been instantiated to
546558 // bounds. Switch to the declaration, which will be an uninstantiated
547559 // type.
548- type = (type.element2.declaration as ClassElement ).thisType;
560+ type = (type.element2.declaration as InterfaceElement ).thisType;
549561 } else {
550562 // Check explicit type arguments for unknown types that were
551563 // turned into `dynamic` by the analyzer.
@@ -731,21 +743,21 @@ class _MockTargetGatherer {
731743
732744 void _checkClassesToMockAreValid () {
733745 final classesInEntryLib =
734- _entryLib.topLevelElements.whereType <ClassElement >();
746+ _entryLib.topLevelElements.whereType <InterfaceElement >();
735747 final classNamesToMock = < String , _MockTarget > {};
736748 final uniqueNameSuggestion =
737749 "use the 'customMocks' argument in @GenerateMocks to specify a unique "
738750 'name' ;
739751 for (final mockTarget in _mockTargets) {
740752 final name = mockTarget.mockName;
741753 if (classNamesToMock.containsKey (name)) {
742- final firstClass = classNamesToMock[name]! .classElement ;
754+ final firstClass = classNamesToMock[name]! .interfaceElement ;
743755 final firstSource = firstClass.source.fullName;
744- final secondSource = mockTarget.classElement .source.fullName;
756+ final secondSource = mockTarget.interfaceElement .source.fullName;
745757 throw InvalidMockitoAnnotationException (
746758 'Mockito cannot generate two mocks with the same name: $name (for '
747759 '${firstClass .name } declared in $firstSource , and for '
748- '${mockTarget .classElement .name } declared in $secondSource ); '
760+ '${mockTarget .interfaceElement .name } declared in $secondSource ); '
749761 '$uniqueNameSuggestion .' );
750762 }
751763 classNamesToMock[name] = mockTarget;
@@ -764,7 +776,7 @@ class _MockTargetGatherer {
764776 var preexistingMock = classesInEntryLib.firstWhereOrNull ((c) =>
765777 c.interfaces
766778 .map ((type) => type.element2)
767- .contains (mockTarget.classElement ) &&
779+ .contains (mockTarget.interfaceElement ) &&
768780 _isMockClass (c.supertype! ));
769781 if (preexistingMock != null ) {
770782 throw InvalidMockitoAnnotationException (
@@ -787,11 +799,11 @@ class _MockTargetGatherer {
787799 /// and no corresponding dummy generator. Mockito cannot generate its own
788800 /// dummy return values for unknown types.
789801 void _checkMethodsToStubAreValid (_MockTarget mockTarget) {
790- final classElement = mockTarget.classElement ;
791- final className = classElement .name;
802+ final interfaceElement = mockTarget.interfaceElement ;
803+ final className = interfaceElement .name;
792804 final substitution = Substitution .fromInterfaceType (mockTarget.classType);
793805 final relevantMembers = _inheritanceManager
794- .getInterface (classElement )
806+ .getInterface (interfaceElement )
795807 .map
796808 .values
797809 .where ((m) => ! m.isPrivate && ! m.isStatic)
@@ -968,9 +980,9 @@ class _MockLibraryInfo {
968980 /// values.
969981 final fakeClasses = < Class > [];
970982
971- /// [ClassElement ] s which are used in non-nullable return types, for which
983+ /// [InterfaceElement ] s which are used in non-nullable return types, for which
972984 /// fake classes are added to the generated library.
973- final fakedClassElements = < InterfaceElement > [];
985+ final fakedInterfaceElements = < InterfaceElement > [];
974986
975987 /// A mapping of each necessary [Element] to a URI from which it can be
976988 /// imported.
@@ -1051,7 +1063,7 @@ class _MockClassInfo {
10511063
10521064 Class _buildMockClass () {
10531065 final typeToMock = mockTarget.classType;
1054- final classToMock = mockTarget.classElement ;
1066+ final classToMock = mockTarget.interfaceElement ;
10551067 final classIsImmutable = classToMock.metadata.any ((it) => it.isImmutable);
10561068 final className = classToMock.name;
10571069
@@ -1101,7 +1113,7 @@ class _MockClassInfo {
11011113 cBuilder.implements .add (TypeReference ((b) {
11021114 b
11031115 ..symbol = classToMock.name
1104- ..url = _typeImport (mockTarget.classElement )
1116+ ..url = _typeImport (mockTarget.interfaceElement )
11051117 ..types.addAll (typeArguments);
11061118 }));
11071119 if (mockTarget.onMissingStub == OnMissingStub .throwException) {
@@ -1471,7 +1483,7 @@ class _MockClassInfo {
14711483 } else {
14721484 final fakeName = mockLibraryInfo._fakeNameFor (elementToFake);
14731485 // Only make one fake class for each class that needs to be faked.
1474- if (! mockLibraryInfo.fakedClassElements .contains (elementToFake)) {
1486+ if (! mockLibraryInfo.fakedInterfaceElements .contains (elementToFake)) {
14751487 _addFakeClass (fakeName, elementToFake);
14761488 }
14771489 final typeArguments = dartType.typeArguments;
@@ -1524,7 +1536,7 @@ class _MockClassInfo {
15241536 (mBuilder) => _buildOverridingMethod (mBuilder, toStringMethod)));
15251537 }
15261538 }));
1527- mockLibraryInfo.fakedClassElements .add (elementToFake);
1539+ mockLibraryInfo.fakedInterfaceElements .add (elementToFake);
15281540 }
15291541
15301542 /// Returns a [Parameter] which matches [parameter] .
@@ -1559,7 +1571,7 @@ class _MockClassInfo {
15591571 final method = parameter.enclosingElement3! ;
15601572 throw InvalidMockitoAnnotationException (
15611573 'Mockito cannot generate a valid override for method '
1562- "'${mockTarget .classElement .displayName }.${method .displayName }'; "
1574+ "'${mockTarget .interfaceElement .displayName }.${method .displayName }'; "
15631575 "parameter '${parameter .displayName }' causes a problem: "
15641576 '${e .message }' );
15651577 }
@@ -1588,7 +1600,7 @@ class _MockClassInfo {
15881600 return type;
15891601 }
15901602 final method = parameter.enclosingElement3 as MethodElement ;
1591- final class_ = method.enclosingElement3 as ClassElement ;
1603+ final class_ = method.enclosingElement3 as InterfaceElement ;
15921604 final name = Name (method.librarySource.uri, method.name);
15931605 final overriddenMethods = inheritanceManager.getOverridden2 (class_, name);
15941606 if (overriddenMethods == null ) {
@@ -1598,7 +1610,7 @@ class _MockClassInfo {
15981610 while (allOverriddenMethods.isNotEmpty) {
15991611 final overriddenMethod = allOverriddenMethods.removeFirst ();
16001612 final secondaryOverrides = inheritanceManager.getOverridden2 (
1601- overriddenMethod.enclosingElement3 as ClassElement , name);
1613+ overriddenMethod.enclosingElement3 as InterfaceElement , name);
16021614 if (secondaryOverrides != null ) {
16031615 allOverriddenMethods.addAll (secondaryOverrides);
16041616 }
@@ -1996,9 +2008,13 @@ extension on Element {
19962008 String get fullName {
19972009 if (this is ClassElement ) {
19982010 return "The class '$name '" ;
2011+ } else if (this is EnumElement ) {
2012+ return "The enum '$name '" ;
19992013 } else if (this is MethodElement ) {
20002014 var className = enclosingElement3! .name;
20012015 return "The method '$className .$name '" ;
2016+ } else if (this is MixinElement ) {
2017+ return "The mixin '$name '" ;
20022018 } else if (this is PropertyAccessorElement ) {
20032019 var className = enclosingElement3! .name;
20042020 return "The property accessor '$className .$name '" ;
0 commit comments