@@ -378,8 +378,13 @@ class AstBinaryWriter extends ThrowingAstVisitor<LinkedNodeBuilder> {
378378
379379 @override
380380 LinkedNodeBuilder visitDefaultFormalParameter (DefaultFormalParameter node) {
381+ var defaultValue = node.defaultValue;
382+ if (! _isSerializableExpression (defaultValue)) {
383+ defaultValue = null ;
384+ }
385+
381386 var builder = LinkedNodeBuilder .defaultFormalParameter (
382- defaultFormalParameter_defaultValue: node. defaultValue? .accept (this ),
387+ defaultFormalParameter_defaultValue: defaultValue? .accept (this ),
383388 defaultFormalParameter_kind: _toParameterKind (node),
384389 defaultFormalParameter_parameter: node.parameter.accept (this ),
385390 informativeId: getInformativeId (node),
@@ -1616,6 +1621,20 @@ class AstBinaryWriter extends ThrowingAstVisitor<LinkedNodeBuilder> {
16161621 return _linkingContext.writeType (type);
16171622 }
16181623
1624+ /// Return `true` if the expression might be successfully serialized.
1625+ ///
1626+ /// This does not mean that the expression is constant, it just means that
1627+ /// we know that it might be serialized and deserialized. For example
1628+ /// function expressions are problematic, and are not necessary to
1629+ /// deserialize, so we choose not to do this.
1630+ static bool _isSerializableExpression (Expression node) {
1631+ if (node == null ) return false ;
1632+
1633+ var visitor = _IsSerializableExpressionVisitor ();
1634+ node.accept (visitor);
1635+ return visitor.result;
1636+ }
1637+
16191638 static LinkedNodeFormalParameterKind _toParameterKind (FormalParameter node) {
16201639 if (node.isRequiredPositional) {
16211640 return LinkedNodeFormalParameterKind .requiredPositional;
@@ -1638,3 +1657,12 @@ class _ElementComponents {
16381657
16391658 _ElementComponents (this .rawElement, this .definingType);
16401659}
1660+
1661+ class _IsSerializableExpressionVisitor extends RecursiveAstVisitor <void > {
1662+ bool result = true ;
1663+
1664+ @override
1665+ void visitFunctionExpression (FunctionExpression node) {
1666+ result = false ;
1667+ }
1668+ }
0 commit comments