Fix for crash in WrapInText when the parameter is not InterfaceType.

There was a crash in the logs.

_TypeError: type 'GenericFunctionTypeElementImpl' is not a subtype of type 'ClassElement'
at WrapInText.compute	(wrap_in_text.dart:26 )
at FixProcessor._addFromProducers.compute	(fix_internal.dart:4506 )
at FixProcessor._addFromProducers	(fix_internal.dart:4520 )
at FixProcessor.compute	(fix_internal.dart:762 )
at DartFixContributor.computeFixes	(fix_internal.dart:82 )


R=brianwilkerson@google.com, pquitslund@google.com

Change-Id: I187b3348a212391cc6c64ab2c412653bd2319334
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141820
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/lib/src/services/correction/dart/wrap_in_text.dart b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
index 7f26c42..e391f54 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
@@ -5,11 +5,15 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class WrapInText extends CorrectionProducer {
+  ParameterElement _parameterElement;
+  Expression _stringExpression;
+
   @override
   FixKind get fixKind => DartFixKind.WRAP_IN_TEXT;
 
@@ -18,29 +22,34 @@
     //
     // Extract the information needed to build the edit.
     //
-    var value = _findStringToWrap(node);
-    if (value == null) {
+    _extractContextInformation(node);
+    if (_parameterElement == null || _stringExpression == null) {
       return;
     }
-    var parameter = (value.parent as Expression).staticParameterElement;
-    if (parameter == null || !flutter.isWidget(parameter.type.element)) {
+    if (!flutter.isWidgetType(_parameterElement.type)) {
       return;
     }
+
     //
     // Extract the information needed to build the edit.
     //
-    var literalSource = utils.getNodeText(value);
+    var stringExpressionCode = utils.getNodeText(_stringExpression);
+
     //
     // Build the edit.
     //
     await builder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleReplacement(range.node(value), 'Text($literalSource)');
+      builder.addSimpleReplacement(
+        range.node(_stringExpression),
+        'Text($stringExpressionCode)',
+      );
     });
   }
 
-  /// Return the expression that should be wrapped in an invocation of the
-  /// constructor for `Text`.
-  Expression _findStringToWrap(AstNode node) {
+  /// Set the `String` typed named expression to [_stringExpression], and the
+  /// corresponding parameter to [_parameterElement]. Leave the fields `null`
+  /// if not a named argument, or not a `String` typed expression.
+  void _extractContextInformation(AstNode node) {
     if (node is SimpleIdentifier) {
       var label = node.parent;
       if (label is Label) {
@@ -48,11 +57,11 @@
         if (namedExpression is NamedExpression) {
           var expression = namedExpression.expression;
           if (expression.staticType.isDartCoreString) {
-            return expression;
+            _parameterElement = node.staticElement;
+            _stringExpression = expression;
           }
         }
       }
     }
-    return null;
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
index a04df7c..d3b0b24 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
@@ -44,7 +44,20 @@
     await assertNoFix();
   }
 
-  Future<void> test_notWidget() async {
+  Future<void> test_parameterType_notClass() async {
+    await resolveTestUnit('''
+typedef F = void Function();
+
+void foo({F a}) {}
+
+void bar() {
+  foo(a: '');
+}
+''');
+    await assertNoFix();
+  }
+
+  Future<void> test_parameterType_notWidget() async {
     await resolveTestUnit('''
 void f(int i) {
   f('a');