Elements. Migrate AddMissingRequiredArgument.

Change-Id: I155f1be9d36ed45c3a814326864e76b713559881
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/387131
Reviewed-by: Phil Quitslund <pquitslund@google.com>
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 eea633f..8b7ec22 100644
--- a/pkg/analysis_server/analyzer_use_new_elements.txt
+++ b/pkg/analysis_server/analyzer_use_new_elements.txt
@@ -16,3 +16,4 @@
 lib/src/services/correction/dart/add_late.dart
 lib/src/services/correction/dart/add_leading_newline_to_string.dart
 lib/src/services/correction/dart/add_missing_parameter_named.dart
+lib/src/services/correction/dart/add_missing_required_argument.dart
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index a97c531..ecce60b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/utilities/extensions/flutter.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/source/source.dart';
@@ -171,6 +172,29 @@
   return null;
 }
 
+/// Return a default argument value for the given [parameter].
+DefaultArgument? getDefaultStringParameterValue2(
+    FormalParameterElement parameter, String quote) {
+  var type = parameter.type;
+  if (type is InterfaceType) {
+    if (type.isDartCoreList) {
+      return DefaultArgument('[]', cursorPosition: 1);
+    } else if (type.isDartCoreMap) {
+      return DefaultArgument('{}', cursorPosition: 1);
+    } else if (type.isDartCoreString) {
+      return DefaultArgument('$quote$quote', cursorPosition: 1);
+    }
+  } else if (type is FunctionType) {
+    var params = type.parameters
+        .map((p) => '${getTypeString(p.type)}${p.name}')
+        .join(', ');
+    // TODO(devoncarew): Support having this method return text with newlines.
+    var text = '($params) {  }';
+    return DefaultArgument(text, cursorPosition: text.length - 2);
+  }
+  return null;
+}
+
 String getRequestLineIndent(DartCompletionRequest request) {
   var content = request.content;
   var lineStartOffset = request.offset;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index d6e3c80..a19897c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
@@ -8,7 +8,7 @@
 import 'package:analysis_server/src/utilities/extensions/flutter.dart';
 import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:collection/collection.dart';
@@ -33,7 +33,7 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     InstanceCreationExpression? creation;
-    Element? targetElement;
+    Element2? targetElement;
     ArgumentList? argumentList;
 
     if (node is SimpleIdentifier ||
@@ -41,12 +41,12 @@
         node is NamedType) {
       var invocation = node.parent;
       if (invocation is MethodInvocation) {
-        targetElement = invocation.methodName.staticElement;
+        targetElement = invocation.methodName.element;
         argumentList = invocation.argumentList;
       } else {
         creation = invocation?.thisOrAncestorOfType();
         if (creation != null) {
-          targetElement = creation.constructorName.staticElement;
+          targetElement = creation.constructorName.element;
           argumentList = creation.argumentList;
         }
       }
@@ -57,7 +57,7 @@
       return;
     }
 
-    if (targetElement is ExecutableElement && argumentList != null) {
+    if (targetElement is ExecutableElement2 && argumentList != null) {
       // Format: "Missing required argument 'foo'."
       var messageParts =
           diagnostic.problemMessage.messageText(includeUrl: false).split("'");
@@ -66,7 +66,7 @@
       }
       _missingParameterName = messageParts[1];
 
-      var missingParameter = targetElement.parameters.firstWhereOrNull(
+      var missingParameter = targetElement.formalParameters.firstWhereOrNull(
         (p) => p.name == _missingParameterName,
       );
       if (missingParameter == null) {
@@ -94,7 +94,7 @@
       }
 
       var codeStyleOptions = getCodeStyleOptions(unitResult.file);
-      var defaultValue = getDefaultStringParameterValue(
+      var defaultValue = getDefaultStringParameterValue2(
           missingParameter, codeStyleOptions.preferredQuoteForStrings);
 
       await builder.addDartFileEdit(file, (builder) {