Skip to content

Commit 3942d5b

Browse files
authored
Clean up warnings handling (#2536)
* Clean up warnings handling * Address feedback around comments
1 parent 17e9a62 commit 3942d5b

File tree

4 files changed

+51
-34
lines changed

4 files changed

+51
-34
lines changed

lib/src/warnings.dart

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:collection';
6+
57
import 'package:analyzer/dart/element/element.dart';
68
import 'package:analyzer/file_system/file_system.dart';
79
import 'package:dartdoc/src/dartdoc_options.dart';
810
import 'package:dartdoc/src/logging.dart';
911
import 'package:dartdoc/src/model/model.dart';
1012
import 'package:dartdoc/src/package_meta.dart';
11-
import 'package:dartdoc/src/tuple.dart';
1213

1314
abstract class PackageWarningOptionContext implements DartdocOptionContextBase {
1415
bool get allowNonLocalWarnings =>
@@ -113,14 +114,15 @@ class PackageWarningDefinition implements Comparable<PackageWarningDefinition> {
113114
}
114115

115116
/// Same as [packageWarningDefinitions], except keyed by the warning name.
116-
final Map<String, PackageWarningDefinition> packageWarningsByName =
117-
Map.fromEntries(packageWarningDefinitions.values
118-
.map((definition) => MapEntry(definition.warningName, definition)));
117+
final Map<String, PackageWarningDefinition> packageWarningsByName = {
118+
for (final definition in packageWarningDefinitions.values)
119+
definition.warningName: definition
120+
};
119121

120122
/// Provides description text and command line flags for warnings.
121123
/// TODO(jcollins-g): Actually use this for command line flags.
122-
final Map<PackageWarning, PackageWarningDefinition> packageWarningDefinitions =
123-
const {
124+
const Map<PackageWarning, PackageWarningDefinition> packageWarningDefinitions =
125+
{
124126
PackageWarning.ambiguousDocReference: PackageWarningDefinition(
125127
PackageWarning.ambiguousDocReference,
126128
'ambiguous-doc-reference',
@@ -317,7 +319,7 @@ enum PackageWarningMode {
317319
/// In particular, this set should not include warnings around public/private
318320
/// or canonicalization problems, because those can break the isDocumented()
319321
/// check.
320-
final Set<PackageWarning> skipWarningIfNotDocumentedFor = {
322+
const Set<PackageWarning> skipWarningIfNotDocumentedFor = {
321323
PackageWarning.unresolvedDocReference,
322324
PackageWarning.typeAsHtml
323325
};
@@ -419,11 +421,26 @@ class PackageWarningOptions {
419421
}
420422

421423
class PackageWarningCounter {
422-
final Map<Element, Set<Tuple2<PackageWarning, String>>> countedWarnings = {};
424+
final Map<Element, Map<PackageWarning, Set<String>>> _countedWarnings = {};
423425
final _items = <Jsonable>[];
424426
final _displayedWarningCounts = <PackageWarning, int>{};
425427
final PackageGraph packageGraph;
426428

429+
int _errorCount = 0;
430+
431+
/// The total amount of errors this package has experienced.
432+
int get errorCount => _errorCount;
433+
434+
int _warningCount = 0;
435+
436+
/// The total amount of warnings this package has experienced.
437+
int get warningCount => _warningCount;
438+
439+
/// An unmodifiable map view of all counted warnings related by their element,
440+
/// warning type, and message.
441+
UnmodifiableMapView<Element, Map<PackageWarning, Set<String>>>
442+
get countedWarnings => UnmodifiableMapView(_countedWarnings);
443+
427444
PackageWarningCounter(this.packageGraph);
428445

429446
/// Actually write out the warning. Assumes it is already counted with add.
@@ -462,11 +479,16 @@ class PackageWarningCounter {
462479
_items.clear();
463480
}
464481

465-
/// Returns true if we've already warned for this.
482+
/// If this package has had any warnings counted.
483+
bool get hasWarnings => _countedWarnings.isNotEmpty;
484+
485+
/// Returns `true` if we've already warned for this
486+
/// combination of [element], [kind], and [message].
466487
bool hasWarning(Warnable element, PackageWarning kind, String message) {
467-
var warningData = Tuple2<PackageWarning, String>(kind, message);
468-
if (countedWarnings.containsKey(element?.element)) {
469-
return countedWarnings[element?.element].contains(warningData);
488+
final warning = _countedWarnings[element?.element];
489+
if (warning != null) {
490+
final messages = warning[kind];
491+
return messages != null && messages.contains(message);
470492
}
471493
return false;
472494
}
@@ -484,19 +506,18 @@ class PackageWarningCounter {
484506
warningMode = PackageWarningMode.ignore;
485507
}
486508
if (warningMode == PackageWarningMode.warn) {
487-
warningCount += 1;
509+
_warningCount += 1;
488510
} else if (warningMode == PackageWarningMode.error) {
489-
errorCount += 1;
511+
_errorCount += 1;
490512
}
491-
var warningData = Tuple2<PackageWarning, String>(kind, message);
492-
countedWarnings.putIfAbsent(element?.element, () => {}).add(warningData);
513+
_countedWarnings
514+
.putIfAbsent(element?.element, () => {})
515+
.putIfAbsent(kind, () => {})
516+
.add(message);
493517
_writeWarning(kind, warningMode, config.verboseWarnings,
494518
element?.fullyQualifiedName, fullMessage);
495519
}
496520

497-
int errorCount = 0;
498-
int warningCount = 0;
499-
500521
@override
501522
String toString() {
502523
var errors = '$errorCount ${errorCount == 1 ? "error" : "errors"}';

test/documentation_comment_test.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ void main() {
3232
Matcher hasMissingExampleWarning(String message) =>
3333
_HasWarning(PackageWarning.missingExampleFile, message);
3434

35-
void expectNoWarnings() =>
36-
expect(packageGraph.packageWarningCounter.countedWarnings, isEmpty);
35+
void expectNoWarnings() {
36+
expect(packageGraph.packageWarningCounter.hasWarnings, isFalse);
37+
expect(packageGraph.packageWarningCounter.countedWarnings, isEmpty);
38+
}
3739

3840
group('documentation_comment tests', () {
3941
setUp(() async {

test/end2end/dartdoc_test.dart

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import 'package:dartdoc/dartdoc.dart';
1212
import 'package:dartdoc/src/io_utils.dart';
1313
import 'package:dartdoc/src/logging.dart';
1414
import 'package:dartdoc/src/model/model.dart';
15-
import 'package:dartdoc/src/tuple.dart';
1615
import 'package:dartdoc/src/warnings.dart';
1716
import 'package:path/path.dart' as path;
1817
import 'package:test/test.dart';
@@ -147,10 +146,8 @@ void main() {
147146
var results = await dartdoc.generateDocsBase();
148147
var p = results.packageGraph;
149148
var unresolvedToolErrors = p.packageWarningCounter.countedWarnings.values
150-
.expand<String>((Set<Tuple2<PackageWarning, String>> s) => s
151-
.where((Tuple2<PackageWarning, String> t) =>
152-
t.item1 == PackageWarning.toolError)
153-
.map<String>((Tuple2<PackageWarning, String> t) => t.item2));
149+
.map((e) => e[PackageWarning.toolError] ?? {})
150+
.expand((element) => element);
154151

155152
expect(p.packageWarningCounter.errorCount, equals(1));
156153
expect(unresolvedToolErrors.length, equals(1));
@@ -165,10 +162,8 @@ void main() {
165162
var p = results.packageGraph;
166163
var unresolvedExportWarnings = p
167164
.packageWarningCounter.countedWarnings.values
168-
.expand<String>((Set<Tuple2<PackageWarning, String>> s) => s
169-
.where((Tuple2<PackageWarning, String> t) =>
170-
t.item1 == PackageWarning.unresolvedExport)
171-
.map<String>((Tuple2<PackageWarning, String> t) => t.item2));
165+
.map((e) => e[PackageWarning.unresolvedExport] ?? {})
166+
.expand((element) => element);
172167

173168
expect(unresolvedExportWarnings.length, equals(1));
174169
expect(unresolvedExportWarnings.first,

test/end2end/model_test.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import 'package:dartdoc/src/render/model_element_renderer.dart';
1515
import 'package:dartdoc/src/render/parameter_renderer.dart';
1616
import 'package:dartdoc/src/render/typedef_renderer.dart';
1717
import 'package:dartdoc/src/special_elements.dart';
18-
import 'package:dartdoc/src/tuple.dart';
1918
import 'package:dartdoc/src/warnings.dart';
2019
import 'package:test/test.dart';
2120

@@ -905,11 +904,11 @@ void main() {
905904
'<a href="%%__HTMLBASE_dartdoc_internal__%%reexport_two/BaseReexported/action.html">ExtendedBaseReexported.action</a></p>'));
906905
var doAwesomeStuffWarnings = packageGraph.packageWarningCounter
907906
.countedWarnings[doAwesomeStuff.element] ??
908-
[];
907+
{};
909908
expect(
910909
doAwesomeStuffWarnings,
911-
isNot(anyElement((Tuple2<PackageWarning, String> e) =>
912-
e.item1 == PackageWarning.ambiguousDocReference)));
910+
isNot(doAwesomeStuffWarnings
911+
.containsKey(PackageWarning.ambiguousDocReference)));
913912
});
914913

915914
test('can handle renamed imports', () {

0 commit comments

Comments
 (0)