Skip to content

Commit

Permalink
Declare locals final where possible (#255)
Browse files Browse the repository at this point in the history
This makes it easier to reason about the code. Enables the prefer_final_locals
lint.
  • Loading branch information
cbracken committed May 14, 2019
1 parent 4add8bd commit 3453196
Show file tree
Hide file tree
Showing 17 changed files with 188 additions and 189 deletions.
2 changes: 1 addition & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ linter:
- package_api_docs
- package_prefixed_library_names
- prefer_equal_for_default_values
# - prefer_final_locals
- prefer_final_locals
- prefer_generic_function_type_aliases
- prefer_is_not_empty
# - public_member_api_docs
Expand Down
12 changes: 6 additions & 6 deletions bin/collect_coverage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ Future<Null> main(List<String> arguments) async {
print('${rec.level.name}: ${rec.time}: ${rec.message}');
});

var options = _parseArgs(arguments);
final options = _parseArgs(arguments);
await Chain.capture(() async {
var coverage = await collect(
final coverage = await collect(
options.serviceUri, options.resume, options.waitPaused,
timeout: options.timeout);
options.out.write(json.encode(coverage));
Expand All @@ -45,7 +45,7 @@ class Options {
}

Options _parseArgs(List<String> arguments) {
var parser = ArgParser()
final parser = ArgParser()
..addOption('host',
abbr: 'H',
help: 'remote VM host. DEPRECATED: use --uri',
Expand All @@ -67,7 +67,7 @@ Options _parseArgs(List<String> arguments) {
abbr: 'r', defaultsTo: false, help: 'resume all isolates on exit')
..addFlag('help', abbr: 'h', negatable: false, help: 'show this help');

var args = parser.parse(arguments);
final args = parser.parse(arguments);

void printUsage() {
print('Usage: dart collect_coverage.dart --uri=http://... [OPTION...]\n');
Expand Down Expand Up @@ -102,10 +102,10 @@ Options _parseArgs(List<String> arguments) {
if (args['out'] == 'stdout') {
out = stdout;
} else {
var outfile = File(args['out'])..createSync(recursive: true);
final outfile = File(args['out'])..createSync(recursive: true);
out = outfile.openWrite();
}
var timeout = (args['connect-timeout'] == null)
final timeout = (args['connect-timeout'] == null)
? null
: Duration(seconds: int.parse(args['connect-timeout']));
return Options(
Expand Down
20 changes: 10 additions & 10 deletions bin/format_coverage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class Environment {
Future<Null> main(List<String> arguments) async {
final env = parseArgs(arguments);

List<File> files = filesToProcess(env.input);
final List<File> files = filesToProcess(env.input);
if (env.verbose) {
print('Environment:');
print(' # files: ${files.length}');
Expand All @@ -41,22 +41,22 @@ Future<Null> main(List<String> arguments) async {
print(' report-on: ${env.reportOn}');
}

var clock = Stopwatch()..start();
var hitmap = await parseCoverage(files, env.workers);
final clock = Stopwatch()..start();
final hitmap = await parseCoverage(files, env.workers);

// All workers are done. Process the data.
if (env.verbose) {
print('Done creating global hitmap. Took ${clock.elapsedMilliseconds} ms.');
}

String output;
var resolver = env.bazel
final resolver = env.bazel
? BazelResolver(workspacePath: env.bazelWorkspace)
: Resolver(
packagesPath: env.packagesPath,
packageRoot: env.pkgRoot,
sdkRoot: env.sdkRoot);
var loader = Loader();
final loader = Loader();
if (env.prettyPrint) {
output =
await PrettyPrintFormatter(resolver, loader, reportOn: env.reportOn)
Expand Down Expand Up @@ -95,7 +95,7 @@ Future<Null> main(List<String> arguments) async {
/// processing.
Environment parseArgs(List<String> arguments) {
final env = Environment();
var parser = ArgParser();
final parser = ArgParser();

parser.addOption('sdk-root', abbr: 's', help: 'path to the SDK root');
parser.addOption('package-root', abbr: 'p', help: 'path to the package root');
Expand Down Expand Up @@ -126,7 +126,7 @@ Environment parseArgs(List<String> arguments) {
abbr: 'v', negatable: false, help: 'verbose output');
parser.addFlag('help', abbr: 'h', negatable: false, help: 'show this help');

var args = parser.parse(arguments);
final args = parser.parse(arguments);

void printUsage() {
print('Usage: dart format_coverage.dart [OPTION...]\n');
Expand Down Expand Up @@ -182,8 +182,8 @@ Environment parseArgs(List<String> arguments) {
if (args['out'] == 'stdout') {
env.output = stdout;
} else {
var outpath = p.absolute(p.normalize(args['out']));
var outfile = File(outpath)..createSync(recursive: true);
final outpath = p.absolute(p.normalize(args['out']));
final outfile = File(outpath)..createSync(recursive: true);
env.output = outfile.openWrite();
}

Expand Down Expand Up @@ -220,7 +220,7 @@ Environment parseArgs(List<String> arguments) {
/// are contained by it if it is a directory, or a [List] containing the file if
/// it is a file.
List<File> filesToProcess(String absPath) {
var filePattern = RegExp(r'^dart-cov-\d+-\d+.json$');
final filePattern = RegExp(r'^dart-cov-\d+-\d+.json$');
if (FileSystemEntity.isDirectorySync(absPath)) {
return Directory(absPath)
.listSync(recursive: true)
Expand Down
2 changes: 1 addition & 1 deletion bin/run_and_collect.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ import 'dart:async';
import 'package:coverage/src/run_and_collect.dart';

Future<Null> main(List<String> args) async {
Map results = await runAndCollect(args[0], packageRoot: args[1]);
final Map results = await runAndCollect(args[0], packageRoot: args[1]);
print(results);
}
44 changes: 22 additions & 22 deletions lib/src/collect.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ Future<Map<String, dynamic>> collect(
if (serviceUri == null) throw ArgumentError('serviceUri must not be null');

// Create websocket URI. Handle any trailing slashes.
var pathSegments = serviceUri.pathSegments.where((c) => c.isNotEmpty).toList()
..add('ws');
var uri = serviceUri.replace(scheme: 'ws', pathSegments: pathSegments);
final pathSegments =
serviceUri.pathSegments.where((c) => c.isNotEmpty).toList()..add('ws');
final uri = serviceUri.replace(scheme: 'ws', pathSegments: pathSegments);

VMServiceClient vmService;
await retry(() async {
Expand All @@ -58,22 +58,22 @@ Future<Map<String, dynamic>> collect(
}

Future<Map<String, dynamic>> _getAllCoverage(VMServiceClient service) async {
var vm = await service.getVM();
var allCoverage = <Map<String, dynamic>>[];
final vm = await service.getVM();
final allCoverage = <Map<String, dynamic>>[];

for (var isolateRef in vm.isolates) {
var isolate = await isolateRef.load();
var report = await isolate.getSourceReport(forceCompile: true);
var coverage = await _getCoverageJson(service, report);
final isolate = await isolateRef.load();
final report = await isolate.getSourceReport(forceCompile: true);
final coverage = await _getCoverageJson(service, report);
allCoverage.addAll(coverage);
}
return <String, dynamic>{'type': 'CodeCoverage', 'coverage': allCoverage};
}

Future _resumeIsolates(VMServiceClient service) async {
var vm = await service.getVM();
final vm = await service.getVM();
for (var isolateRef in vm.isolates) {
var isolate = await isolateRef.load();
final isolate = await isolateRef.load();
if (isolate.isPaused) {
await isolateRef.resume();
}
Expand All @@ -82,9 +82,9 @@ Future _resumeIsolates(VMServiceClient service) async {

Future _waitIsolatesPaused(VMServiceClient service, {Duration timeout}) async {
Future allPaused() async {
var vm = await service.getVM();
final vm = await service.getVM();
for (var isolateRef in vm.isolates) {
var isolate = await isolateRef.load();
final isolate = await isolateRef.load();
if (!isolate.isPaused) throw "Unpaused isolates remaining.";
}
}
Expand All @@ -95,33 +95,33 @@ Future _waitIsolatesPaused(VMServiceClient service, {Duration timeout}) async {
/// Returns a JSON coverage list backward-compatible with pre-1.16.0 SDKs.
Future<List<Map<String, dynamic>>> _getCoverageJson(
VMServiceClient service, VMSourceReport report) async {
var scriptRefs = report.ranges.map((r) => r.script).toSet();
var scripts = <VMScriptRef, VMScript>{};
final scriptRefs = report.ranges.map((r) => r.script).toSet();
final scripts = <VMScriptRef, VMScript>{};
for (var ref in scriptRefs) {
scripts[ref] = await ref.load();
}

// script uri -> { line -> hit count }
var hitMaps = <Uri, Map<int, int>>{};
final hitMaps = <Uri, Map<int, int>>{};
for (var range in report.ranges) {
// Not returned in scripts section of source report.
if (range.script.uri.scheme == 'evaluate') continue;

hitMaps.putIfAbsent(range.script.uri, () => <int, int>{});
var hitMap = hitMaps[range.script.uri];
var script = scripts[range.script];
final hitMap = hitMaps[range.script.uri];
final script = scripts[range.script];
for (VMScriptToken hit in range.hits ?? []) {
var line = script.sourceLocation(hit).line + 1;
final line = script.sourceLocation(hit).line + 1;
hitMap[line] = hitMap.containsKey(line) ? hitMap[line] + 1 : 1;
}
for (VMScriptToken miss in range.misses ?? []) {
var line = script.sourceLocation(miss).line + 1;
final line = script.sourceLocation(miss).line + 1;
hitMap.putIfAbsent(line, () => 0);
}
}

// Output JSON
var coverage = <Map<String, dynamic>>[];
final coverage = <Map<String, dynamic>>[];
hitMaps.forEach((uri, hitMap) {
coverage.add(_toScriptCoverageJson(uri, hitMap));
});
Expand All @@ -131,8 +131,8 @@ Future<List<Map<String, dynamic>>> _getCoverageJson(
/// Returns a JSON hit map backward-compatible with pre-1.16.0 SDKs.
Map<String, dynamic> _toScriptCoverageJson(
Uri scriptUri, Map<int, int> hitMap) {
var json = <String, dynamic>{};
var hits = <int>[];
final json = <String, dynamic>{};
final hits = <int>[];
hitMap.forEach((line, hitCount) {
hits.add(line);
hits.add(hitCount);
Expand Down
18 changes: 9 additions & 9 deletions lib/src/formatter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ class LcovFormatter implements Formatter {

@override
Future<String> format(Map hitmap) async {
_PathFilter pathFilter = _getPathFilter(reportOn);
var buf = StringBuffer();
final _PathFilter pathFilter = _getPathFilter(reportOn);
final buf = StringBuffer();
for (var key in hitmap.keys) {
Map<int, int> v = hitmap[key];
final Map<int, int> v = hitmap[key];
var source = resolver.resolve(key);
if (source == null) {
continue;
Expand Down Expand Up @@ -81,11 +81,11 @@ class PrettyPrintFormatter implements Formatter {

@override
Future<String> format(Map hitmap) async {
_PathFilter pathFilter = _getPathFilter(reportOn);
var buf = StringBuffer();
final _PathFilter pathFilter = _getPathFilter(reportOn);
final buf = StringBuffer();
for (var key in hitmap.keys) {
Map<int, int> v = hitmap[key];
var source = resolver.resolve(key);
final Map<int, int> v = hitmap[key];
final source = resolver.resolve(key);
if (source == null) {
continue;
}
Expand All @@ -94,7 +94,7 @@ class PrettyPrintFormatter implements Formatter {
continue;
}

var lines = await loader.load(source);
final lines = await loader.load(source);
if (lines == null) {
continue;
}
Expand All @@ -119,6 +119,6 @@ typedef _PathFilter = bool Function(String path);
_PathFilter _getPathFilter(List<String> reportOn) {
if (reportOn == null) return (String path) => true;

var absolutePaths = reportOn.map(p.absolute).toList();
final absolutePaths = reportOn.map(p.absolute).toList();
return (String path) => absolutePaths.any((item) => path.startsWith(item));
}
24 changes: 12 additions & 12 deletions lib/src/hitmap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,37 @@ import 'dart:io';
/// `jsonResult` is expected to be a List<Map<String, dynamic>>.
Map<String, Map<int, int>> createHitmap(List jsonResult) {
// Map of source file to map of line to hit count for that line.
var globalHitMap = <String, Map<int, int>>{};
final globalHitMap = <String, Map<int, int>>{};

void addToMap(Map<int, int> map, int line, int count) {
var oldCount = map.putIfAbsent(line, () => 0);
final oldCount = map.putIfAbsent(line, () => 0);
map[line] = count + oldCount;
}

for (Map<String, dynamic> e in jsonResult) {
String source = e['source'];
final String source = e['source'];
if (source == null) {
// Couldn't resolve import, so skip this entry.
continue;
}

var sourceHitMap = globalHitMap.putIfAbsent(source, () => <int, int>{});
List<dynamic> hits = e['hits'];
final sourceHitMap = globalHitMap.putIfAbsent(source, () => <int, int>{});
final List<dynamic> hits = e['hits'];
// hits is a flat array of the following format:
// [ <line|linerange>, <hitcount>,...]
// line: number.
// linerange: '<line>-<line>'.
for (var i = 0; i < hits.length; i += 2) {
dynamic k = hits[i];
final dynamic k = hits[i];
if (k is num) {
// Single line.
addToMap(sourceHitMap, k, hits[i + 1]);
} else {
assert(k is String);
// Linerange. We expand line ranges to actual lines at this point.
int splitPos = k.indexOf('-');
int start = int.parse(k.substring(0, splitPos));
int end = int.parse(k.substring(splitPos + 1));
final int splitPos = k.indexOf('-');
final start = int.parse(k.substring(0, splitPos));
final end = int.parse(k.substring(splitPos + 1));
for (var j = start; j <= end; j++) {
addToMap(sourceHitMap, j, hits[i + 1]);
}
Expand Down Expand Up @@ -72,10 +72,10 @@ void mergeHitmaps(

/// Generates a merged hitmap from a set of coverage JSON files.
Future<Map> parseCoverage(Iterable<File> files, int _) async {
var globalHitmap = <String, Map<int, int>>{};
final globalHitmap = <String, Map<int, int>>{};
for (var file in files) {
String contents = file.readAsStringSync();
List jsonResult = json.decode(contents)['coverage'];
final contents = file.readAsStringSync();
final List jsonResult = json.decode(contents)['coverage'];
mergeHitmaps(createHitmap(jsonResult), globalHitmap);
}
return globalHitmap;
Expand Down
Loading

0 comments on commit 3453196

Please sign in to comment.