[element model] migrate `annotate_overrides`

Bug: https://github.com/dart-lang/linter/issues/5099
Change-Id: I7e1c18d4f8d911d041f0da69599ce680b4c61a2b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/389340
Auto-Submit: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 43ac505..13799fb 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -10361,6 +10361,7 @@
     //  that's true then this getter isn't necessary and should be removed.
     return switch (this) {
       LibraryFragment(:var metadata) => metadata,
+      PropertyInducingFragment(:var metadata) => metadata,
       TypeDefiningFragment(:var metadata) => metadata,
       TypeParameterizedFragment(:var metadata) => metadata,
       FormalParameterFragment(:var metadata) => metadata,
diff --git a/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart b/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
index 6d67184..45a9cf5 100644
--- a/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
@@ -741,6 +741,52 @@
   topLevelVariables
     v
       firstFragment: <testLibraryFragment>::@topLevelVariable::v
+      metadata
+        Annotation
+          atSign: @ @29
+          name: SimpleIdentifier
+            token: A @30
+            staticElement: <testLibraryFragment>::@class::A
+            element: <testLibraryFragment>::@class::A#element
+            staticType: null
+          typeArguments: TypeArgumentList
+            leftBracket: < @31
+            arguments
+              GenericFunctionType
+                returnType: NamedType
+                  name: int @32
+                  element: dart:core::<fragment>::@class::int
+                  element2: dart:core::<fragment>::@class::int#element
+                  type: int
+                functionKeyword: Function @36
+                parameters: FormalParameterList
+                  leftParenthesis: ( @44
+                  parameter: SimpleFormalParameter
+                    type: NamedType
+                      name: String @45
+                      element: dart:core::<fragment>::@class::String
+                      element2: dart:core::<fragment>::@class::String#element
+                      type: String
+                    name: a @52
+                    declaredElement: a@52
+                      type: String
+                  rightParenthesis: ) @53
+                declaredElement: GenericFunctionTypeElement
+                  parameters
+                    a
+                      kind: required positional
+                      type: String
+                  returnType: int
+                  type: int Function(String)
+                type: int Function(String)
+            rightBracket: > @54
+          arguments: ArgumentList
+            leftParenthesis: ( @55
+            rightParenthesis: ) @56
+          element: ConstructorMember
+            base: <testLibraryFragment>::@class::A::@constructor::new
+            substitution: {T: int Function(String)}
+          element2: <testLibraryFragment>::@class::A::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::v#element
       setter: <testLibraryFragment>::@setter::v#element
diff --git a/pkg/analyzer/test/src/summary/elements/metadata_test.dart b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
index 9bfcbcf..4db2fc5 100644
--- a/pkg/analyzer/test/src/summary/elements/metadata_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
@@ -8494,11 +8494,31 @@
       getter: <testLibraryFragment>::@getter::foo#element
     isNotConst
       firstFragment: <testLibraryFragment>::@topLevelVariable::isNotConst
+      metadata
+        Annotation
+          atSign: @ @16
+          name: SimpleIdentifier
+            token: foo @17
+            staticElement: <testLibraryFragment>::@getter::foo
+            element: <testLibraryFragment>::@getter::foo#element
+            staticType: null
+          element: <testLibraryFragment>::@getter::foo
+          element2: <testLibraryFragment>::@getter::foo#element
       type: int
       getter: <testLibraryFragment>::@getter::isNotConst#element
       setter: <testLibraryFragment>::@setter::isNotConst#element
     const isConst
       firstFragment: <testLibraryFragment>::@topLevelVariable::isConst
+      metadata
+        Annotation
+          atSign: @ @42
+          name: SimpleIdentifier
+            token: foo @43
+            staticElement: <testLibraryFragment>::@getter::foo
+            element: <testLibraryFragment>::@getter::foo#element
+            staticType: null
+          element: <testLibraryFragment>::@getter::foo
+          element2: <testLibraryFragment>::@getter::foo#element
       type: int
       getter: <testLibraryFragment>::@getter::isConst#element
   getters
@@ -9648,6 +9668,16 @@
       getter: <testLibraryFragment>::@getter::a#element
     v
       firstFragment: <testLibraryFragment>::@topLevelVariable::v
+      metadata
+        Annotation
+          atSign: @ @16
+          name: SimpleIdentifier
+            token: a @17
+            staticElement: <testLibraryFragment>::@getter::a
+            element: <testLibraryFragment>::@getter::a#element
+            staticType: null
+          element: <testLibraryFragment>::@getter::a
+          element2: <testLibraryFragment>::@getter::a#element
       type: int
       getter: <testLibraryFragment>::@getter::v#element
       setter: <testLibraryFragment>::@setter::v#element
@@ -10259,6 +10289,16 @@
       getter: <testLibraryFragment>::@getter::a#element
     x
       firstFragment: <testLibraryFragment>::@topLevelVariable::x
+      metadata
+        Annotation
+          atSign: @ @13
+          name: SimpleIdentifier
+            token: a @14
+            staticElement: <testLibraryFragment>::@getter::a
+            element: <testLibraryFragment>::@getter::a#element
+            staticType: null
+          element: <testLibraryFragment>::@getter::a
+          element2: <testLibraryFragment>::@getter::a#element
       type: int
       getter: <testLibraryFragment>::@getter::x#element
       setter: <testLibraryFragment>::@setter::x#element
diff --git a/pkg/analyzer/test/src/summary/elements/offsets_test.dart b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
index 814d0aa..cfd45d1 100644
--- a/pkg/analyzer/test/src/summary/elements/offsets_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
@@ -4088,41 +4088,145 @@
       setter: <testLibraryFragment>::@setter::hasDocComment2#element
     hasAnnotation
       firstFragment: <testLibraryFragment>::@topLevelVariable::hasAnnotation
+      metadata
+        Annotation
+          atSign: @ @66
+          name: SimpleIdentifier
+            token: Object @67
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @73
+            rightParenthesis: ) @74
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::hasAnnotation#element
       setter: <testLibraryFragment>::@setter::hasAnnotation#element
     hasAnnotation2
       firstFragment: <testLibraryFragment>::@topLevelVariable::hasAnnotation2
