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 09cfb62..f451cf8 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
@@ -130,7 +130,13 @@
         fixes.sort(Fix.compareFixes);
         var lineInfo = LineInfo.fromContent(content);
         var result = engine.ErrorsResultImpl(
-            session, file, Uri.file(file), lineInfo, false, errors);
+          session: session,
+          path: file,
+          uri: Uri.file(file),
+          lineInfo: lineInfo,
+          isPart: false,
+          errors: errors,
+        );
         var serverError = newAnalysisError_fromEngine(result, error);
         var errorFixes = AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
@@ -230,7 +236,13 @@
         fixes.sort(Fix.compareFixes);
         var lineInfo = LineInfo.fromContent(content);
         var result = engine.ErrorsResultImpl(
-            session, file, Uri.file(file), lineInfo, false, errors);
+          session: session,
+          path: file,
+          uri: Uri.file(file),
+          lineInfo: lineInfo,
+          isPart: false,
+          errors: errors,
+        );
         var serverError = newAnalysisError_fromEngine(result, error);
         var errorFixes = AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 8351847..d8fcdce 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -685,7 +685,12 @@
 
     FileState file = _fsState.getFileForPath(path);
     return FileResultImpl(
-        currentSession, path, file.uri, file.lineInfo, file.isPart);
+      session: currentSession,
+      path: path,
+      uri: file.uri,
+      lineInfo: file.lineInfo,
+      isPart: file.isPart,
+    );
   }
 
   /// Return the [FileResult] for the Dart file with the given [path].
@@ -802,7 +807,10 @@
       units.add(unitResult);
     }
 
-    return ParsedLibraryResultImpl(currentSession, units);
+    return ParsedLibraryResultImpl(
+      session: currentSession,
+      units: units,
+    );
   }
 
   /// Return a [ParsedLibraryResult] for the library with the given [uri].
@@ -1016,8 +1024,16 @@
     FileState file = _fsState.getFileForPath(path);
     RecordingErrorListener listener = RecordingErrorListener();
     CompilationUnit unit = file.parse(listener);
-    return ParsedUnitResultImpl(currentSession, file.path, file.uri,
-        file.content, file.lineInfo, file.isPart, unit, listener.errors);
+    return ParsedUnitResultImpl(
+      session: currentSession,
+      path: file.path,
+      uri: file.uri,
+      content: file.content,
+      lineInfo: file.lineInfo,
+      isPart: file.isPart,
+      unit: unit,
+      errors: listener.errors,
+    );
   }
 
   /// Return a [ParsedUnitResult] for the file with the given [path].
@@ -1423,23 +1439,23 @@
         var unitFile = unitResult.file;
         resolvedUnits.add(
           ResolvedUnitResultImpl(
-            currentSession,
-            unitFile.path,
-            unitFile.uri,
-            unitFile.exists,
-            unitFile.content,
-            unitFile.lineInfo,
-            unitFile.isPart,
-            unitResult.unit,
-            unitResult.errors,
+            session: currentSession,
+            path: unitFile.path,
+            uri: unitFile.uri,
+            exists: unitFile.exists,
+            content: unitFile.content,
+            lineInfo: unitFile.lineInfo,
+            isPart: unitFile.isPart,
+            unit: unitResult.unit,
+            errors: unitResult.errors,
           ),
         );
       }
 
       return ResolvedLibraryResultImpl(
-        currentSession,
-        resolvedUnits.first.libraryElement,
-        resolvedUnits,
+        session: currentSession,
+        element: resolvedUnits.first.libraryElement,
+        units: resolvedUnits,
       );
     });
   }
@@ -1459,12 +1475,12 @@
       );
       var element = libraryContext.computeUnitElement(library, file);
       return UnitElementResultImpl(
-        currentSession,
-        path,
-        file.uri,
-        file.lineInfo,
-        file.isPart,
-        element,
+        session: currentSession,
+        path: path,
+        uri: file.uri,
+        lineInfo: file.lineInfo,
+        isPart: file.isPart,
+        element: element,
       );
     });
   }
@@ -1597,25 +1613,25 @@
     var index = unit.index!;
     if (content != null && resolvedUnit != null) {
       var resolvedUnitResult = ResolvedUnitResultImpl(
-        currentSession,
-        file.path,
-        file.uri,
-        file.exists,
-        content,
-        file.lineInfo,
-        file.isPart,
-        resolvedUnit,
-        errors,
+        session: currentSession,
+        path: file.path,
+        uri: file.uri,
+        exists: file.exists,
+        content: content,
+        lineInfo: file.lineInfo,
+        isPart: file.isPart,
+        unit: resolvedUnit,
+        errors: errors,
       );
       return AnalysisResult.unit(signature, resolvedUnitResult, index);
     } else {
       var errorsResult = ErrorsResultImpl(
-        currentSession,
-        file.path,
-        file.uri,
-        file.lineInfo,
-        file.isPart,
-        errors,
+        session: currentSession,
+        path: file.path,
+        uri: file.uri,
+        lineInfo: file.lineInfo,
+        isPart: file.isPart,
+        errors: errors,
       );
       return AnalysisResult.errors(signature, errorsResult, index);
     }
