diff --git a/pkg/analysis_server/lib/src/cider/fixes.dart b/pkg/analysis_server/lib/src/cider/fixes.dart
index 9bd2d57..add0127 100644
--- a/pkg/analysis_server/lib/src/cider/fixes.dart
+++ b/pkg/analysis_server/lib/src/cider/fixes.dart
@@ -45,16 +45,16 @@
     var lineInfo = resolvedUnit.lineInfo;
 
     await _logger.runAsync('Compute fixes', () async {
-      for (var error in resolvedUnit.errors) {
-        var errorLine = lineInfo.getLocation(error.offset).lineNumber;
-        if (errorLine == lineNumber) {
+      for (var diagnostic in resolvedUnit.diagnostics) {
+        var diagnosticLine = lineInfo.getLocation(diagnostic.offset).lineNumber;
+        if (diagnosticLine == lineNumber) {
           var workspace = DartChangeWorkspace([resolvedUnit.session]);
           var context = _CiderDartFixContextImpl(
             _fileResolver,
             workspace: workspace,
             libraryResult: resolvedLibrary,
             unitResult: resolvedUnit,
-            error: error,
+            error: diagnostic,
           );
 
           var fixes = await computeFixes(context);
@@ -62,7 +62,7 @@
 
           result.add(
             CiderErrorFixes(
-              diagnostic: error,
+              diagnostic: diagnostic,
               fixes: fixes,
               lineInfo: lineInfo,
             ),
diff --git a/pkg/analysis_server/lib/src/g3/fixes.dart b/pkg/analysis_server/lib/src/g3/fixes.dart
index 92168f4..6e2f2c5 100644
--- a/pkg/analysis_server/lib/src/g3/fixes.dart
+++ b/pkg/analysis_server/lib/src/g3/fixes.dart
@@ -73,7 +73,7 @@
     var unitResult = resolvedLibrary.unitWithPath(path)!;
 
     Diagnostic diagnostic;
-    var errors = unitResult.errors;
+    var errors = unitResult.diagnostics;
     if (inFile) {
       var groups = errors.groupListsBy((error) => error.diagnosticCode);
       if (groups.length != 1) {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
index 647ac78..5e0e148 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
@@ -127,7 +127,7 @@
     );
     var sdkVersionConstraint =
         (package is PubPackage) ? package.sdkVersionConstraint : null;
-    var errors = analyzeAnalysisOptions(
+    var diagnostics = analyzeAnalysisOptions(
       FileSource(optionsFile),
       content,
       sourceFactory,
@@ -138,10 +138,10 @@
     if (options == null) {
       return errorFixesList;
     }
-    for (var error in errors) {
+    for (var diagnostic in diagnostics) {
       var generator = AnalysisOptionsFixGenerator(
         resourceProvider,
-        error,
+        diagnostic,
         content,
         options,
       );
@@ -160,10 +160,10 @@
           lineInfo: lineInfo,
           isLibrary: true,
           isPart: false,
-          errors: errors,
+          diagnostics: diagnostics,
           analysisOptions: analysisOptions,
         );
-        var serverError = newAnalysisError_fromEngine(result, error);
+        var serverError = newAnalysisError_fromEngine(result, diagnostic);
         var errorFixes = AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
         for (var fix in fixes) {
@@ -188,8 +188,8 @@
       var unitResult = libraryResult.unitWithPath(file)!;
       var lineInfo = unitResult.lineInfo;
       var requestLine = lineInfo.getLocation(offset).lineNumber;
-      for (var error in unitResult.errors) {
-        var errorLine = lineInfo.getLocation(error.offset).lineNumber;
+      for (var diagnostic in unitResult.diagnostics) {
+        var errorLine = lineInfo.getLocation(diagnostic.offset).lineNumber;
         if (errorLine == requestLine) {
           var workspace = DartChangeWorkspace(await server.currentSessions);
           var context = DartFixContext(
@@ -197,7 +197,7 @@
             workspace: workspace,
             libraryResult: libraryResult,
             unitResult: unitResult,
-            error: error,
+            error: diagnostic,
           );
 
           List<Fix> fixes;
@@ -223,8 +223,8 @@
           } catch (exception, stackTrace) {
             var parametersFile = '''
 offset: $offset
-error: $error
-error.errorCode: ${error.diagnosticCode}
+error: $diagnostic
+error.errorCode: ${diagnostic.diagnosticCode}
 ''';
             throw CaughtExceptionWithFiles(exception, stackTrace, {
               file: unitResult.content,
@@ -234,7 +234,10 @@
 
           if (fixes.isNotEmpty) {
             fixes.sort(Fix.compareFixes);
-            var serverError = newAnalysisError_fromEngine(unitResult, error);
+            var serverError = newAnalysisError_fromEngine(
+              unitResult,
+              diagnostic,
+            );
             var errorFixes = AnalysisErrorFixes(serverError);
             errorFixesList.add(errorFixes);
             for (var fix in fixes) {
@@ -282,16 +285,16 @@
     }
 
     var analysisOptions = fileResult.analysisOptions;
-    var errors = validatePubspec(
+    var diagnostics = validatePubspec(
       contents: node,
       source: FileSource(pubspecFile),
       provider: resourceProvider,
       analysisOptions: analysisOptions,
     );
-    for (var error in errors) {
+    for (var diagnostic in diagnostics) {
       var generator = PubspecFixGenerator(
         resourceProvider,
-        error,
+        diagnostic,
         content,
         node,
       );
@@ -310,10 +313,10 @@
           lineInfo: lineInfo,
           isLibrary: true,
           isPart: false,
-          errors: errors,
+          diagnostics: diagnostics,
           analysisOptions: analysisOptions,
         );
-        var serverError = newAnalysisError_fromEngine(result, error);
+        var serverError = newAnalysisError_fromEngine(result, diagnostic);
         var errorFixes = AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
         for (var fix in fixes) {
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart
index dd94364..d968b42 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_organize_directives.dart
@@ -49,9 +49,9 @@
     var fileStamp = -1;
     var code = result.content;
     var unit = result.unit;
-    var errors = result.errors;
-    // check if there are scan/parse errors in the file
-    var numScanParseErrors = numberOfSyntacticErrors(errors);
+    var diagnostics = result.diagnostics;
+    // Check if there are scan/parse errors in the file.
+    var numScanParseErrors = numberOfSyntacticErrors(diagnostics);
     if (numScanParseErrors != 0) {
       sendResponse(
         Response.organizeDirectivesError(
@@ -62,7 +62,7 @@
       return;
     }
     // do organize
-    var sorter = ImportOrganizer(code, unit, errors);
+    var sorter = ImportOrganizer(code, unit, diagnostics);
     var edits = sorter.organize();
     var fileEdit = SourceFileEdit(file, fileStamp, edits: edits);
     sendResult(EditOrganizeDirectivesResult(fileEdit));
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart
index 519f0b4..48e8f30 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_sort_members.dart
@@ -50,9 +50,9 @@
     var fileStamp = -1;
     var code = result.content;
     var unit = result.unit;
-    var errors = result.errors;
+    var diagnostics = result.diagnostics;
     // Check if there are scan/parse errors in the file.
-    var numScanParseErrors = numberOfSyntacticErrors(errors);
+    var numScanParseErrors = numberOfSyntacticErrors(diagnostics);
     if (numScanParseErrors != 0) {
       sendResponse(
         Response.sortMembersParseErrors(request, numScanParseErrors),
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart
index 294ae90..c0e75c8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart
@@ -245,7 +245,7 @@
       lineInfo: lineInfo,
       isLibrary: true,
       isPart: false,
-      errors: diagnostics,
+      diagnostics: diagnostics,
       analysisOptions: analysisOptions,
     );
   }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart
index b062757..fe1fc06 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart
@@ -212,7 +212,7 @@
           willBeDeduplicated ? {} : null;
       var workspace = DartChangeWorkspace(await server.currentSessions);
       CorrectionUtils? correctionUtils;
-      for (var error in unitResult.errors) {
+      for (var error in unitResult.diagnostics) {
         // Return fixes for any part of the line where a diagnostic is.
         // If a diagnostic spans multiple lines, the fix will be included for
         // all of those lines.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
index 85967cb..9ab2912 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
@@ -52,7 +52,7 @@
       var code = result.content;
       var unit = result.unit;
 
-      if (hasScanParseErrors(result.errors)) {
+      if (hasScanParseErrors(result.diagnostics)) {
         if (autoTriggered) {
           return success(null);
         }
@@ -66,7 +66,7 @@
         );
       }
 
-      var organizer = ImportOrganizer(code, unit, result.errors);
+      var organizer = ImportOrganizer(code, unit, result.diagnostics);
       var edits = organizer.organize();
 
       if (edits.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
index c441716..8eea96b 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
@@ -65,7 +65,7 @@
     var code = result.content;
     var unit = result.unit;
 
-    if (hasScanParseErrors(result.errors)) {
+    if (hasScanParseErrors(result.diagnostics)) {
       if (autoTriggered) {
         return success(null);
       }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
index 774c2a9..31bc0bf 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
@@ -38,7 +38,7 @@
     }
 
     var result = await server.getParsedUnit(path);
-    if (result == null || result.errors.isNotEmpty) {
+    if (result == null || result.diagnostics.isNotEmpty) {
       return success(null);
     }
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
index 16526a6..490ffc4 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
@@ -38,7 +38,7 @@
     }
 
     var result = await server.getParsedUnit(path);
-    if (result == null || result.errors.isNotEmpty) {
+    if (result == null || result.diagnostics.isNotEmpty) {
       return success(null);
     }
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
index c5938a6..7cb9ef4 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
@@ -37,7 +37,7 @@
     }
 
     var result = await server.getParsedUnit(path);
-    if (result == null || result.errors.isNotEmpty) {
+    if (result == null || result.diagnostics.isNotEmpty) {
       return success(null);
     }
 
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 2facd04..62597d4 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -34,7 +34,11 @@
 List<AnalysisError> doAnalysisError_listFromEngine(
   engine.AnalysisResultWithErrors result,
 ) {
-  return mapEngineErrors(result, result.errors, newAnalysisError_fromEngine);
+  return mapEngineErrors(
+    result,
+    result.diagnostics,
+    newAnalysisError_fromEngine,
+  );
 }
 
 /// Adds [edit] to the file containing the given [fragment].
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index ab53c14..aa94923 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -186,11 +186,11 @@
     if (_isEmptyStatementOrEmptyBlock(node)) {
       node = node.parent!;
     }
-    for (var error in statementContext.resolveResult.errors) {
-      if (error.offset >= node.offset && error.offset <= node.end) {
-        if (error.diagnosticCode is! HintCode &&
-            error.diagnosticCode is! WarningCode) {
-          diagnostics.add(error);
+    for (var diagnostic in statementContext.resolveResult.diagnostics) {
+      if (diagnostic.offset >= node.offset && diagnostic.offset <= node.end) {
+        if (diagnostic.diagnosticCode is! HintCode &&
+            diagnostic.diagnosticCode is! WarningCode) {
+          diagnostics.add(diagnostic);
         }
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 43a8cb8..0920a81 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -261,7 +261,7 @@
           continue;
         }
 
-        if (!await _hasFixableErrors(context, path)) {
+        if (!await _hasFixableDiagnostics(context, path)) {
           continue;
         }
 
@@ -501,7 +501,7 @@
           continue;
         }
 
-        if (!await _hasFixableErrors(context, path)) {
+        if (!await _hasFixableDiagnostics(context, path)) {
           continue;
         }
 
@@ -557,16 +557,16 @@
     AnalysisOptions analysisOptions,
     List<Diagnostic> originalDiagnostics,
   ) sync* {
-    var errors = originalDiagnostics.toList();
-    errors.sort((a, b) => a.offset.compareTo(b.offset));
-    for (var error in errors) {
+    var diagnostics = originalDiagnostics.toList();
+    diagnostics.sort((a, b) => a.offset.compareTo(b.offset));
+    for (var diagnostic in diagnostics) {
       if (_codes != null &&
-          !_codes.contains(error.diagnosticCode.name.toLowerCase())) {
+          !_codes.contains(diagnostic.diagnosticCode.name.toLowerCase())) {
         continue;
       }
-      var processor = ErrorProcessor.getProcessor(analysisOptions, error);
+      var processor = ErrorProcessor.getProcessor(analysisOptions, diagnostic);
       if (processor == null || processor.severity != null) {
-        yield error;
+        yield diagnostic;
       }
     }
   }
@@ -629,7 +629,7 @@
     //
     for (var diagnostic in _filterDiagnostics(
       analysisOptions,
-      unitResult.errors,
+      unitResult.diagnostics,
     )) {
       var context = fixContext(diagnostic);
       await _fixSingleDiagnostic(
@@ -655,7 +655,7 @@
     var unusedImportDiagnostics = <Diagnostic>[];
     for (var diagnostic in _filterDiagnostics(
       analysisOptions,
-      unitResult.errors,
+      unitResult.diagnostics,
     )) {
       var diagnosticCode = diagnostic.diagnosticCode;
       if (diagnosticCode is LintCode) {
@@ -829,7 +829,7 @@
         }
         var unitResult =
             context.currentSession.getParsedUnit(path) as ParsedUnitResult;
-        if (unitResult.errors.isNotEmpty) {
+        if (unitResult.diagnostics.isNotEmpty) {
           continue;
         }
 
@@ -876,8 +876,11 @@
     }
   }
 
-  /// Returns whether [path] has any errors that might be fixable.
-  Future<bool> _hasFixableErrors(AnalysisContext context, String path) async {
+  /// Returns whether [path] has any diagnostics that might be fixable.
+  Future<bool> _hasFixableDiagnostics(
+    AnalysisContext context,
+    String path,
+  ) async {
     var errorsResult = await context.currentSession.getErrors(path);
     if (errorsResult is! ErrorsResult) {
       return false;
@@ -887,7 +890,7 @@
         .getAnalysisOptionsForFile(errorsResult.file);
     return _filterDiagnostics(
       analysisOptions,
-      errorsResult.errors,
+      errorsResult.diagnostics,
     ).any((d) => d.isFixable);
   }
 
@@ -904,18 +907,18 @@
         var unitResult =
             context.currentSession.getParsedUnit(path) as ParsedUnitResult;
         var code = unitResult.content;
-        var errors = unitResult.errors;
+        var diagnostics = unitResult.diagnostics;
         // Check if there are scan/parse errors in the file.
-        var hasParseErrors = errors.any(
-          (error) =>
-              error.diagnosticCode is ScannerErrorCode ||
-              error.diagnosticCode is ParserErrorCode,
+        var hasParseErrors = diagnostics.any(
+          (d) =>
+              d.diagnosticCode is ScannerErrorCode ||
+              d.diagnosticCode is ParserErrorCode,
         );
         if (hasParseErrors) {
           // Cannot process files with parse errors.
           continue;
         }
-        var sorter = ImportOrganizer(code, unitResult.unit, errors);
+        var sorter = ImportOrganizer(code, unitResult.unit, diagnostics);
         var edits = sorter.organize();
         await builder.addDartFileEdit(path, (builder) {
           for (var edit in edits) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
index 8f97645..a85a384 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
@@ -176,20 +176,20 @@
   /// If other diagnostics are to be fixed with this CorrectionProducer the
   /// inner test for `prefer_const_constructors` will need to be amended.
   bool _declarationListIsFullyConst(NodeList<VariableDeclaration> variables) {
-    var errors = [
-      ...unitResult.errors.where(
+    var diagnostics = [
+      ...unitResult.diagnostics.where(
         (error) =>
             error.diagnosticCode == LinterLintCode.prefer_const_constructors,
       ),
     ];
-    var errorsRanges = errors.map(range.error);
+    var ranges = diagnostics.map(range.error);
     var variablesRanges = variables.map((v) {
       var initializer = v.initializer;
       if (initializer == null) return range.node(v);
       return range.node(initializer);
     });
     // If each of the variable ranges is contained in the list of error ranges.
-    return variablesRanges.every(errorsRanges.contains);
+    return variablesRanges.every(ranges.contains);
   }
 
   /// Inserts `const ` before [targetNode].
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index bf19e674..d027595 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -252,10 +252,10 @@
     var properties = <_PropertyInfo>[];
 
     // Compute the information for all the properties to be added.
-    for (var error in propertyDiagnostics) {
+    for (var diagnostic in propertyDiagnostics) {
       var node = unitResult.unit.nodeCovering(
-        offset: error.offset,
-        length: error.length,
+        offset: diagnostic.offset,
+        length: diagnostic.length,
       );
       if (node == null) {
         continue;
@@ -329,13 +329,13 @@
     var propertyDiagnostics = <Diagnostic>[];
     var startOffset = declaration.offset;
     var endOffset = startOffset + declaration.length;
-    for (var error in unitResult.errors) {
-      var errorCode = error.diagnosticCode;
-      if (errorCode.type == DiagnosticType.LINT &&
-          errorCode == LinterLintCode.diagnostic_describe_all_properties &&
-          error.offset > startOffset &&
-          error.offset < endOffset) {
-        propertyDiagnostics.add(error);
+    for (var diagnostic in unitResult.diagnostics) {
+      var diagnosticCode = diagnostic.diagnosticCode;
+      if (diagnosticCode.type == DiagnosticType.LINT &&
+          diagnosticCode == LinterLintCode.diagnostic_describe_all_properties &&
+          diagnostic.offset > startOffset &&
+          diagnostic.offset < endOffset) {
+        propertyDiagnostics.add(diagnostic);
       }
     }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index 7c9adff..e521584 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
@@ -72,27 +72,26 @@
       return;
     }
 
-    var validErrors = _codesWhereThisIsValid;
-    var errors = unitResult.errors.where(
-      (e) =>
-          diagnostic.sameRangeAs(e) && validErrors.contains(e.diagnosticCode),
+    var validCodes = _codesWhereThisIsValid;
+    var diagnostics = unitResult.diagnostics.where(
+      (e) => diagnostic.sameRangeAs(e) && validCodes.contains(e.diagnosticCode),
     );
 
     // Should not happen since the current diagnostic is in the list of errors
     // where this fix is valid.
-    if (errors.isEmpty) {
-      errors = [diagnostic];
+    if (diagnostics.isEmpty) {
+      diagnostics = [diagnostic];
     }
 
     // This should only trigger once and the disposition of the valid
     // diagnostics in the unit should always be the same.
-    if (errors.first != diagnostic) {
+    if (diagnostics.first != diagnostic) {
       return;
     }
 
-    _missingParameters = errors.length;
+    _missingParameters = diagnostics.length;
 
-    for (var (index, diagnostic) in errors.indexed) {
+    for (var (index, diagnostic) in diagnostics.indexed) {
       if (targetElement is ExecutableElement && argumentList != null) {
         // Format: "Missing required argument 'foo'."
         var messageParts = diagnostic.problemMessage
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_related_to_cascade.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_related_to_cascade.dart
index d85042c..7b06b90 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_related_to_cascade.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_related_to_cascade.dart
@@ -31,28 +31,21 @@
     var block = node.parent;
     if (block is! Block) return;
 
-    var errors = unitResult.errors
-        .where(
-          (error) => error.diagnosticCode.name == LintNames.cascade_invocations,
-        )
-        .whereNot(
-          (error) => error.offset == node.offset && error.length == node.length,
-        );
+    var diagnostics = unitResult.diagnostics
+        .where((d) => d.diagnosticCode.name == LintNames.cascade_invocations)
+        .whereNot((d) => d.offset == node.offset && d.length == node.length);
 
-    if (errors.isEmpty) return;
+    if (diagnostics.isEmpty) return;
 
     var previous = _getPrevious(block, node);
     var next = _getNext(block, node);
 
     // Skip if no error has the offset and length of previous or next.
-    if (errors.none(
-          (error) =>
-              error.offset == previous?.offset &&
-              error.length == previous?.length,
+    if (diagnostics.none(
+          (d) => d.offset == previous?.offset && d.length == previous?.length,
         ) &&
-        errors.none(
-          (error) =>
-              error.offset == next?.offset && error.length == next?.length,
+        diagnostics.none(
+          (d) => d.offset == next?.offset && d.length == next?.length,
         )) {
       return;
     }
@@ -60,17 +53,16 @@
     // Get the full list of statements with errors that are related to this.
     List<ExpressionStatement> relatedStatements = [node];
     while (previous != null && previous is ExpressionStatement) {
-      if (errors.any(
-        (error) =>
-            error.offset == previous!.offset && error.length == previous.length,
+      if (diagnostics.any(
+        (d) => d.offset == previous!.offset && d.length == previous.length,
       )) {
         relatedStatements.insert(0, previous);
       }
       previous = _getPrevious(block, previous);
     }
     while (next != null && next is ExpressionStatement) {
-      if (errors.any(
-        (error) => error.offset == next!.offset && error.length == next.length,
+      if (diagnostics.any(
+        (d) => d.offset == next!.offset && d.length == next.length,
       )) {
         relatedStatements.add(next);
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index f9a4a0c..4153f50 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
@@ -722,18 +722,18 @@
   /// names where this fix can be applied besides the current diagnostic.
   Future<Set<String>> _otherUnresolvedNames(String? prefix, String name) async {
     var errorsForThisFix = _codesWhereThisIsValid;
-    var errors =
+    var diagnostics =
         <Diagnostic, List<MultiProducerGenerator>>{}..addEntries(
-          unitResult.errors.map((error) {
-            if (error == diagnostic) return null;
-            var generators = errorsForThisFix[error.diagnosticCode];
+          unitResult.diagnostics.map((d) {
+            if (d == diagnostic) return null;
+            var generators = errorsForThisFix[d.diagnosticCode];
             if (generators == null) return null;
-            return MapEntry(error, generators);
+            return MapEntry(d, generators);
           }).nonNulls,
         );
     var otherNames = <String>{};
-    if (errors.isNotEmpty) {
-      for (var MapEntry(:key, :value) in errors.entries) {
+    if (diagnostics.isNotEmpty) {
+      for (var MapEntry(:key, :value) in diagnostics.entries) {
         for (var generator in value) {
           DartFixContext? dartFixContext;
           if (context.dartFixContext case var context?) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
index 0453670..dc363ac 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
@@ -25,7 +25,7 @@
     var organizer = ImportOrganizer(
       unitResult.content,
       unit,
-      unitResult.errors,
+      unitResult.diagnostics,
     );
     // TODO(pq): consider restructuring organizer to allow a passed-in change
     //  builder
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_const.dart
index bee8b3b..ca168ab 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_const.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_const.dart
@@ -171,7 +171,7 @@
         var constantContext = expression.constantContext(includeSelf: true);
         if (constantContext case (var node, var constKeyword?)) {
           var validDiagnostics = [
-            for (var e in unitResult.errors)
+            for (var e in unitResult.diagnostics)
               if (_codesWhereThisIsValid.contains(e.diagnosticCode)) e,
           ];
           switch (node) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_decorated_box.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_decorated_box.dart
index a7e0663..089c392 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_decorated_box.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_decorated_box.dart
@@ -113,16 +113,15 @@
     });
   }
 
-  /// Return `true` if the specified [expression] has the lint fixed by this
-  /// producer.
+  /// Whether the specified [expression] has the lint fixed by this producer.
   bool _hasLint(InstanceCreationExpression expression) {
     var constructorName = expression.constructorName;
-    return unitResult.errors.any((error) {
-      var errorCode = error.diagnosticCode;
-      return errorCode.type == DiagnosticType.LINT &&
-          errorCode == LinterLintCode.use_decorated_box &&
-          error.offset == constructorName.offset &&
-          error.length == constructorName.length;
+    return unitResult.diagnostics.any((d) {
+      var diagnosticCode = d.diagnosticCode;
+      return diagnosticCode.type == DiagnosticType.LINT &&
+          diagnosticCode == LinterLintCode.use_decorated_box &&
+          d.offset == constructorName.offset &&
+          d.length == constructorName.length;
     });
   }
 }
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 303a7b6..504d7bc 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -73,14 +73,14 @@
     }
     if (verifyNoTestUnitErrors) {
       expect(
-        unitResult.errors.where((error) {
-          return error.diagnosticCode != WarningCode.DEAD_CODE &&
-              error.diagnosticCode != WarningCode.UNUSED_CATCH_CLAUSE &&
-              error.diagnosticCode != WarningCode.UNUSED_CATCH_STACK &&
-              error.diagnosticCode != WarningCode.UNUSED_ELEMENT &&
-              error.diagnosticCode != WarningCode.UNUSED_FIELD &&
-              error.diagnosticCode != WarningCode.UNUSED_IMPORT &&
-              error.diagnosticCode != WarningCode.UNUSED_LOCAL_VARIABLE;
+        unitResult.diagnostics.where((d) {
+          return d.diagnosticCode != WarningCode.DEAD_CODE &&
+              d.diagnosticCode != WarningCode.UNUSED_CATCH_CLAUSE &&
+              d.diagnosticCode != WarningCode.UNUSED_CATCH_STACK &&
+              d.diagnosticCode != WarningCode.UNUSED_ELEMENT &&
+              d.diagnosticCode != WarningCode.UNUSED_FIELD &&
+              d.diagnosticCode != WarningCode.UNUSED_IMPORT &&
+              d.diagnosticCode != WarningCode.UNUSED_LOCAL_VARIABLE;
         }),
         isEmpty,
       );
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index d867efc..60e946a 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -34,16 +34,16 @@
 @reflectiveTest
 class AnalysisErrorTest {
   late MockSource source;
-  late MockAnalysisError engineError;
+  late MockDiagnostic engineDiagnostic;
   late ResolvedUnitResult result;
 
   void setUp() {
     // prepare Source
     source = MockSource(fullName: 'foo.dart');
     // prepare AnalysisError
-    engineError = MockAnalysisError(
+    engineDiagnostic = MockDiagnostic(
       source: source,
-      errorCode: engine.CompileTimeErrorCode.AMBIGUOUS_EXPORT,
+      diagnosticCode: engine.CompileTimeErrorCode.AMBIGUOUS_EXPORT,
       offset: 10,
       length: 20,
       message: 'my message',
@@ -52,13 +52,13 @@
     var lineInfo = engine.LineInfo([0, 5, 9, 20]);
     result = _ResolvedUnitResultImplMock(
       lineInfo: lineInfo,
-      errors: [engineError],
+      diagnostics: [engineDiagnostic],
       path: 'foo.dart',
     );
   }
 
   void test_fromEngine_hasContextMessage() {
-    engineError.contextMessages.add(
+    engineDiagnostic.contextMessages.add(
       engine.DiagnosticMessageImpl(
         filePath: 'bar.dart',
         offset: 30,
@@ -70,10 +70,10 @@
     var error = newAnalysisError_fromEngine(
       _ResolvedUnitResultImplMock(
         lineInfo: engine.LineInfo([0, 5, 9, 20]),
-        errors: [engineError],
+        diagnostics: [engineDiagnostic],
         path: 'bar.dart',
       ),
-      engineError,
+      engineDiagnostic,
     );
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
@@ -109,15 +109,15 @@
   }
 
   void test_fromEngine_hasCorrection() {
-    engineError = MockAnalysisError(
+    engineDiagnostic = MockDiagnostic(
       source: source,
-      errorCode: engine.CompileTimeErrorCode.AMBIGUOUS_EXPORT,
+      diagnosticCode: engine.CompileTimeErrorCode.AMBIGUOUS_EXPORT,
       offset: 10,
       length: 20,
       message: 'my message',
       correctionMessage: 'my correction',
     );
-    var error = newAnalysisError_fromEngine(result, engineError);
+    var error = newAnalysisError_fromEngine(result, engineDiagnostic);
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
@@ -139,16 +139,16 @@
   }
 
   void test_fromEngine_hasUrl() {
-    engineError = MockAnalysisError(
+    engineDiagnostic = MockDiagnostic(
       source: source,
-      errorCode: MockDiagnosticCode(
+      diagnosticCode: MockDiagnosticCode(
         url: 'http://codes.dartlang.org/TEST_ERROR',
       ),
       offset: 10,
       length: 20,
       message: 'my message',
     );
-    var error = newAnalysisError_fromEngine(result, engineError);
+    var error = newAnalysisError_fromEngine(result, engineDiagnostic);
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
@@ -169,9 +169,9 @@
   }
 
   void test_fromEngine_lint() {
-    engineError = MockAnalysisError(
+    engineDiagnostic = MockDiagnostic(
       source: source,
-      errorCode: LintCode(
+      diagnosticCode: LintCode(
         'my_lint',
         'my message',
         correctionMessage: 'correction',
@@ -180,7 +180,7 @@
       length: 20,
       message: 'my message',
     );
-    var error = newAnalysisError_fromEngine(result, engineError);
+    var error = newAnalysisError_fromEngine(result, engineDiagnostic);
     expect(error.toJson(), {
       SEVERITY: 'INFO',
       TYPE: 'LINT',
@@ -200,14 +200,14 @@
   }
 
   void test_fromEngine_noCorrection() {
-    engineError = MockAnalysisError(
+    engineDiagnostic = MockDiagnostic(
       source: source,
-      errorCode: engine.CompileTimeErrorCode.AMBIGUOUS_EXPORT,
+      diagnosticCode: engine.CompileTimeErrorCode.AMBIGUOUS_EXPORT,
       offset: 10,
       length: 20,
       message: 'my message',
     );
-    var error = newAnalysisError_fromEngine(result, engineError);
+    var error = newAnalysisError_fromEngine(result, engineDiagnostic);
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
@@ -328,7 +328,7 @@
   }
 }
 
-class MockAnalysisError implements engine.Diagnostic {
+class MockDiagnostic implements engine.Diagnostic {
   final MockSource? _source;
   final engine.DiagnosticCode? _diagnosticCode;
   final int? _offset;
@@ -341,16 +341,16 @@
   @override
   List<DiagnosticMessage> contextMessages = <DiagnosticMessage>[];
 
-  MockAnalysisError({
+  MockDiagnostic({
     MockSource? source,
-    engine.DiagnosticCode? errorCode,
+    engine.DiagnosticCode? diagnosticCode,
     int? offset,
     int? length,
     String? message,
     DiagnosticMessage? problemMessage,
     String? correctionMessage,
   }) : _source = source,
-       _diagnosticCode = errorCode,
+       _diagnosticCode = diagnosticCode,
        _offset = offset,
        _length = length,
        _message = message,
@@ -444,14 +444,14 @@
   final engine.LineInfo lineInfo;
 
   @override
-  final List<engine.Diagnostic> errors;
+  final List<engine.Diagnostic> diagnostics;
 
   @override
   final String path;
 
   _ResolvedUnitResultImplMock({
     required this.lineInfo,
-    required this.errors,
+    required this.diagnostics,
     required this.path,
   });
 
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 723cbb4..53fa506 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -1007,12 +1007,12 @@
   Future<void> _computeUnitAndErrors(String code) async {
     verifyNoTestUnitErrors = false;
     await resolveTestCode(code);
-    testDiagnostics = testAnalysisResult.errors;
+    testDiagnostics = testAnalysisResult.diagnostics;
   }
 
   Future<void> _parseUnitAndErrors(String code) async {
     verifyNoTestUnitErrors = false;
     await parseTestCode(code);
-    testDiagnostics = testParsedResult.errors;
+    testDiagnostics = testParsedResult.diagnostics;
   }
 }
diff --git a/pkg/analysis_server/test/src/computer/call_hierarchy_computer_test.dart b/pkg/analysis_server/test/src/computer/call_hierarchy_computer_test.dart
index 0273422..0b067ec 100644
--- a/pkg/analysis_server/test/src/computer/call_hierarchy_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/call_hierarchy_computer_test.dart
@@ -1040,7 +1040,7 @@
   ) async {
     var targetFile = getFile(target.file);
     var result = await getResolvedUnit(targetFile);
-    expect(result.errors, isEmpty);
+    expect(result.diagnostics, isEmpty);
 
     return DartCallHierarchyComputer(
       result,
@@ -2024,7 +2024,7 @@
   ) async {
     var targetFile = getFile(target.file);
     var result = await getResolvedUnit(targetFile);
-    expect(result.errors, isEmpty);
+    expect(result.diagnostics, isEmpty);
 
     return DartCallHierarchyComputer(result).findOutgoingCalls(target);
   }
diff --git a/pkg/analysis_server/test/src/computer/color_computer_test.dart b/pkg/analysis_server/test/src/computer/color_computer_test.dart
index 9bf9c7d..4edc13a 100644
--- a/pkg/analysis_server/test/src/computer/color_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/color_computer_test.dart
@@ -197,7 +197,7 @@
   void expectNoErrors(ResolvedUnitResult result) {
     // If the test code has errors, generate a suitable failure to help debug.
     var errors =
-        result.errors
+        result.diagnostics
             .where((error) => error.severity == Severity.error)
             .toList();
     if (errors.isNotEmpty) {
diff --git a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
index ca711fa..28851c4 100644
--- a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
@@ -115,9 +115,9 @@
     var result = await getResolvedUnit(file);
 
     if (hasErrors) {
-      expect(result.errors, isNotEmpty);
+      expect(result.diagnostics, isNotEmpty);
     } else {
-      expect(result.errors, isEmpty);
+      expect(result.diagnostics, isEmpty);
     }
 
     var computer = DartUnitHighlightsComputer(result.unit);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index 6f979d7..3f01331 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -60,31 +60,31 @@
   /// diagnostic filter should return `true` if the diagnostic should not be
   /// ignored.
   Future<Diagnostic> _findDiagnosticToFix({ErrorFilter? filter}) async {
-    var errors = testAnalysisResult.errors;
+    var diagnostics = testAnalysisResult.diagnostics;
     if (filter != null) {
-      if (errors.length == 1) {
+      if (diagnostics.length == 1) {
         fail('Unnecessary error filter');
       }
-      errors = errors.where(filter).toList();
+      diagnostics = diagnostics.where(filter).toList();
     }
-    if (errors.isEmpty) {
+    if (diagnostics.isEmpty) {
       fail('Expected one diagnostic, found: none');
-    } else if (errors.length > 1) {
+    } else if (diagnostics.length > 1) {
       var buffer = StringBuffer();
       buffer.writeln('Expected one diagnostic, found:');
-      for (var error in errors) {
-        buffer.writeln('  $error [${error.diagnosticCode}]');
+      for (var diagnostic in diagnostics) {
+        buffer.writeln('  $diagnostic [${diagnostic.diagnosticCode}]');
       }
       fail(buffer.toString());
     }
-    return errors[0];
+    return diagnostics[0];
   }
 
   Future<Diagnostic> _findDiagnosticToFixOfType(DiagnosticCode code) async {
-    var errors = testAnalysisResult.errors;
-    for (var error in errors) {
-      if (error.diagnosticCode == code) {
-        return error;
+    var diagnostics = testAnalysisResult.diagnostics;
+    for (var diagnostic in diagnostics) {
+      if (diagnostic.diagnosticCode == code) {
+        return diagnostic;
       }
     }
     fail('Expected to find an diagnostic with the code: $code');
@@ -239,44 +239,44 @@
   }
 
   Future<List<Fix>> getFixesForAllErrors(Set<String>? alreadyCalculated) async {
-    var errors = testAnalysisResult.errors;
-    expect(errors, isNotEmpty);
+    var diagnostics = testAnalysisResult.diagnostics;
+    expect(diagnostics, isNotEmpty);
     List<Fix> fixes = [];
-    for (var error in errors) {
+    for (var diagnostic in diagnostics) {
       fixes.addAll(
-        await _computeFixes(error, alreadyCalculated: alreadyCalculated),
+        await _computeFixes(diagnostic, alreadyCalculated: alreadyCalculated),
       );
     }
     return fixes;
   }
 
   Future<List<Fix>> getFixesForFirst(ErrorFilter test) async {
-    var errors = testAnalysisResult.errors.where(test);
-    expect(errors, isNotEmpty);
+    var diagnostics = testAnalysisResult.diagnostics.where(test);
+    expect(diagnostics, isNotEmpty);
     String? diagnosticCode;
-    for (var error in errors) {
-      diagnosticCode ??= error.diagnosticCode.name;
-      if (diagnosticCode != error.diagnosticCode.name) {
-        fail('Expected only errors of one type but found: $errors');
+    for (var diagnostic in diagnostics) {
+      diagnosticCode ??= diagnostic.diagnosticCode.name;
+      if (diagnosticCode != diagnostic.diagnosticCode.name) {
+        fail('Expected only errors of one type but found: $diagnostics');
       }
     }
 
-    var fixes = await _computeFixes(errors.first);
+    var fixes = await _computeFixes(diagnostics.first);
     return fixes;
   }
 
   Future<List<Fix>> getFixesForFirstError() async {
-    var errors = testAnalysisResult.errors;
-    expect(errors, isNotEmpty);
+    var diagnostics = testAnalysisResult.diagnostics;
+    expect(diagnostics, isNotEmpty);
     String? diagnosticCode;
-    for (var error in errors) {
-      diagnosticCode ??= error.diagnosticCode.name;
-      if (diagnosticCode != error.diagnosticCode.name) {
-        fail('Expected only errors of one type but found: $errors');
+    for (var diagnostic in diagnostics) {
+      diagnosticCode ??= diagnostic.diagnosticCode.name;
+      if (diagnosticCode != diagnostic.diagnosticCode.name) {
+        fail('Expected only errors of one type but found: $diagnostics');
       }
     }
 
-    var fixes = await _computeFixes(errors.first);
+    var fixes = await _computeFixes(diagnostics.first);
     return fixes;
   }
 
@@ -317,8 +317,8 @@
     List<FixKind> fixKinds, {
     ErrorFilter? errorFilter,
   }) async {
-    var error = await _findDiagnosticToFix(filter: errorFilter);
-    var computedFixes = await _computeFixes(error);
+    var diagnostic = await _findDiagnosticToFix(filter: errorFilter);
+    var computedFixes = await _computeFixes(diagnostic);
     var kinds = computedFixes.map((fix) => fix.kind).toList();
     kinds.sort((a, b) => b.priority.compareTo(a.priority));
     expect(kinds, containsAllInOrder(fixKinds));
@@ -345,12 +345,12 @@
   /// Return the lint code being tested.
   String get lintCode;
 
-  /// Return the [LintCode] for the [lintCode] (which is actually a name).
+  /// Returns the [LintCode] for the [lintCode] (which is actually a name).
   Future<LintCode> lintCodeByName(String name) async {
-    var errors = testAnalysisResult.errors;
+    var diagnostics = testAnalysisResult.diagnostics;
     var lintCodeSet =
-        errors
-            .map((error) => error.diagnosticCode)
+        diagnostics
+            .map((d) => d.diagnosticCode)
             .whereType<LintCode>()
             .where((lintCode) => lintCode.name == name)
             .toSet();
@@ -389,9 +389,9 @@
     bool allowFixAllFixes = false,
   }) async {
     expected = normalizeSource(expected);
-    var error = await _findDiagnosticToFix(filter: errorFilter);
+    var diagnostic = await _findDiagnosticToFix(filter: errorFilter);
     var fix = await _assertHasFix(
-      error,
+      diagnostic,
       expectedNumberOfFixesForKind: expectedNumberOfFixesForKind,
       matchFixMessage: matchFixMessage,
       allowFixAllFixes: allowFixAllFixes,
@@ -418,8 +418,8 @@
     String? target,
   }) async {
     expected = normalizeSource(expected);
-    var error = await _findDiagnosticToFixOfType(diagnosticCode);
-    var fix = await _assertHasFixAllFix(error);
+    var diagnostic = await _findDiagnosticToFixOfType(diagnosticCode);
+    var fix = await _assertHasFixAllFix(diagnostic);
     change = fix.change;
 
     // apply to "file"
@@ -444,17 +444,17 @@
     required int expectedNumberOfFixesForKind,
     required List<String> matchFixMessages,
   }) async {
-    var error = await _findDiagnosticToFix(filter: errorFilter);
+    var diagnostic = await _findDiagnosticToFix(filter: errorFilter);
     await _assertHasFixes(
-      error,
+      diagnostic,
       expectedNumberOfFixesForKind: expectedNumberOfFixesForKind,
       matchFixMessages: matchFixMessages,
     );
   }
 
   Future<void> assertHasFixWithoutApplying({ErrorFilter? errorFilter}) async {
-    var error = await _findDiagnosticToFix(filter: errorFilter);
-    var fix = await _assertHasFix(error);
+    var diagnostic = await _findDiagnosticToFix(filter: errorFilter);
+    var fix = await _assertHasFix(diagnostic);
     change = fix.change;
   }
 
@@ -470,25 +470,24 @@
     }
   }
 
-  /// Compute fixes for all of the errors in the test file to effectively assert
-  /// that no exceptions will be thrown by doing so.
+  /// Compute fixes for all of the diagnostics in the test file to effectively
+  /// assert that no exceptions will be thrown by doing so.
   Future<void> assertNoExceptions() async {
-    var errors = testAnalysisResult.errors;
-    for (var error in errors) {
-      await _computeFixes(error);
+    for (var diagnostic in testAnalysisResult.diagnostics) {
+      await _computeFixes(diagnostic);
     }
   }
 
   /// Compute fixes and ensure that there is no fix of the [kind] being tested by
   /// this class.
   Future<void> assertNoFix({ErrorFilter? errorFilter}) async {
-    var error = await _findDiagnosticToFix(filter: errorFilter);
-    await _assertNoFix(error);
+    var diagnostic = await _findDiagnosticToFix(filter: errorFilter);
+    await _assertNoFix(diagnostic);
   }
 
   Future<void> assertNoFixAllFix(DiagnosticCode diagnosticCode) async {
-    var error = await _findDiagnosticToFixOfType(diagnosticCode);
-    await _assertNoFixAllFix(error);
+    var diagnostic = await _findDiagnosticToFixOfType(diagnosticCode);
+    await _assertNoFixAllFix(diagnostic);
   }
 
   List<LinkedEditSuggestion> expectedSuggestions(
diff --git a/pkg/analysis_server/test/verify_sorted_test.dart b/pkg/analysis_server/test/verify_sorted_test.dart
index 11723108..fd72401 100644
--- a/pkg/analysis_server/test/verify_sorted_test.dart
+++ b/pkg/analysis_server/test/verify_sorted_test.dart
@@ -150,9 +150,9 @@
         }
         var code = result.content;
         var unit = result.unit;
-        var errors = result.errors;
-        if (errors.isNotEmpty) {
-          fail('Errors found when parsing $path');
+        var diagnostics = result.diagnostics;
+        if (diagnostics.isNotEmpty) {
+          fail('Diagnostics found when parsing $path');
         }
         var sorter = MemberSorter(
           code,
diff --git a/pkg/analysis_server/tool/code_completion/code_metrics.dart b/pkg/analysis_server/tool/code_completion/code_metrics.dart
index 26441ea..3e8d195 100644
--- a/pkg/analysis_server/tool/code_completion/code_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/code_metrics.dart
@@ -1311,8 +1311,8 @@
             continue;
           } else if (hasError(resolvedUnitResult)) {
             print('File $filePath skipped due to errors:');
-            for (var error in resolvedUnitResult.errors) {
-              print('  ${error.toString()}');
+            for (var diagnostic in resolvedUnitResult.diagnostics) {
+              print('  ${diagnostic.toString()}');
             }
             print('');
             continue;
@@ -1419,10 +1419,10 @@
     }
   }
 
-  /// Return `true` if the [result] contains an error.
+  /// Whether the [result] contains an error.
   static bool hasError(ResolvedUnitResult result) {
-    for (var error in result.errors) {
-      if (error.severity == Severity.error) {
+    for (var diagnostic in result.diagnostics) {
+      if (diagnostic.severity == Severity.error) {
         return true;
       }
     }
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart b/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
index f7d9582..2689069 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
@@ -162,9 +162,9 @@
   static Diagnostic? getFirstErrorOrNull(
     ResolvedUnitResult resolvedUnitResult,
   ) {
-    for (var error in resolvedUnitResult.errors) {
-      if (error.severity == Severity.error) {
-        return error;
+    for (var diagnostic in resolvedUnitResult.diagnostics) {
+      if (diagnostic.severity == Severity.error) {
+        return diagnostic;
       }
     }
     return null;
diff --git a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
index 488d0e7..b2b6b05 100644
--- a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
@@ -210,8 +210,8 @@
           } else if (hasError(resolvedUnitResult)) {
             print('');
             print('File $filePath skipped due to errors:');
-            for (var error in resolvedUnitResult.errors) {
-              print('  ${error.toString()}');
+            for (var diagnostic in resolvedUnitResult.diagnostics) {
+              print('  ${diagnostic.toString()}');
             }
             continue;
           }
@@ -290,10 +290,10 @@
     }
   }
 
-  /// Return `true` if the [result] contains an error.
+  /// Whether the [result] contains an error.
   static bool hasError(ResolvedUnitResult result) {
-    for (var error in result.errors) {
-      if (error.severity == Severity.error) {
+    for (var diagnostic in result.diagnostics) {
+      if (diagnostic.severity == Severity.error) {
         return true;
       }
     }
diff --git a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
index 6d728cf..b8c8f9b 100644
--- a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
+++ b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
@@ -196,10 +196,10 @@
           } else if (hasError(resolvedUnitResult)) {
             if (verbose) {
               print('File $filePath skipped due to errors:');
-              for (var error in resolvedUnitResult.errors.where(
+              for (var diagnostics in resolvedUnitResult.diagnostics.where(
                 (e) => e.severity == Severity.error,
               )) {
-                print('  ${error.toString()}');
+                print('  ${diagnostics.toString()}');
               }
               print('');
             } else {
@@ -220,8 +220,8 @@
 
   /// Return `true` if the [result] contains an error.
   static bool hasError(ResolvedUnitResult result) {
-    for (var error in result.errors) {
-      if (error.severity == Severity.error) {
+    for (var diagnostic in result.diagnostics) {
+      if (diagnostic.severity == Severity.error) {
         return true;
       }
     }
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index 652913d..381e875 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -2223,10 +2223,10 @@
           } else if (hasError(resolvedUnitResult)) {
             if (verbose) {
               print('File $filePath skipped due to errors:');
-              for (var error in resolvedUnitResult.errors.where(
+              for (var diagnostic in resolvedUnitResult.diagnostics.where(
                 (e) => e.severity == Severity.error,
               )) {
-                print('  ${error.toString()}');
+                print('  ${diagnostic.toString()}');
               }
               print('');
             } else {
@@ -2455,10 +2455,10 @@
     sink.writeTable(table);
   }
 
-  /// Return `true` if the [result] contains an error.
+  /// Whether the [result] contains an error.
   static bool hasError(ResolvedUnitResult result) {
-    for (var error in result.errors) {
-      if (error.severity == Severity.error) {
+    for (var diagnostic in result.diagnostics) {
+      if (diagnostic.severity == Severity.error) {
         return true;
       }
     }
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index fd61b0f..17d8af5 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -1686,10 +1686,10 @@
           } else if (hasError(resolvedUnitResult)) {
             if (verbose) {
               print('File $filePath skipped due to errors:');
-              for (var error in resolvedUnitResult.errors.where(
+              for (var diagnostic in resolvedUnitResult.diagnostics.where(
                 (e) => e.severity == Severity.error,
               )) {
-                print('  ${error.toString()}');
+                print('  ${diagnostic.toString()}');
               }
               print('');
             } else {
@@ -1711,8 +1711,8 @@
 
   /// Return `true` if the [result] contains an error.
   static bool hasError(ResolvedUnitResult result) {
-    for (var error in result.errors) {
-      if (error.severity == Severity.error) {
+    for (var diagnostic in result.diagnostics) {
+      if (diagnostic.severity == Severity.error) {
         return true;
       }
     }
diff --git a/pkg/analysis_server/tool/codebase/failing_tests.dart b/pkg/analysis_server/tool/codebase/failing_tests.dart
index 5eae739..04d087b 100644
--- a/pkg/analysis_server/tool/codebase/failing_tests.dart
+++ b/pkg/analysis_server/tool/codebase/failing_tests.dart
@@ -99,8 +99,8 @@
         fail('Could not parse $path');
       }
       var unit = result.unit;
-      var errors = result.errors;
-      if (errors.isNotEmpty) {
+      var diagnostics = result.diagnostics;
+      if (diagnostics.isNotEmpty) {
         fail('Errors found when parsing $path');
       }
       var tracker = FailingTestAnnotationTracker(child);
diff --git a/pkg/analysis_server_plugin/lib/src/correction/assist_processor.dart b/pkg/analysis_server_plugin/lib/src/correction/assist_processor.dart
index f6d193c..61d4191 100644
--- a/pkg/analysis_server_plugin/lib/src/correction/assist_processor.dart
+++ b/pkg/analysis_server_plugin/lib/src/correction/assist_processor.dart
@@ -125,12 +125,12 @@
     }
 
     var fileOffset = node.offset;
-    for (var error in _assistContext.unitResult.errors) {
-      var errorSource = error.source;
+    for (var diagnostic in _assistContext.unitResult.diagnostics) {
+      var errorSource = diagnostic.source;
       if (_assistContext.unitResult.path == errorSource.fullName) {
-        if (fileOffset >= error.offset &&
-            fileOffset <= error.offset + error.length) {
-          if (lintCodes.contains(error.diagnosticCode)) {
+        if (fileOffset >= diagnostic.offset &&
+            fileOffset <= diagnostic.offset + diagnostic.length) {
+          if (lintCodes.contains(diagnostic.diagnosticCode)) {
             return true;
           }
         }
diff --git a/pkg/analysis_server_plugin/lib/src/correction/fix_in_file_processor.dart b/pkg/analysis_server_plugin/lib/src/correction/fix_in_file_processor.dart
index 66c8112..7b0e10d 100644
--- a/pkg/analysis_server_plugin/lib/src/correction/fix_in_file_processor.dart
+++ b/pkg/analysis_server_plugin/lib/src/correction/fix_in_file_processor.dart
@@ -47,9 +47,9 @@
       return const <Fix>[];
     }
 
-    var errors = _fixContext.unitResult.errors
+    var diagnostics = _fixContext.unitResult.diagnostics
         .where((e) => error.diagnosticCode.name == e.diagnosticCode.name);
-    if (errors.length < 2) {
+    if (diagnostics.length < 2) {
       return const <Fix>[];
     }
 
@@ -79,17 +79,17 @@
         }
 
         // Compute fixes for the rest of the errors.
-        for (var error in errors.where((item) => item != error)) {
+        for (var diagnostic in diagnostics.where((item) => item != error)) {
           var fixContext = DartFixContext(
             instrumentationService: _fixContext.instrumentationService,
             workspace: _fixContext.workspace,
             libraryResult: _fixContext.libraryResult,
             unitResult: _fixContext.unitResult,
-            error: error,
+            error: diagnostic,
             correctionUtils: _fixContext.correctionUtils,
           );
           fixState =
-              await _fixDiagnostic(fixContext, fixState, generator, error);
+              await _fixDiagnostic(fixContext, fixState, generator, diagnostic);
         }
         if (fixState is _NotEmptyFixState) {
           var sourceChange = fixState.builder.sourceChange;
diff --git a/pkg/analysis_server_plugin/test/single_unit.dart b/pkg/analysis_server_plugin/test/single_unit.dart
index 62e2b3e..0d0ea0f 100644
--- a/pkg/analysis_server_plugin/test/single_unit.dart
+++ b/pkg/analysis_server_plugin/test/single_unit.dart
@@ -77,14 +77,14 @@
     testCode = result.content;
     var testUnit = result.unit;
 
-    expect(result.errors.where((error) {
-      return error.diagnosticCode != WarningCode.DEAD_CODE &&
-          error.diagnosticCode != WarningCode.UNUSED_CATCH_CLAUSE &&
-          error.diagnosticCode != WarningCode.UNUSED_CATCH_STACK &&
-          error.diagnosticCode != WarningCode.UNUSED_ELEMENT &&
-          error.diagnosticCode != WarningCode.UNUSED_FIELD &&
-          error.diagnosticCode != WarningCode.UNUSED_IMPORT &&
-          error.diagnosticCode != WarningCode.UNUSED_LOCAL_VARIABLE;
+    expect(result.diagnostics.where((d) {
+      return d.diagnosticCode != WarningCode.DEAD_CODE &&
+          d.diagnosticCode != WarningCode.UNUSED_CATCH_CLAUSE &&
+          d.diagnosticCode != WarningCode.UNUSED_CATCH_STACK &&
+          d.diagnosticCode != WarningCode.UNUSED_ELEMENT &&
+          d.diagnosticCode != WarningCode.UNUSED_FIELD &&
+          d.diagnosticCode != WarningCode.UNUSED_IMPORT &&
+          d.diagnosticCode != WarningCode.UNUSED_LOCAL_VARIABLE;
     }), isEmpty);
 
     findNode = FindNode(testCode, testUnit);
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index f350f4b..81f60de 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -22,6 +22,8 @@
 * Deprecate `RecordingErrorListener.errors`; use
   `RecordingDiagnosticListener.diagnostics` instead.
 * Deprecate `RecordingErrorListener.getErrorsForSource`; no longer supported.
+* Deprecate `AnalysisResultWithErrors.errors`; use
+  `AnalysisResultWithErrors.diagnostics` instead.
 * Deprecate `ErrorType`; use `DiagnosticType` instead.
 * Change `ElementDirective` from `sealed` to `abstract`.
   This allows the analyzer to have an internal implementation
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index d8cfa6c..1bd011a 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -446,7 +446,8 @@
     session (getter: AnalysisSession)
   AnalysisResultWithErrors (class extends Object implements FileResult):
     new (constructor: AnalysisResultWithErrors Function())
-    errors (getter: List<Diagnostic>)
+    diagnostics (getter: List<Diagnostic>)
+    errors (getter: List<Diagnostic>, deprecated)
   CannotResolveUriResult (class extends Object implements InvalidResult, SomeLibraryElementResult, SomeParsedLibraryResult, SomeResolvedLibraryResult):
     new (constructor: CannotResolveUriResult Function())
   DisposedAnalysisContextResult (class extends Object implements InvalidResult, SomeErrorsResult, SomeFileResult, SomeParsedLibraryResult, SomeParsedUnitResult, SomeResolvedLibraryResult, SomeResolvedUnitResult, SomeUnitElementResult):
diff --git a/pkg/analyzer/example/analyze.dart b/pkg/analyzer/example/analyze.dart
index 924d5cf..2e7a897 100644
--- a/pkg/analyzer/example/analyze.dart
+++ b/pkg/analyzer/example/analyze.dart
@@ -35,10 +35,10 @@
 
       var errorsResult = await context.currentSession.getErrors(filePath);
       if (errorsResult is ErrorsResult) {
-        for (var error in errorsResult.errors) {
-          if (error.diagnosticCode.type != DiagnosticType.TODO) {
+        for (var diagnostic in errorsResult.diagnostics) {
+          if (diagnostic.diagnosticCode.type != DiagnosticType.TODO) {
             print(
-              '  \u001b[1m${error.source.shortName}\u001b[0m ${error.message}',
+              '  \u001b[1m${diagnostic.source.shortName}\u001b[0m ${diagnostic.message}',
             );
             issueCount++;
           }
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 28d1888..8734e14 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -26,8 +26,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisResultWithErrors implements FileResult {
-  /// The analysis errors that were computed during analysis.
-  List<Diagnostic> get errors;
+  /// The diagnostics that were computed during analysis.
+  List<Diagnostic> get diagnostics;
+
+  @Deprecated("Use 'diagnostics' instead")
+  List<Diagnostic> get errors => diagnostics;
 }
 
 /// The type of [InvalidResult] returned when the given URI cannot be resolved.
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 5aa8b1d..73039a3 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -1162,7 +1162,7 @@
       session: currentSession,
       fileState: file,
       unit: unit,
-      errors: listener.diagnostics,
+      diagnostics: listener.diagnostics,
     );
   }
 
@@ -1421,7 +1421,7 @@
             unitFile.path,
             _createErrorsResultImpl(
               file: unitFile,
-              diagnostics: unitResult.errors,
+              diagnostics: unitResult.diagnostics,
             ),
           );
 
@@ -1434,9 +1434,9 @@
             var unitBytes =
                 AnalysisDriverResolvedUnitBuilder(
                   errors:
-                      unitResult.errors.map((error) {
-                        return ErrorEncoding.encode(error);
-                      }).toList(),
+                      unitResult.diagnostics
+                          .map((d) => ErrorEncoding.encode(d))
+                          .toList(),
                   index: index,
                 ).toBuffer();
             _byteStore.putGet(unitKey, unitBytes);
@@ -1451,7 +1451,7 @@
             _priorityResults[unitFile.path] = resolvedUnit;
           }
 
-          _updateHasErrorOrWarningFlag(unitFile, resolvedUnit.errors);
+          _updateHasErrorOrWarningFlag(unitFile, resolvedUnit.diagnostics);
         }
 
         if (withFineDependencies && requirements != null) {
@@ -1605,7 +1605,7 @@
       uri: file.uri,
       isLibrary: file.kind is LibraryFileKind,
       isPart: file.kind is PartFileKind,
-      errors: diagnostics,
+      diagnostics: diagnostics,
       analysisOptions: file.analysisOptions,
     );
   }
@@ -1649,7 +1649,7 @@
       session: currentSession,
       fileState: file,
       unit: unitResult.unit,
-      errors: unitResult.errors,
+      diagnostics: unitResult.diagnostics,
     );
   }
 
@@ -1971,7 +1971,7 @@
       uri: file.uri,
       isLibrary: file.kind is LibraryFileKind,
       isPart: file.kind is PartFileKind,
-      errors: [
+      diagnostics: [
         Diagnostic.tmp(
           source: file.source,
           offset: 0,
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 61c6da4..d6b8167 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -1110,10 +1110,9 @@
 class UnitAnalysisResult {
   final FileState file;
   final CompilationUnitImpl unit;
-  // TODO(srawlins): Renamed to `diagnostics`.
-  final List<Diagnostic> errors;
+  final List<Diagnostic> diagnostics;
 
-  UnitAnalysisResult(this.file, this.unit, this.errors);
+  UnitAnalysisResult(this.file, this.unit, this.diagnostics);
 }
 
 extension on file_state.DirectiveUri {
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 5d2173a..0f2fa8f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -197,7 +197,7 @@
 
 class ErrorsResultImpl implements ErrorsResult {
   @override
-  final List<Diagnostic> errors;
+  final List<Diagnostic> diagnostics;
 
   @override
   final bool isLibrary;
@@ -231,11 +231,14 @@
     required this.lineInfo,
     required this.isLibrary,
     required this.isPart,
-    required this.errors,
+    required this.diagnostics,
     required this.analysisOptions,
   });
 
   @override
+  List<Diagnostic> get errors => diagnostics;
+
+  @override
   String get path => file.path;
 }
 
@@ -334,14 +337,17 @@
   final CompilationUnit unit;
 
   @override
-  final List<Diagnostic> errors;
+  final List<Diagnostic> diagnostics;
 
   ParsedUnitResultImpl({
     required super.session,
     required super.fileState,
     required this.unit,
-    required this.errors,
+    required this.diagnostics,
   });
+
+  @override
+  List<Diagnostic> get errors => diagnostics;
 }
 
 class ParseStringResultImpl implements ParseStringResult {
@@ -481,16 +487,19 @@
   final CompilationUnitImpl unit;
 
   @override
-  final List<Diagnostic> errors;
+  final List<Diagnostic> diagnostics;
 
   ResolvedUnitResultImpl({
     required super.session,
     required super.fileState,
     required this.unit,
-    required this.errors,
+    required this.diagnostics,
   });
 
   @override
+  List<Diagnostic> get errors => diagnostics;
+
+  @override
   bool get exists => fileState.exists;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index c44bd3e..b200d35 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -338,7 +338,7 @@
             }).toList();
       } else {
         var unitResult = await resolve(path: path, performance: performance);
-        diagnostics = unitResult.errors;
+        diagnostics = unitResult.diagnostics;
 
         _errorResultsCache.put(
           errorsKey,
@@ -356,7 +356,7 @@
         lineInfo: file.lineInfo,
         isLibrary: file.kind is LibraryFileKind,
         isPart: file.kind is PartFileKind,
-        errors: diagnostics,
+        diagnostics: diagnostics,
         analysisOptions: file.analysisOptions,
       );
     });
@@ -661,7 +661,7 @@
               session: contextObjects!.analysisSession,
               fileState: file,
               unit: fileResult.unit,
-              errors: fileResult.errors,
+              diagnostics: fileResult.diagnostics,
             );
           }).toList();
 
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index b0291be..48fd1a1 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -213,7 +213,7 @@
     result = await resolveFile(file);
 
     var diagnosticListener = GatheringDiagnosticListener();
-    diagnosticListener.addAll(result.errors);
+    diagnosticListener.addAll(result.diagnostics);
     diagnosticListener.assertErrors(expectedErrors);
   }
 }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index c4f0d93..add9858 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -3442,7 +3442,7 @@
   /// the expected [errorMessage].
   void _expectInferenceError(String errorMessage) {
     var errors =
-        result.errors
+        result.diagnostics
             .where(
               (e) => e.diagnosticCode == CompileTimeErrorCode.COULD_NOT_INFER,
             )
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
index eff0ea7..a9a0a29 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
@@ -327,7 +327,7 @@
 
     // Check that the lint was run, and reported.
     await resolveTestFile();
-    _assertHasLintReported(result.errors, 'prefer_is_not_empty');
+    _assertHasLintReported(result.diagnostics, 'prefer_is_not_empty');
 
     // Lints don't affect summaries, nothing should be linked.
     _assertNoLinkedCycles();
@@ -367,7 +367,7 @@
     var errorsResult =
         await contextFor(testFile).currentSession.getErrors(testFile.path)
             as ErrorsResult;
-    return errorsResult.errors;
+    return errorsResult.diagnostics;
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 6c5f5c6..cbfa772 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -126,7 +126,7 @@
     await resolveTestFile();
 
     // Existing/empty file triggers the lint.
-    _assertHasLintReported(result.errors, _AlwaysReportedLint.code.name);
+    _assertHasLintReported(result.diagnostics, _AlwaysReportedLint.code.name);
   }
 
   test_getResolvedUnit_lint_notExistingFile() async {
@@ -2020,7 +2020,7 @@
     expect(result.units[0].path, a.path);
     expect(result.units[0].content, content);
     expect(result.units[0].unit, isNotNull);
-    expect(result.units[0].errors, isEmpty);
+    expect(result.units[0].diagnostics, isEmpty);
   }
 
   test_getParsedLibrary_invalidPath_notAbsolute() async {
@@ -3323,7 +3323,7 @@
     var a = newFile('$testPackageLibPath/a.dart', '');
     var result = await driver.getErrors(a.path);
     result as ErrorsResult;
-    assertErrorsInList(result.errors, [
+    assertErrorsInList(result.diagnostics, [
       error(CompileTimeErrorCode.MISSING_DART_LIBRARY, 0, 0),
     ]);
   }
@@ -3336,7 +3336,7 @@
     var a = newFile('$testPackageLibPath/a.dart', '');
     var result = await driver.getErrors(a.path);
     result as ErrorsResult;
-    assertErrorsInList(result.errors, [
+    assertErrorsInList(result.diagnostics, [
       error(CompileTimeErrorCode.MISSING_DART_LIBRARY, 0, 0),
     ]);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/result_printer.dart b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
index 4fa17c2..122c7a5 100644
--- a/pkg/analyzer/test/src/dart/analysis/result_printer.dart
+++ b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
@@ -303,7 +303,7 @@
             sink.writeln('---');
           }
 
-          sink.writeElements('errors', result.errors, _writeDiagnostic);
+          sink.writeElements('errors', result.diagnostics, _writeDiagnostic);
         });
       default:
         throw UnimplementedError('${result.runtimeType}');
@@ -1568,7 +1568,7 @@
         sink.writeln('---');
       }
 
-      sink.writeElements('errors', result.errors, _writeDiagnostic);
+      sink.writeElements('errors', result.diagnostics, _writeDiagnostic);
 
       var nodeToWrite = configuration.nodeSelector(result);
       if (nodeToWrite != null) {
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index fdbee95..54dd9ca 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -43,7 +43,7 @@
     var session = contextFor(a).currentSession;
     var result = await session.getErrorsValid(a);
     expect(result.path, a.path);
-    expect(result.errors, hasLength(1));
+    expect(result.diagnostics, hasLength(1));
     expect(result.uri.toString(), 'package:dart.my/a.dart');
   }
 
@@ -83,7 +83,7 @@
     var session = contextFor(file).currentSession;
     var result = await session.getResolvedUnit(file.path) as ResolvedUnitResult;
     expect(result.path, file.path);
-    expect(result.errors, isEmpty);
+    expect(result.diagnostics, isEmpty);
     expect(result.uri.toString(), 'package:dart.my/a.dart');
   }
 
@@ -183,7 +183,7 @@
     var errorsResult = await session.getErrorsValid(testFile);
     expect(errorsResult.session, session);
     expect(errorsResult.path, testFile.path);
-    expect(errorsResult.errors, isNotEmpty);
+    expect(errorsResult.diagnostics, isNotEmpty);
   }
 
   test_getErrors_inconsistent() async {
@@ -560,7 +560,7 @@
     expect(aUnitResult.unit, isNotNull);
     expect(aUnitResult.unit.directives, hasLength(1));
     expect(aUnitResult.unit.declarations, hasLength(1));
-    expect(aUnitResult.errors, isEmpty);
+    expect(aUnitResult.diagnostics, isEmpty);
 
     var bUnitResult = resolvedLibrary.units[1];
     expect(bUnitResult.path, b.path);
@@ -569,7 +569,7 @@
     expect(bUnitResult.unit, isNotNull);
     expect(bUnitResult.unit.directives, hasLength(1));
     expect(bUnitResult.unit.declarations, hasLength(2));
-    expect(bUnitResult.errors, isNotEmpty);
+    expect(bUnitResult.diagnostics, isNotEmpty);
 
     var aDeclaration =
         resolvedLibrary.getFragmentDeclaration(aClass.firstFragment)!;
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index f131a08..ad6ac0a 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -1373,7 +1373,7 @@
     var result = await getTestErrors();
     expect(result.path, convertPath('/workspace/dart/test/lib/test.dart'));
     expect(result.uri.toString(), 'package:dart.test/test.dart');
-    assertErrorsInList(result.errors, [
+    assertErrorsInList(result.diagnostics, [
       error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 8, 1),
     ]);
     expect(result.lineInfo.lineStarts, [0, 11, 24]);
@@ -1388,7 +1388,7 @@
 ''');
 
     var errorsResult = await fileResolver.getErrors2(path: b.path);
-    assertErrorsInList(errorsResult.errors, []);
+    assertErrorsInList(errorsResult.diagnostics, []);
   }
 
   test_getErrors_library() async {
@@ -1397,7 +1397,7 @@
 ''');
 
     var errorsResult = await fileResolver.getErrors2(path: a.path);
-    assertErrorsInList(errorsResult.errors, [
+    assertErrorsInList(errorsResult.diagnostics, [
       error(ParserErrorCode.EXPECTED_TOKEN, 8, 2),
     ]);
   }
@@ -1413,7 +1413,7 @@
 ''');
 
     var errorsResult = await fileResolver.getErrors2(path: b.path);
-    assertErrorsInList(errorsResult.errors, [
+    assertErrorsInList(errorsResult.diagnostics, [
       error(ParserErrorCode.EXPECTED_TOKEN, 26, 2),
     ]);
   }
@@ -1425,17 +1425,17 @@
     _assertResolvedFiles([]);
 
     // No cached, will resolve once.
-    expect((await getTestErrors()).errors, hasLength(1));
+    expect((await getTestErrors()).diagnostics, hasLength(1));
     _assertResolvedFiles([testFile]);
 
     // Has cached, will be not resolved again.
-    expect((await getTestErrors()).errors, hasLength(1));
+    expect((await getTestErrors()).diagnostics, hasLength(1));
     _assertResolvedFiles([]);
 
     // Change the file, will be resolved again.
     addTestFile('var a = c;');
     fileResolver.changeFiles([testFile.path]);
-    expect((await getTestErrors()).errors, hasLength(1));
+    expect((await getTestErrors()).diagnostics, hasLength(1));
     _assertResolvedFiles([testFile]);
   }
 
@@ -1453,11 +1453,11 @@
     _assertResolvedFiles([]);
 
     // No cached, will resolve once.
-    expect((await getTestErrors()).errors, hasLength(1));
+    expect((await getTestErrors()).diagnostics, hasLength(1));
     _assertResolvedFiles([testFile]);
 
     // Has cached, will be not resolved again.
-    expect((await getTestErrors()).errors, hasLength(1));
+    expect((await getTestErrors()).diagnostics, hasLength(1));
     _assertResolvedFiles([]);
 
     // Change the dependency.
@@ -1467,7 +1467,7 @@
 var a = 4.2;
 ''');
     fileResolver.changeFiles([a.path]);
-    expect((await getTestErrors()).errors, hasLength(1));
+    expect((await getTestErrors()).diagnostics, hasLength(1));
     _assertResolvedFiles([testFile]);
   }
 
@@ -1796,7 +1796,7 @@
     var result = await getTestErrors();
     expect(result.path, testFile.path);
     expect(result.uri.toString(), 'package:dart.test/test.dart');
-    assertErrorsInList(result.errors, [
+    assertErrorsInList(result.diagnostics, [
       error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 8, 1),
     ]);
     expect(result.lineInfo.lineStarts, [0, 11, 24]);
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index cd21511..6439f4c 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -210,7 +210,7 @@
     ResolvedUnitResult result,
     List<ExpectedError> expectedErrors,
   ) {
-    assertErrorsInList(result.errors, expectedErrors);
+    assertErrorsInList(result.diagnostics, expectedErrors);
   }
 
   void assertErrorsInResult(List<ExpectedError> expectedErrors) {
@@ -218,7 +218,7 @@
   }
 
   void assertHasTestErrors() {
-    expect(result.errors, isNotEmpty);
+    expect(result.diagnostics, isNotEmpty);
   }
 
   /// Resolve the [code], and ensure that it can be resolved without a crash,
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
index 23cff6f..20b1615 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
@@ -115,9 +115,9 @@
 ''');
     ResolvedUnitResult libResult = await resolveFile(libFile);
     ResolvedUnitResult partResult = await resolveFile(partFile);
-    expect(libResult.errors, hasLength(0));
+    expect(libResult.diagnostics, hasLength(0));
     GatheringDiagnosticListener()
-      ..addAll(partResult.errors)
+      ..addAll(partResult.diagnostics)
       ..assertErrors([
         error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 36, 1),
         error(CompileTimeErrorCode.AMBIGUOUS_IMPORT, 36, 1),
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index c5be215..260c4d3 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -34,7 +34,7 @@
     // The name _A is private to the library it's defined in, so this is a type
     // mismatch. Furthermore, the error message should mention both _A and the
     // filenames so the user can figure out what's going on.
-    String message = result.errors[0].message;
+    String message = result.diagnostics[0].message;
     expect(message.contains("_A"), isTrue);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
index 4724b5a..6942106 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
@@ -128,7 +128,7 @@
 const C constant = const C(0);
 ''');
     var otherFileResult = await resolveFile(other);
-    expect(otherFileResult.errors, isEmpty);
+    expect(otherFileResult.diagnostics, isEmpty);
   }
 
   test_int_to_double_reference_from_other_library_other_file_before() async {
@@ -148,7 +148,7 @@
 const D constant2 = const D(constant);
 ''');
     var otherFileResult = await resolveFile(other);
-    expect(otherFileResult.errors, isEmpty);
+    expect(otherFileResult.diagnostics, isEmpty);
   }
 
   test_int_to_double_single_library() async {
@@ -173,7 +173,7 @@
 const c = C();
 ''');
     var otherFileResult = await resolveFile(other);
-    expect(otherFileResult.errors, isEmpty);
+    expect(otherFileResult.diagnostics, isEmpty);
   }
 
   test_int_to_double_via_default_value_other_file_before() async {
@@ -184,7 +184,7 @@
 }
 ''');
     var otherFileResult = await resolveFile(other);
-    expect(otherFileResult.errors, isEmpty);
+    expect(otherFileResult.diagnostics, isEmpty);
 
     await assertNoErrorsInCode('''
 import 'other.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index 6dd73a2..0387621 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -415,7 +415,7 @@
 }
 ''');
     var otherFileResult = await resolveFile(other);
-    expect(otherFileResult.errors, isEmpty);
+    expect(otherFileResult.diagnostics, isEmpty);
   }
 
   test_CastError_intToDouble_constructor_importAnalyzedBefore() async {
@@ -444,7 +444,7 @@
 }
 ''');
     var otherFileResult = await resolveFile(other);
-    expect(otherFileResult.errors, isEmpty);
+    expect(otherFileResult.diagnostics, isEmpty);
   }
 
   test_default_constructor_arg_empty_map_import() async {
@@ -466,7 +466,7 @@
       [error(WarningCode.UNUSED_LOCAL_VARIABLE, 37, 1)],
     );
     var otherFileResult = await resolveFile(other);
-    assertErrorsInList(otherFileResult.errors, [
+    assertErrorsInList(otherFileResult.diagnostics, [
       error(WarningCode.UNNECESSARY_NULL_COMPARISON_NEVER_NULL_TRUE, 97, 7),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
index 8b2ef95..0898027 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
@@ -4754,7 +4754,7 @@
 
     var aResult = await resolveFile(a);
     GatheringDiagnosticListener()
-      ..addAll(aResult.errors)
+      ..addAll(aResult.diagnostics)
       ..assertErrors([
         error(
           CompileTimeErrorCode.DUPLICATE_DEFINITION,
@@ -4787,12 +4787,12 @@
 
     var aResult = await resolveFile(a);
     GatheringDiagnosticListener()
-      ..addAll(aResult.errors)
+      ..addAll(aResult.diagnostics)
       ..assertNoErrors();
 
     var bResult = await resolveFile(b);
     GatheringDiagnosticListener()
-      ..addAll(bResult.errors)
+      ..addAll(bResult.diagnostics)
       ..assertErrors([
         error(
           CompileTimeErrorCode.DUPLICATE_DEFINITION,
@@ -4838,7 +4838,7 @@
 
     var aResult = await resolveFile(a);
     GatheringDiagnosticListener()
-      ..addAll(aResult.errors)
+      ..addAll(aResult.diagnostics)
       ..assertErrors([
         error(
           CompileTimeErrorCode.DUPLICATE_DEFINITION,
@@ -4884,7 +4884,7 @@
 
     var aResult = await resolveFile(a);
     GatheringDiagnosticListener()
-      ..addAll(aResult.errors)
+      ..addAll(aResult.diagnostics)
       ..assertErrors([
         error(
           CompileTimeErrorCode.DUPLICATE_DEFINITION,
@@ -4951,7 +4951,7 @@
 
     var aResult = await resolveFile(a);
     GatheringDiagnosticListener()
-      ..addAll(aResult.errors)
+      ..addAll(aResult.diagnostics)
       ..assertErrors([
         error(
           CompileTimeErrorCode.DUPLICATE_DEFINITION,
diff --git a/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart b/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart
index 1b57bae..e68d72f 100644
--- a/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inference_failure_on_instance_creation_test.dart
@@ -36,7 +36,7 @@
 ''',
       [error(WarningCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 39, 12)],
     );
-    expect(result.errors[0].message, contains("'HashMap.from'"));
+    expect(result.diagnostics[0].message, contains("'HashMap.from'"));
   }
 
   test_constructorNames_named_importPrefix() async {
@@ -49,7 +49,7 @@
 ''',
       [error(WarningCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 44, 14)],
     );
-    expect(result.errors[0].message, contains("'c.HashMap.from'"));
+    expect(result.diagnostics[0].message, contains("'c.HashMap.from'"));
   }
 
   test_constructorNames_unnamed() async {
@@ -62,7 +62,7 @@
 ''',
       [error(WarningCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 39, 7)],
     );
-    expect(result.errors[0].message, contains("'HashMap'"));
+    expect(result.diagnostics[0].message, contains("'HashMap'"));
   }
 
   test_constructorNames_unnamed_importPrefix() async {
@@ -75,7 +75,7 @@
 ''',
       [error(WarningCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 44, 9)],
     );
-    expect(result.errors[0].message, contains("'c.HashMap'"));
+    expect(result.diagnostics[0].message, contains("'c.HashMap'"));
   }
 
   test_explicitTypeArgument() async {
diff --git a/pkg/analyzer/test/src/diagnostics/mock_sdk_test.dart b/pkg/analyzer/test/src/diagnostics/mock_sdk_test.dart
index 67be84e..47364f3 100644
--- a/pkg/analyzer/test/src/diagnostics/mock_sdk_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mock_sdk_test.dart
@@ -45,7 +45,7 @@
 
   void _assertOnlyWarningsInUnit(ResolvedUnitResult resolvedUnit) {
     var notHints =
-        resolvedUnit.errors
+        resolvedUnit.diagnostics
             .where(
               (element) =>
                   element.diagnosticCode.type != DiagnosticType.HINT &&
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart b/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart
index 64c58da..1b02da3 100644
--- a/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart
@@ -28,7 +28,7 @@
 ''');
     await resolveTestFile();
     expect(
-      result.errors[0].diagnosticCode,
+      result.diagnostics[0].diagnosticCode,
       CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
     );
   }
@@ -45,7 +45,7 @@
 ''');
     await resolveTestFile();
     expect(
-      result.errors[0].diagnosticCode,
+      result.diagnostics[0].diagnosticCode,
       CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
index becefde..6890360 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
@@ -1867,7 +1867,7 @@
 }
 ''');
     await resolveTestFile();
-    expect(result.errors, isNotEmpty);
+    expect(result.diagnostics, isNotEmpty);
   }
 
   @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47839')
@@ -1880,7 +1880,7 @@
 }
 ''');
     await resolveTestFile();
-    expect(result.errors, isNotEmpty);
+    expect(result.diagnostics, isNotEmpty);
   }
 
   @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47839')
@@ -1895,7 +1895,7 @@
 }
 ''');
     await resolveTestFile();
-    expect(result.errors, isNotEmpty);
+    expect(result.diagnostics, isNotEmpty);
   }
 
   test_optionalParameter_notUsed_named() async {
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 17d01db..150df78 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -6066,7 +6066,7 @@
   ) async {
     await resolveTestCode(code);
     assertErrorsInList(
-      result.errors.where((e) {
+      result.diagnostics.where((e) {
         return e.diagnosticCode != WarningCode.UNUSED_LOCAL_VARIABLE &&
             e.diagnosticCode is! TodoCode;
       }).toList(),
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index a17618a..3c142d9 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -164,7 +164,7 @@
     var result = await analysisSession.getResolvedUnit(testFile.path);
     result as ResolvedUnitResult;
     var errors =
-        result.errors.where((e) => e.severity == Severity.error).toList();
+        result.diagnostics.where((e) => e.severity == Severity.error).toList();
     if (errors.isNotEmpty) {
       if (dataComputer.supportsErrors) {
         var diagnosticMap = <int, List<Diagnostic>>{};
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index 87edd4a..ac4c8f2 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -424,7 +424,7 @@
     _SnippetTest test = _SnippetTest(snippet);
     test.setUp();
     await test.resolveTestFile();
-    List<Diagnostic> diagnostics = test.result.errors;
+    List<Diagnostic> diagnostics = test.result.diagnostics;
     int errorCount = diagnostics.length;
     if (snippet.offset < 0) {
       if (errorCount > 0) {
diff --git a/pkg/analyzer/test/verify_docs_test.dart b/pkg/analyzer/test/verify_docs_test.dart
index d069c2a..13d3622 100644
--- a/pkg/analyzer/test/verify_docs_test.dart
+++ b/pkg/analyzer/test/verify_docs_test.dart
@@ -160,7 +160,7 @@
       await context.applyPendingFileChanges();
       var results = await context.currentSession.getErrors(snippetPath);
       if (results is ErrorsResult) {
-        Iterable<Diagnostic> diagnostics = results.errors.where((error) {
+        Iterable<Diagnostic> diagnostics = results.diagnostics.where((error) {
           DiagnosticCode diagnosticCode = error.diagnosticCode;
           // TODO(brianwilkerson): .
           return diagnosticCode != WarningCode.UNUSED_IMPORT &&
diff --git a/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart b/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart
index 64d1458..478fd097 100644
--- a/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart
+++ b/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart
@@ -101,7 +101,7 @@
         var errorsResult = await analysisSession.getErrors(filePath);
         if (errorsResult is ErrorsResult) {
           var errors =
-              errorsResult.errors
+              errorsResult.diagnostics
                   .where(
                     (element) =>
                         element.diagnosticCode.type ==
diff --git a/pkg/analyzer/tool/type_inference_log.dart b/pkg/analyzer/tool/type_inference_log.dart
index 23c7d30..25f70b2 100644
--- a/pkg/analyzer/tool/type_inference_log.dart
+++ b/pkg/analyzer/tool/type_inference_log.dart
@@ -35,11 +35,11 @@
     print('File does not exist: `$filePath`');
     exit(1);
   }
-  var errors = result.errors;
-  if (errors.isNotEmpty) {
-    print('${errors.length} errors found:');
-    for (var error in errors) {
-      print('  $error');
+  var diagnostics = result.diagnostics;
+  if (diagnostics.isNotEmpty) {
+    print('${diagnostics.length} diagnostics found:');
+    for (var diagnostic in diagnostics) {
+      print('  $diagnostic');
     }
   }
 }
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 35842e2..2180da3 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -119,11 +119,13 @@
   DiagnosticSeverity computeMaxSeverity() {
     var status = DiagnosticSeverity.NONE;
     for (var result in errorsResults) {
-      for (var error in result.errors) {
-        if (_defaultSeverityProcessor(error) == null) {
+      for (var diagnostic in result.diagnostics) {
+        if (_defaultSeverityProcessor(diagnostic) == null) {
           continue;
         }
-        status = status.max(computeSeverity(error, options, analysisOptions)!);
+        status = status.max(
+          computeSeverity(diagnostic, options, analysisOptions)!,
+        );
       }
     }
     return status;
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 56bf8f4..dabfdd3 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -293,7 +293,7 @@
               lineInfo: lineInfo,
               isLibrary: true,
               isPart: false,
-              errors: errors,
+              diagnostics: errors,
               analysisOptions: analysisOptions,
             ),
           ]);
@@ -346,7 +346,7 @@
                   lineInfo: lineInfo,
                   isLibrary: true,
                   isPart: false,
-                  errors: diagnostics,
+                  diagnostics: diagnostics,
                   analysisOptions: analysisOptions,
                 ),
               ]);
@@ -377,7 +377,7 @@
                 lineInfo: lineInfo,
                 isLibrary: true,
                 isPart: false,
-                errors: errors,
+                diagnostics: errors,
                 analysisOptions: analysisOptions,
               ),
             ]);
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index 6d78bb7..b984f7f 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -206,16 +206,16 @@
     var diagnostics = <Diagnostic>[];
     var diagnosticToLine = <Diagnostic, ErrorsResult>{};
     for (var result in results) {
-      for (var error in result.errors) {
-        if (_computeSeverity(error) != null) {
-          diagnostics.add(error);
-          diagnosticToLine[error] = result;
+      for (var diagnostic in result.diagnostics) {
+        if (_computeSeverity(diagnostic) != null) {
+          diagnostics.add(diagnostic);
+          diagnosticToLine[diagnostic] = result;
         }
       }
     }
 
-    for (var error in diagnostics) {
-      await formatDiagnostic(diagnosticToLine, error);
+    for (var diagnostic in diagnostics) {
+      await formatDiagnostic(diagnosticToLine, diagnostic);
     }
   }
 
@@ -413,7 +413,7 @@
 
     var diagnostics = <Map<String, dynamic>>[];
     for (var result in results) {
-      var errors = result.errors;
+      var errors = result.diagnostics;
       var lineInfo = result.lineInfo;
       for (var error in errors) {
         var severity = _computeSeverity(error);
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index de2c5e1..75ef558 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -135,7 +135,7 @@
     lineInfo: lineInfo,
     isLibrary: true,
     isPart: false,
-    errors: [error],
+    diagnostics: [error],
     analysisOptions: AnalysisOptionsImpl(),
   );
 }
diff --git a/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart b/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
index 4e24b1a..d59f9b9 100644
--- a/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
@@ -31,7 +31,7 @@
   List<Diagnostic> _getDiagnostics(int offset, ResolvedUnitResult result) {
     var lineInfo = result.lineInfo;
     var offsetLine = lineInfo.getLocation(offset).lineNumber;
-    return result.errors.where((error) {
+    return result.diagnostics.where((error) {
       var errorLine = lineInfo.getLocation(error.offset).lineNumber;
       return errorLine == offsetLine;
     }).toList();
diff --git a/pkg/analyzer_plugin/lib/utilities/range_factory.dart b/pkg/analyzer_plugin/lib/utilities/range_factory.dart
index c4ecf72..c3fb5eb 100644
--- a/pkg/analyzer_plugin/lib/utilities/range_factory.dart
+++ b/pkg/analyzer_plugin/lib/utilities/range_factory.dart
@@ -125,6 +125,7 @@
 
   /// Returns a source range that covers the same range as the given
   /// [diagnostic].
+  // TODO(srawlins): Rename to 'diagnostic'.
   SourceRange error(Diagnostic diagnostic) {
     return SourceRange(diagnostic.offset, diagnostic.length);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/mocks.dart b/pkg/analyzer_plugin/test/plugin/mocks.dart
index adb24ee..71190c1 100644
--- a/pkg/analyzer_plugin/test/plugin/mocks.dart
+++ b/pkg/analyzer_plugin/test/plugin/mocks.dart
@@ -113,7 +113,7 @@
 
 class MockResolvedUnitResult implements ResolvedUnitResult {
   @override
-  final List<Diagnostic> errors;
+  final List<Diagnostic> diagnostics;
 
   @override
   final LineInfo lineInfo;
@@ -123,7 +123,7 @@
 
   MockResolvedUnitResult(
       {List<Diagnostic>? errors, LineInfo? lineInfo, String? path})
-      : errors = errors ?? [],
+      : diagnostics = errors ?? [],
         lineInfo = lineInfo ?? LineInfo([0]),
         path = path ?? '';
 
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index 99d2c36..9815d67 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -105,14 +105,14 @@
     testCode = result.content;
     testUnit = result.unit;
     if (verifyNoTestUnitErrors) {
-      expect(result.errors.where((error) {
-        return error.diagnosticCode != WarningCode.DEAD_CODE &&
-            error.diagnosticCode != WarningCode.UNUSED_CATCH_CLAUSE &&
-            error.diagnosticCode != WarningCode.UNUSED_CATCH_STACK &&
-            error.diagnosticCode != WarningCode.UNUSED_ELEMENT &&
-            error.diagnosticCode != WarningCode.UNUSED_FIELD &&
-            error.diagnosticCode != WarningCode.UNUSED_IMPORT &&
-            error.diagnosticCode != WarningCode.UNUSED_LOCAL_VARIABLE;
+      expect(result.diagnostics.where((d) {
+        return d.diagnosticCode != WarningCode.DEAD_CODE &&
+            d.diagnosticCode != WarningCode.UNUSED_CATCH_CLAUSE &&
+            d.diagnosticCode != WarningCode.UNUSED_CATCH_STACK &&
+            d.diagnosticCode != WarningCode.UNUSED_ELEMENT &&
+            d.diagnosticCode != WarningCode.UNUSED_FIELD &&
+            d.diagnosticCode != WarningCode.UNUSED_IMPORT &&
+            d.diagnosticCode != WarningCode.UNUSED_LOCAL_VARIABLE;
       }), isEmpty);
     }
     findNode = FindNode(testCode, testUnit);
diff --git a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
index 58b95c9..e07375d 100644
--- a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
@@ -537,8 +537,8 @@
 const class B {}
 ''');
     var result = await resolveFile(testFile);
-    var error = result.errors.single;
-    expect(range.error(error), SourceRange(11, 5));
+    var diagnostic = result.diagnostics.single;
+    expect(range.error(diagnostic), SourceRange(11, 5));
   }
 
   Future<void> test_node() async {
diff --git a/pkg/analyzer_testing/lib/src/analysis_rule/pub_package_resolution.dart b/pkg/analyzer_testing/lib/src/analysis_rule/pub_package_resolution.dart
index 46d7ac4..e5c2869 100644
--- a/pkg/analyzer_testing/lib/src/analysis_rule/pub_package_resolution.dart
+++ b/pkg/analyzer_testing/lib/src/analysis_rule/pub_package_resolution.dart
@@ -183,7 +183,7 @@
 
   /// The diagnostics that were computed during analysis.
   List<Diagnostic> get _diagnostics =>
-      result.errors
+      result.diagnostics
           .where(
             (e) => !ignoredDiagnosticCodes.any((c) => e.diagnosticCode == c),
           )
@@ -359,7 +359,7 @@
   ) async {
     for (var (path, expectedDiagnostics) in unitsAndDiagnostics) {
       result = await resolveFile(convertPath(path));
-      assertDiagnosticsIn(result.errors, expectedDiagnostics);
+      assertDiagnosticsIn(result.diagnostics, expectedDiagnostics);
     }
   }
 
diff --git a/pkg/linter/lib/src/test_utilities/lint_driver.dart b/pkg/linter/lib/src/test_utilities/lint_driver.dart
index 9b66b0e..8d8ccb1 100644
--- a/pkg/linter/lib/src/test_utilities/lint_driver.dart
+++ b/pkg/linter/lib/src/test_utilities/lint_driver.dart
@@ -55,7 +55,9 @@
       var analysisSession = contextCollection.contextFor(path).currentSession;
       var errorsResult = await analysisSession.getErrors(path);
       if (errorsResult is ErrorsResult) {
-        result.add(DiagnosticInfo(errorsResult.errors, errorsResult.lineInfo));
+        result.add(
+          DiagnosticInfo(errorsResult.diagnostics, errorsResult.lineInfo),
+        );
       }
     }
     return result;
diff --git a/pkg/linter/tool/checks/driver.dart b/pkg/linter/tool/checks/driver.dart
index e0013f3..71757af 100644
--- a/pkg/linter/tool/checks/driver.dart
+++ b/pkg/linter/tool/checks/driver.dart
@@ -96,7 +96,7 @@
               var result = await context.currentSession.getErrors(filePath);
               if (result is ErrorsResult) {
                 var filtered =
-                    result.errors
+                    result.diagnostics
                         .where((e) => e.diagnosticCode.name != 'TODO')
                         .toList();
                 if (filtered.isNotEmpty) {
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index 50dee47..5aa0cee 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -298,7 +298,7 @@
   // Convert the analyzer errors to test_runner [StaticErrors].
   var errors = <StaticError>[];
   if (errorsResult is ErrorsResult) {
-    for (var diagnostic in errorsResult.errors) {
+    for (var diagnostic in errorsResult.diagnostics) {
       switch (diagnostic.severity) {
         case Severity.error:
         case Severity.warning
diff --git a/tools/verify_docs/bin/verify_docs.dart b/tools/verify_docs/bin/verify_docs.dart
index 1d172fc..c65862c 100755
--- a/tools/verify_docs/bin/verify_docs.dart
+++ b/tools/verify_docs/bin/verify_docs.dart
@@ -331,7 +331,8 @@
     final result = await analysisHelper.resolveFile(text);
 
     if (result is ResolvedUnitResult) {
-      var diagnostics = SplayTreeSet<Diagnostic>.from(result.errors, (a, b) {
+      var diagnostics =
+          SplayTreeSet<Diagnostic>.from(result.diagnostics, (a, b) {
         var value = a.offset.compareTo(b.offset);
         if (value == 0) {
           value = a.message.compareTo(b.message);