+      metadata
+        Annotation
+          atSign: @ @66
+          name: SimpleIdentifier
+            token: Object @67
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @73
+            rightParenthesis: ) @74
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::hasAnnotation2#element
       setter: <testLibraryFragment>::@setter::hasAnnotation2#element
     annotationThenComment
       firstFragment: <testLibraryFragment>::@topLevelVariable::annotationThenComment
+      metadata
+        Annotation
+          atSign: @ @112
+          name: SimpleIdentifier
+            token: Object @113
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @119
+            rightParenthesis: ) @120
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::annotationThenComment#element
       setter: <testLibraryFragment>::@setter::annotationThenComment#element
     annotationThenComment2
       firstFragment: <testLibraryFragment>::@topLevelVariable::annotationThenComment2
+      metadata
+        Annotation
+          atSign: @ @112
+          name: SimpleIdentifier
+            token: Object @113
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @119
+            rightParenthesis: ) @120
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::annotationThenComment2#element
       setter: <testLibraryFragment>::@setter::annotationThenComment2#element
     commentThenAnnotation
       firstFragment: <testLibraryFragment>::@topLevelVariable::commentThenAnnotation
+      metadata
+        Annotation
+          atSign: @ @234
+          name: SimpleIdentifier
+            token: Object @235
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @241
+            rightParenthesis: ) @242
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::commentThenAnnotation#element
       setter: <testLibraryFragment>::@setter::commentThenAnnotation#element
     commentThenAnnotation2
       firstFragment: <testLibraryFragment>::@topLevelVariable::commentThenAnnotation2
+      metadata
+        Annotation
+          atSign: @ @234
+          name: SimpleIdentifier
+            token: Object @235
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @241
+            rightParenthesis: ) @242
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::commentThenAnnotation2#element
       setter: <testLibraryFragment>::@setter::commentThenAnnotation2#element
     commentAroundAnnotation
       firstFragment: <testLibraryFragment>::@topLevelVariable::commentAroundAnnotation
+      metadata
+        Annotation
+          atSign: @ @311
+          name: SimpleIdentifier
+            token: Object @312
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @318
+            rightParenthesis: ) @319
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::commentAroundAnnotation#element
       setter: <testLibraryFragment>::@setter::commentAroundAnnotation#element
     commentAroundAnnotation2
       firstFragment: <testLibraryFragment>::@topLevelVariable::commentAroundAnnotation2
