Version 2.15.0-231.0.dev
Merge commit 'cc40080d967fc9f522b12a4bfbe990bc1b0d230c' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index d041f09..9c19e78 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
"constraint, update this by running tools/generate_package_config.dart."
],
"configVersion": 2,
- "generated": "2021-10-13T14:43:47.733371",
+ "generated": "2021-10-15T13:46:59.969883",
"generator": "tools/generate_package_config.dart",
"packages": [
{
@@ -208,7 +208,7 @@
"name": "dart2js_info",
"rootUri": "../pkg/dart2js_info",
"packageUri": "lib/",
- "languageVersion": "2.3"
+ "languageVersion": "2.11"
},
{
"name": "dart2js_runtime_metrics",
diff --git a/pkg/dart2js_info/analysis_options.yaml b/pkg/dart2js_info/analysis_options.yaml
new file mode 100644
index 0000000..7ad2eaf
--- /dev/null
+++ b/pkg/dart2js_info/analysis_options.yaml
@@ -0,0 +1,6 @@
+include: package:lints/recommended.yaml
+
+analyzer:
+ errors:
+ # Until the protobuf package generates the right code - or the right ignores
+ constant_identifier_names: ignore
diff --git a/pkg/dart2js_info/bin/src/code_deps.dart b/pkg/dart2js_info/bin/src/code_deps.dart
index 91b9222..056e08b 100644
--- a/pkg/dart2js_info/bin/src/code_deps.dart
+++ b/pkg/dart2js_info/bin/src/code_deps.dart
@@ -37,16 +37,20 @@
import 'usage_exception.dart';
class CodeDepsCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "code_deps";
+ @override
final String description = "";
CodeDepsCommand() {
- addSubcommand(new _SomePathQuery());
+ addSubcommand(_SomePathQuery());
}
}
class _SomePathQuery extends Command<void> with PrintUsageException {
+ @override
final String name = "some_path";
+ @override
final String description = "find a call-graph path between two elements.";
@override
@@ -62,9 +66,9 @@
var graph = graphFromInfo(info);
var source = info.functions
- .firstWhere(_longNameMatcher(new RegExp(args[1])), orElse: () => null);
+ .firstWhere(_longNameMatcher(RegExp(args[1])), orElse: () => null);
var target = info.functions
- .firstWhere(_longNameMatcher(new RegExp(args[2])), orElse: () => null);
+ .firstWhere(_longNameMatcher(RegExp(args[2])), orElse: () => null);
print('query: some_path');
if (source == null) {
usageException("source '${args[1]}' not found in '${args[0]}'");
@@ -74,7 +78,7 @@
usageException("target '${args[2]}' not found in '${args[0]}'");
}
print('target: ${longName(target)}');
- var path = new SomePathQuery(source, target).run(graph);
+ var path = SomePathQuery(source, target).run(graph);
if (path.isEmpty) {
print('result: no path found');
} else {
@@ -103,12 +107,12 @@
List<Info> run(Graph<Info> graph) {
var seen = <Info, Info>{source: null};
- var queue = new Queue<Info>();
+ var queue = Queue<Info>();
queue.addLast(source);
while (queue.isNotEmpty) {
var node = queue.removeFirst();
if (identical(node, target)) {
- var result = new Queue<Info>();
+ var result = Queue<Info>();
while (node != null) {
result.addFirst(node);
node = seen[node];
@@ -125,7 +129,7 @@
}
}
-typedef bool LongNameMatcher(FunctionInfo info);
+typedef LongNameMatcher = bool Function(FunctionInfo info);
LongNameMatcher _longNameMatcher(RegExp regexp) =>
(e) => regexp.hasMatch(longName(e));
diff --git a/pkg/dart2js_info/bin/src/convert.dart b/pkg/dart2js_info/bin/src/convert.dart
index f79233d..7439957 100644
--- a/pkg/dart2js_info/bin/src/convert.dart
+++ b/pkg/dart2js_info/bin/src/convert.dart
@@ -11,13 +11,15 @@
/// This tool reports how code is divided among deferred chunks.
class ConvertCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "convert";
+ @override
final String description = "Convert between info formats.";
ConvertCommand() {
- _addSubcommand(new ToJsonCommand());
- _addSubcommand(new ToBinaryCommand());
- _addSubcommand(new ToProtoCommand());
+ _addSubcommand(ToJsonCommand());
+ _addSubcommand(ToBinaryCommand());
+ _addSubcommand(ToProtoCommand());
}
_addSubcommand(Command<void> command) {
diff --git a/pkg/dart2js_info/bin/src/coverage_log_server.dart b/pkg/dart2js_info/bin/src/coverage_log_server.dart
index d43d410..f86654a 100644
--- a/pkg/dart2js_info/bin/src/coverage_log_server.dart
+++ b/pkg/dart2js_info/bin/src/coverage_log_server.dart
@@ -31,7 +31,9 @@
import 'usage_exception.dart';
class CoverageLogServerCommand extends Command<void> with PrintUsageException {
+ @override
final String name = 'coverage_server';
+ @override
final String description = 'Server to gather code coverage data';
CoverageLogServerCommand() {
@@ -46,30 +48,29 @@
' into the .js file',
defaultsTo: '')
..addOption('out',
- abbr: 'o',
- help: 'output log file',
- defaultsTo: _DEFAULT_OUT_TEMPLATE);
+ abbr: 'o', help: 'output log file', defaultsTo: _defaultOutTemplate);
}
+ @override
void run() async {
if (argResults.rest.isEmpty) {
usageException('Missing arguments: <dart2js-out-file> [<html-file>]');
}
var jsPath = argResults.rest[0];
- var htmlPath = null;
+ String htmlPath;
if (argResults.rest.length > 1) {
htmlPath = argResults.rest[1];
}
var outPath = argResults['out'];
- if (outPath == _DEFAULT_OUT_TEMPLATE) outPath = '$jsPath.coverage.json';
- var server = new _Server(argResults['host'], int.parse(argResults['port']),
+ if (outPath == _defaultOutTemplate) outPath = '$jsPath.coverage.json';
+ var server = _Server(argResults['host'], int.parse(argResults['port']),
jsPath, htmlPath, outPath, argResults['uri-prefix']);
await server.run();
}
}
-const _DEFAULT_OUT_TEMPLATE = '<dart2js-out-file>.coverage.json';
+const _defaultOutTemplate = '<dart2js-out-file>.coverage.json';
class _Server {
/// Server hostname, typically `localhost`, but can be `0.0.0.0`.
@@ -102,12 +103,11 @@
/// against dump-info data.
Map data = {};
- String get _serializedData => new JsonEncoder.withIndent(' ').convert(data);
+ String get _serializedData => JsonEncoder.withIndent(' ').convert(data);
- _Server(this.hostname, this.port, String jsPath, this.htmlPath, this.outPath,
+ _Server(this.hostname, this.port, this.jsPath, this.htmlPath, this.outPath,
String prefix)
- : jsPath = jsPath,
- jsCode = _adjustRequestUrl(new File(jsPath).readAsStringSync(), prefix),
+ : jsCode = _adjustRequestUrl(File(jsPath).readAsStringSync(), prefix),
prefix = _normalize(prefix);
run() async {
@@ -135,29 +135,29 @@
urlPath == _expectedPath(baseHtmlName)) {
var contents = htmlPath == null
? '<html><script src="$baseJsName"></script>'
- : await new File(htmlPath).readAsString();
- return new shelf.Response.ok(contents, headers: HTML_HEADERS);
+ : await File(htmlPath).readAsString();
+ return shelf.Response.ok(contents, headers: _htmlHeaders);
}
if (urlPath == _expectedPath(baseJsName)) {
- return new shelf.Response.ok(jsCode, headers: JS_HEADERS);
+ return shelf.Response.ok(jsCode, headers: _jsHeaders);
}
// Handle POST requests to record coverage data, and GET requests to display
// the currently coverage results.
if (urlPath == _expectedPath('coverage')) {
if (request.method == 'GET') {
- return new shelf.Response.ok(_serializedData, headers: TEXT_HEADERS);
+ return shelf.Response.ok(_serializedData, headers: _textHeaders);
}
if (request.method == 'POST') {
_record(jsonDecode(await request.readAsString()));
- return new shelf.Response.ok("Thanks!");
+ return shelf.Response.ok("Thanks!");
}
}
// Any other request is not supported.
- return new shelf.Response.notFound('Not found: "$urlPath"');
+ return shelf.Response.notFound('Not found: "$urlPath"');
}
_record(List entries) {
@@ -174,8 +174,8 @@
_enqueueSave() async {
if (!_savePending) {
_savePending = true;
- await new Future.delayed(new Duration(seconds: 3));
- await new File(outPath).writeAsString(_serializedData);
+ await Future.delayed(Duration(seconds: 3));
+ await File(outPath).writeAsString(_serializedData);
var diff = data.length - _total;
print(diff == 0
? ' - no new element covered'
@@ -215,6 +215,6 @@
return '$hook$code';
}
-const HTML_HEADERS = const {'content-type': 'text/html'};
-const JS_HEADERS = const {'content-type': 'text/javascript'};
-const TEXT_HEADERS = const {'content-type': 'text/plain'};
+const _htmlHeaders = {'content-type': 'text/html'};
+const _jsHeaders = {'content-type': 'text/javascript'};
+const _textHeaders = {'content-type': 'text/plain'};
diff --git a/pkg/dart2js_info/bin/src/debug_info.dart b/pkg/dart2js_info/bin/src/debug_info.dart
index 4851e01..6199ee4 100644
--- a/pkg/dart2js_info/bin/src/debug_info.dart
+++ b/pkg/dart2js_info/bin/src/debug_info.dart
@@ -7,7 +7,6 @@
library dart2js_info.bin.debug_info;
import 'package:args/command_runner.dart';
-
import 'package:dart2js_info/info.dart';
import 'package:dart2js_info/src/graph.dart';
import 'package:dart2js_info/src/io.dart';
@@ -16,7 +15,9 @@
import 'usage_exception.dart';
class DebugCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "debug";
+ @override
final String description = "Dart2js-team diagnostics on a dump-info file.";
DebugCommand() {
@@ -24,9 +25,10 @@
help: "Show detailed data for a library with the given name");
}
+ @override
void run() async {
var args = argResults.rest;
- if (args.length < 1) {
+ if (args.isEmpty) {
usageException('Missing argument: info.data');
}
@@ -43,24 +45,22 @@
/// Validates that codesize of elements adds up to total codesize.
validateSize(AllInfo info, String debugLibName) {
// Gather data from visiting all info elements.
- var tracker = new _SizeTracker(debugLibName);
+ var tracker = _SizeTracker(debugLibName);
info.accept(tracker);
// Validate that listed elements include elements of each library.
- Set<Info> listed = new Set()
- ..addAll(info.functions)
- ..addAll(info.fields);
+ final listed = {...info.functions, ...info.fields};
// For our sanity we do some validation of dump-info invariants
var diff1 = listed.difference(tracker.discovered);
var diff2 = tracker.discovered.difference(listed);
- if (diff1.length == 0 || diff2.length == 0) {
+ if (diff1.isEmpty || diff2.isEmpty) {
_pass('all fields and functions are covered');
} else {
- if (diff1.length > 0) {
+ if (diff1.isNotEmpty) {
_fail("some elements where listed globally that weren't part of any "
"library (non-zero ${diff1.where((f) => f.size > 0).length})");
}
- if (diff2.length > 0) {
+ if (diff2.isNotEmpty) {
_fail("some elements found in libraries weren't part of the global list"
" (non-zero ${diff2.where((f) => f.size > 0).length})");
}
@@ -87,7 +87,7 @@
/// Validates that every element in the model has a parent (except libraries).
validateParents(AllInfo info) {
- final parentlessInfos = new Set<Info>();
+ final parentlessInfos = <Info>{};
failIfNoParents(List<Info> infos) {
for (var info in infos) {
@@ -118,7 +118,7 @@
/// [FunctionInfo]s and [FieldInfo]s transitively reachable from [LibraryInfo]
/// elements.
- final Set<Info> discovered = new Set<Info>();
+ final Set<Info> discovered = <Info>{};
/// Total number of bytes missing if you look at the reported size compared
/// to the sum of the nested infos (e.g. if a class size is smaller than the
@@ -131,13 +131,13 @@
final List unused = [];
/// Tracks the current state of this visitor.
- List<_State> stack = [new _State()];
+ List<_State> stack = [_State()];
/// Code discovered for a [LibraryInfo], only used for debugging.
- final StringBuffer _debugCode = new StringBuffer();
+ final StringBuffer _debugCode = StringBuffer();
int _indent = 2;
- void _push() => stack.add(new _State());
+ void _push() => stack.add(_State());
void _pop(info) {
var last = stack.removeLast();
@@ -158,6 +158,7 @@
}
bool _debug = false;
+ @override
visitLibrary(LibraryInfo info) {
if (_debugLibName != null) _debug = info.name.contains(_debugLibName);
_push();
@@ -189,7 +190,7 @@
_debugCode.write('...\n');
}
- print('$info ${isClosureClass} \n${info.code}');
+ print('$info $isClosureClass \n${info.code}');
_debugCode.write(' ' * _indent);
var endsInNewLine = code.endsWith('\n');
if (endsInNewLine) code = code.substring(0, code.length - 1);
@@ -206,22 +207,26 @@
stack.last._count++;
}
+ @override
visitField(FieldInfo info) {
_handleCodeInfo(info);
super.visitField(info);
}
+ @override
visitFunction(FunctionInfo info) {
_handleCodeInfo(info);
super.visitFunction(info);
}
+ @override
visitTypedef(TypedefInfo info) {
if (_debug) print('$info');
stack.last._totalSize += info.size;
super.visitTypedef(info);
}
+ @override
visitClass(ClassInfo info) {
if (_debug) {
print('$info');
@@ -239,6 +244,7 @@
}
}
+ @override
visitClassType(ClassTypeInfo info) {
if (_debug) {
print('$info');
@@ -265,8 +271,8 @@
/// Validates that both forms of dependency information match.
void compareGraphs(AllInfo info) {
- var g1 = new EdgeListGraph<Info>();
- var g2 = new EdgeListGraph<Info>();
+ var g1 = EdgeListGraph<Info>();
+ var g2 = EdgeListGraph<Info>();
for (var f in info.functions) {
g1.addNode(f);
for (var g in f.uses) {
@@ -320,11 +326,9 @@
verifyDeps(AllInfo info) {
var graph = graphFromInfo(info);
var entrypoint = info.program.entrypoint;
- var reachables = new Set.from(graph.preOrder(entrypoint));
+ var reachables = Set.from(graph.preOrder(entrypoint));
- var functionsAndFields = []
- ..addAll(info.functions)
- ..addAll(info.fields);
+ var functionsAndFields = <BasicInfo>[...info.functions, ...info.fields];
var unreachables =
functionsAndFields.where((func) => !reachables.contains(func));
if (unreachables.isNotEmpty) {
diff --git a/pkg/dart2js_info/bin/src/deferred_library_check.dart b/pkg/dart2js_info/bin/src/deferred_library_check.dart
index 5493c66..a54bdeb 100644
--- a/pkg/dart2js_info/bin/src/deferred_library_check.dart
+++ b/pkg/dart2js_info/bin/src/deferred_library_check.dart
@@ -47,10 +47,13 @@
/// A command that computes the diff between two info files.
class DeferredLibraryCheck extends Command<void> with PrintUsageException {
+ @override
final String name = "deferred_check";
+ @override
final String description =
"Verify that deferred libraries are split as expected";
+ @override
void run() async {
var args = argResults.rest;
if (args.length < 2) {
@@ -66,6 +69,6 @@
}
Future manifestFromFile(String fileName) async {
- var file = await new File(fileName).readAsString();
+ var file = await File(fileName).readAsString();
return loadYaml(file);
}
diff --git a/pkg/dart2js_info/bin/src/deferred_library_layout.dart b/pkg/dart2js_info/bin/src/deferred_library_layout.dart
index 0584119..1c4f13f 100644
--- a/pkg/dart2js_info/bin/src/deferred_library_layout.dart
+++ b/pkg/dart2js_info/bin/src/deferred_library_layout.dart
@@ -8,7 +8,6 @@
import 'dart:io';
import 'package:args/command_runner.dart';
-
import 'package:dart2js_info/info.dart';
import 'package:dart2js_info/src/io.dart';
@@ -16,12 +15,15 @@
/// This tool reports how code is divided among deferred chunks.
class DeferredLibraryLayout extends Command<void> with PrintUsageException {
+ @override
final String name = "deferred_layout";
+ @override
final String description = "Show how code is divided among deferred parts.";
+ @override
void run() async {
var args = argResults.rest;
- if (args.length < 1) {
+ if (args.isEmpty) {
usageException('Missing argument: info.data');
}
await _showLayout(args.first);
@@ -37,7 +39,7 @@
var unit = info.outputUnit;
var lib = _libOf(info);
if (lib == null) return;
- libToHunks.putIfAbsent(lib, () => new Set()).add(unit);
+ libToHunks.putIfAbsent(lib, () => <OutputUnitInfo>{}).add(unit);
hunkMembers
.putIfAbsent(unit, () => {})
.putIfAbsent(lib, () => [])
diff --git a/pkg/dart2js_info/bin/src/deferred_library_size.dart b/pkg/dart2js_info/bin/src/deferred_library_size.dart
index 2ea7089..46455ed 100644
--- a/pkg/dart2js_info/bin/src/deferred_library_size.dart
+++ b/pkg/dart2js_info/bin/src/deferred_library_size.dart
@@ -16,12 +16,15 @@
/// This tool gives a breakdown of code size by deferred part in the program.
class DeferredLibrarySize extends Command<void> with PrintUsageException {
+ @override
final String name = "deferred_size";
+ @override
final String description = "Show breakdown of codesize by deferred part.";
+ @override
void run() async {
var args = argResults.rest;
- if (args.length < 1) {
+ if (args.isEmpty) {
usageException('Missing argument: info.data');
}
// TODO(het): Would be faster to only parse the 'outputUnits' part
@@ -37,6 +40,7 @@
const ImportSize(this.import, this.size);
+ @override
String toString() {
return '$import: $size';
}
@@ -45,14 +49,14 @@
void printSizes(Map<String, int> sizeByImport, int programSize) {
var importSizes = <ImportSize>[];
sizeByImport.forEach((import, size) {
- importSizes.add(new ImportSize(import, size));
+ importSizes.add(ImportSize(import, size));
});
// Sort by size, largest first.
importSizes.sort((a, b) => b.size - a.size);
int longest = importSizes.fold('Percent of code deferred'.length,
(longest, importSize) => max(longest, importSize.import.length));
- _printRow(label, data, {int width: 15}) {
+ _printRow(label, data, {int width = 15}) {
print('${label.toString().padRight(longest + 1)}'
'${data.toString().padLeft(width)}');
}
diff --git a/pkg/dart2js_info/bin/src/diff.dart b/pkg/dart2js_info/bin/src/diff.dart
index d013349..b811071 100644
--- a/pkg/dart2js_info/bin/src/diff.dart
+++ b/pkg/dart2js_info/bin/src/diff.dart
@@ -13,7 +13,9 @@
/// A command that computes the diff between two info files.
class DiffCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "diff";
+ @override
final String description =
"See code size differences between two dump-info files.";
@@ -23,6 +25,7 @@
help: "Show only a summary and hide details of each library");
}
+ @override
void run() async {
var args = argResults.rest;
if (args.length < 2) {
diff --git a/pkg/dart2js_info/bin/src/function_size_analysis.dart b/pkg/dart2js_info/bin/src/function_size_analysis.dart
index cb2c591..704155d 100644
--- a/pkg/dart2js_info/bin/src/function_size_analysis.dart
+++ b/pkg/dart2js_info/bin/src/function_size_analysis.dart
@@ -8,7 +8,6 @@
import 'dart:math' as math;
import 'package:args/command_runner.dart';
-
import 'package:dart2js_info/info.dart';
import 'package:dart2js_info/src/graph.dart';
import 'package:dart2js_info/src/io.dart';
@@ -18,12 +17,15 @@
/// Command presenting how much each function contributes to the total code.
class FunctionSizeCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "function_size";
+ @override
final String description = "See breakdown of code size by function.";
+ @override
void run() async {
var args = argResults.rest;
- if (args.length < 1) {
+ if (args.isEmpty) {
usageException('Missing argument: info.data');
}
var info = await infoFromFile(args.first);
@@ -32,12 +34,13 @@
}
showCodeDistribution(AllInfo info,
- {bool filter(Info info), bool showLibrarySizes: false}) {
+ {bool Function(Info info) filter, bool showLibrarySizes = false}) {
var realTotal = info.program.size;
- if (filter == null) filter = (i) => true;
- var reported = <BasicInfo>[]
- ..addAll(info.functions.where(filter))
- ..addAll(info.fields.where(filter));
+ filter ??= (i) => true;
+ var reported = <BasicInfo>[
+ ...info.functions.where(filter),
+ ...info.fields.where(filter)
+ ];
// Compute a graph from the dependencies in [info].
Graph<Info> graph = graphFromInfo(info);
@@ -51,7 +54,7 @@
var minS = totalCount;
var nodeData = {};
for (var scc in components) {
- var sccData = new _SccData();
+ var sccData = _SccData();
maxS = math.max(maxS, scc.length);
minS = math.min(minS, scc.length);
for (var f in scc) {
@@ -85,7 +88,9 @@
}
helper(mainMethod);
- reported.forEach((n) => dominatedSize.putIfAbsent(n, () => n.size));
+ for (var n in reported) {
+ dominatedSize.putIfAbsent(n, () => n.size);
+ }
reported.sort((a, b) =>
(dominatedSize[b] + nodeData[b].maxSize) -
(dominatedSize[a] + nodeData[a].maxSize));
@@ -94,7 +99,7 @@
print(' --- Results per library ---');
var totals = <LibraryInfo, int>{};
var longest = 0;
- reported.forEach((info) {
+ for (var info in reported) {
var size = info.size;
while (info != null && info is! LibraryInfo) {
info = info.parent;
@@ -104,31 +109,31 @@
totals.putIfAbsent(lib, () => 0);
totals[lib] += size;
longest = math.max(longest, '${lib.uri}'.length);
- });
+ }
_showLibHeader(longest + 1);
var reportedByLibrary = totals.keys.toList();
reportedByLibrary.sort((a, b) => totals[b] - totals[a]);
- reportedByLibrary.forEach((info) {
+ for (var info in reportedByLibrary) {
_showLib('${info.uri}', totals[info], realTotal, longest + 1);
- });
+ }
}
print('\n --- Results per element (field or function) ---');
_showElementHeader();
- reported.forEach((info) {
+ for (var info in reported) {
var size = info.size;
var min = dominatedSize[info];
var max = nodeData[info].maxSize;
_showElement(
longName(info, useLibraryUri: true), size, min, max, realTotal);
- });
+ }
}
/// Data associated with an SCC. Used to compute the reachable code size.
class _SccData {
int size = 0;
- Set deps = new Set();
+ Set deps = {};
_SccData();
int _maxSize;
@@ -140,7 +145,7 @@
void compute() {
if (_maxSize != null) return;
var max = 0;
- var seen = new Set();
+ var seen = <dynamic>{};
helper(n) {
if (!seen.add(n)) return;
max += n.size;
diff --git a/pkg/dart2js_info/bin/src/inject_text.dart b/pkg/dart2js_info/bin/src/inject_text.dart
index 8dfe157..18bd5bd 100644
--- a/pkg/dart2js_info/bin/src/inject_text.dart
+++ b/pkg/dart2js_info/bin/src/inject_text.dart
@@ -14,22 +14,28 @@
void injectText(AllInfo info) {
// Fill the text of each code span. The binary form produced by dart2js
// produces code spans, but excludes the orignal text
- info.functions.forEach((f) {
- f.code.forEach((span) => _fillSpan(span, f.outputUnit));
- });
- info.fields.forEach((f) {
- f.code.forEach((span) => _fillSpan(span, f.outputUnit));
- });
- info.constants.forEach((c) {
- c.code.forEach((span) => _fillSpan(span, c.outputUnit));
- });
+ for (var f in info.functions) {
+ for (var span in f.code) {
+ _fillSpan(span, f.outputUnit);
+ }
+ }
+ for (var f in info.fields) {
+ for (var span in f.code) {
+ _fillSpan(span, f.outputUnit);
+ }
+ }
+ for (var c in info.constants) {
+ for (var span in c.code) {
+ _fillSpan(span, c.outputUnit);
+ }
+ }
}
Map<String, String> _cache = {};
_getContents(OutputUnitInfo unit) => _cache.putIfAbsent(unit.filename, () {
var uri = Uri.base.resolve(unit.filename);
- return new File.fromUri(uri).readAsStringSync();
+ return File.fromUri(uri).readAsStringSync();
});
_fillSpan(CodeSpan span, OutputUnitInfo unit) {
diff --git a/pkg/dart2js_info/bin/src/library_size_split.dart b/pkg/dart2js_info/bin/src/library_size_split.dart
index 1d252c4..da6d85d 100644
--- a/pkg/dart2js_info/bin/src/library_size_split.dart
+++ b/pkg/dart2js_info/bin/src/library_size_split.dart
@@ -72,7 +72,9 @@
/// Command presenting how much each library contributes to the total code.
class LibrarySizeCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "library_size";
+ @override
final String description = "See breakdown of code size by library.";
LibrarySizeCommand() {
@@ -80,9 +82,10 @@
help: 'YAML file specifying how libraries should be grouped.');
}
+ @override
void run() async {
var args = argResults.rest;
- if (args.length < 1) {
+ if (args.isEmpty) {
usageException('Missing argument: info.data');
print('usage: dart tool/library_size_split.dart '
'path-to-info.json [grouping.yaml]');
@@ -93,29 +96,29 @@
var groupingFile = argResults['grouping'];
var groupingText = groupingFile != null
- ? new File(groupingFile).readAsStringSync()
+ ? File(groupingFile).readAsStringSync()
: defaultGrouping;
var groupingYaml = loadYaml(groupingText);
var groups = [];
for (var group in groupingYaml['groups']) {
- groups.add(new _Group(
- group['name'], new RegExp(group['regexp']), group['cluster'] ?? 0));
+ groups.add(_Group(
+ group['name'], RegExp(group['regexp']), group['cluster'] ?? 0));
}
var sizes = {};
var allLibs = 0;
for (LibraryInfo lib in info.libraries) {
allLibs += lib.size;
- groups.forEach((group) {
+ for (var group in groups) {
var match = group.matcher.firstMatch('${lib.uri}');
if (match != null) {
var name = group.name;
if (name == null && match.groupCount > 0) name = match.group(1);
- if (name == null) name = match.group(0);
- sizes.putIfAbsent(name, () => new _SizeEntry(name, group.cluster));
+ name ??= match.group(0);
+ sizes.putIfAbsent(name, () => _SizeEntry(name, group.cluster));
sizes[name].size += lib.size;
}
- });
+ }
}
var allConstants = 0;
@@ -129,7 +132,7 @@
var longest = 0;
var rows = <_Row>[];
_addRow(String label, int value) {
- rows.add(new _Row(label, value));
+ rows.add(_Row(label, value));
longest = max(longest, label.length);
}
@@ -204,7 +207,7 @@
const _Divider() : super('', 0);
}
-_pad(value, n, {bool right: false}) {
+_pad(value, n, {bool right = false}) {
var s = '$value';
if (s.length >= n) return s;
var pad = ' ' * (n - s.length);
diff --git a/pkg/dart2js_info/bin/src/live_code_size_analysis.dart b/pkg/dart2js_info/bin/src/live_code_size_analysis.dart
index 77c02fd..23d4e32 100644
--- a/pkg/dart2js_info/bin/src/live_code_size_analysis.dart
+++ b/pkg/dart2js_info/bin/src/live_code_size_analysis.dart
@@ -47,7 +47,9 @@
import 'usage_exception.dart';
class LiveCodeAnalysisCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "coverage_analysis";
+ @override
final String description = "Analyze coverage data collected via the"
" 'coverage_server' command";
@@ -56,6 +58,7 @@
abbr: 'v', negatable: false, help: 'Show verbose details.');
}
+ @override
void run() async {
var args = argResults.rest;
if (args.length < 2) {
@@ -67,7 +70,7 @@
_liveCodeAnalysis(infoFile, coverageFile, bool verbose) async {
var info = await infoFromFile(infoFile);
- var coverage = jsonDecode(new File(coverageFile).readAsStringSync());
+ var coverage = jsonDecode(File(coverageFile).readAsStringSync());
int realTotal = info.program.size;
int totalLib = info.libraries.fold(0, (n, lib) => n + lib.size);
diff --git a/pkg/dart2js_info/bin/src/show_inferred_types.dart b/pkg/dart2js_info/bin/src/show_inferred_types.dart
index 521af34..9c3b119 100644
--- a/pkg/dart2js_info/bin/src/show_inferred_types.dart
+++ b/pkg/dart2js_info/bin/src/show_inferred_types.dart
@@ -15,7 +15,9 @@
import 'usage_exception.dart';
class ShowInferredTypesCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "show_inferred";
+ @override
final String description = "Show data inferred by dart2js global inference";
ShowInferredTypesCommand() {
@@ -23,6 +25,7 @@
abbr: 'l', negatable: false, help: 'Show long qualified names.');
}
+ @override
void run() async {
var args = argResults.rest;
if (args.length < 2) {
@@ -35,7 +38,7 @@
_showInferredTypes(String infoFile, String pattern, bool showLongName) async {
var info = await infoFromFile(infoFile);
- var nameRegExp = new RegExp(pattern);
+ var nameRegExp = RegExp(pattern);
matches(e) => nameRegExp.hasMatch(longName(e));
bool noResults = true;
diff --git a/pkg/dart2js_info/bin/src/text_print.dart b/pkg/dart2js_info/bin/src/text_print.dart
index 167ad03c..3615b4d 100644
--- a/pkg/dart2js_info/bin/src/text_print.dart
+++ b/pkg/dart2js_info/bin/src/text_print.dart
@@ -3,18 +3,20 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:io';
-import 'package:args/command_runner.dart';
+import 'package:args/command_runner.dart';
import 'package:dart2js_info/info.dart';
-import 'package:dart2js_info/src/util.dart';
import 'package:dart2js_info/src/io.dart';
+import 'package:dart2js_info/src/util.dart';
import 'inject_text.dart';
import 'usage_exception.dart';
/// Shows the contents of an info file as text.
class ShowCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "show";
+ @override
final String description = "Show a text representation of the info file.";
ShowCommand() {
@@ -28,8 +30,9 @@
'option can be used to embed the text directly in the output.');
}
+ @override
void run() async {
- if (argResults.rest.length < 1) {
+ if (argResults.rest.isEmpty) {
usageException('Missing argument: <input-info>');
}
@@ -37,13 +40,13 @@
AllInfo info = await infoFromFile(filename);
if (argResults['inject-text']) injectText(info);
- var buffer = new StringBuffer();
- info.accept(new TextPrinter(buffer, argResults['inject-text']));
+ var buffer = StringBuffer();
+ info.accept(TextPrinter(buffer, argResults['inject-text']));
var outputPath = argResults['out'];
if (outputPath == null) {
print(buffer);
} else {
- new File(outputPath).writeAsStringSync('$buffer');
+ File(outputPath).writeAsStringSync('$buffer');
}
}
}
@@ -65,13 +68,14 @@
buffer.writeln(s.replaceAll('\n', '\n$_textIndent'));
}
- void _writeBlock(String s, void f()) {
- _writeIndented("$s");
+ void _writeBlock(String s, void Function() f) {
+ _writeIndented(s);
_indent++;
f();
_indent--;
}
+ @override
void visitAll(AllInfo info) {
_writeBlock("Summary data", () => visitProgram(info.program));
buffer.writeln();
@@ -87,6 +91,7 @@
_writeBlock("Output units", () => info.outputUnits.forEach(visitOutput));
}
+ @override
void visitProgram(ProgramInfo info) {
_writeIndented('main: ${longName(info.entrypoint, useLibraryUri: true)}');
_writeIndented('size: ${info.size}');
@@ -109,6 +114,7 @@
return "${(size / (1024 * 1024)).toStringAsFixed(2)} Mb ($size b)";
}
+ @override
void visitLibrary(LibraryInfo info) {
_writeBlock('${info.uri}: ${_size(info.size)}', () {
if (info.topLevelFunctions.isNotEmpty) {
@@ -135,6 +141,7 @@
});
}
+ @override
void visitClass(ClassInfo info) {
_writeBlock(
'${info.name}: ${_size(info.size)} [${info.outputUnit.filename}]', () {
@@ -148,12 +155,14 @@
});
}
+ @override
void visitClassType(ClassTypeInfo info) {
_writeBlock(
'${info.name}: ${_size(info.size)} [${info.outputUnit.filename}]',
() {});
}
+ @override
void visitField(FieldInfo info) {
_writeBlock('${info.type} ${info.name}: ${_size(info.size)}', () {
_writeIndented('inferred type: ${info.inferredType}');
@@ -167,6 +176,7 @@
});
}
+ @override
void visitFunction(FunctionInfo info) {
var outputUnitFile = '';
if (info.functionKind == FunctionInfo.TOP_LEVEL_FUNCTION_KIND) {
@@ -177,7 +187,7 @@
_writeBlock(
'${info.returnType} ${info.name}($params): ${_size(info.size)}$outputUnitFile',
() {
- String params = info.parameters.map((p) => "${p.type}").join(', ');
+ String params = info.parameters.map((p) => p.type).join(', ');
_writeIndented('declared type: ${info.type}');
_writeIndented(
'inferred type: ${info.inferredReturnType} Function($params)');
@@ -197,14 +207,17 @@
_writeIndented('- ${longName(info.target, useLibraryUri: true)} $mask');
}
+ @override
void visitTypedef(TypedefInfo info) {
_writeIndented('${info.name}: ${info.type}');
}
+ @override
void visitClosure(ClosureInfo info) {
- _writeBlock('${info.name}', () => visitFunction(info.function));
+ _writeBlock(info.name, () => visitFunction(info.function));
}
+ @override
void visitConstant(ConstantInfo info) {
_writeBlock('${_size(info.size)}:', () => _writeCode(info.code));
}
@@ -213,6 +226,7 @@
_writeIndented(code.map((c) => c.text).join('\n'));
}
+ @override
void visitOutput(OutputUnitInfo info) {
_writeIndented('${info.filename}: ${_size(info.size)}');
}
diff --git a/pkg/dart2js_info/bin/src/to_binary.dart b/pkg/dart2js_info/bin/src/to_binary.dart
index 1d90ed2..e1170f3 100644
--- a/pkg/dart2js_info/bin/src/to_binary.dart
+++ b/pkg/dart2js_info/bin/src/to_binary.dart
@@ -15,11 +15,14 @@
/// Converts a dump-info file emitted by dart2js in JSON to binary format.
class ToBinaryCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "to_binary";
+ @override
final String description = "Convert any info file to binary format.";
+ @override
void run() async {
- if (argResults.rest.length < 1) {
+ if (argResults.rest.isEmpty) {
usageException('Missing argument: <input-info>');
exit(1);
}
@@ -28,7 +31,7 @@
AllInfo info = await infoFromFile(filename);
if (argResults['inject-text']) injectText(info);
String outputFilename = argResults['out'] ?? '$filename.data';
- var outstream = new File(outputFilename).openWrite();
+ var outstream = File(outputFilename).openWrite();
binary.encode(info, outstream);
await outstream.done;
}
diff --git a/pkg/dart2js_info/bin/src/to_json.dart b/pkg/dart2js_info/bin/src/to_json.dart
index fff4d34..15e2722 100644
--- a/pkg/dart2js_info/bin/src/to_json.dart
+++ b/pkg/dart2js_info/bin/src/to_json.dart
@@ -16,7 +16,9 @@
/// Converts a dump-info file emitted by dart2js in binary format to JSON.
class ToJsonCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "to_json";
+ @override
final String description = "Convert any info file to JSON format.";
ToJsonCommand() {
@@ -32,8 +34,9 @@
'available in the input file.');
}
+ @override
void run() async {
- if (argResults.rest.length < 1) {
+ if (argResults.rest.isEmpty) {
usageException('Missing argument: <input-info>');
}
@@ -45,10 +48,10 @@
injectText(info);
}
- var json = new AllInfoJsonCodec(isBackwardCompatible: isBackwardCompatible)
+ var json = AllInfoJsonCodec(isBackwardCompatible: isBackwardCompatible)
.encode(info);
String outputFilename = argResults['out'] ?? '$filename.json';
- new File(outputFilename)
+ File(outputFilename)
.writeAsStringSync(const JsonEncoder.withIndent(" ").convert(json));
}
}
diff --git a/pkg/dart2js_info/bin/src/to_proto.dart b/pkg/dart2js_info/bin/src/to_proto.dart
index fcbfaa8..5af4503 100644
--- a/pkg/dart2js_info/bin/src/to_proto.dart
+++ b/pkg/dart2js_info/bin/src/to_proto.dart
@@ -17,11 +17,14 @@
/// Converts a dump-info file emitted by dart2js to the proto format
class ToProtoCommand extends Command<void> with PrintUsageException {
+ @override
final String name = "to_proto";
+ @override
final String description = "Convert any info file to proto format.";
+ @override
void run() async {
- if (argResults.rest.length < 1) {
+ if (argResults.rest.isEmpty) {
usageException('Missing argument: <input-info>');
exit(1);
}
@@ -29,9 +32,9 @@
String filename = argResults.rest[0];
final info = await infoFromFile(filename);
if (argResults['inject-text']) injectText(info);
- final proto = new AllInfoProtoCodec().encode(info);
+ final proto = AllInfoProtoCodec().encode(info);
String outputFilename = argResults['out'] ?? '$filename.pb';
- final outputFile = new File(outputFilename);
+ final outputFile = File(outputFilename);
await outputFile.writeAsBytes(proto.writeToBuffer(), mode: FileMode.write);
}
}
diff --git a/pkg/dart2js_info/bin/src/usage_exception.dart b/pkg/dart2js_info/bin/src/usage_exception.dart
index 4499da3..3065100 100644
--- a/pkg/dart2js_info/bin/src/usage_exception.dart
+++ b/pkg/dart2js_info/bin/src/usage_exception.dart
@@ -8,6 +8,7 @@
abstract class PrintUsageException implements Command<void> {
// TODO(rnystrom): Use "Never" for the return type when this package is
// migrated to null safety.
+ @override
usageException(String message) {
print(message);
printUsage();
diff --git a/pkg/dart2js_info/bin/tools.dart b/pkg/dart2js_info/bin/tools.dart
index 40495a8..26a188b 100644
--- a/pkg/dart2js_info/bin/tools.dart
+++ b/pkg/dart2js_info/bin/tools.dart
@@ -20,20 +20,20 @@
/// Entrypoint to run all dart2js_info tools.
void main(args) {
- var commandRunner = new CommandRunner("dart2js_info",
+ var commandRunner = CommandRunner("dart2js_info",
"collection of tools to digest the output of dart2js's --dump-info")
- ..addCommand(new CodeDepsCommand())
- ..addCommand(new CoverageLogServerCommand())
- ..addCommand(new DebugCommand())
- ..addCommand(new DiffCommand())
- ..addCommand(new DeferredLibraryCheck())
- ..addCommand(new DeferredLibrarySize())
- ..addCommand(new DeferredLibraryLayout())
- ..addCommand(new ConvertCommand())
- ..addCommand(new FunctionSizeCommand())
- ..addCommand(new LibrarySizeCommand())
- ..addCommand(new LiveCodeAnalysisCommand())
- ..addCommand(new ShowInferredTypesCommand())
- ..addCommand(new ShowCommand());
+ ..addCommand(CodeDepsCommand())
+ ..addCommand(CoverageLogServerCommand())
+ ..addCommand(DebugCommand())
+ ..addCommand(DiffCommand())
+ ..addCommand(DeferredLibraryCheck())
+ ..addCommand(DeferredLibrarySize())
+ ..addCommand(DeferredLibraryLayout())
+ ..addCommand(ConvertCommand())
+ ..addCommand(FunctionSizeCommand())
+ ..addCommand(LibrarySizeCommand())
+ ..addCommand(LiveCodeAnalysisCommand())
+ ..addCommand(ShowInferredTypesCommand())
+ ..addCommand(ShowCommand());
commandRunner.run(args);
}
diff --git a/pkg/dart2js_info/lib/binary_serialization.dart b/pkg/dart2js_info/lib/binary_serialization.dart
index ecf0cec..23b626d 100644
--- a/pkg/dart2js_info/lib/binary_serialization.dart
+++ b/pkg/dart2js_info/lib/binary_serialization.dart
@@ -13,11 +13,11 @@
import 'info.dart';
void encode(AllInfo info, Sink<List<int>> sink) {
- new BinaryPrinter(new BinarySink(sink)).visitAll(info);
+ BinaryPrinter(BinarySink(sink)).visitAll(info);
}
AllInfo decode(List<int> data) {
- return new BinaryReader(new BinarySource(data)).readAll();
+ return BinaryReader(BinarySource(data)).readAll();
}
class BinaryPrinter implements InfoVisitor<void> {
@@ -38,6 +38,7 @@
info.accept(this);
}
+ @override
void visitAll(AllInfo info) {
sink.writeInt(info.version);
sink.writeInt(info.minorVersion);
@@ -70,6 +71,7 @@
sink.close();
}
+ @override
void visitProgram(ProgramInfo info) {
visitFunction(info.entrypoint);
sink.writeInt(info.size);
@@ -94,6 +96,7 @@
// Note: parent-pointers are not serialized, they get deduced during deserialization.
}
+ @override
void visitLibrary(LibraryInfo library) {
sink.writeCached(library, (LibraryInfo info) {
sink.writeUri(info.uri);
@@ -106,6 +109,7 @@
});
}
+ @override
void visitClass(ClassInfo cls) {
sink.writeCached(cls, (ClassInfo info) {
_visitBasicInfo(info);
@@ -115,12 +119,14 @@
});
}
+ @override
void visitClassType(ClassTypeInfo cls) {
sink.writeCached(cls, (ClassTypeInfo info) {
_visitBasicInfo(info);
});
}
+ @override
void visitField(FieldInfo field) {
sink.writeCached(field, (FieldInfo info) {
_visitBasicInfo(info);
@@ -148,6 +154,7 @@
}
}
+ @override
void visitConstant(ConstantInfo constant) {
sink.writeCached(constant, (ConstantInfo info) {
_visitBasicInfo(info);
@@ -170,6 +177,7 @@
sink.writeString(info.declaredType);
}
+ @override
void visitFunction(FunctionInfo function) {
sink.writeCached(function, (FunctionInfo info) {
_visitBasicInfo(info);
@@ -190,6 +198,7 @@
sink.writeStringOrNull(info.mask);
}
+ @override
void visitClosure(ClosureInfo closure) {
sink.writeCached(closure, (ClosureInfo info) {
_visitBasicInfo(info);
@@ -197,6 +206,7 @@
});
}
+ @override
void visitTypedef(TypedefInfo typedef) {
sink.writeCached(typedef, (TypedefInfo info) {
_visitBasicInfo(info);
@@ -211,6 +221,7 @@
}
}
+ @override
void visitOutput(OutputUnitInfo output) {
sink.writeCached(output, (OutputUnitInfo info) {
_visitBasicInfo(info);
@@ -229,7 +240,7 @@
}
Duration readDuration() {
- return new Duration(microseconds: source.readInt());
+ return Duration(microseconds: source.readInt());
}
Info readInfoWithKind() {
@@ -258,7 +269,7 @@
}
AllInfo readAll() {
- var info = new AllInfo();
+ var info = AllInfo();
int version = source.readInt();
int minorVersion = source.readInt();
if (info.version != version || info.minorVersion != minorVersion) {
@@ -311,13 +322,13 @@
}
ProgramInfo readProgram() {
- var info = new ProgramInfo();
+ var info = ProgramInfo();
info.entrypoint = readFunction();
info.size = source.readInt();
info.dart2jsVersion = source.readStringOrNull();
info.compilationMoment = readDate();
info.compilationDuration = readDuration();
- info.toJsonDuration = new Duration(microseconds: 0);
+ info.toJsonDuration = Duration(microseconds: 0);
info.dumpInfoDuration = readDuration();
info.noSuchMethodEnabled = source.readBool();
info.isRuntimeTypeUsed = source.readBool();
@@ -337,7 +348,7 @@
}
LibraryInfo readLibrary() => source.readCached<LibraryInfo>(() {
- LibraryInfo info = new LibraryInfo.internal();
+ LibraryInfo info = LibraryInfo.internal();
info.uri = source.readUri();
_readBasicInfo(info);
info.topLevelFunctions = source.readList(readFunction);
@@ -356,7 +367,7 @@
});
ClassInfo readClass() => source.readCached<ClassInfo>(() {
- ClassInfo info = new ClassInfo.internal();
+ ClassInfo info = ClassInfo.internal();
_readBasicInfo(info);
info.isAbstract = source.readBool();
info.fields = source.readList(readField);
@@ -375,7 +386,7 @@
});
FieldInfo readField() => source.readCached<FieldInfo>(() {
- FieldInfo info = new FieldInfo.internal();
+ FieldInfo info = FieldInfo.internal();
_readBasicInfo(info);
info.closures = source.readList(readClosure);
info.inferredType = source.readString();
@@ -385,12 +396,14 @@
if (info.isConst) {
info.initializer = _readConstantOrNull();
}
- info.closures.forEach((c) => c.parent = info);
+ for (var c in info.closures) {
+ c.parent = info;
+ }
return info;
});
CodeSpan _readCodeSpan() {
- return new CodeSpan()
+ return CodeSpan()
..start = source.readIntOrNull()
..end = source.readIntOrNull()
..text = source.readStringOrNull();
@@ -403,7 +416,7 @@
}
ConstantInfo readConstant() => source.readCached<ConstantInfo>(() {
- ConstantInfo info = new ConstantInfo.internal();
+ ConstantInfo info = ConstantInfo.internal();
_readBasicInfo(info);
info.code = source.readList(_readCodeSpan);
return info;
@@ -411,7 +424,7 @@
FunctionModifiers _readFunctionModifiers() {
int value = source.readInt();
- return new FunctionModifiers(
+ return FunctionModifiers(
isStatic: value & _staticMask != 0,
isConst: value & _constMask != 0,
isFactory: value & _factoryMask != 0,
@@ -419,12 +432,12 @@
}
ParameterInfo _readParameterInfo() {
- return new ParameterInfo(
+ return ParameterInfo(
source.readString(), source.readString(), source.readString());
}
FunctionInfo readFunction() => source.readCached<FunctionInfo>(() {
- FunctionInfo info = new FunctionInfo.internal();
+ FunctionInfo info = FunctionInfo.internal();
_readBasicInfo(info);
info.closures = source.readList(readClosure);
info.modifiers = _readFunctionModifiers();
@@ -435,15 +448,17 @@
info.inlinedCount = source.readIntOrNull();
info.code = source.readList(_readCodeSpan);
info.type = source.readString();
- info.closures.forEach((c) => c.parent = info);
+ for (var c in info.closures) {
+ c.parent = info;
+ }
return info;
});
DependencyInfo _readDependencyInfo() =>
- new DependencyInfo(readInfoWithKind(), source.readStringOrNull());
+ DependencyInfo(readInfoWithKind(), source.readStringOrNull());
ClosureInfo readClosure() => source.readCached<ClosureInfo>(() {
- ClosureInfo info = new ClosureInfo.internal();
+ ClosureInfo info = ClosureInfo.internal();
_readBasicInfo(info);
info.function = readFunction();
info.function.parent = info;
@@ -451,7 +466,7 @@
});
TypedefInfo readTypedef() => source.readCached<TypedefInfo>(() {
- TypedefInfo info = new TypedefInfo.internal();
+ TypedefInfo info = TypedefInfo.internal();
_readBasicInfo(info);
info.type = source.readString();
return info;
@@ -464,7 +479,7 @@
}
OutputUnitInfo readOutput() => source.readCached<OutputUnitInfo>(() {
- OutputUnitInfo info = new OutputUnitInfo.internal();
+ OutputUnitInfo info = OutputUnitInfo.internal();
_readBasicInfo(info);
info.filename = source.readStringOrNull();
info.imports = source.readList(source.readString);
diff --git a/pkg/dart2js_info/lib/deferred_library_check.dart b/pkg/dart2js_info/lib/deferred_library_check.dart
index 8a7e98b..ef35cec 100644
--- a/pkg/dart2js_info/lib/deferred_library_check.dart
+++ b/pkg/dart2js_info/lib/deferred_library_check.dart
@@ -42,8 +42,8 @@
List<ManifestComplianceFailure> checkDeferredLibraryManifest(
AllInfo info, Map manifest) {
- var includedPackages = new Map<String, Set<String>>();
- var excludedPackages = new Map<String, Set<String>>();
+ var includedPackages = <String, Set<String>>{};
+ var excludedPackages = <String, Set<String>>{};
for (var part in manifest.keys) {
for (var package in manifest[part]['include'] ?? []) {
(includedPackages[part] ??= {}).add(package);
@@ -59,16 +59,20 @@
// the outputUnits whose list of 'imports' contains a single import. If the
// part is shared, it will have more than one import since it will include the
// imports of all the top-level deferred parts that will load the shared part.
- List<String> validParts = ['main']..addAll(info.outputUnits
- .where((unit) => unit.imports.length == 1)
- .map((unit) => unit.imports.single));
- List<String> mentionedParts = []
- ..addAll(includedPackages.keys)
- ..addAll(excludedPackages.keys);
+ List<String> validParts = [
+ 'main',
+ ...info.outputUnits
+ .where((unit) => unit.imports.length == 1)
+ .map((unit) => unit.imports.single)
+ ];
+ List<String> mentionedParts = [
+ ...includedPackages.keys,
+ ...excludedPackages.keys
+ ];
var partNameFailures = <_InvalidPartName>[];
for (var part in mentionedParts) {
if (!validParts.contains(part)) {
- partNameFailures.add(new _InvalidPartName(part, validParts));
+ partNameFailures.add(_InvalidPartName(part, validParts));
}
}
if (partNameFailures.isNotEmpty) {
@@ -79,7 +83,7 @@
for (var values in includedPackages.values) ...values,
for (var values in excludedPackages.values) ...values
};
- var actualIncludedPackages = new Map<String, Set<String>>();
+ var actualIncludedPackages = <String, Set<String>>{};
var failures = <ManifestComplianceFailure>[];
@@ -98,8 +102,7 @@
for (var part in containingParts) {
(actualIncludedPackages[part] ??= {}).add(packageName);
if (excludedPackages[part].contains(packageName)) {
- failures
- .add(new _PartContainedExcludedPackage(part, packageName, info));
+ failures.add(_PartContainedExcludedPackage(part, packageName, info));
}
}
}
@@ -112,7 +115,7 @@
for (var package in packages) {
if (!actualIncludedPackages.containsKey(part) ||
!actualIncludedPackages[part].contains(package)) {
- failures.add(new _PartDidNotContainPackage(part, package));
+ failures.add(_PartDidNotContainPackage(part, package));
}
}
});
@@ -146,6 +149,7 @@
final List<String> validPartNames;
const _InvalidPartName(this.part, this.validPartNames);
+ @override
String toString() {
return 'Manifest file declares invalid part "$part". '
'Valid part names are: $validPartNames';
@@ -158,6 +162,7 @@
final BasicInfo info;
const _PartContainedExcludedPackage(this.part, this.package, this.info);
+ @override
String toString() {
return 'Part "$part" was specified to exclude package "$package" but it '
'actually contains ${kindToString(info.kind)} "${info.name}" which '
@@ -170,6 +175,7 @@
final String package;
const _PartDidNotContainPackage(this.part, this.package);
+ @override
String toString() {
return 'Part "$part" was specified to include package "$package" but it '
'does not contain any elements from that package.';
diff --git a/pkg/dart2js_info/lib/info.dart b/pkg/dart2js_info/lib/info.dart
index 850029a..1ebb2a7 100644
--- a/pkg/dart2js_info/lib/info.dart
+++ b/pkg/dart2js_info/lib/info.dart
@@ -33,12 +33,17 @@
// TODO(sigmund): add more:
// - inputSize: bytes used in the Dart source program
abstract class BasicInfo implements Info {
+ @override
final InfoKind kind;
+ @override
String coverageId;
+ @override
int size;
+ @override
Info parent;
+ @override
String name;
/// If using deferred libraries, where the element associated with this info
@@ -49,6 +54,7 @@
BasicInfo.internal(this.kind);
+ @override
String toString() => '$kind $name [$size]';
}
@@ -205,6 +211,7 @@
LibraryInfo.internal() : super.internal(InfoKind.library);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitLibrary(this);
}
@@ -222,6 +229,7 @@
OutputUnitInfo.internal() : super.internal(InfoKind.outputUnit);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitOutput(this);
}
@@ -240,11 +248,12 @@
List<FieldInfo> fields = <FieldInfo>[];
ClassInfo(
- {String name, this.isAbstract, OutputUnitInfo outputUnit, int size: 0})
+ {String name, this.isAbstract, OutputUnitInfo outputUnit, int size = 0})
: super(InfoKind.clazz, name, outputUnit, size, null);
ClassInfo.internal() : super.internal(InfoKind.clazz);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitClass(this);
}
@@ -252,11 +261,12 @@
/// [ClassInfo] because a class and its type may end up in different output
/// units.
class ClassTypeInfo extends BasicInfo {
- ClassTypeInfo({String name, OutputUnitInfo outputUnit, int size: 0})
+ ClassTypeInfo({String name, OutputUnitInfo outputUnit, int size = 0})
: super(InfoKind.classType, name, outputUnit, size, null);
ClassTypeInfo.internal() : super.internal(InfoKind.classType);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitClassType(this);
}
@@ -284,11 +294,12 @@
List<CodeSpan> code;
// TODO(sigmund): Add coverage support to constants?
- ConstantInfo({int size: 0, this.code, OutputUnitInfo outputUnit})
+ ConstantInfo({int size = 0, this.code, OutputUnitInfo outputUnit})
: super(InfoKind.constant, null, outputUnit, size, null);
ConstantInfo.internal() : super.internal(InfoKind.constant);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitConstant(this);
}
@@ -315,7 +326,7 @@
FieldInfo(
{String name,
String coverageId,
- int size: 0,
+ int size = 0,
this.type,
this.inferredType,
this.closures,
@@ -326,6 +337,7 @@
FieldInfo.internal() : super.internal(InfoKind.field);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitField(this);
}
@@ -339,6 +351,7 @@
TypedefInfo.internal() : super.internal(InfoKind.typedef);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitTypedef(this);
}
@@ -384,7 +397,7 @@
{String name,
String coverageId,
OutputUnitInfo outputUnit,
- int size: 0,
+ int size = 0,
this.functionKind,
this.modifiers,
this.closures,
@@ -399,6 +412,7 @@
FunctionInfo.internal() : super.internal(InfoKind.function);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitFunction(this);
}
@@ -408,11 +422,12 @@
FunctionInfo function;
ClosureInfo(
- {String name, OutputUnitInfo outputUnit, int size: 0, this.function})
+ {String name, OutputUnitInfo outputUnit, int size = 0, this.function})
: super(InfoKind.closure, name, outputUnit, size, null);
ClosureInfo.internal() : super.internal(InfoKind.closure);
+ @override
T accept<T>(InfoVisitor<T> visitor) => visitor.visitClosure(this);
}
@@ -446,10 +461,10 @@
final bool isExternal;
FunctionModifiers(
- {this.isStatic: false,
- this.isConst: false,
- this.isFactory: false,
- this.isExternal: false});
+ {this.isStatic = false,
+ this.isConst = false,
+ this.isFactory = false,
+ this.isExternal = false});
}
/// Possible values of the `kind` field in the serialized infos.
@@ -536,7 +551,8 @@
/// visitAll contains references to functions, this visitor only recurses to
/// visit libraries, then from each library we visit functions and classes, and
/// so on.
-class RecursiveInfoVisitor extends InfoVisitor<Null> {
+class RecursiveInfoVisitor extends InfoVisitor<void> {
+ @override
visitAll(AllInfo info) {
// Note: we don't visit functions, fields, classes, and typedefs because
// they are reachable from the library info.
@@ -544,8 +560,10 @@
info.constants.forEach(visitConstant);
}
+ @override
visitProgram(ProgramInfo info) {}
+ @override
visitLibrary(LibraryInfo info) {
info.topLevelFunctions.forEach(visitFunction);
info.topLevelVariables.forEach(visitField);
@@ -554,25 +572,33 @@
info.typedefs.forEach(visitTypedef);
}
+ @override
visitClass(ClassInfo info) {
info.functions.forEach(visitFunction);
info.fields.forEach(visitField);
}
+ @override
visitClassType(ClassTypeInfo info) {}
+ @override
visitField(FieldInfo info) {
info.closures.forEach(visitClosure);
}
+ @override
visitConstant(ConstantInfo info) {}
+ @override
visitFunction(FunctionInfo info) {
info.closures.forEach(visitClosure);
}
+ @override
visitTypedef(TypedefInfo info) {}
+ @override
visitOutput(OutputUnitInfo info) {}
+ @override
visitClosure(ClosureInfo info) {
visitFunction(info.function);
}
diff --git a/pkg/dart2js_info/lib/json_info_codec.dart b/pkg/dart2js_info/lib/json_info_codec.dart
index 16e33fd..1b741a7 100644
--- a/pkg/dart2js_info/lib/json_info_codec.dart
+++ b/pkg/dart2js_info/lib/json_info_codec.dart
@@ -3,13 +3,13 @@
// BSD-style license that can be found in the LICENSE file.
/// Converters and codecs for converting between JSON and [Info] classes.
-
import 'dart:collection';
import 'dart:convert';
import 'package:collection/collection.dart';
-import 'src/util.dart';
+
import 'info.dart';
+import 'src/util.dart';
List<String> _toSortedSerializedIds(
Iterable<Info> infos, Id Function(Info) getId) =>
@@ -18,13 +18,14 @@
// TODO(sigmund): add unit tests.
class JsonToAllInfoConverter extends Converter<Map<String, dynamic>, AllInfo> {
// Using `MashMap` here because it's faster than the default `LinkedHashMap`.
- final Map<String, Info> registry = new HashMap<String, Info>();
+ final Map<String, Info> registry = HashMap<String, Info>();
- AllInfo convert(Map<String, dynamic> json) {
+ @override
+ AllInfo convert(Map<String, dynamic> input) {
registry.clear();
- var result = new AllInfo();
- var elements = json['elements'];
+ var result = AllInfo();
+ var elements = input['elements'];
// TODO(srawlins): Since only the Map values are being extracted below,
// replace `as` with `cast` when `cast` becomes available in Dart 2.0:
//
@@ -50,29 +51,29 @@
result.constants.addAll(
(elements['constant'] as Map).values.map((c) => parseConstant(c)));
- json['holding'].forEach((k, deps) {
+ input['holding'].forEach((k, deps) {
CodeInfo src = registry[k];
assert(src != null);
for (var dep in deps) {
var target = registry[dep['id']];
assert(target != null);
- src.uses.add(new DependencyInfo(target, dep['mask']));
+ src.uses.add(DependencyInfo(target, dep['mask']));
}
});
- json['dependencies']?.forEach((String k, dependencies) {
+ input['dependencies']?.forEach((String k, dependencies) {
List<String> deps = dependencies;
result.dependencies[registry[k]] = deps.map((d) => registry[d]).toList();
});
result.outputUnits
- .addAll((json['outputUnits'] as List).map((o) => parseOutputUnit(o)));
+ .addAll((input['outputUnits'] as List).map((o) => parseOutputUnit(o)));
- result.program = parseProgram(json['program']);
+ result.program = parseProgram(input['program']);
- if (json['deferredFiles'] != null) {
+ if (input['deferredFiles'] != null) {
final deferredFilesMap =
- (json['deferredFiles'] as Map).cast<String, Map<String, dynamic>>();
+ (input['deferredFiles'] as Map).cast<String, Map<String, dynamic>>();
for (final library in deferredFilesMap.values) {
if (library['imports'] != null) {
// The importMap needs to be typed as <String, List<String>>, but the
@@ -192,7 +193,7 @@
}
ProgramInfo parseProgram(Map json) {
- var programInfo = new ProgramInfo()
+ var programInfo = ProgramInfo()
..entrypoint = parseId(json['entrypoint'])
..size = json['size']
..compilationMoment = DateTime.parse(json['compilationMoment'])
@@ -211,7 +212,7 @@
} else {
assert(compilationDuration is int);
programInfo.compilationDuration =
- new Duration(microseconds: compilationDuration);
+ Duration(microseconds: compilationDuration);
}
var toJsonDuration = json['toJsonDuration'];
@@ -219,7 +220,7 @@
programInfo.toJsonDuration = _parseDuration(toJsonDuration);
} else {
assert(toJsonDuration is int);
- programInfo.toJsonDuration = new Duration(microseconds: toJsonDuration);
+ programInfo.toJsonDuration = Duration(microseconds: toJsonDuration);
}
var dumpInfoDuration = json['dumpInfoDuration'];
@@ -227,8 +228,7 @@
programInfo.dumpInfoDuration = _parseDuration(dumpInfoDuration);
} else {
assert(dumpInfoDuration is int);
- programInfo.dumpInfoDuration =
- new Duration(microseconds: dumpInfoDuration);
+ programInfo.dumpInfoDuration = Duration(microseconds: dumpInfoDuration);
}
return programInfo;
@@ -237,7 +237,7 @@
/// Parse a string formatted as "XX:YY:ZZ.ZZZZZ" into a [Duration].
Duration _parseDuration(String duration) {
if (!duration.contains(':')) {
- return new Duration(milliseconds: int.parse(duration));
+ return Duration(milliseconds: int.parse(duration));
}
var parts = duration.split(':');
var hours = double.parse(parts[0]);
@@ -249,7 +249,7 @@
var totalMillis = secondsInMillis * seconds +
minutesInMillis * minutes +
hoursInMillis * hours;
- return new Duration(milliseconds: totalMillis.round());
+ return Duration(milliseconds: totalMillis.round());
}
FunctionInfo parseFunction(Map json) {
@@ -268,18 +268,17 @@
..code = parseCode(json['code'])
..sideEffects = json['sideEffects']
..inlinedCount = json['inlinedCount']
- ..modifiers =
- parseModifiers(new Map<String, bool>.from(json['modifiers']))
+ ..modifiers = parseModifiers(Map<String, bool>.from(json['modifiers']))
..closures = (json['children'] as List)
.map<ClosureInfo>((c) => parseId(c))
.toList();
}
ParameterInfo parseParameter(Map json) =>
- new ParameterInfo(json['name'], json['type'], json['declaredType']);
+ ParameterInfo(json['name'], json['type'], json['declaredType']);
FunctionModifiers parseModifiers(Map<String, bool> json) {
- return new FunctionModifiers(
+ return FunctionModifiers(
isStatic: json['static'] == true,
isConst: json['const'] == true,
isFactory: json['factory'] == true,
@@ -303,23 +302,23 @@
}
return registry.putIfAbsent(serializedId, () {
if (serializedId.startsWith('function/')) {
- return new FunctionInfo.internal();
+ return FunctionInfo.internal();
} else if (serializedId.startsWith('closure/')) {
- return new ClosureInfo.internal();
+ return ClosureInfo.internal();
} else if (serializedId.startsWith('library/')) {
- return new LibraryInfo.internal();
+ return LibraryInfo.internal();
} else if (serializedId.startsWith('class/')) {
- return new ClassInfo.internal();
+ return ClassInfo.internal();
} else if (serializedId.startsWith('classType/')) {
- return new ClassTypeInfo.internal();
+ return ClassTypeInfo.internal();
} else if (serializedId.startsWith('field/')) {
- return new FieldInfo.internal();
+ return FieldInfo.internal();
} else if (serializedId.startsWith('constant/')) {
- return new ConstantInfo.internal();
+ return ConstantInfo.internal();
} else if (serializedId.startsWith('typedef/')) {
- return new TypedefInfo.internal();
+ return TypedefInfo.internal();
} else if (serializedId.startsWith('outputUnit/')) {
- return new OutputUnitInfo.internal();
+ return OutputUnitInfo.internal();
}
assert(false);
return null;
@@ -329,13 +328,13 @@
List<CodeSpan> parseCode(dynamic json) {
// backwards compatibility with format 5.1:
if (json is String) {
- return [new CodeSpan(start: null, end: null, text: json)];
+ return [CodeSpan(start: null, end: null, text: json)];
}
if (json is List) {
return json.map((dynamic value) {
Map<String, dynamic> jsonCode = value;
- return new CodeSpan(
+ return CodeSpan(
start: jsonCode['start'],
end: jsonCode['end'],
text: jsonCode['text']);
@@ -350,10 +349,10 @@
implements InfoVisitor<Map> {
/// Whether to generate json compatible with format 5.1
final bool isBackwardCompatible;
- final Map<Info, Id> ids = new HashMap<Info, Id>();
- final Set<int> usedIds = new Set<int>();
+ final Map<Info, Id> ids = HashMap<Info, Id>();
+ final Set<int> usedIds = <int>{};
- AllInfoToJsonConverter({this.isBackwardCompatible: false});
+ AllInfoToJsonConverter({this.isBackwardCompatible = false});
Id idFor(Info info) {
var serializedId = ids[info];
@@ -381,17 +380,18 @@
while (!usedIds.add(id)) {
id++;
}
- serializedId = new Id(info.kind, '$id');
+ serializedId = Id(info.kind, '$id');
return ids[info] = serializedId;
}
- Map convert(AllInfo info) => info.accept(this);
+ @override
+ Map convert(AllInfo input) => input.accept(this);
Map _visitList(List<Info> infos) {
// Using SplayTree to maintain a consistent order of keys
- var map = new SplayTreeMap<String, Map>(compareNatural);
+ var map = SplayTreeMap<String, Map>(compareNatural);
for (var info in infos) {
- map['${idFor(info).id}'] = info.accept(this);
+ map[idFor(info).id] = info.accept(this);
}
return map;
}
@@ -421,7 +421,7 @@
{'id': idFor(info.target).serializedId, 'mask': info.mask};
Map _visitAllInfoHolding(AllInfo allInfo) {
- var map = new SplayTreeMap<String, List>(compareNatural);
+ var map = SplayTreeMap<String, List>(compareNatural);
void helper(CodeInfo info) {
if (info.uses.isEmpty) return;
map[idFor(info).serializedId] = info.uses
@@ -436,13 +436,14 @@
}
Map _visitAllInfoDependencies(AllInfo allInfo) {
- var map = new SplayTreeMap<String, List>(compareNatural);
+ var map = SplayTreeMap<String, List>(compareNatural);
allInfo.dependencies.forEach((k, v) {
map[idFor(k).serializedId] = _toSortedSerializedIds(v, idFor);
});
return map;
}
+ @override
Map visitAll(AllInfo info) {
var elements = _visitAllInfoElements(info);
var jsonHolding = _visitAllInfoHolding(info);
@@ -459,6 +460,7 @@
};
}
+ @override
Map visitProgram(ProgramInfo info) {
return {
'entrypoint': idFor(info.entrypoint).serializedId,
@@ -494,6 +496,7 @@
return res;
}
+ @override
Map visitLibrary(LibraryInfo info) {
return _visitBasicInfo(info)
..addAll(<String, Object>{
@@ -510,6 +513,7 @@
});
}
+ @override
Map visitClass(ClassInfo info) {
return _visitBasicInfo(info)
..addAll(<String, Object>{
@@ -520,10 +524,12 @@
});
}
+ @override
Map visitClassType(ClassTypeInfo info) {
return _visitBasicInfo(info);
}
+ @override
Map visitField(FieldInfo info) {
var result = _visitBasicInfo(info)
..addAll(<String, Object>{
@@ -541,6 +547,7 @@
return result;
}
+ @override
Map visitConstant(ConstantInfo info) => _visitBasicInfo(info)
..addAll(<String, Object>{'code': _serializeCode(info.code)});
@@ -561,6 +568,7 @@
Map _visitParameterInfo(ParameterInfo info) =>
{'name': info.name, 'type': info.type, 'declaredType': info.declaredType};
+ @override
Map visitFunction(FunctionInfo info) {
return _visitBasicInfo(info)
..addAll(<String, Object>{
@@ -579,13 +587,16 @@
});
}
+ @override
Map visitClosure(ClosureInfo info) {
return _visitBasicInfo(info)
..addAll(<String, Object>{'function': idFor(info.function).serializedId});
}
+ @override
visitTypedef(TypedefInfo info) => _visitBasicInfo(info)..['type'] = info.type;
+ @override
visitOutput(OutputUnitInfo info) => _visitBasicInfo(info)
..['filename'] = info.filename
..['imports'] = info.imports;
@@ -605,12 +616,14 @@
}
class AllInfoJsonCodec extends Codec<AllInfo, Map> {
+ @override
final Converter<AllInfo, Map> encoder;
- final Converter<Map, AllInfo> decoder = new JsonToAllInfoConverter();
+ @override
+ final Converter<Map, AllInfo> decoder = JsonToAllInfoConverter();
- AllInfoJsonCodec({bool isBackwardCompatible: false})
- : encoder = new AllInfoToJsonConverter(
- isBackwardCompatible: isBackwardCompatible);
+ AllInfoJsonCodec({bool isBackwardCompatible = false})
+ : encoder =
+ AllInfoToJsonConverter(isBackwardCompatible: isBackwardCompatible);
}
class Id {
diff --git a/pkg/dart2js_info/lib/proto_info_codec.dart b/pkg/dart2js_info/lib/proto_info_codec.dart
index d5425a8..4d42457 100644
--- a/pkg/dart2js_info/lib/proto_info_codec.dart
+++ b/pkg/dart2js_info/lib/proto_info_codec.dart
@@ -3,8 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
/// Converters and codecs for converting between Protobuf and [Info] classes.
-
import 'dart:convert';
+
import 'package:fixnum/fixnum.dart';
import 'info.dart';
@@ -14,18 +14,19 @@
export 'src/proto/info.pb.dart';
class ProtoToAllInfoConverter extends Converter<AllInfoPB, AllInfo> {
- AllInfo convert(AllInfoPB info) {
+ @override
+ AllInfo convert(AllInfoPB input) {
// TODO(lorenvs): Implement this conversion. It is unlikely to to be used
// by production code since the goal of the proto codec is to consume this
// information from other languages. However, it is useful for roundtrip
// testing, so we should support it.
- throw new UnimplementedError('ProtoToAllInfoConverter is not implemented');
+ throw UnimplementedError('ProtoToAllInfoConverter is not implemented');
}
}
class AllInfoToProtoConverter extends Converter<AllInfo, AllInfoPB> {
final Map<Info, Id> ids = {};
- final Set<int> usedIds = new Set<int>();
+ final Set<int> usedIds = <int>{};
Id idFor(Info info) {
if (info == null) return null;
@@ -51,14 +52,15 @@
while (!usedIds.add(id)) {
id++;
}
- serializedId = new Id(info.kind, id);
+ serializedId = Id(info.kind, id);
return ids[info] = serializedId;
}
- AllInfoPB convert(AllInfo info) => _convertToAllInfoPB(info);
+ @override
+ AllInfoPB convert(AllInfo input) => _convertToAllInfoPB(input);
DependencyInfoPB _convertToDependencyInfoPB(DependencyInfo info) {
- var result = new DependencyInfoPB()
+ var result = DependencyInfoPB()
..targetId = idFor(info.target)?.serializedId;
if (info.mask != null) {
result.mask = info.mask;
@@ -67,14 +69,14 @@
}
static ParameterInfoPB _convertToParameterInfoPB(ParameterInfo info) {
- return new ParameterInfoPB()
+ return ParameterInfoPB()
..name = info.name
..type = info.type
..declaredType = info.declaredType;
}
LibraryInfoPB _convertToLibraryInfoPB(LibraryInfo info) {
- final proto = new LibraryInfoPB()..uri = info.uri.toString();
+ final proto = LibraryInfoPB()..uri = info.uri.toString();
proto.childrenIds
.addAll(info.topLevelFunctions.map((func) => idFor(func).serializedId));
@@ -91,7 +93,7 @@
}
ClassInfoPB _convertToClassInfoPB(ClassInfo info) {
- final proto = new ClassInfoPB()..isAbstract = info.isAbstract;
+ final proto = ClassInfoPB()..isAbstract = info.isAbstract;
proto.childrenIds
.addAll(info.functions.map((func) => idFor(func).serializedId));
@@ -107,7 +109,7 @@
static FunctionModifiersPB _convertToFunctionModifiers(
FunctionModifiers modifiers) {
- return new FunctionModifiersPB()
+ return FunctionModifiersPB()
..isStatic = modifiers.isStatic
..isConst = modifiers.isConst
..isFactory = modifiers.isFactory
@@ -115,7 +117,7 @@
}
FunctionInfoPB _convertToFunctionInfoPB(FunctionInfo info) {
- final proto = new FunctionInfoPB()
+ final proto = FunctionInfoPB()
..functionModifiers = _convertToFunctionModifiers(info.modifiers)
..inlinedCount = info.inlinedCount ?? 0;
@@ -143,7 +145,7 @@
}
FieldInfoPB _convertToFieldInfoPB(FieldInfo info) {
- final proto = new FieldInfoPB()
+ final proto = FieldInfoPB()
..type = info.type
..inferredType = info.inferredType
..isConst = info.isConst;
@@ -163,25 +165,25 @@
}
static ConstantInfoPB _convertToConstantInfoPB(ConstantInfo info) {
- return new ConstantInfoPB()..code = info.code.map((c) => c.text).join('\n');
+ return ConstantInfoPB()..code = info.code.map((c) => c.text).join('\n');
}
static OutputUnitInfoPB _convertToOutputUnitInfoPB(OutputUnitInfo info) {
- final proto = new OutputUnitInfoPB();
+ final proto = OutputUnitInfoPB();
proto.imports.addAll(info.imports.where((import) => import != null));
return proto;
}
static TypedefInfoPB _convertToTypedefInfoPB(TypedefInfo info) {
- return new TypedefInfoPB()..type = info.type;
+ return TypedefInfoPB()..type = info.type;
}
ClosureInfoPB _convertToClosureInfoPB(ClosureInfo info) {
- return new ClosureInfoPB()..functionId = idFor(info.function).serializedId;
+ return ClosureInfoPB()..functionId = idFor(info.function).serializedId;
}
InfoPB _convertToInfoPB(Info info) {
- final proto = new InfoPB()
+ final proto = InfoPB()
..id = idFor(info).id
..serializedId = idFor(info).serializedId
..size = info.size;
@@ -233,14 +235,13 @@
}
ProgramInfoPB _convertToProgramInfoPB(ProgramInfo info) {
- var result = new ProgramInfoPB()
+ var result = ProgramInfoPB()
..entrypointId = idFor(info.entrypoint).serializedId
..size = info.size
- ..compilationMoment =
- new Int64(info.compilationMoment.microsecondsSinceEpoch)
- ..compilationDuration = new Int64(info.compilationDuration.inMicroseconds)
- ..toProtoDuration = new Int64(info.toJsonDuration.inMicroseconds)
- ..dumpInfoDuration = new Int64(info.dumpInfoDuration.inMicroseconds)
+ ..compilationMoment = Int64(info.compilationMoment.microsecondsSinceEpoch)
+ ..compilationDuration = Int64(info.compilationDuration.inMicroseconds)
+ ..toProtoDuration = Int64(info.toJsonDuration.inMicroseconds)
+ ..dumpInfoDuration = Int64(info.dumpInfoDuration.inMicroseconds)
..noSuchMethodEnabled = info.noSuchMethodEnabled ?? false
..isRuntimeTypeUsed = info.isRuntimeTypeUsed ?? false
..isIsolateUsed = info.isIsolateInUse ?? false
@@ -265,13 +266,13 @@
static LibraryDeferredImportsPB _convertToLibraryDeferredImportsPB(
String libraryUri, Map<String, dynamic> fields) {
- final proto = new LibraryDeferredImportsPB()
+ final proto = LibraryDeferredImportsPB()
..libraryUri = libraryUri
..libraryName = fields['name'] ?? '<unnamed>';
Map<String, List<String>> imports = fields['imports'];
imports.forEach((prefix, files) {
- final import = new DeferredImportPB()..prefix = prefix;
+ final import = DeferredImportPB()..prefix = prefix;
import.files.addAll(files);
proto.imports.add(import);
});
@@ -280,8 +281,7 @@
}
AllInfoPB _convertToAllInfoPB(AllInfo info) {
- final proto = new AllInfoPB()
- ..program = _convertToProgramInfoPB(info.program);
+ final proto = AllInfoPB()..program = _convertToProgramInfoPB(info.program);
proto.allInfos.addEntries(_convertToAllInfosEntries(info.libraries));
proto.allInfos.addEntries(_convertToAllInfosEntries(info.classes));
@@ -307,8 +307,10 @@
/// This codec is still experimental, and will likely crash on certain output
/// from dart2js.
class AllInfoProtoCodec extends Codec<AllInfo, AllInfoPB> {
- final Converter<AllInfo, AllInfoPB> encoder = new AllInfoToProtoConverter();
- final Converter<AllInfoPB, AllInfo> decoder = new ProtoToAllInfoConverter();
+ @override
+ final Converter<AllInfo, AllInfoPB> encoder = AllInfoToProtoConverter();
+ @override
+ final Converter<AllInfoPB, AllInfo> decoder = ProtoToAllInfoConverter();
}
class Id {
diff --git a/pkg/dart2js_info/lib/src/binary/sink.dart b/pkg/dart2js_info/lib/src/binary/sink.dart
index 7cacadc..4905b49 100644
--- a/pkg/dart2js_info/lib/src/binary/sink.dart
+++ b/pkg/dart2js_info/lib/src/binary/sink.dart
@@ -20,22 +20,22 @@
/// Writes a reference to [value] to this data sink. If [value] has not yet
/// been serialized, [f] is called to serialize the value itself.
- void writeCached<E>(E value, void f(E value));
+ void writeCached<E>(E value, void Function(E value) f);
/// Writes the potentially `null` [value] to this data sink. If [value] is
/// non-null [f] is called to write the non-null value to the data sink.
///
/// This is a convenience method to be used together with
/// [DataSource.readValueOrNull].
- void writeValueOrNull<E>(E value, void f(E value));
+ void writeValueOrNull<E>(E value, void Function(E value) f);
/// Writes the [values] to this data sink calling [f] to write each value to
/// the data sink. If [allowNull] is `true`, [values] is allowed to be `null`.
///
/// This is a convenience method to be used together with
/// [DataSource.readList].
- void writeList<E>(Iterable<E> values, void f(E value),
- {bool allowNull: false});
+ void writeList<E>(Iterable<E> values, void Function(E value) f,
+ {bool allowNull = false});
/// Writes the boolean [value] to this data sink.
void writeBool(bool value);
@@ -63,7 +63,7 @@
///
/// This is a convenience method to be used together with
/// [DataSource.readStrings].
- void writeStrings(Iterable<String> values, {bool allowNull: false});
+ void writeStrings(Iterable<String> values, {bool allowNull = false});
/// Writes the [map] from string to [V] values to this data sink, calling [f]
/// to write each value to the data sink. If [allowNull] is `true`, [map] is
@@ -71,8 +71,8 @@
///
/// This is a convenience method to be used together with
/// [DataSource.readStringMap].
- void writeStringMap<V>(Map<String, V> map, void f(V value),
- {bool allowNull: false});
+ void writeStringMap<V>(Map<String, V> map, void Function(V value) f,
+ {bool allowNull = false});
/// Writes the enum value [value] to this data sink.
// TODO(johnniwinther): Change the signature to
@@ -103,7 +103,7 @@
}
@override
- void writeStrings(Iterable<String> values, {bool allowNull: false}) {
+ void writeStrings(Iterable<String> values, {bool allowNull = false}) {
if (values == null) {
assert(allowNull);
writeInt(0);
@@ -116,8 +116,8 @@
}
@override
- void writeStringMap<V>(Map<String, V> map, void f(V value),
- {bool allowNull: false}) {
+ void writeStringMap<V>(Map<String, V> map, void Function(V value) f,
+ {bool allowNull = false}) {
if (map == null) {
assert(allowNull);
writeInt(0);
@@ -131,8 +131,8 @@
}
@override
- void writeList<E>(Iterable<E> values, void f(E value),
- {bool allowNull: false}) {
+ void writeList<E>(Iterable<E> values, void Function(E value) f,
+ {bool allowNull = false}) {
if (values == null) {
assert(allowNull);
writeInt(0);
@@ -143,7 +143,7 @@
}
@override
- void writeValueOrNull<E>(E value, void f(E value)) {
+ void writeValueOrNull<E>(E value, void Function(E value) f) {
writeBool(value != null);
if (value != null) {
f(value);
@@ -162,7 +162,7 @@
///
/// If [value] has not been canonicalized yet, [writeValue] is called to
/// serialize the [value] itself.
- void write(E value, void writeValue(E value)) {
+ void write(E value, void Function(E value) writeValue) {
int index = _cache[value];
if (index == null) {
index = _cache.length;
@@ -180,17 +180,16 @@
abstract class AbstractDataSink extends DataSinkMixin implements DataSink {
IndexedSink<String> _stringIndex;
IndexedSink<Uri> _uriIndex;
- Map<Type, IndexedSink> _generalCaches = {};
+ final Map<Type, IndexedSink> _generalCaches = {};
AbstractDataSink() {
- _stringIndex = new IndexedSink<String>(_writeIntInternal);
- _uriIndex = new IndexedSink<Uri>(_writeIntInternal);
+ _stringIndex = IndexedSink<String>(_writeIntInternal);
+ _uriIndex = IndexedSink<Uri>(_writeIntInternal);
}
@override
- void writeCached<E>(E value, void f(E value)) {
- IndexedSink sink =
- _generalCaches[E] ??= new IndexedSink<E>(_writeIntInternal);
+ void writeCached<E>(E value, void Function(E value) f) {
+ IndexedSink sink = _generalCaches[E] ??= IndexedSink<E>(_writeIntInternal);
sink.write(value, (v) => f(v));
}
@@ -254,7 +253,7 @@
BufferedSink _bufferedSink;
int _length = 0;
- BinarySink(this.sink) : _bufferedSink = new BufferedSink(sink);
+ BinarySink(this.sink) : _bufferedSink = BufferedSink(sink);
@override
void _writeUriInternal(Uri value) {
@@ -290,6 +289,7 @@
_writeIntInternal(value.index);
}
+ @override
void close() {
_bufferedSink.flushAndDestroy();
_bufferedSink = null;
@@ -297,6 +297,7 @@
}
/// Returns the number of bytes written to this data sink.
+ @override
int get length => _length;
}
@@ -304,15 +305,15 @@
// TODO(sigmund): share with the implementation in
// package:kernel/binary/ast_to_binary.dart
class BufferedSink {
- static const int SIZE = 100000;
- static const int SAFE_SIZE = SIZE - 5;
- static const int SMALL = 10000;
+ static const int _size = 100000;
+ static const int _safeSize = _size - 5;
+ static const int _small = 10000;
final Sink<List<int>> _sink;
- Uint8List _buffer = new Uint8List(SIZE);
+ Uint8List _buffer = Uint8List(_size);
int length = 0;
int flushedLength = 0;
- Float64List _doubleBuffer = new Float64List(1);
+ final Float64List _doubleBuffer = Float64List(1);
Uint8List _doubleBufferUint8;
int get offset => length + flushedLength;
@@ -330,16 +331,16 @@
void addByte(int byte) {
_buffer[length++] = byte;
- if (length == SIZE) {
+ if (length == _size) {
_sink.add(_buffer);
- _buffer = new Uint8List(SIZE);
+ _buffer = Uint8List(_size);
length = 0;
- flushedLength += SIZE;
+ flushedLength += _size;
}
}
void addByte2(int byte1, int byte2) {
- if (length < SAFE_SIZE) {
+ if (length < _safeSize) {
_buffer[length++] = byte1;
_buffer[length++] = byte2;
} else {
@@ -349,7 +350,7 @@
}
void addByte4(int byte1, int byte2, int byte3, int byte4) {
- if (length < SAFE_SIZE) {
+ if (length < _safeSize) {
_buffer[length++] = byte1;
_buffer[length++] = byte2;
_buffer[length++] = byte3;
@@ -365,22 +366,22 @@
void addBytes(List<int> bytes) {
// Avoid copying a large buffer into the another large buffer. Also, if
// the bytes buffer is too large to fit in our own buffer, just emit both.
- if (length + bytes.length < SIZE &&
- (bytes.length < SMALL || length < SMALL)) {
+ if (length + bytes.length < _size &&
+ (bytes.length < _small || length < _small)) {
_buffer.setRange(length, length + bytes.length, bytes);
length += bytes.length;
- } else if (bytes.length < SMALL) {
+ } else if (bytes.length < _small) {
// Flush as much as we can in the current buffer.
- _buffer.setRange(length, SIZE, bytes);
+ _buffer.setRange(length, _size, bytes);
_sink.add(_buffer);
// Copy over the remainder into a new buffer. It is guaranteed to fit
// because the input byte array is small.
- int alreadyEmitted = SIZE - length;
+ int alreadyEmitted = _size - length;
int remainder = bytes.length - alreadyEmitted;
- _buffer = new Uint8List(SIZE);
+ _buffer = Uint8List(_size);
_buffer.setRange(0, remainder, bytes, alreadyEmitted);
length = remainder;
- flushedLength += SIZE;
+ flushedLength += _size;
} else {
flush();
_sink.add(bytes);
@@ -390,7 +391,7 @@
void flush() {
_sink.add(_buffer.sublist(0, length));
- _buffer = new Uint8List(SIZE);
+ _buffer = Uint8List(_size);
flushedLength += length;
length = 0;
}
diff --git a/pkg/dart2js_info/lib/src/binary/source.dart b/pkg/dart2js_info/lib/src/binary/source.dart
index 5ada983..d423f3f 100644
--- a/pkg/dart2js_info/lib/src/binary/source.dart
+++ b/pkg/dart2js_info/lib/src/binary/source.dart
@@ -2,29 +2,29 @@
// 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 'dart:typed_data';
import 'dart:convert';
+import 'dart:typed_data';
/// Interface for deserialization.
// TODO(sigmund): share this with pkg:compiler/src/serialization/*
abstract class DataSource {
/// Reads a reference to an [E] value from this data source. If the value has
/// not yet been deserialized, [f] is called to deserialize the value itself.
- E readCached<E>(E f());
+ E readCached<E>(E Function() f);
/// Reads a potentially `null` [E] value from this data source, calling [f] to
/// read the non-null value from the data source.
///
/// This is a convenience method to be used together with
/// [DataSink.writeValueOrNull].
- E readValueOrNull<E>(E f());
+ E readValueOrNull<E>(E Function() f);
/// Reads a list of [E] values from this data source. If [emptyAsNull] is
/// `true`, `null` is returned instead of an empty list.
///
/// This is a convenience method to be used together with
/// [DataSink.writeList].
- List<E> readList<E>(E f(), {bool emptyAsNull: false});
+ List<E> readList<E>(E Function() f, {bool emptyAsNull = false});
/// Reads a boolean value from this data source.
bool readBool();
@@ -53,7 +53,7 @@
///
/// This is a convenience method to be used together with
/// [DataSink.writeStrings].
- List<String> readStrings({bool emptyAsNull: false});
+ List<String> readStrings({bool emptyAsNull = false});
/// Reads a map from string values to [V] values from this data source,
/// calling [f] to read each value from the data source. If [emptyAsNull] is
@@ -61,7 +61,7 @@
///
/// This is a convenience method to be used together with
/// [DataSink.writeStringMap].
- Map<String, V> readStringMap<V>(V f(), {bool emptyAsNull: false});
+ Map<String, V> readStringMap<V>(V Function() f, {bool emptyAsNull = false});
/// Reads an enum value from the list of enum [values] from this data source.
///
@@ -81,7 +81,7 @@
/// Mixin that implements all convenience methods of [DataSource].
abstract class DataSourceMixin implements DataSource {
@override
- E readValueOrNull<E>(E f()) {
+ E readValueOrNull<E>(E Function() f) {
bool hasValue = readBool();
if (hasValue) {
return f();
@@ -90,14 +90,10 @@
}
@override
- List<E> readList<E>(E f(), {bool emptyAsNull: false}) {
+ List<E> readList<E>(E Function() f, {bool emptyAsNull = false}) {
int count = readInt();
if (count == 0 && emptyAsNull) return null;
- List<E> list = new List<E>(count);
- for (int i = 0; i < count; i++) {
- list[i] = f();
- }
- return list;
+ return List.generate(count, (i) => f());
}
@override
@@ -119,18 +115,14 @@
}
@override
- List<String> readStrings({bool emptyAsNull: false}) {
+ List<String> readStrings({bool emptyAsNull = false}) {
int count = readInt();
if (count == 0 && emptyAsNull) return null;
- List<String> list = new List<String>(count);
- for (int i = 0; i < count; i++) {
- list[i] = readString();
- }
- return list;
+ return List.generate(count, (index) => readString());
}
@override
- Map<String, V> readStringMap<V>(V f(), {bool emptyAsNull: false}) {
+ Map<String, V> readStringMap<V>(V Function() f, {bool emptyAsNull = false}) {
int count = readInt();
if (count == 0 && emptyAsNull) return null;
Map<String, V> map = {};
@@ -147,7 +139,7 @@
class IndexedSource<E> {
final int Function() _readInt;
final List<E> _cache = [];
- final Set<int> _pending = new Set();
+ final Set<int> _pending = {};
IndexedSource(this._readInt);
@@ -155,7 +147,7 @@
///
/// If the value hasn't yet been read, [readValue] is called to deserialize
/// the value itself.
- E read(E readValue()) {
+ E read(E Function() readValue) {
int index = _readInt();
if (_pending.contains(index)) throw "serialization cycles not supported";
if (index >= _cache.length) {
@@ -177,17 +169,17 @@
implements DataSource {
IndexedSource<String> _stringIndex;
IndexedSource<Uri> _uriIndex;
- Map<Type, IndexedSource> _generalCaches = {};
+ final Map<Type, IndexedSource> _generalCaches = {};
AbstractDataSource() {
- _stringIndex = new IndexedSource<String>(_readIntInternal);
- _uriIndex = new IndexedSource<Uri>(_readIntInternal);
+ _stringIndex = IndexedSource<String>(_readIntInternal);
+ _uriIndex = IndexedSource<Uri>(_readIntInternal);
}
@override
- E readCached<E>(E f()) {
+ E readCached<E>(E Function() f) {
IndexedSource source =
- _generalCaches[E] ??= new IndexedSource<E>(_readIntInternal);
+ _generalCaches[E] ??= IndexedSource<E>(_readIntInternal);
return source.read(f);
}
@@ -254,7 +246,7 @@
@override
String _readStringInternal() {
int length = _readIntInternal();
- List<int> bytes = new Uint8List(length);
+ List<int> bytes = Uint8List(length);
bytes.setRange(0, bytes.length, _bytes, _byteOffset);
_byteOffset += bytes.length;
return utf8.decode(bytes);
diff --git a/pkg/dart2js_info/lib/src/diff.dart b/pkg/dart2js_info/lib/src/diff.dart
index 500f935..29dd698 100644
--- a/pkg/dart2js_info/lib/src/diff.dart
+++ b/pkg/dart2js_info/lib/src/diff.dart
@@ -29,12 +29,12 @@
}
List<Diff> diff(AllInfo oldInfo, AllInfo newInfo) {
- var differ = new _InfoDiffer(oldInfo, newInfo);
+ var differ = _InfoDiffer(oldInfo, newInfo);
differ.diff();
return differ.diffs;
}
-class _InfoDiffer extends InfoVisitor<Null> {
+class _InfoDiffer extends InfoVisitor<void> {
final AllInfo _old;
final AllInfo _new;
@@ -50,23 +50,23 @@
@override
visitAll(AllInfo info) {
- throw new StateError('should not diff AllInfo');
+ throw StateError('should not diff AllInfo');
}
@override
visitProgram(ProgramInfo info) {
- throw new StateError('should not diff ProgramInfo');
+ throw StateError('should not diff ProgramInfo');
}
@override
visitOutput(OutputUnitInfo info) {
- throw new StateError('should not diff OutputUnitInfo');
+ throw StateError('should not diff OutputUnitInfo');
}
// TODO(het): diff constants
@override
visitConstant(ConstantInfo info) {
- throw new StateError('should not diff ConstantInfo');
+ throw StateError('should not diff ConstantInfo');
}
@override
@@ -127,7 +127,7 @@
void _checkSize(BasicInfo info, BasicInfo other) {
if (info.size != other.size) {
- diffs.add(new SizeDiff(info, other.size - info.size));
+ diffs.add(SizeDiff(info, other.size - info.size));
}
}
@@ -135,7 +135,7 @@
var oldIsDeferred = _isDeferred(oldInfo);
var newIsDeferred = _isDeferred(newInfo);
if (oldIsDeferred != newIsDeferred) {
- diffs.add(new DeferredStatusDiff(oldInfo, oldIsDeferred));
+ diffs.add(DeferredStatusDiff(oldInfo, oldIsDeferred));
}
}
@@ -157,7 +157,7 @@
}
for (var oldName in oldNames.keys) {
if (newNames[oldName] == null) {
- diffs.add(new RemoveDiff(oldNames[oldName]));
+ diffs.add(RemoveDiff(oldNames[oldName]));
} else {
_other = newNames[oldName];
oldNames[oldName].accept(this);
@@ -165,7 +165,7 @@
}
for (var newName in newNames.keys) {
if (oldNames[newName] == null) {
- diffs.add(new AddDiff(newNames[newName]));
+ diffs.add(AddDiff(newNames[newName]));
}
}
}
diff --git a/pkg/dart2js_info/lib/src/graph.dart b/pkg/dart2js_info/lib/src/graph.dart
index 1eaabce..9233d9f 100644
--- a/pkg/dart2js_info/lib/src/graph.dart
+++ b/pkg/dart2js_info/lib/src/graph.dart
@@ -25,13 +25,13 @@
/// of nodes. The nodes in each strongly connected components only have edges
/// that point to nodes in the same component or earlier components.
List<List<N>> computeTopologicalSort() {
- _SccFinder<N> finder = new _SccFinder<N>(this);
+ _SccFinder<N> finder = _SccFinder<N>(this);
return finder.computeTopologicalSort();
}
/// Whether [source] can transitively reach [target].
bool containsPath(N source, N target) {
- Set<N> seen = new Set<N>();
+ Set<N> seen = <N>{};
bool helper(N node) {
if (identical(node, target)) return true;
if (!seen.add(node)) return false;
@@ -43,7 +43,7 @@
/// Returns all nodes reachable from [root] in post order.
Iterable<N> postOrder(N root) sync* {
- var seen = new Set<N>();
+ var seen = <N>{};
Iterable<N> helper(N n) sync* {
if (!seen.add(n)) return;
for (var x in targetsOf(n)) {
@@ -57,7 +57,7 @@
/// Returns an iterable of all nodes reachable from [root] in preorder.
Iterable<N> preOrder(N root) sync* {
- var seen = new Set<N>();
+ var seen = <N>{};
var stack = <N>[root];
while (stack.isNotEmpty) {
var next = stack.removeLast();
@@ -74,7 +74,7 @@
/// the node itself will be returned.
List<N> findCycleContaining(N node) {
assert(node != null);
- _SccFinder<N> finder = new _SccFinder<N>(this);
+ _SccFinder<N> finder = _SccFinder<N>(this);
return finder._componentContaining(node);
}
@@ -103,8 +103,8 @@
/// Internally we compute dominators using (Cooper, Harvey, and Kennedy's
/// algorithm)[http://www.cs.rice.edu/~keith/EMBED/dom.pdf].
Graph<N> dominatorTree(N root) {
- var iDom = (new _DominatorFinder(this)..run(root)).immediateDominators;
- var graph = new EdgeListGraph<N>();
+ var iDom = (_DominatorFinder(this)..run(root)).immediateDominators;
+ var graph = EdgeListGraph<N>();
for (N node in iDom.keys) {
if (node != root) graph.addEdge(iDom[node], node);
}
@@ -114,18 +114,23 @@
class EdgeListGraph<N> extends Graph<N> {
/// Edges in the graph.
- Map<N, Set<N>> _edges = new Map<N, Set<N>>();
+ final Map<N, Set<N>> _edges = <N, Set<N>>{};
/// The reverse of _edges.
- Map<N, Set<N>> _revEdges = new Map<N, Set<N>>();
+ final Map<N, Set<N>> _revEdges = <N, Set<N>>{};
+ @override
Iterable<N> get nodes => _edges.keys;
+ @override
bool get isEmpty => _edges.isEmpty;
+ @override
int get nodeCount => _edges.length;
- final _empty = new Set<N>();
+ final _empty = <N>{};
+ @override
Iterable<N> targetsOf(N source) => _edges[source] ?? _empty;
+ @override
Iterable<N> sourcesOf(N source) => _revEdges[source] ?? _empty;
void addEdge(N source, N target) {
@@ -139,8 +144,8 @@
void addNode(N node) {
assert(node != null);
- _edges.putIfAbsent(node, () => new Set<N>());
- _revEdges.putIfAbsent(node, () => new Set<N>());
+ _edges.putIfAbsent(node, () => <N>{});
+ _revEdges.putIfAbsent(node, () => <N>{});
}
/// Remove the edge from the given [source] node to the given [target] node.
@@ -200,15 +205,15 @@
int _index = 0;
/// Nodes that are being visited in order to identify components.
- List<N> _stack = new List<N>();
+ final List<N> _stack = <N>[];
/// Information associated with each node.
- Map<N, _NodeInfo<N>> _info = <N, _NodeInfo<N>>{};
+ final Map<N, _NodeInfo<N>> _info = <N, _NodeInfo<N>>{};
/// All strongly connected components found, in topological sort order (each
/// node in a strongly connected component only has edges that point to nodes
/// in the same component or earlier components).
- List<List<N>> _allComponents = new List<List<N>>();
+ final List<List<N>> _allComponents = <List<N>>[];
_SccFinder(this._graph);
@@ -246,7 +251,7 @@
/// component.
_NodeInfo<N> _strongConnect(N v) {
// Set the depth index for v to the smallest unused index
- var vInfo = new _NodeInfo<N>(_index++);
+ var vInfo = _NodeInfo<N>(_index++);
_info[v] = vInfo;
_push(v);
@@ -264,7 +269,7 @@
// If v is a root node, pop the stack and generate an SCC
if (vInfo.lowlink == vInfo.index) {
- var component = new List<N>();
+ var component = <N>[];
N w;
do {
w = _pop();
diff --git a/pkg/dart2js_info/lib/src/io.dart b/pkg/dart2js_info/lib/src/io.dart
index b37c331..affc8de 100644
--- a/pkg/dart2js_info/lib/src/io.dart
+++ b/pkg/dart2js_info/lib/src/io.dart
@@ -6,9 +6,9 @@
import 'package:dart2js_info/binary_serialization.dart' as binary;
Future<AllInfo> infoFromFile(String fileName) async {
- var file = new File(fileName);
+ var file = File(fileName);
if (fileName.endsWith('.json')) {
- return new AllInfoJsonCodec().decode(jsonDecode(await file.readAsString()));
+ return AllInfoJsonCodec().decode(jsonDecode(await file.readAsString()));
} else {
return binary.decode(file.readAsBytesSync());
}
diff --git a/pkg/dart2js_info/lib/src/string_edit_buffer.dart b/pkg/dart2js_info/lib/src/string_edit_buffer.dart
index dc314f7..7630bf2 100644
--- a/pkg/dart2js_info/lib/src/string_edit_buffer.dart
+++ b/pkg/dart2js_info/lib/src/string_edit_buffer.dart
@@ -18,12 +18,12 @@
StringEditBuffer(this.original);
- bool get hasEdits => _edits.length > 0;
+ bool get hasEdits => _edits.isNotEmpty;
/// Edit the original text, replacing text on the range [begin] and
/// exclusive [end] with the [replacement] string.
void replace(int begin, int end, String replacement, [int sortId]) {
- _edits.add(new _StringEdit(begin, end, replacement, sortId));
+ _edits.add(_StringEdit(begin, end, replacement, sortId));
}
/// Insert [string] at [offset].
@@ -43,9 +43,10 @@
///
/// Throws [UnsupportedError] if the edits were overlapping. If no edits were
/// made, the original string will be returned.
+ @override
String toString() {
- var sb = new StringBuffer();
- if (_edits.length == 0) return original;
+ var sb = StringBuffer();
+ if (_edits.isEmpty) return original;
// Sort edits by start location.
_edits.sort();
@@ -53,7 +54,7 @@
int consumed = 0;
for (var edit in _edits) {
if (consumed > edit.begin) {
- sb = new StringBuffer();
+ sb = StringBuffer();
sb.write('overlapping edits. Insert at offset ');
sb.write(edit.begin);
sb.write(' but have consumed ');
@@ -63,7 +64,7 @@
sb.write('\n ');
sb.write(e);
}
- throw new UnsupportedError(sb.toString());
+ throw UnsupportedError(sb.toString());
}
// Add characters from the original string between this edit and the last
@@ -94,14 +95,15 @@
// String to insert
final String string;
- _StringEdit(int begin, this.end, this.string, [int sortId])
- : begin = begin,
- sortId = sortId == null ? begin : sortId;
+ _StringEdit(this.begin, this.end, this.string, [int sortId])
+ : sortId = sortId ?? begin;
int get length => end - begin;
+ @override
String toString() => '(Edit @ $begin,$end: "$string")';
+ @override
int compareTo(_StringEdit other) {
int diff = begin - other.begin;
if (diff != 0) return diff;
diff --git a/pkg/dart2js_info/lib/src/table.dart b/pkg/dart2js_info/lib/src/table.dart
index 85abcd3..23f44f0 100644
--- a/pkg/dart2js_info/lib/src/table.dart
+++ b/pkg/dart2js_info/lib/src/table.dart
@@ -28,7 +28,7 @@
List<List> rows = [];
/// Columns to skip, for example, if they are all zero entries.
- List<bool> _skipped = <bool>[];
+ final List<bool> _skipped = <bool>[];
/// Whether we started adding entries. Indicates that no more columns can be
/// added.
@@ -39,14 +39,16 @@
/// Add a column with the given [name].
void declareColumn(String name,
- {bool abbreviate: false, String color: _NO_COLOR}) {
+ {bool abbreviate = false, String color = _noColor}) {
assert(!_sealed);
var headerName = name;
if (abbreviate) {
// abbreviate the header by using only the initials of each word
headerName =
name.split(' ').map((s) => s.substring(0, 1).toUpperCase()).join('');
- while (abbreviations[headerName] != null) headerName = "$headerName'";
+ while (abbreviations[headerName] != null) {
+ headerName = "$headerName'";
+ }
abbreviations[headerName] = name;
}
widths.add(max(5, headerName.length + 1));
@@ -94,11 +96,12 @@
/// Generates a string representation of the table to print on a terminal.
// TODO(sigmund): add also a .csv format
+ @override
String toString() {
- var sb = new StringBuffer();
+ var sb = StringBuffer();
sb.write('\n');
for (var row in rows) {
- var lastColor = _NO_COLOR;
+ var lastColor = _noColor;
for (int i = 0; i < _totalColumns; i++) {
if (_skipped[i]) continue;
var entry = row[i];
@@ -111,7 +114,7 @@
sb.write(
i == 0 ? entry.padRight(widths[i]) : entry.padLeft(widths[i] + 1));
}
- if (lastColor != _NO_COLOR) sb.write(_NO_COLOR);
+ if (lastColor != _noColor) sb.write(_noColor);
sb.write('\n');
}
sb.write('\nWhere:\n');
@@ -123,4 +126,4 @@
}
}
-const _NO_COLOR = "\x1b[0m";
+const _noColor = "\x1b[0m";
diff --git a/pkg/dart2js_info/lib/src/util.dart b/pkg/dart2js_info/lib/src/util.dart
index 31e9ffc..2566c76 100644
--- a/pkg/dart2js_info/lib/src/util.dart
+++ b/pkg/dart2js_info/lib/src/util.dart
@@ -18,7 +18,7 @@
// of them.
// TODO(sigmund): create a concrete implementation of InfoGraph, instead of
// using the EdgeListGraph.
- var graph = new EdgeListGraph<Info>();
+ var graph = EdgeListGraph<Info>();
for (var f in info.functions) {
graph.addNode(f);
for (var g in f.uses) {
@@ -48,13 +48,13 @@
/// Provide a unique long name associated with [info].
// TODO(sigmund): guarantee that the name is actually unique.
-String longName(Info info, {bool useLibraryUri: false, bool forId: false}) {
+String longName(Info info, {bool useLibraryUri = false, bool forId = false}) {
var infoPath = [];
while (info != null) {
infoPath.add(info);
info = info.parent;
}
- var sb = new StringBuffer();
+ var sb = StringBuffer();
var first = true;
for (var segment in infoPath.reversed) {
if (!first) sb.write('.');
@@ -91,7 +91,7 @@
}
/// Produce a string containing [value] padded with white space up to [n] chars.
-pad(value, n, {bool right: false}) {
+pad(value, n, {bool right = false}) {
var s = '$value';
if (s.length >= n) return s;
var pad = ' ' * (n - s.length);
diff --git a/pkg/dart2js_info/pubspec.yaml b/pkg/dart2js_info/pubspec.yaml
index 77980f6..441e3ae 100644
--- a/pkg/dart2js_info/pubspec.yaml
+++ b/pkg/dart2js_info/pubspec.yaml
@@ -1,24 +1,24 @@
name: dart2js_info
-version: 0.6.5
+publish_to: none
description: >-
Libraries and tools to process data produced when running dart2js with
--dump-info.
-homepage: https://github.com/dart-lang/dart2js_info/
environment:
- sdk: '>=2.3.0 <3.0.0'
+ sdk: '>=2.11.99 <3.0.0'
dependencies:
- args: ^1.4.3
+ args: ^2.3.0
collection: ^1.10.1
fixnum: '>=0.10.5 <2.0.0'
path: ^1.3.6
protobuf: '>=1.0.1 <3.0.0'
- shelf: ^0.7.3
- yaml: ^2.1.0
+ shelf: ^1.2.0
+ yaml: ^3.1.0
dev_dependencies:
+ lints: ^1.0.0
test: ^1.2.0
executables:
diff --git a/pkg/dart2js_info/test/binary_serialization_test.dart b/pkg/dart2js_info/test/binary_serialization_test.dart
index 116003e..b622d04 100644
--- a/pkg/dart2js_info/test/binary_serialization_test.dart
+++ b/pkg/dart2js_info/test/binary_serialization_test.dart
@@ -12,15 +12,17 @@
class ByteSink implements Sink<List<int>> {
BytesBuilder builder = BytesBuilder();
+ @override
add(List<int> data) => builder.add(data);
+ @override
close() {}
}
main() {
group('json to proto conversion with deferred files', () {
test('hello_world_deferred', () {
- var uri = Platform.script.resolve(
- 'hello_world_deferred/hello_world_deferred.js.info.json');
+ var uri = Platform.script
+ .resolve('hello_world_deferred/hello_world_deferred.js.info.json');
var helloWorld = File.fromUri(uri);
var contents = helloWorld.readAsStringSync();
var json = jsonDecode(contents);
diff --git a/pkg/dart2js_info/test/graph_test.dart b/pkg/dart2js_info/test/graph_test.dart
index 4934adf..71afc23 100644
--- a/pkg/dart2js_info/test/graph_test.dart
+++ b/pkg/dart2js_info/test/graph_test.dart
@@ -60,7 +60,7 @@
/// C
/// ```
Graph<String> makeTestGraph() {
- var graph = new EdgeListGraph<String>();
+ var graph = EdgeListGraph<String>();
graph.addEdge('A', 'B');
graph.addEdge('A', 'D');
graph.addEdge('A', 'E');
diff --git a/pkg/dart2js_info/test/json_to_proto_deferred_test.dart b/pkg/dart2js_info/test/json_to_proto_deferred_test.dart
index 70d7681..fc0af00 100644
--- a/pkg/dart2js_info/test/json_to_proto_deferred_test.dart
+++ b/pkg/dart2js_info/test/json_to_proto_deferred_test.dart
@@ -12,8 +12,8 @@
main() {
group('json to proto conversion with deferred files', () {
test('hello_world_deferred', () {
- var uri = Platform.script.resolve(
- 'hello_world_deferred/hello_world_deferred.js.info.json');
+ var uri = Platform.script
+ .resolve('hello_world_deferred/hello_world_deferred.js.info.json');
final helloWorld = File.fromUri(uri);
final json = jsonDecode(helloWorld.readAsStringSync());
final decoded = AllInfoJsonCodec().decode(json);
diff --git a/pkg/dart2js_info/test/json_to_proto_test.dart b/pkg/dart2js_info/test/json_to_proto_test.dart
index 8393827..67f7ef0 100644
--- a/pkg/dart2js_info/test/json_to_proto_test.dart
+++ b/pkg/dart2js_info/test/json_to_proto_test.dart
@@ -13,8 +13,7 @@
main() {
group('json to proto conversion', () {
test('hello_world', () {
- var uri = Platform.script.resolve(
- 'hello_world/hello_world.js.info.json');
+ var uri = Platform.script.resolve('hello_world/hello_world.js.info.json');
final helloWorld = File.fromUri(uri);
final json = jsonDecode(helloWorld.readAsStringSync());
final decoded = AllInfoJsonCodec().decode(json);
@@ -33,8 +32,7 @@
});
test('has proper id format', () {
- var uri = Platform.script.resolve(
- 'hello_world/hello_world.js.info.json');
+ var uri = Platform.script.resolve('hello_world/hello_world.js.info.json');
final helloWorld = File.fromUri(uri);
final json = jsonDecode(helloWorld.readAsStringSync());
final decoded = AllInfoJsonCodec().decode(json);
@@ -54,8 +52,8 @@
expect(
value.serializedId, startsWith(expectedPrefixes[InfoKind.clazz]));
} else if (value.hasClassTypeInfo()) {
- expect(
- value.serializedId, startsWith(expectedPrefixes[InfoKind.classType]));
+ expect(value.serializedId,
+ startsWith(expectedPrefixes[InfoKind.classType]));
} else if (value.hasFunctionInfo()) {
expect(value.serializedId,
startsWith(expectedPrefixes[InfoKind.function]));
diff --git a/pkg/dart2js_info/test/parse_test.dart b/pkg/dart2js_info/test/parse_test.dart
index bc0cfed..bc5883b 100644
--- a/pkg/dart2js_info/test/parse_test.dart
+++ b/pkg/dart2js_info/test/parse_test.dart
@@ -11,8 +11,7 @@
main() {
group('parse', () {
test('hello_world', () {
- var uri =
- Platform.script.resolve('hello_world/hello_world.js.info.json');
+ var uri = Platform.script.resolve('hello_world/hello_world.js.info.json');
var helloWorld = File.fromUri(uri);
var json = jsonDecode(helloWorld.readAsStringSync());
var decoded = AllInfoJsonCodec().decode(json);
@@ -24,9 +23,9 @@
expect(program.size, 94182);
expect(program.compilationMoment,
DateTime.parse("2021-09-27 15:32:00.380236"));
- expect(program.compilationDuration, new Duration(microseconds: 2848001));
- expect(program.toJsonDuration, new Duration(milliseconds: 3));
- expect(program.dumpInfoDuration, new Duration(seconds: 0));
+ expect(program.compilationDuration, Duration(microseconds: 2848001));
+ expect(program.toJsonDuration, Duration(milliseconds: 3));
+ expect(program.dumpInfoDuration, Duration(seconds: 0));
expect(program.noSuchMethodEnabled, false);
expect(program.minified, false);
});
diff --git a/tools/VERSION b/tools/VERSION
index 3cd4c9b..5ea786d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 15
PATCH 0
-PRERELEASE 230
+PRERELEASE 231
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index f1079d2..9c1191c 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -3248,6 +3248,15 @@
]
},
{
+ "name": "analyze pkg/dart2js_info",
+ "script": "out/ReleaseX64/dart-sdk/bin/dart",
+ "arguments": [
+ "analyze",
+ "--fatal-infos",
+ "pkg/dart2js_info"
+ ]
+ },
+ {
"name": "analyze pkg/dart2js_tools",
"script": "out/ReleaseX64/dart-sdk/bin/dart",
"arguments": [