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+
57import 'package:analyzer/dart/element/element.dart' ;
68import 'package:analyzer/file_system/file_system.dart' ;
79import 'package:dartdoc/src/dartdoc_options.dart' ;
810import 'package:dartdoc/src/logging.dart' ;
911import 'package:dartdoc/src/model/model.dart' ;
1012import 'package:dartdoc/src/package_meta.dart' ;
11- import 'package:dartdoc/src/tuple.dart' ;
1213
1314abstract 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
421423class 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" }' ;
0 commit comments