Skip to content

Commit 5a3f21b

Browse files
authored
Add strict-cast analysis option (#3919)
1 parent fbb6f75 commit 5a3f21b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+380
-292
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.buildlog
22
.DS_Store
33
.idea
4+
.vscode
45
.dart_tool/
56
.settings/
67
/build/

analysis_options.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ analyzer:
99
exclude:
1010
- lib/src/third_party/**
1111

12+
language:
13+
strict-casts: true
14+
1215
linter:
1316
rules:
1417
- avoid_catching_errors

bin/dependency_services.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@ import 'package:pub/src/command/dependency_services.dart';
1616
import 'package:pub/src/exit_codes.dart' as exit_codes;
1717
import 'package:pub/src/io.dart';
1818
import 'package:pub/src/log.dart' as log;
19+
import 'package:pub/src/utils.dart';
1920

2021
class _DependencyServicesCommandRunner extends CommandRunner<int>
2122
implements PubTopLevel {
2223
@override
23-
String get directory => argResults['directory'];
24+
String get directory => argResults.option('directory');
2425

2526
@override
26-
bool get captureStackChains => argResults['verbose'];
27+
bool get captureStackChains => argResults.flag('verbose');
2728

2829
@override
29-
bool get trace => argResults['verbose'];
30+
bool get trace => argResults.flag('verbose');
3031

3132
ArgResults? _argResults;
3233

bin/pub.dart

100644100755
File mode changed.

lib/src/command.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ abstract class PubCommand extends Command<int> {
6868

6969
String get directory {
7070
return (argResults.options.contains('directory')
71-
? argResults['directory']
71+
? argResults.optionWithoutDefault('directory')
7272
: null) ??
7373
_pubTopLevel.directory;
7474
}

lib/src/command/add.dart

+10-10
Original file line numberDiff line numberDiff line change
@@ -766,21 +766,21 @@ class _ParseResult {
766766
}
767767

768768
extension on ArgResults {
769-
bool get isDev => this['dev'];
770-
bool get isDryRun => this['dry-run'];
771-
String? get gitUrl => this['git-url'];
772-
String? get gitPath => this['git-path'];
773-
String? get gitRef => this['git-ref'];
774-
String? get hostedUrl => this['hosted-url'];
775-
String? get path => this['path'];
776-
String? get sdk => this['sdk'];
769+
bool get isDev => flag('dev');
770+
bool get isDryRun => flag('dry-run');
771+
String? get gitUrl => this['git-url'] as String?;
772+
String? get gitPath => this['git-path'] as String?;
773+
String? get gitRef => this['git-ref'] as String?;
774+
String? get hostedUrl => this['hosted-url'] as String?;
775+
String? get path => this['path'] as String?;
776+
String? get sdk => this['sdk'] as String?;
777777
bool get hasOldStyleOptions =>
778778
hasGitOptions ||
779779
path != null ||
780780
sdk != null ||
781781
hostedUrl != null ||
782782
isDev;
783-
bool get shouldPrecompile => this['precompile'];
784-
bool get example => this['example'];
783+
bool get shouldPrecompile => flag('precompile');
784+
bool get example => flag('example');
785785
bool get hasGitOptions => gitUrl != null || gitRef != null || gitPath != null;
786786
}

lib/src/command/cache_add.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:pub_semver/pub_semver.dart';
88

99
import '../command.dart';
1010
import '../log.dart' as log;
11+
import '../package_name.dart';
1112
import '../utils.dart';
1213

1314
/// Handles the `cache add` pub command.
@@ -52,7 +53,7 @@ class CacheAddCommand extends PubCommand {
5253
var constraint = VersionConstraint.any;
5354
if (argResults['version'] != null) {
5455
try {
55-
constraint = VersionConstraint.parse(argResults['version']);
56+
constraint = VersionConstraint.parse(argResults['version'] as String);
5657
} on FormatException catch (error) {
5758
usageException(error.message);
5859
}
@@ -71,14 +72,14 @@ class CacheAddCommand extends PubCommand {
7172
fail('Package $package has no versions that match $constraint.');
7273
}
7374

74-
Future<void> downloadVersion(id) async {
75+
Future<void> downloadVersion(PackageId id) async {
7576
final result = await cache.downloadPackage(id);
7677
if (!result.didUpdate) {
7778
log.message('Already cached ${id.name} ${id.version}.');
7879
}
7980
}
8081

81-
if (argResults['all']) {
82+
if (argResults.flag('all')) {
8283
// Install them in ascending order.
8384
ids.sort((id1, id2) => id1.version.compareTo(id2.version));
8485
await Future.forEach(ids, downloadVersion);

lib/src/command/cache_clean.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import '../command.dart';
66
import '../command_runner.dart';
77
import '../io.dart';
88
import '../log.dart' as log;
9+
import '../utils.dart';
910

1011
class CacheCleanCommand extends PubCommand {
1112
@override
@@ -27,7 +28,7 @@ class CacheCleanCommand extends PubCommand {
2728
@override
2829
Future<void> runProtected() async {
2930
if (dirExists(cache.rootDir)) {
30-
if (argResults['force'] || await confirm('''
31+
if (argResults.flag('force') || await confirm('''
3132
This will remove everything inside ${cache.rootDir}.
3233
You will have to run `$topLevelProgram pub get` again in each project.
3334
Are you sure?''')) {

lib/src/command/cache_repair.dart

+6-4
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@ class CacheRepairCommand extends PubCommand {
3838

3939
if (successes.isNotEmpty) {
4040
var packages = pluralize('package', successes.length);
41-
log.message('Reinstalled ${log.green(successes.length)} $packages.');
41+
log.message(
42+
'Reinstalled ${log.green(successes.length.toString())} $packages.',
43+
);
4244
}
4345

4446
if (failures.isNotEmpty) {
4547
var packages = pluralize('package', failures.length);
4648
var buffer = StringBuffer(
47-
'Failed to reinstall ${log.red(failures.length)} $packages:\n',
49+
'Failed to reinstall ${log.red(failures.length.toString())} $packages:\n',
4850
);
4951

5052
for (var failure in failures) {
@@ -62,14 +64,14 @@ class CacheRepairCommand extends PubCommand {
6264
if (globalRepairResults.first.isNotEmpty) {
6365
var packages = pluralize('package', globalRepairResults.first.length);
6466
log.message(
65-
'Reactivated ${log.green(globalRepairResults.first.length)} $packages.',
67+
'Reactivated ${log.green(globalRepairResults.first.length.toString())} $packages.',
6668
);
6769
}
6870

6971
if (globalRepairResults.last.isNotEmpty) {
7072
var packages = pluralize('package', globalRepairResults.last.length);
7173
log.message(
72-
'Failed to reactivate ${log.red(globalRepairResults.last.length)} $packages:',
74+
'Failed to reactivate ${log.red(globalRepairResults.last.length.toString())} $packages:',
7375
);
7476
log.message(
7577
globalRepairResults.last

lib/src/command/dependency_services.dart

+15-13
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,10 @@ class DependencyServicesReportCommand extends PubCommand {
6969
} else {
7070
final resolution = await _tryResolve(entrypoint.root.pubspec, cache) ??
7171
(throw DataException('Failed to resolve pubspec'));
72-
currentPackages =
73-
Map<String, PackageId>.fromIterable(resolution, key: (e) => e.name);
72+
currentPackages = Map<String, PackageId>.fromIterable(
73+
resolution,
74+
key: (e) => (e as PackageId).name,
75+
);
7476
}
7577
currentPackages.remove(entrypoint.root.name);
7678

@@ -361,13 +363,13 @@ class DependencyServicesApplyCommand extends PubCommand {
361363
YamlEditor(readTextFile(entrypoint.pubspecPath));
362364
final toApply = <_PackageVersion>[];
363365
final input = json.decode(await utf8.decodeStream(stdin));
364-
for (final change in input['dependencyChanges']) {
366+
for (final change in input['dependencyChanges'] as Iterable) {
365367
toApply.add(
366368
_PackageVersion(
367-
change['name'],
368-
change['version'],
369+
change['name'] as String,
370+
change['version'] as String?,
369371
change['constraint'] != null
370-
? VersionConstraint.parse(change['constraint'])
372+
? VersionConstraint.parse(change['constraint'] as String)
371373
: null,
372374
),
373375
);
@@ -421,23 +423,23 @@ class DependencyServicesApplyCommand extends PubCommand {
421423
}
422424
if (lockFileEditor != null) {
423425
if (targetVersion != null &&
424-
lockFileYaml['packages'].containsKey(targetPackage)) {
426+
(lockFileYaml['packages'] as Map).containsKey(targetPackage)) {
425427
lockFileEditor.update(
426428
['packages', targetPackage, 'version'],
427429
targetVersion.toString(),
428430
);
429431
// Remove the now outdated content-hash - it will be restored below
430432
// after resolution.
431-
if (lockFileEditor
432-
.parseAt(['packages', targetPackage, 'description'])
433-
.value
434-
.containsKey('sha256')) {
433+
var packageMap = lockFileEditor
434+
.parseAt(['packages', targetPackage, 'description']).value as Map;
435+
var hasSha = packageMap.containsKey('sha256');
436+
if (hasSha) {
435437
lockFileEditor.remove(
436438
['packages', targetPackage, 'description', 'sha256'],
437439
);
438440
}
439441
} else if (targetRevision != null &&
440-
lockFileYaml['packages'].containsKey(targetPackage)) {
442+
(lockFileYaml['packages'] as Map).containsKey(targetPackage)) {
441443
final ref = entrypoint.lockFile.packages[targetPackage]!.toRef();
442444
final currentDescription = ref.description as GitDescription;
443445
final updatedRef = PackageRef(
@@ -468,7 +470,7 @@ class DependencyServicesApplyCommand extends PubCommand {
468470
);
469471
} else if (targetVersion == null &&
470472
targetRevision == null &&
471-
!lockFileYaml['packages'].containsKey(targetPackage)) {
473+
!(lockFileYaml['packages'] as Map).containsKey(targetPackage)) {
472474
dataError(
473475
'Trying to remove non-existing transitive dependency $targetPackage.',
474476
);

lib/src/command/deps.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class DepsCommand extends PubCommand {
3232
bool get takesArguments => false;
3333

3434
/// Whether to include dev dependencies.
35-
bool get _includeDev => argResults['dev'];
35+
bool get _includeDev => argResults.flag('dev');
3636

3737
DepsCommand() {
3838
argParser.addOption(
@@ -75,7 +75,7 @@ class DepsCommand extends PubCommand {
7575
await entrypoint.ensureUpToDate();
7676
final buffer = StringBuffer();
7777

78-
if (argResults['json']) {
78+
if (argResults.flag('json')) {
7979
if (argResults.wasParsed('dev')) {
8080
usageException(
8181
'Cannot combine --json and --dev.\nThe json output contains the dependency type in the output.',
@@ -150,7 +150,7 @@ class DepsCommand extends PubCommand {
150150
),
151151
);
152152
} else {
153-
if (argResults['executables']) {
153+
if (argResults.flag('executables')) {
154154
_outputExecutables(buffer);
155155
} else {
156156
for (var sdk in sdks.values) {
@@ -174,7 +174,7 @@ class DepsCommand extends PubCommand {
174174
}
175175
}
176176

177-
log.message(buffer);
177+
log.message(buffer.toString());
178178
}
179179

180180
/// Outputs a list of all of the package's immediate, dev, override, and

lib/src/command/downgrade.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:async';
77
import '../command.dart';
88
import '../log.dart' as log;
99
import '../solver.dart';
10+
import '../utils.dart';
1011

1112
/// Handles the `downgrade` pub command.
1213
class DowngradeCommand extends PubCommand {
@@ -21,7 +22,7 @@ class DowngradeCommand extends PubCommand {
2122
String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-downgrade';
2223

2324
@override
24-
bool get isOffline => argResults['offline'];
25+
bool get isOffline => argResults.flag('offline');
2526

2627
DowngradeCommand() {
2728
argParser.addFlag(
@@ -62,7 +63,7 @@ class DowngradeCommand extends PubCommand {
6263
),
6364
);
6465
}
65-
var dryRun = argResults['dry-run'];
66+
var dryRun = argResults.flag('dry-run');
6667

6768
await entrypoint.acquireDependencies(
6869
SolveType.downgrade,
@@ -71,7 +72,7 @@ class DowngradeCommand extends PubCommand {
7172
analytics: analytics,
7273
);
7374
var example = entrypoint.example;
74-
if (argResults['example'] && example != null) {
75+
if (argResults.flag('example') && example != null) {
7576
await example.acquireDependencies(
7677
SolveType.get,
7778
unlock: argResults.rest,

lib/src/command/get.dart

+9-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:async';
77
import '../command.dart';
88
import '../log.dart' as log;
99
import '../solver.dart';
10+
import '../utils.dart';
1011

1112
/// Handles the `get` pub command.
1213
class GetCommand extends PubCommand {
@@ -17,7 +18,7 @@ class GetCommand extends PubCommand {
1718
@override
1819
String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-get';
1920
@override
20-
bool get isOffline => argResults['offline'];
21+
bool get isOffline => argResults.flag('offline');
2122
@override
2223
String get argumentsDescription => '';
2324

@@ -75,21 +76,21 @@ class GetCommand extends PubCommand {
7576

7677
await entrypoint.acquireDependencies(
7778
SolveType.get,
78-
dryRun: argResults['dry-run'],
79-
precompile: argResults['precompile'],
79+
dryRun: argResults.flag('dry-run'),
80+
precompile: argResults.flag('precompile'),
8081
analytics: analytics,
81-
enforceLockfile: argResults['enforce-lockfile'],
82+
enforceLockfile: argResults.flag('enforce-lockfile'),
8283
);
8384

8485
var example = entrypoint.example;
85-
if (argResults['example'] && example != null) {
86+
if ((argResults['example'] as bool? ?? false) && example != null) {
8687
await example.acquireDependencies(
8788
SolveType.get,
88-
dryRun: argResults['dry-run'],
89-
precompile: argResults['precompile'],
89+
dryRun: argResults.flag('dry-run'),
90+
precompile: argResults.flag('precompile'),
9091
analytics: analytics,
9192
summaryOnly: true,
92-
enforceLockfile: argResults['enforce-lockfile'],
93+
enforceLockfile: argResults.flag('enforce-lockfile'),
9394
);
9495
}
9596
}

lib/src/command/global_activate.dart

+6-5
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ class GlobalActivateCommand extends PubCommand {
8787
usageException('Cannot pass both --no-executables and --executable.');
8888
}
8989

90-
executables = argResults['executable'];
91-
} else if (argResults['no-executables']) {
90+
executables = argResults['executable'] as List<String>?;
91+
} else if (argResults.flag('no-executables')) {
9292
// An empty list means no executables.
9393
executables = [];
9494
}
@@ -126,16 +126,17 @@ class GlobalActivateCommand extends PubCommand {
126126
repo,
127127
executables,
128128
overwriteBinStubs: overwrite,
129-
path: argResults['git-path'],
130-
ref: argResults['git-ref'],
129+
path: argResults['git-path'] as String?,
130+
ref: argResults['git-ref'] as String?,
131131
);
132132

133133
case 'hosted':
134134
var package = readArg('No package to activate given.');
135135

136136
PackageRef ref;
137137
try {
138-
ref = cache.hosted.refFor(package, url: argResults['hosted-url']);
138+
ref = cache.hosted
139+
.refFor(package, url: argResults['hosted-url'] as String?);
139140
} on FormatException catch (e) {
140141
usageException('Invalid hosted-url: $e');
141142
}

lib/src/command/global_run.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ class GlobalRunCommand extends PubCommand {
7979
Executable.adaptProgramName(package, executable),
8080
args,
8181
vmArgs: vmArgs,
82-
enableAsserts: argResults['enable-asserts'] || argResults['checked'],
82+
enableAsserts:
83+
argResults.flag('enable-asserts') || argResults.flag('checked'),
8384
recompile: (executable) => log.errorsOnlyUnlessTerminal(
8485
() => globalEntrypoint.precompileExecutable(executable),
8586
),

0 commit comments

Comments
 (0)