Don't attempt to serialize FunctionExpression(s).

R=brianwilkerson@google.com

Change-Id: I18df1789eca4460edc40285a3fde08c81cdbe96d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105351
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index ac696dd..5d3ce26 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -378,8 +378,13 @@
 
   @override
   LinkedNodeBuilder visitDefaultFormalParameter(DefaultFormalParameter node) {
+    var defaultValue = node.defaultValue;
+    if (!_isSerializableExpression(defaultValue)) {
+      defaultValue = null;
+    }
+
     var builder = LinkedNodeBuilder.defaultFormalParameter(
-      defaultFormalParameter_defaultValue: node.defaultValue?.accept(this),
+      defaultFormalParameter_defaultValue: defaultValue?.accept(this),
       defaultFormalParameter_kind: _toParameterKind(node),
       defaultFormalParameter_parameter: node.parameter.accept(this),
       informativeId: getInformativeId(node),
@@ -1616,6 +1621,20 @@
     return _linkingContext.writeType(type);
   }
 
+  /// Return `true` if the expression might be successfully serialized.
+  ///
+  /// This does not mean that the expression is constant, it just means that
+  /// we know that it might be serialized and deserialized. For example
+  /// function expressions are problematic, and are not necessary to
+  /// deserialize, so we choose not to do this.
+  static bool _isSerializableExpression(Expression node) {
+    if (node == null) return false;
+
+    var visitor = _IsSerializableExpressionVisitor();
+    node.accept(visitor);
+    return visitor.result;
+  }
+
   static LinkedNodeFormalParameterKind _toParameterKind(FormalParameter node) {
     if (node.isRequiredPositional) {
       return LinkedNodeFormalParameterKind.requiredPositional;
@@ -1638,3 +1657,12 @@
 
   _ElementComponents(this.rawElement, this.definingType);
 }
+
+class _IsSerializableExpressionVisitor extends RecursiveAstVisitor<void> {
+  bool result = true;
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    result = false;
+  }
+}