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;
+ }
+}