Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(423)

Unified Diff: pkg/analyzer/lib/src/task/dart.dart

Issue 2888953002: Analyzer: add ignore_for_file comment that ignores a type of problem for the whole file; add tests. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/error_suppression_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/task/dart.dart
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 2de68f1957d9172236a914bee75a231d41491313..797d8f736aca11ba0e885d816076e67917ccae85 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -3005,7 +3005,8 @@ class GenerateLintsTask extends SourceBasedAnalysisTask {
}
/**
- * Information about analysis `//ignore:` comments within a source file.
+ * Information about analysis `//ignore:` and `//ignore_for_file` comments
+ * within a source file.
*/
class IgnoreInfo {
/**
@@ -3024,12 +3025,25 @@ class IgnoreInfo {
static final RegExp _IGNORE_MATCHER =
new RegExp(r'//[ ]*ignore:(.*)$', multiLine: true);
+ /**
+ * A regular expression for matching 'ignore_for_file' comments. Produces
+ * matches containing 2 groups. For example:
+ *
+ * * ['//ignore_for_file: error_code', 'error_code']
+ *
+ * Resulting codes may be in a list ('error_code_1,error_code2').
+ */
+ static final RegExp _IGNORE_FOR_FILE_MATCHER =
+ new RegExp(r'//[ ]*ignore_for_file:(.*)$', multiLine: true);
+
final Map<int, List<String>> _ignoreMap = new HashMap<int, List<String>>();
+ final Set<String> _ignoreForFileSet = new HashSet<String>();
+
/**
* Whether this info object defines any ignores.
*/
- bool get hasIgnores => ignores.isNotEmpty;
+ bool get hasIgnores => ignores.isNotEmpty || _ignoreForFileSet.isNotEmpty;
/**
* Map of line numbers to associated ignored error codes.
@@ -3037,6 +3051,11 @@ class IgnoreInfo {
Map<int, Iterable<String>> get ignores => _ignoreMap;
/**
+ * Iterable of error codes ignored for the whole file.
+ */
+ Iterable<String> get ignoreForFiles => _ignoreForFileSet;
+
+ /**
* Ignore this [errorCode] at [line].
*/
void add(int line, String errorCode) {
@@ -3051,9 +3070,17 @@ class IgnoreInfo {
}
/**
+ * Ignore these [errorCodes] in the whole file.
+ */
+ void addAllForFile(Iterable<String> errorCodes) {
+ _ignoreForFileSet.addAll(errorCodes);
+ }
+
+ /**
* Test whether this [errorCode] is ignored at the given [line].
*/
bool ignoredAt(String errorCode, int line) =>
+ _ignoreForFileSet.contains(errorCode) ||
_ignoreMap[line]?.contains(errorCode) == true;
/**
@@ -3061,7 +3088,8 @@ class IgnoreInfo {
*/
static IgnoreInfo calculateIgnores(String content, LineInfo info) {
Iterable<Match> matches = _IGNORE_MATCHER.allMatches(content);
- if (matches.isEmpty) {
+ Iterable<Match> fileMatches = _IGNORE_FOR_FILE_MATCHER.allMatches(content);
+ if (matches.isEmpty && fileMatches.isEmpty) {
return _EMPTY_INFO;
}
@@ -3074,6 +3102,13 @@ class IgnoreInfo {
.map((String code) => code.trim().toLowerCase());
ignoreInfo.addAll(info.getLocation(match.start).lineNumber, codes);
}
+ for (Match match in fileMatches) {
+ Iterable<String> codes = match
+ .group(1)
+ .split(',')
+ .map((String code) => code.trim().toLowerCase());
+ ignoreInfo.addAllForFile(codes);
+ }
return ignoreInfo;
}
}
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/error_suppression_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698