in lib/src/argument_list_visitor.dart [229:268]
static bool _isBlockFunction(Expression expression) {
if (expression is NamedExpression) expression = expression.expression;
// Allow functions wrapped in dotted method calls like "a.b.c(() { ... })".
if (expression is MethodInvocation) {
if (!_isValidWrappingTarget(expression.target)) return false;
if (expression.argumentList.arguments.length != 1) return false;
return _isBlockFunction(expression.argumentList.arguments.single);
}
if (expression is InstanceCreationExpression) {
if (expression.argumentList.arguments.length != 1) return false;
return _isBlockFunction(expression.argumentList.arguments.single);
}
// Allow immediately-invoked functions like "() { ... }()".
if (expression is FunctionExpressionInvocation) {
if (expression.argumentList.arguments.isNotEmpty) return false;
expression = expression.function;
}
// Unwrap parenthesized expressions.
while (expression is ParenthesizedExpression) {
expression = expression.expression;
}
// Must be a function.
if (expression is! FunctionExpression) return false;
// With a curly body.
if (expression.body is! BlockFunctionBody) return false;
// That isn't empty.
var body = expression.body as BlockFunctionBody;
return body.block.statements.isNotEmpty ||
body.block.rightBracket.precedingComments != null;
}