Elements. Migrate AddLate.

Change-Id: I26035d05790b0115f8233a3901bc9cbd31db220b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/386976
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt
index 034311b..0d58fae 100644
--- a/pkg/analysis_server/analyzer_use_new_elements.txt
+++ b/pkg/analysis_server/analyzer_use_new_elements.txt
@@ -10,3 +10,7 @@
 lib/src/services/correction/dart/add_eol_at_end_of_file.dart
 lib/src/services/correction/dart/add_explicit_call.dart
 lib/src/services/correction/dart/add_explicit_cast.dart
+lib/src/services/correction/dart/add_field_formal_parameters.dart
+lib/src/services/correction/dart/add_key_to_constructors.dart
+lib/src/services/correction/dart/add_late.dart
+lib/src/services/correction/dart/add_leading_newline_to_string.dart
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
index 5ce3b54..9c7814f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
@@ -6,7 +6,7 @@
 import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -58,18 +58,18 @@
         }
       }
     } else if (node is SimpleIdentifier) {
-      var getter = node.writeOrReadElement;
-      if (getter is PropertyAccessorElement &&
-          getter.isGetter &&
+      var getter = node.writeOrReadElement2;
+      if (getter is GetterElement &&
           getter.isSynthetic &&
-          getter.enclosingElement3 is InterfaceElement) {
-        var variableElement = getter.variable2;
+          getter.enclosingElement2 is InterfaceElement2) {
+        var variableElement = getter.variable3;
         if (variableElement != null &&
             !variableElement.isSynthetic &&
             !variableElement.isLate &&
             variableElement.setter == null) {
+          var variableFragment = variableElement.firstFragment!;
           var declarationResult =
-              await sessionHelper.getElementDeclaration(variableElement);
+              await sessionHelper.getElementDeclaration2(variableFragment);
           if (declarationResult == null) {
             return;
           }
@@ -83,7 +83,7 @@
                 keywordToken != null &&
                 keywordToken.keyword == Keyword.FINAL) {
               await _insertAt(builder, keywordToken.offset,
-                  source: declarationResult.element.source);
+                  source: variableFragment.libraryFragment.source);
             }
           }
         }
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index 989b146..9cf1688 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/utilities/extensions/element.dart';
@@ -57,6 +58,29 @@
 }
 
 // TODO(scheglov): https://github.com/dart-lang/sdk/issues/43608
+Element2? _writeElement2(AstNode node) {
+  var parent = node.parent;
+
+  if (parent is AssignmentExpression && parent.leftHandSide == node) {
+    return parent.writeElement2;
+  }
+  if (parent is PostfixExpression && parent.operand == node) {
+    return parent.writeElement2;
+  }
+  if (parent is PrefixExpression && parent.operand == node) {
+    return parent.writeElement2;
+  }
+
+  if (parent is PrefixedIdentifier && parent.identifier == node) {
+    return _writeElement2(parent);
+  }
+  if (parent is PropertyAccess && parent.propertyName == node) {
+    return _writeElement2(parent);
+  }
+  return null;
+}
+
+// TODO(scheglov): https://github.com/dart-lang/sdk/issues/43608
 DartType? _writeType(AstNode node) {
   var parent = node.parent;
 
@@ -211,6 +235,10 @@
     return _writeElement(this) ?? staticElement;
   }
 
+  Element2? get writeOrReadElement2 {
+    return _writeElement2(this) ?? element;
+  }
+
   DartType? get writeOrReadType {
     return _writeType(this) ?? staticType;
   }