2
2
// for details. All rights reserved. Use of this source code is governed by a
3
3
// BSD-style license that can be found in the LICENSE file.
4
4
5
+ import 'dart:collection' ;
6
+
5
7
import 'package:analyzer/dart/element/element.dart' ;
6
8
import 'package:analyzer/file_system/file_system.dart' ;
7
9
import 'package:dartdoc/src/dartdoc_options.dart' ;
8
10
import 'package:dartdoc/src/logging.dart' ;
9
11
import 'package:dartdoc/src/model/model.dart' ;
10
12
import 'package:dartdoc/src/package_meta.dart' ;
11
- import 'package:dartdoc/src/tuple.dart' ;
12
13
13
14
abstract class PackageWarningOptionContext implements DartdocOptionContextBase {
14
15
bool get allowNonLocalWarnings =>
@@ -113,14 +114,15 @@ class PackageWarningDefinition implements Comparable<PackageWarningDefinition> {
113
114
}
114
115
115
116
/// 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
+ };
119
121
120
122
/// Provides description text and command line flags for warnings.
121
123
/// 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
+ {
124
126
PackageWarning .ambiguousDocReference: PackageWarningDefinition (
125
127
PackageWarning .ambiguousDocReference,
126
128
'ambiguous-doc-reference' ,
@@ -317,7 +319,7 @@ enum PackageWarningMode {
317
319
/// In particular, this set should not include warnings around public/private
318
320
/// or canonicalization problems, because those can break the isDocumented()
319
321
/// check.
320
- final Set <PackageWarning > skipWarningIfNotDocumentedFor = {
322
+ const Set <PackageWarning > skipWarningIfNotDocumentedFor = {
321
323
PackageWarning .unresolvedDocReference,
322
324
PackageWarning .typeAsHtml
323
325
};
@@ -419,11 +421,26 @@ class PackageWarningOptions {
419
421
}
420
422
421
423
class PackageWarningCounter {
422
- final Map <Element , Set < Tuple2 < PackageWarning , String >>> countedWarnings = {};
424
+ final Map <Element , Map < PackageWarning , Set < String >>> _countedWarnings = {};
423
425
final _items = < Jsonable > [];
424
426
final _displayedWarningCounts = < PackageWarning , int > {};
425
427
final PackageGraph packageGraph;
426
428
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
+
427
444
PackageWarningCounter (this .packageGraph);
428
445
429
446
/// Actually write out the warning. Assumes it is already counted with add.
@@ -462,11 +479,16 @@ class PackageWarningCounter {
462
479
_items.clear ();
463
480
}
464
481
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] .
466
487
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);
470
492
}
471
493
return false ;
472
494
}
@@ -484,19 +506,18 @@ class PackageWarningCounter {
484
506
warningMode = PackageWarningMode .ignore;
485
507
}
486
508
if (warningMode == PackageWarningMode .warn) {
487
- warningCount += 1 ;
509
+ _warningCount += 1 ;
488
510
} else if (warningMode == PackageWarningMode .error) {
489
- errorCount += 1 ;
511
+ _errorCount += 1 ;
490
512
}
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);
493
517
_writeWarning (kind, warningMode, config.verboseWarnings,
494
518
element? .fullyQualifiedName, fullMessage);
495
519
}
496
520
497
- int errorCount = 0 ;
498
- int warningCount = 0 ;
499
-
500
521
@override
501
522
String toString () {
502
523
var errors = '$errorCount ${errorCount == 1 ? "error" : "errors" }' ;
0 commit comments