26c90ed46b
Prior to this CL, the analyzer's set of unignorable diagnostic code names (`AnalysisOptionsImpl.unignorableDiagnosticCodeNames`) was constructed in the following way: - For each entry in the `cannot-ignore` section of the `analysis_options.yaml` file that matches the name of a severity code, the names of all diagnostic codes with matching severities were added (1). - All other entries in the `cannot-ignore` section were converted to upper case and then added (2). However, diagnostic codes associated with lints are named using `lower_snake_case`, while analyzer diagnonstic codes are named using `UPPER_SNAKE_CASE`. Some of the logic that consumed `AnalysisOptionsImpl.unignorableDiagnosticCodeNames` didn't account for this, resulting in some subtle bugs: - When the resolved correction producer base class `_BaseIgnoreDiagnostic` attempted to figure out if a diagnostic was unignorable, it compared elements of `unignorableDiagnosticCodeNames` to `DiagnosticCode.name`, which meant that it would successfully recognize non-lint codes as unignorable, but it would only recognize that a lint code was unignorable if it was included in `unignorableDiagnosticCodeNames` by putting the name of a severity in the `cannot-ignore` section of the `analysis_options.yaml` file. - When `LibraryAnalyzer._filterIgnoredDiagnostics` attempted to block unignorable diagnostics from being ignored, it compared elements of `unignorableDiagnosticCodeNames` to `DiagnosticCode.name`, `DiagnosticCode.uniqueName`, and `DiagnosticCode.name.toUpperCase()`. This worked, however the comparison to `DiagnosticCode.uniqueName` had no effect. Note that values of `DiagnosticCode.uniqueName` always take the form `ClassName.snake_case_diagnostic_code` or `ClassName.SNAKE_CASE_DIAGNOSTIC_CODE`. It's impossible for any of the values added to `AnalysisOptionsImpl.unignorableDiagnosticCodeNames` to ever match this, because (1) always adds values of `DiagnosticCode.name` (which never contains a `.`), and (2) always adds strings that have been converted to upper case. - When `IgnoreValidator.reportErrors` attempted to report unignorable and duplicate entries, it compared elements of `unignorableDiagnosticCodeNames` to `IgnoredDiagnosticName.name`, which is always lower case. That meant that it would only recognize that a diagnostic code was unignorable if the diagnostic code was associated with a lint and was included in `unignorableDiagnosticCodeNames` by putting the name of a severity in the `cannot-ignore` section of the `analysis_options.yaml` file. (Note, however, that this bug was unobservable because the reporting of the `unignorable_ignore` diagnostic is currently disabled; I will address this in a follow-up CL.) - Additionally, the logic to populate `AnalysisOptionsImpl.unignorableDiagnosticCodeNames` based on a severity code had a bug in its handling of error processors: if one or more error processors were used to change the severity of a diagnostic, then entries would be added to `AnalysisOptionsImpl.unignorableDiagnosticCodeNames` corresponding to both the original and the new severity. These buggy behaviors have been fixed by: - Streamlining and simplifying the logic that builds `AnalysisOptionsImpl.unignorableDiagnosticCodeNames`, and ensuring that all strings added to it are all lower case. - Changing all logic that checks whether a string is contained in `AnalysisOptionsImpl.unignorableDiagnosticCodeNames` so that it first converts that string to lower case. - Removing the ineffective logic in `LibraryAnalyzer._filterIgnoredDiagnostics` that attempted to compare elements of `unignorableDiagnosticCodeNames` to `DiagnosticCode.uniqueName`. Change-Id: I6a6a6964d89c139492dbb11d8ba3b2d33c0e2ee8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/462864 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Paul Berry <paulberry@google.com>