blob: 95e3adf772c1e98d1eb7b43e195e562cd05f258a [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/ast_factory.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
FunctionExpressionImpl emptyFunctionExpression() {
return astFactory.functionExpression(
null,
astFactory.formalParameterList(
Tokens.openParenthesis(),
[],
null,
null,
Tokens.closeParenthesis(),
),
astFactory.blockFunctionBody(
null,
null,
astFactory.block(
Tokens.openCurlyBracket(),
[],
Tokens.closeCurlyBracket(),
),
),
);
}
/// We cannot serialize [FunctionExpression], but we need to have some node
/// with the same source range for error reporting. So, we replace them with
/// empty [FunctionExpression]s that have the same offset and length.
ExpressionImpl replaceNotSerializableNodes(ExpressionImpl node) {
if (node is FunctionExpressionImpl) {
return FunctionExpressionReplacementVisitor._replacement(node);
}
node.accept(FunctionExpressionReplacementVisitor());
return node;
}
class FunctionExpressionReplacementVisitor extends RecursiveAstVisitor<void> {
@override
void visitFunctionExpression(FunctionExpression node) {
NodeReplacer.replace(node, _replacement(node));
}
static FunctionExpressionImpl _replacement(FunctionExpression from) {
var to = emptyFunctionExpression();
to.parameters?.leftParenthesis.offset = from.offset;
var toBody = to.body;
if (toBody is BlockFunctionBodyImpl) {
toBody.block.rightBracket.offset = from.end - 1;
}
return to;
}
}