+      metadata
+        Annotation
+          atSign: @ @311
+          name: SimpleIdentifier
+            token: Object @312
+            staticElement: dart:core::<fragment>::@class::Object
+            element: dart:core::<fragment>::@class::Object#element
+            staticType: null
+          arguments: ArgumentList
+            leftParenthesis: ( @318
+            rightParenthesis: ) @319
+          element: dart:core::<fragment>::@class::Object::@constructor::new
+          element2: dart:core::<fragment>::@class::Object::@constructor::new#element
       type: int
       getter: <testLibraryFragment>::@getter::commentAroundAnnotation2#element
       setter: <testLibraryFragment>::@setter::commentAroundAnnotation2#element
diff --git a/pkg/linter/analyzer_use_new_elements.txt b/pkg/linter/analyzer_use_new_elements.txt
index e144402..12f1318 100644
--- a/pkg/linter/analyzer_use_new_elements.txt
+++ b/pkg/linter/analyzer_use_new_elements.txt
@@ -8,6 +8,7 @@
 lib/src/rules/always_require_non_null_named_parameters.dart
 lib/src/rules/always_specify_types.dart
 lib/src/rules/always_use_package_imports.dart
+lib/src/rules/annotate_overrides.dart
 lib/src/rules/avoid_annotating_with_dynamic.dart
 lib/src/rules/avoid_as.dart
 lib/src/rules/avoid_bool_literals_in_conditional_expressions.dart
@@ -67,6 +68,7 @@
 lib/src/rules/iterable_contains_unrelated_type.dart
 lib/src/rules/join_return_with_assignment.dart
 lib/src/rules/leading_newlines_in_multiline_strings.dart
+lib/src/rules/library_annotations.dart
 lib/src/rules/library_names.dart
 lib/src/rules/library_prefixes.dart
 lib/src/rules/lines_longer_than_80_chars.dart
@@ -119,6 +121,7 @@
 lib/src/rules/prefer_single_quotes.dart
 lib/src/rules/prefer_spread_collections.dart
 lib/src/rules/prefer_typing_uninitialized_variables.dart
+lib/src/rules/prefer_void_to_null.dart
 lib/src/rules/provide_deprecation_message.dart
 lib/src/rules/pub/depend_on_referenced_packages.dart
 lib/src/rules/pub/package_names.dart
diff --git a/pkg/linter/lib/src/rules/annotate_overrides.dart b/pkg/linter/lib/src/rules/annotate_overrides.dart
index b7978c2..f71f175 100644
--- a/pkg/linter/lib/src/rules/annotate_overrides.dart
+++ b/pkg/linter/lib/src/rules/annotate_overrides.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 
 import '../analyzer.dart';
 import '../extensions.dart';
@@ -38,12 +38,13 @@
 
   _Visitor(this.rule, this.context);
 
-  void check(Element? element, Token target) {
-    if (element == null || element.hasOverride) return;
+  void check(Element2? element, Token target) {
+    if (element == null) return;
+    if (element case Annotatable a when a.hasOverride) return;
 
-    var member = context.inheritanceManager.overriddenMember(element);
+    var member = context.inheritanceManager.overriddenMember2(element);
     if (member != null) {
-      rule.reportLintForToken(target, arguments: [member.name]);
+      rule.reportLintForToken(target, arguments: [member.name!]);
     }
   }
 
@@ -54,7 +55,7 @@
     if (node.parent is ExtensionTypeDeclaration) return;
 
     for (var field in node.fields.variables) {
-      check(field.declaredElement, field.name);
+      check(field.declaredFragment?.element, field.name);
     }
   }
 
@@ -64,6 +65,6 @@
     if (node.isStatic) return;
     if (node.parent is ExtensionTypeDeclaration) return;
 
-    check(node.declaredElement, node.name);
+    check(node.declaredFragment?.element, node.name);
   }
 }
diff --git a/pkg/linter/test/rules/annotate_overrides_test.dart b/pkg/linter/test/rules/annotate_overrides_test.dart
index 9d95f2d..45c135d 100644
--- a/pkg/linter/test/rules/annotate_overrides_test.dart
+++ b/pkg/linter/test/rules/annotate_overrides_test.dart
@@ -17,11 +17,6 @@
   @override
   String get lintRule => LintNames.annotate_overrides;
 
-  @FailingTest(
-    reason:
-        '`augmented.hasOverride` not implemented yet (https://github.com/dart-lang/sdk/issues/55579)',
-    issue: 'https://github.com/dart-lang/linter/issues/4925',
-  )
   test_augmentationClass_implementsInterface() async {
     var a = newFile('$testPackageLibPath/a.dart', r'''
 part 'b.dart';