@@ -1681,12 +1697,12 @@
       FileState file, String missingUri) {
     // TODO(scheglov) Find a better way to report this.
     var errorsResult = ErrorsResultImpl(
-      currentSession,
-      file.path,
-      file.uri,
-      file.lineInfo,
-      file.isPart,
-      [
+      session: currentSession,
+      path: file.path,
+      uri: file.uri,
+      lineInfo: file.lineInfo,
+      isPart: file.isPart,
+      errors: [
         AnalysisError(file.source, 0, 0,
             CompileTimeErrorCode.MISSING_DART_LIBRARY, [missingUri])
       ],
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 124c052..be68147 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -16,7 +16,9 @@
   @override
   final AnalysisSession session;
 
-  AnalysisResultImpl(this.session);
+  AnalysisResultImpl({
+    required this.session,
+  });
 }
 
 class ElementDeclarationResultImpl implements ElementDeclarationResult {
@@ -40,8 +42,14 @@
   @override
   final List<AnalysisError> errors;
 
-  ErrorsResultImpl(super.session, super.path, super.uri, super.lineInfo,
-      super.isPart, this.errors);
+  ErrorsResultImpl({
+    required super.session,
+    required super.path,
+    required super.uri,
+    required super.lineInfo,
+    required super.isPart,
+    required this.errors,
+  });
 }
 
 class FileResultImpl extends AnalysisResultImpl implements FileResult {
@@ -57,8 +65,13 @@
   @override
   final bool isPart;
 
-  FileResultImpl(
-      super.session, this.path, this.uri, this.lineInfo, this.isPart);
+  FileResultImpl({
+    required super.session,
+    required this.path,
+    required this.uri,
+    required this.lineInfo,
+    required this.isPart,
+  });
 }
 
 class LibraryElementResultImpl implements LibraryElementResult {
@@ -73,7 +86,10 @@
   @override
   final List<ParsedUnitResult> units;
 
-  ParsedLibraryResultImpl(super.session, this.units);
+  ParsedLibraryResultImpl({
+    required super.session,
+    required this.units,
+  });
 
   @override
   ElementDeclarationResult? getElementDeclaration(Element element) {
@@ -116,9 +132,16 @@
   @override
   final List<AnalysisError> errors;
 
-  ParsedUnitResultImpl(AnalysisSession session, String path, Uri uri,
-      this.content, LineInfo lineInfo, bool isPart, this.unit, this.errors)
-      : super(session, path, uri, lineInfo, isPart);
+  ParsedUnitResultImpl({
+    required super.session,
+    required super.path,
+    required super.uri,
+    required this.content,
+    required super.lineInfo,
+    required super.isPart,
+    required this.unit,
+    required this.errors,
+  });
 }
 
 class ParseStringResultImpl implements ParseStringResult {
@@ -189,7 +212,11 @@
   @override
   final List<ResolvedUnitResult> units;
 
-  ResolvedLibraryResultImpl(super.session, this.element, this.units);
+  ResolvedLibraryResultImpl({
+    required super.session,
+    required this.element,
+    required this.units,
+  });
 
   @override
   TypeProvider get typeProvider => element.typeProvider;
@@ -239,17 +266,17 @@
   @override
   final List<AnalysisError> errors;
 
-  ResolvedUnitResultImpl(
-      AnalysisSession session,
-      String path,
-      Uri uri,
-      this.exists,
-      this.content,
-      LineInfo lineInfo,
-      bool isPart,
-      this.unit,
-      this.errors)
-      : super(session, path, uri, lineInfo, isPart);
+  ResolvedUnitResultImpl({
+    required super.session,
+    required super.path,
+    required super.uri,
+    required this.exists,
+    required this.content,
+    required super.lineInfo,
+    required super.isPart,
+    required this.unit,
+    required this.errors,
+  });
 
   @override
   LibraryElement get libraryElement {
@@ -268,8 +295,14 @@
   @override
   final CompilationUnitElement element;
 
-  UnitElementResultImpl(super.session, super.path, super.uri, super.lineInfo,
-      super.isPart, this.element);
+  UnitElementResultImpl({
+    required super.session,
+    required super.path,
+    required super.uri,
+    required super.lineInfo,
+    required super.isPart,
+    required this.element,
+  });
 }
 
 /// A visitor which locates the [AstNode] which declares [element].
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index e9ff575..60118ed 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -347,12 +347,12 @@
       }
 
       return ErrorsResultImpl(
-        contextObjects!.analysisSession,
-        path,
-        file.uri,
-        file.lineInfo,
-        false, // isPart
-        errors,
+        session: contextObjects!.analysisSession,
+        path: path,
+        uri: file.uri,
+        lineInfo: file.lineInfo,
+        isPart: false,
+        errors: errors,
       );
     });
   }
