Skip to content

Commit 4f9b6cf

Browse files
authored
enable lint prefer_final_in_for_each (flutter#47724)
1 parent fa337f5 commit 4f9b6cf

369 files changed

Lines changed: 1219 additions & 1220 deletions

File tree

Some content is hidden

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

analysis_options.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ linter:
141141
- prefer_equal_for_default_values
142142
# - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
143143
- prefer_final_fields
144-
# - prefer_final_in_for_each # not yet tested
144+
- prefer_final_in_for_each
145145
- prefer_final_locals
146146
# - prefer_for_elements_to_map_fromIterable # not yet tested
147147
- prefer_foreach

dev/benchmarks/macrobenchmarks/lib/src/cubic_bezier.dart

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class AnimatedBezierState extends State<AnimatedBezier>
146146

147147
path.moveTo(100.0, 97.0);
148148

149-
for (Point p in pointList[0]) {
149+
for (final Point p in pointList[0]) {
150150
path.lineTo(p.x, p.y);
151151
}
152152

@@ -167,7 +167,7 @@ class AnimatedBezierState extends State<AnimatedBezier>
167167

168168
bezier2Path.moveTo(0.0, 70.55);
169169

170-
for (Point p in pointList[1]) {
170+
for (final Point p in pointList[1]) {
171171
bezier2Path.lineTo(p.x, p.y);
172172
}
173173

@@ -188,7 +188,7 @@ class AnimatedBezierState extends State<AnimatedBezier>
188188

189189
bezier3Path.moveTo(0.0, 69.48);
190190

191-
for (Point p in pointList[2]) {
191+
for (final Point p in pointList[2]) {
192192
bezier3Path.lineTo(p.x, p.y);
193193
}
194194

@@ -210,7 +210,7 @@ class AnimatedBezierState extends State<AnimatedBezier>
210210

211211
bezier4Path.moveTo(0.0, 69.48);
212212

213-
for (Point p in pointList[3]) {
213+
for (final Point p in pointList[3]) {
214214
bezier4Path.lineTo(p.x, p.y);
215215
}
216216

@@ -221,7 +221,7 @@ class AnimatedBezierState extends State<AnimatedBezier>
221221
}
222222

223223
List<PathDetail> _playReversed() {
224-
for (List<Point> list in pointList) {
224+
for (final List<Point> list in pointList) {
225225
if (list.isNotEmpty) {
226226
list.removeLast();
227227
}
@@ -232,30 +232,30 @@ class AnimatedBezierState extends State<AnimatedBezier>
232232

233233
path.moveTo(100.0, 97.0);
234234

235-
for (Point point in points) {
235+
for (final Point point in points) {
236236
path.lineTo(point.x, point.y);
237237
}
238238

239239
final Path bezier2Path = Path();
240240

241241
bezier2Path.moveTo(0.0, 70.55);
242242

243-
for (Point p in pointList[1]) {
243+
for (final Point p in pointList[1]) {
244244
bezier2Path.lineTo(p.x, p.y);
245245
}
246246

247247
final Path bezier3Path = Path();
248248
bezier3Path.moveTo(0.0, 69.48);
249249

250-
for (Point p in pointList[2]) {
250+
for (final Point p in pointList[2]) {
251251
bezier3Path.lineTo(p.x, p.y);
252252
}
253253

254254
final Path bezier4Path = Path();
255255

256256
bezier4Path.moveTo(0.0, 69.48);
257257

258-
for (Point p in pointList[3]) {
258+
for (final Point p in pointList[3]) {
259259
bezier4Path.lineTo(p.x, p.y);
260260
}
261261

@@ -287,7 +287,7 @@ class AnimatedBezierState extends State<AnimatedBezier>
287287
void playAnimation() {
288288
isPlaying = true;
289289
isReversed = false;
290-
for (List<Point> list in pointList) {
290+
for (final List<Point> list in pointList) {
291291
list.clear();
292292
}
293293
controller.reset();
@@ -297,7 +297,7 @@ class AnimatedBezierState extends State<AnimatedBezier>
297297
void stopAnimation() {
298298
isPlaying = false;
299299
controller.stop();
300-
for (List<Point> list in pointList) {
300+
for (final List<Point> list in pointList) {
301301
list.clear();
302302
}
303303
}

dev/benchmarks/microbenchmarks/lib/common.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ class BenchmarkResultPrinter {
5151

5252
String _printJson() {
5353
final Map<String, double> results = <String, double>{};
54-
for (_BenchmarkResult result in _results) {
54+
for (final _BenchmarkResult result in _results) {
5555
results[result.name] = result.value;
5656
}
5757
return json.encode(results);
5858
}
5959

6060
String _printPlainText() {
6161
final StringBuffer buf = StringBuffer();
62-
for (_BenchmarkResult result in _results) {
62+
for (final _BenchmarkResult result in _results) {
6363
buf.writeln('${result.description}: ${result.value.toStringAsFixed(1)} ${result.unit}');
6464
}
6565
return buf.toString();

dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ void main() {
1616
print('Velocity tracker benchmark...');
1717
watch.start();
1818
for (int i = 0; i < _kNumIters; i += 1) {
19-
for (PointerEvent event in velocityEventData) {
19+
for (final PointerEvent event in velocityEventData) {
2020
if (event is PointerDownEvent || event is PointerMoveEvent)
2121
tracker.addPosition(event.timeStamp, event.position);
2222
if (event is PointerUpEvent)

dev/benchmarks/microbenchmarks/lib/language/sync_star_bench.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ Iterable<int> generateIterableList() {
8484

8585
int sumIterable(Iterable<int> values) {
8686
int result = 0;
87-
for (int value in values) {
87+
for (final int value in values) {
8888
result += value;
8989
}
9090
return result;

dev/benchmarks/microbenchmarks/lib/language/sync_star_semantics_bench.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void main() {
7171

7272
String consumeSpan(Iterable<InlineSpanSemanticsInformation> items) {
7373
String result = '';
74-
for (InlineSpanSemanticsInformation span in items) {
74+
for (final InlineSpanSemanticsInformation span in items) {
7575
result += span.text;
7676
}
7777
return result;
@@ -81,7 +81,7 @@ String consumeSpan(Iterable<InlineSpanSemanticsInformation> items) {
8181
Iterable<InlineSpanSemanticsInformation> combineSemanticsInfoSyncStar(List<InlineSpanSemanticsInformation> inputs) sync* {
8282
String workingText = '';
8383
String workingLabel;
84-
for (InlineSpanSemanticsInformation info in inputs) {
84+
for (final InlineSpanSemanticsInformation info in inputs) {
8585
if (info.requiresOwnNode) {
8686
if (workingText != null) {
8787
yield InlineSpanSemanticsInformation(workingText, semanticsLabel: workingLabel ?? workingText);
@@ -110,7 +110,7 @@ Iterable<InlineSpanSemanticsInformation> combineSemanticsInfoList(List<InlineSpa
110110
String workingText = '';
111111
String workingLabel;
112112
final List<InlineSpanSemanticsInformation> result = <InlineSpanSemanticsInformation>[];
113-
for (InlineSpanSemanticsInformation info in inputs) {
113+
for (final InlineSpanSemanticsInformation info in inputs) {
114114
if (info.requiresOwnNode) {
115115
if (workingText != null) {
116116
result.add(InlineSpanSemanticsInformation(workingText, semanticsLabel: workingLabel ?? workingText));

dev/bots/analyze-sample-code.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ class SampleChecker {
193193
"import 'dart:typed_data';",
194194
"import 'dart:ui' as ui;",
195195
"import 'package:flutter_test/flutter_test.dart';",
196-
for (File file in _listDartFiles(Directory(_defaultFlutterPackage))) ...<String>[
196+
for (final File file in _listDartFiles(Directory(_defaultFlutterPackage))) ...<String>[
197197
'',
198198
'// ${file.path}',
199199
"import 'package:flutter/${path.basename(file.path)}';",
@@ -214,7 +214,7 @@ class SampleChecker {
214214
errors = _analyze(_tempDirectory, sections, snippets);
215215
} finally {
216216
if (errors.isNotEmpty) {
217-
for (String filePath in errors.keys) {
217+
for (final String filePath in errors.keys) {
218218
errors[filePath].forEach(stderr.writeln);
219219
}
220220
stderr.writeln('\nFound ${errors.length} sample code errors.');
@@ -310,7 +310,7 @@ class SampleChecker {
310310
final List<Section> sections = <Section>[];
311311
final List<Snippet> snippets = <Snippet>[];
312312

313-
for (File file in _listDartFiles(_flutterPackage, recursive: true)) {
313+
for (final File file in _listDartFiles(_flutterPackage, recursive: true)) {
314314
final String relativeFilePath = path.relative(file.path, from: _flutterPackage.path);
315315
final List<String> sampleLines = file.readAsLinesSync();
316316
final List<Section> preambleSections = <Section>[];
@@ -326,7 +326,7 @@ class SampleChecker {
326326
final List<String> block = <String>[];
327327
List<String> snippetArgs = <String>[];
328328
Line startLine;
329-
for (String line in sampleLines) {
329+
for (final String line in sampleLines) {
330330
lineNumber += 1;
331331
final String trimmedLine = line.trim();
332332
if (inSnippet) {
@@ -434,10 +434,10 @@ class SampleChecker {
434434
}
435435
}
436436
print('Found ${sections.length} sample code sections.');
437-
for (Section section in sections) {
437+
for (final Section section in sections) {
438438
sectionMap[_writeSection(section).path] = section;
439439
}
440-
for (Snippet snippet in snippets) {
440+
for (final Snippet snippet in snippets) {
441441
final File snippetFile = _writeSnippet(snippet);
442442
snippet.contents = snippetFile.readAsLinesSync();
443443
snippetMap[snippetFile.absolute.path] = snippet;
@@ -576,7 +576,7 @@ linter:
576576
);
577577
bool unknownAnalyzerErrors = false;
578578
final int headerLength = headers.length + 2;
579-
for (String error in errors) {
579+
for (final String error in errors) {
580580
final Match parts = errorPattern.matchAsPrefix(error);
581581
if (parts != null) {
582582
final String message = parts[2];
@@ -860,7 +860,7 @@ class Snippet {
860860
String toString() {
861861
final StringBuffer buf = StringBuffer('snippet ${args.join(' ')}\n');
862862
int count = start.line;
863-
for (String line in input) {
863+
for (final String line in input) {
864864
buf.writeln(' ${count.toString().padLeft(4, ' ')}: $line');
865865
count++;
866866
}

dev/bots/analyze.dart

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,11 @@ final RegExp _grandfatheredDeprecation = RegExp(r' // ignore: flutter_deprecatio
147147

148148
Future<void> verifyDeprecations(String workingDirectory, { int minimumMatches = 2000 }) async {
149149
final List<String> errors = <String>[];
150-
for (File file in _allFiles(workingDirectory, 'dart', minimumMatches: minimumMatches)) {
150+
for (final File file in _allFiles(workingDirectory, 'dart', minimumMatches: minimumMatches)) {
151151
int lineNumber = 0;
152152
final List<String> lines = file.readAsLinesSync();
153153
final List<int> linesWithDeprecations = <int>[];
154-
for (String line in lines) {
154+
for (final String line in lines) {
155155
if (line.contains(_findDeprecationPattern) &&
156156
!line.endsWith(_ignoreDeprecation) &&
157157
!line.contains(_grandfatheredDeprecation)) {
@@ -239,7 +239,7 @@ Future<void> _verifyNoMissingLicenseForExtension(String workingDirectory, String
239239
assert(!license.endsWith('\n'));
240240
final String licensePattern = license + '\n' + (trailingBlank ? '\n' : '');
241241
final List<String> errors = <String>[];
242-
for (File file in _allFiles(workingDirectory, extension, minimumMatches: minimumMatches)) {
242+
for (final File file in _allFiles(workingDirectory, extension, minimumMatches: minimumMatches)) {
243243
final String contents = file.readAsStringSync().replaceAll('\r\n', '\n');
244244
if (contents.isEmpty)
245245
continue; // let's not go down the /bin/true rabbit hole
@@ -270,8 +270,8 @@ Future<void> verifyNoTestImports(String workingDirectory) async {
270270
final List<String> errors = <String>[];
271271
assert("// foo\nimport 'binding_test.dart' as binding;\n'".contains(_testImportPattern));
272272
final List<File> dartFiles = _allFiles(path.join(workingDirectory, 'packages'), 'dart', minimumMatches: 1500).toList();
273-
for (File file in dartFiles) {
274-
for (String line in file.readAsLinesSync()) {
273+
for (final File file in dartFiles) {
274+
for (final String line in file.readAsLinesSync()) {
275275
final Match match = _testImportPattern.firstMatch(line);
276276
if (match != null && !_exemptTestImports.contains(match.group(2)))
277277
errors.add(file.path);
@@ -365,24 +365,24 @@ Future<void> verifyGeneratedPluginRegistrants(String flutterRoot) async {
365365

366366
final Map<String, List<File>> packageToRegistrants = <String, List<File>>{};
367367

368-
for (File file in flutterRootDir.listSync(recursive: true).whereType<File>().where(_isGeneratedPluginRegistrant)) {
368+
for (final File file in flutterRootDir.listSync(recursive: true).whereType<File>().where(_isGeneratedPluginRegistrant)) {
369369
final String package = _getPackageFor(file, flutterRootDir);
370370
final List<File> registrants = packageToRegistrants.putIfAbsent(package, () => <File>[]);
371371
registrants.add(file);
372372
}
373373

374374
final Set<String> outOfDate = <String>{};
375375

376-
for (String package in packageToRegistrants.keys) {
376+
for (final String package in packageToRegistrants.keys) {
377377
final Map<File, String> fileToContent = <File, String>{};
378-
for (File f in packageToRegistrants[package]) {
378+
for (final File f in packageToRegistrants[package]) {
379379
fileToContent[f] = f.readAsStringSync();
380380
}
381381
await runCommand(flutter, <String>['inject-plugins'],
382382
workingDirectory: package,
383383
outputMode: OutputMode.discard,
384384
);
385-
for (File registrant in fileToContent.keys) {
385+
for (final File registrant in fileToContent.keys) {
386386
if (registrant.readAsStringSync() != fileToContent[registrant]) {
387387
outOfDate.add(registrant.path);
388388
}
@@ -422,20 +422,20 @@ Future<void> verifyNoBadImportsInFlutter(String workingDirectory) async {
422422
}
423423
// Verify that the imports are well-ordered.
424424
final Map<String, Set<String>> dependencyMap = <String, Set<String>>{};
425-
for (String directory in directories) {
425+
for (final String directory in directories) {
426426
dependencyMap[directory] = _findFlutterDependencies(path.join(srcPath, directory), errors, checkForMeta: directory != 'foundation');
427427
}
428428
assert(dependencyMap['material'].contains('widgets') &&
429429
dependencyMap['widgets'].contains('rendering') &&
430430
dependencyMap['rendering'].contains('painting')); // to make sure we're convinced _findFlutterDependencies is finding some
431-
for (String package in dependencyMap.keys) {
431+
for (final String package in dependencyMap.keys) {
432432
if (dependencyMap[package].contains(package)) {
433433
errors.add(
434434
'One of the files in the $yellow$package$reset package imports that package recursively.'
435435
);
436436
}
437437
}
438-
for (String package in dependencyMap.keys) {
438+
for (final String package in dependencyMap.keys) {
439439
final List<String> loop = _deepSearch<String>(dependencyMap, package);
440440
if (loop != null) {
441441
errors.add(
@@ -459,7 +459,7 @@ Future<void> verifyNoBadImportsInFlutter(String workingDirectory) async {
459459
Future<void> verifyNoBadImportsInFlutterTools(String workingDirectory) async {
460460
final List<String> errors = <String>[];
461461
final List<File> files = _allFiles(path.join(workingDirectory, 'packages', 'flutter_tools', 'lib'), 'dart', minimumMatches: 200).toList();
462-
for (File file in files) {
462+
for (final File file in files) {
463463
if (file.readAsStringSync().contains('package:flutter_tools/')) {
464464
errors.add('$yellow${file.path}$reset imports flutter_tools.');
465465
}
@@ -535,7 +535,7 @@ Future<void> verifyNoTrailingSpaces(String workingDirectory, { int minimumMatche
535535
.where((File file) => path.extension(file.path) != '.jar')
536536
.toList();
537537
final List<String> problems = <String>[];
538-
for (File file in files) {
538+
for (final File file in files) {
539539
final List<String> lines = file.readAsLinesSync();
540540
for (int index = 0; index < lines.length; index += 1) {
541541
if (lines[index].endsWith(' ')) {
@@ -1004,7 +1004,7 @@ Future<void> verifyNoBinaries(String workingDirectory, { Set<Hash256> grandfathe
10041004
.map<File>((String filename) => File(path.join(workingDirectory, filename)))
10051005
.toList();
10061006
final List<String> problems = <String>[];
1007-
for (File file in files) {
1007+
for (final File file in files) {
10081008
final Uint8List bytes = file.readAsBytesSync();
10091009
try {
10101010
utf8.decode(bytes);
@@ -1156,7 +1156,7 @@ Set<String> _findFlutterDependencies(String srcPath, List<String> errors, { bool
11561156
return _allFiles(srcPath, 'dart', minimumMatches: 1)
11571157
.map<Set<String>>((File file) {
11581158
final Set<String> result = <String>{};
1159-
for (String line in file.readAsLinesSync()) {
1159+
for (final String line in file.readAsLinesSync()) {
11601160
Match match = _importPattern.firstMatch(line);
11611161
if (match != null)
11621162
result.add(match.group(2));
@@ -1180,7 +1180,7 @@ Set<String> _findFlutterDependencies(String srcPath, List<String> errors, { bool
11801180
}
11811181

11821182
List<T> _deepSearch<T>(Map<T, Set<T>> map, T start, [ Set<T> seen ]) {
1183-
for (T key in map[start]) {
1183+
for (final T key in map[start]) {
11841184
if (key == start)
11851185
continue; // we catch these separately
11861186
if (seen != null && seen.contains(key))

dev/bots/flutter_compact_formatter.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class FlutterCompactFormatter {
160160
void finish() {
161161
final List<String> skipped = <String>[];
162162
final List<String> failed = <String>[];
163-
for (TestResult result in _tests.values) {
163+
for (final TestResult result in _tests.values) {
164164
switch (result.status) {
165165
case TestStatus.started:
166166
failed.add('${_red}Unexpectedly failed to complete a test!');

dev/bots/prepare_package.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ class ArchiveCreator {
354354
// Create each of the templates, since they will call 'pub get' on
355355
// themselves when created, and this will warm the cache with their
356356
// dependencies too.
357-
for (String template in <String>['app', 'package', 'plugin']) {
357+
for (final String template in <String>['app', 'package', 'plugin']) {
358358
final String createName = path.join(tempDir.path, 'create_$template');
359359
await _runFlutter(
360360
<String>['create', '--template=$template', createName],
@@ -528,7 +528,7 @@ class ArchivePublisher {
528528
// Search for any entries with the same hash and channel and remove them.
529529
final List<dynamic> releases = jsonData['releases'] as List<dynamic>;
530530
jsonData['releases'] = <Map<String, dynamic>>[
531-
for (Map<String, dynamic> entry in releases.cast<Map<String, dynamic>>())
531+
for (final Map<String, dynamic> entry in releases.cast<Map<String, dynamic>>())
532532
if (entry['hash'] != newEntry['hash'] || entry['channel'] != newEntry['channel'])
533533
entry,
534534
newEntry,

0 commit comments

Comments
 (0)