Files
sdk/pkg/scrape/example/spread_sizes.dart
T
Robert Nystrom 891a8a1aa3 Add new "scrape" package.
The README explains, it but, in short, this is a little library I
harvested from the scripts I wrote during ui-as-code. It makes it easier
to write scripts to gather bits of statistical data from Dart syntax.

Change-Id: Ia33797f582c4d4f9f966b7f6dc7b58ca2414601e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/166788
Commit-Queue: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Auto-Submit: Bob Nystrom <rnystrom@google.com>
2020-10-19 22:24:28 +00:00

57 lines
1.7 KiB
Dart

// Copyright (c) 2020, 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:scrape/scrape.dart';
/// Looks at expressions that could likely be converted to spread operators and
/// measures their length. "Likely" means calls to `addAll()` where the
/// receiver is a list or map literal.
void main(List<String> arguments) {
Scrape()
..addHistogram('Arguments')
..addHistogram('Lengths', order: SortOrder.numeric)
..addVisitor(() => SpreadVisitor())
..runCommandLine(arguments);
}
class SpreadVisitor extends ScrapeVisitor {
@override
void visitCascadeExpression(CascadeExpression node) {
for (var section in node.cascadeSections) {
if (section is MethodInvocation) {
_countCall(node, section.methodName, node.target, section.argumentList);
}
}
super.visitCascadeExpression(node);
}
@override
void visitMethodInvocation(MethodInvocation node) {
_countCall(node, node.methodName, node.target, node.argumentList);
super.visitMethodInvocation(node);
}
void _countCall(Expression node, SimpleIdentifier name, Expression target,
ArgumentList args) {
if (name.name != 'addAll') return;
// See if the target is a collection literal.
while (target is MethodInvocation) {
target = (target as MethodInvocation).target;
}
if (target is ListLiteral || target is SetOrMapLiteral) {
if (args.arguments.length == 1) {
var arg = args.arguments[0];
record('Arguments', arg.toString());
record('Lengths', arg.length);
}
printNode(node);
}
}
}