@@ -659,21 +659,24 @@
       var resolvedUnits = results.map((fileResult) {
         var file = fileResult.file;
         return ResolvedUnitResultImpl(
-          contextObjects!.analysisSession,
-          file.path,
-          file.uri,
-          file.exists,
-          file.content,
-          file.lineInfo,
-          file.isPart,
-          fileResult.unit,
-          fileResult.errors,
+          session: contextObjects!.analysisSession,
+          path: file.path,
+          uri: file.uri,
+          exists: file.exists,
+          content: file.content,
+          lineInfo: file.lineInfo,
+          isPart: file.isPart,
+          unit: fileResult.unit,
+          errors: fileResult.errors,
         );
       }).toList();
 
       var libraryUnit = resolvedUnits.first;
-      var result = ResolvedLibraryResultImpl(contextObjects!.analysisSession,
-          libraryUnit.libraryElement, resolvedUnits);
+      var result = ResolvedLibraryResultImpl(
+        session: contextObjects!.analysisSession,
+        element: libraryUnit.libraryElement,
+        units: resolvedUnits,
+      );
 
       cachedResults[path] = result;
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index d2b2f72..cfaeac2 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -251,8 +251,14 @@
             analysisDriver.currentSession.analysisContext.contextRoot.root.path,
           );
           await formatter.formatErrors([
-            ErrorsResultImpl(analysisDriver.currentSession, path,
-                pathContext.toUri(path), lineInfo, false, errors)
+            ErrorsResultImpl(
+              session: analysisDriver.currentSession,
+              path: path,
+              uri: pathContext.toUri(path),
+              lineInfo: lineInfo,
+              isPart: false,
+              errors: errors,
+            )
           ]);
           for (var error in errors) {
             var severity = determineProcessedSeverity(
@@ -307,8 +313,14 @@
               }
               var lineInfo = LineInfo.fromContent(content);
               await formatter.formatErrors([
-                ErrorsResultImpl(analysisDriver.currentSession, path,
-                    pathContext.toUri(path), lineInfo, false, errors)
+                ErrorsResultImpl(
+                  session: analysisDriver.currentSession,
+                  path: path,
+                  uri: pathContext.toUri(path),
+                  lineInfo: lineInfo,
+                  isPart: false,
+                  errors: errors,
+                ),
               ]);
             }
           } catch (exception) {
@@ -323,8 +335,14 @@
             var errors = validator.validate(
                 content, analysisDriver.analysisOptions.chromeOsManifestChecks);
             await formatter.formatErrors([
-              ErrorsResultImpl(analysisDriver.currentSession, path,
-                  pathContext.toUri(path), lineInfo, false, errors)
+              ErrorsResultImpl(
+                session: analysisDriver.currentSession,
+                path: path,
+                uri: pathContext.toUri(path),
+                lineInfo: lineInfo,
+                isPart: false,
+                errors: errors,
+              ),
             ]);
             for (var error in errors) {
               var severity = determineProcessedSeverity(
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index 4f65380..e54bfca 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -107,8 +107,14 @@
   var source = MockSource(path, package_path.toUri(path));
   var error = MockAnalysisError(source, code, 20, 'MSG');
 
-  return ErrorsResultImpl(_MockAnalysisSession(), source.fullName,
-      Uri.file('/'), lineInfo, false, [error]);
+  return ErrorsResultImpl(
+    session: _MockAnalysisSession(),
+    path: source.fullName,
+    uri: Uri.file('/'),
+    lineInfo: lineInfo,
+    isPart: false,
+    errors: [error],
+  );
 }
 
 class _MockAnalysisSession implements AnalysisSession {
diff --git a/tools/VERSION b/tools/VERSION
index 65ce53c..dc85efc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 19
 PATCH 0
-PRERELEASE 49
+PRERELEASE 50
 PRERELEASE_PATCH 0
\ No newline at end of file
