Skip to content

Commit 2bba747

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Don't attempt to serialize FunctionExpression(s).
[email protected] Change-Id: I18df1789eca4460edc40285a3fde08c81cdbe96d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105351 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 9ff2c10 commit 2bba747

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

pkg/analyzer/lib/src/summary2/ast_binary_writer.dart

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)