diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index c182eee..853fa09 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -810,7 +810,7 @@
 }
 
 lsp.Diagnostic pluginToDiagnostic(
-  server.LineInfo Function(String) getLineInfo,
+  server.LineInfo? Function(String) getLineInfo,
   plugin.AnalysisError error, {
   required Set<lsp.DiagnosticTag>? supportedTags,
   required bool clientSupportsCodeDescription,
@@ -832,7 +832,14 @@
 
   final range = locationToRange(error.location) ??
       locationOffsetLenToRange(
-          getLineInfo(error.location.file), error.location);
+        // TODO(dantup): This null assertion is not sound and can lead to
+        //   errors (for example during a large rename where files may be
+        //   removed as diagnostics are being mapped). To remove this,
+        //   error.location should be updated to require line/col information
+        //   (which involves breaking changes).
+        getLineInfo(error.location.file)!,
+        error.location,
+      );
   var documentationUrl = error.url;
   return lsp.Diagnostic(
     range: range,
diff --git a/pkg/analysis_server/lib/src/lsp/notification_manager.dart b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
index 8f38df1..bae8def 100644
--- a/pkg/analysis_server/lib/src/lsp/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
@@ -30,9 +30,7 @@
       String filePath, List<protocol.AnalysisError> errors) {
     final diagnostics = errors
         .map((error) => pluginToDiagnostic(
-              // We should never return errors for a file we can't get a
-              // LineInfo for
-              (path) => server.getLineInfo(path)!,
+              (path) => server.getLineInfo(path),
               error,
               supportedTags: server.clientCapabilities?.diagnosticTags,
               clientSupportsCodeDescription:
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index fe3cd92..9e6fc22 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -268,37 +268,6 @@
     _search = Search(this);
   }
 
-  /// Create a new instance of [AnalysisDriver].
-  ///
-  /// The given [SourceFactory] is cloned to ensure that it does not contain a
-  /// reference to a [AnalysisContext] in which it could have been used.
-  @Deprecated('Use the unnamed constructor instead')
-  AnalysisDriver.tmp1({
-    required AnalysisDriverScheduler scheduler,
-    required PerformanceLog logger,
-    required ResourceProvider resourceProvider,
-    required ByteStore byteStore,
-    required SourceFactory sourceFactory,
-    required AnalysisOptionsImpl analysisOptions,
-    required Packages packages,
-    FileContentCache? fileContentCache,
-    bool enableIndex = false,
-    SummaryDataStore? externalSummaries,
-    bool retainDataForTesting = false,
-  }) : this(
-          scheduler: scheduler,
-          logger: logger,
-          resourceProvider: resourceProvider,
-          byteStore: byteStore,
-          sourceFactory: sourceFactory,
-          analysisOptions: analysisOptions,
-          packages: packages,
-          fileContentCache: fileContentCache,
-          enableIndex: enableIndex,
-          externalSummaries: externalSummaries,
-          retainDataForTesting: retainDataForTesting,
-        );
-
   /// Return the set of files explicitly added to analysis using [addFile].
   Set<String> get addedFiles => _fileTracker.addedFiles;
 
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
index 19ca635..c5d9146 100644
--- a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -18,12 +18,21 @@
   RequiredParametersVerifier(this._errorReporter);
 
   @override
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _check(
+      node.constructorElement?.parameters,
+      node.arguments?.argumentList.arguments ?? <Expression>[],
+      node.name,
+    );
+  }
+
+  @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     var type = node.staticInvokeType;
     if (type is FunctionType) {
       _check(
         type.parameters,
-        node.argumentList,
+        node.argumentList.arguments,
         node,
       );
     }
@@ -33,7 +42,7 @@
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     _check(
       node.constructorName.staticElement?.parameters,
-      node.argumentList,
+      node.argumentList.arguments,
       node.constructorName,
     );
   }
@@ -43,14 +52,15 @@
     if (node.methodName.name == FunctionElement.CALL_METHOD_NAME) {
       var targetType = node.realTarget?.staticType;
       if (targetType is FunctionType) {
-        _check(targetType.parameters, node.argumentList, node.argumentList);
+        _check(targetType.parameters, node.argumentList.arguments,
+            node.argumentList);
         return;
       }
     }
 
     _check(
       _executableElement(node.methodName.staticElement)?.parameters,
-      node.argumentList,
+      node.argumentList.arguments,
       node.methodName,
     );
   }
@@ -60,7 +70,7 @@
       RedirectingConstructorInvocation node) {
     _check(
       _executableElement(node.staticElement)?.parameters,
-      node.argumentList,
+      node.argumentList.arguments,
       node,
     );
   }
@@ -69,14 +79,14 @@
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _check(
       _executableElement(node.staticElement)?.parameters,
-      node.argumentList,
+      node.argumentList.arguments,
       node,
     );
   }
 
   void _check(
     List<ParameterElement>? parameters,
-    ArgumentList argumentList,
+    List<Expression> arguments,
     AstNode node,
   ) {
     if (parameters == null) {
@@ -86,7 +96,7 @@
     for (ParameterElement parameter in parameters) {
       if (parameter.isRequiredNamed) {
         String parameterName = parameter.name;
-        if (!_containsNamedExpression(argumentList, parameterName)) {
+        if (!_containsNamedExpression(arguments, parameterName)) {
           _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
             node,
@@ -98,7 +108,7 @@
         var annotation = _requiredAnnotation(parameter);
         if (annotation != null) {
           String parameterName = parameter.name;
-          if (!_containsNamedExpression(argumentList, parameterName)) {
+          if (!_containsNamedExpression(arguments, parameterName)) {
             var reason = annotation.reason;
             if (reason != null) {
               _errorReporter.reportErrorForNode(
@@ -119,8 +129,10 @@
     }
   }
 
-  static bool _containsNamedExpression(ArgumentList args, String name) {
-    NodeList<Expression> arguments = args.arguments;
+  static bool _containsNamedExpression(
+    List<Expression> arguments,
+    String name,
+  ) {
     for (int i = arguments.length - 1; i >= 0; i--) {
       Expression expression = arguments[i];
       if (expression is NamedExpression) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 84ae1df..36d3095 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -558,6 +558,12 @@
   }
 
   @override
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _requiredParametersVerifier.visitEnumConstantDeclaration(node);
+    super.visitEnumConstantDeclaration(node);
+  }
+
+  @override
   void visitEnumDeclaration(EnumDeclaration node) {
     var outerClass = _enclosingClass;
     try {
@@ -3987,6 +3993,7 @@
           redirectedConstructor,
           [constructorStrName, redirectedClass.name]);
     }
+    _checkForInvalidGenerativeConstructorReference(redirectedConstructor);
   }
 
   /// Check whether the redirecting constructor, [element], is const, and
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 7761fe1..6253c65 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1583,20 +1583,38 @@
           }
         }
       }
-      var arguments = node.arguments;
-      if (arguments != null) {
-        var argumentList = arguments.argumentList;
-        if (constructorElement != null) {
+      if (constructorElement != null) {
+        var arguments = node.arguments;
+        if (arguments != null) {
+          var argumentList = arguments.argumentList;
           argumentList.correspondingStaticParameters =
               ResolverVisitor.resolveArgumentsToParameters(
             argumentList: argumentList,
             parameters: constructorElement.parameters,
+            errorReporter: errorReporter,
           );
           for (var argument in argumentList.arguments) {
             analyzeExpression(argument, argument.staticParameterElement?.type);
           }
+          arguments.typeArguments?.accept(this);
+
+          var whyNotPromotedList =
+              <Map<DartType, NonPromotionReason> Function()>[];
+          checkForArgumentTypesNotAssignableInList(
+              argumentList, whyNotPromotedList);
+        } else if (definingLibrary.featureSet
+            .isEnabled(Feature.enhanced_enums)) {
+          var requiredParameterCount = constructorElement.parameters
+              .where((e) => e.isRequiredPositional)
+              .length;
+          if (requiredParameterCount != 0) {
+            errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS,
+              node.name,
+              [requiredParameterCount, 0],
+            );
+          }
         }
-        arguments.typeArguments?.accept(this);
       }
     }
 
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 4cde594..cf141f5 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4087,11 +4087,15 @@
   v = 3;
   v; // marker
 }''');
-    if (hasAssignmentLeftResolution) {
-      assertTypeDynamic(findNode.simple('v ='));
-    } else {
-      assertTypeNull(findNode.simple('v ='));
-    }
+    assertAssignment(
+      findNode.assignment('= 3'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.localVar('v'),
+      writeType: 'dynamic',
+      operatorElement: null,
+      type: 'int',
+    );
     assertTypeDynamic(findNode.simple('v; // marker'));
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index d56b63b..82900cd 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -1522,24 +1522,13 @@
 
     {
       var prefixed = findNode.prefixed('a.v = 1;');
-      if (hasAssignmentLeftResolution) {
-        assertElement(prefixed, v.setter);
-        assertType(prefixed, 'int');
-      } else {
-        assertElementNull(prefixed);
-        assertTypeNull(prefixed);
-      }
+      assertElementNull(prefixed);
+      assertTypeNull(prefixed);
 
       assertElement(prefixed.prefix, import.prefix);
       assertType(prefixed.prefix, null);
 
-      if (hasAssignmentLeftResolution) {
-        assertElement(prefixed.identifier, v.setter);
-        assertType(prefixed.identifier, 'int');
-      } else {
-        assertElementNull(prefixed.identifier);
-        assertTypeNull(prefixed.identifier);
-      }
+      assertUnresolvedSimpleIdentifier(prefixed.identifier);
     }
   }
 
@@ -1770,13 +1759,7 @@
 
     {
       var fRef = findNode.simple('f = 1;');
-      if (hasAssignmentLeftResolution) {
-        assertMember(fRef, findElement.setter('f'), {'T': 'int'});
-        assertType(fRef, 'int');
-      } else {
-        assertElementNull(fRef);
-        assertTypeNull(fRef);
-      }
+      assertUnresolvedSimpleIdentifier(fRef);
     }
   }
 
@@ -5944,13 +5927,7 @@
     await resolveTestFile();
 
     var xRef = findNode.simple('x ++');
-    if (hasAssignmentLeftResolution) {
-      assertElement(xRef, findElement.parameter('x'));
-      assertType(xRef, 'int');
-    } else {
-      // assertElementNull(xRef);
-      assertTypeNull(xRef);
-    }
+    assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true);
   }
 
   test_postfixExpression_local() async {
@@ -5982,13 +5959,7 @@
       expect(postfix.staticType, typeProvider.intType);
 
       var operand = postfix.operand as SimpleIdentifier;
-      if (hasAssignmentLeftResolution) {
-        expect(operand.staticElement, same(v));
-        expect(operand.staticType, typeProvider.intType);
-      } else {
-        // expect(operand.staticElement, same(v));
-        expect(operand.staticType, isNull);
-      }
+      assertUnresolvedSimpleIdentifier(operand, disableElementCheck: true);
     }
   }
 
@@ -6004,11 +5975,6 @@
     addTestFile(content);
 
     await resolveTestFile();
-    CompilationUnit unit = result.unit;
-
-    var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
-    ClassElement cClassElement = cClassDeclaration.declaredElement!;
-    FieldElement fElement = cClassElement.getField('f')!;
 
     List<Statement> mainStatements = _getMainStatements(result);
 
@@ -6021,20 +5987,10 @@
       expect(postfix.staticType, typeProvider.intType);
 
       var propertyAccess = postfix.operand as PropertyAccess;
-      if (hasAssignmentLeftResolution) {
-        expect(propertyAccess.staticType, typeProvider.intType);
-      } else {
-        assertTypeNull(propertyAccess);
-      }
+      assertUnresolvedPropertyAccess(propertyAccess);
 
       SimpleIdentifier propertyName = propertyAccess.propertyName;
-      if (hasAssignmentLeftResolution) {
-        expect(propertyName.staticElement, same(fElement.setter));
-        expect(propertyName.staticType, typeProvider.intType);
-      } else {
-        assertElementNull(propertyName);
-        assertTypeNull(propertyName);
-      }
+      assertUnresolvedSimpleIdentifier(propertyName);
     }
   }
 
@@ -6060,13 +6016,7 @@
     await resolveTestFile();
 
     var xRef = findNode.simple('x++');
-    if (hasAssignmentLeftResolution) {
-      assertElement(xRef, findElement.parameter('x'));
-      assertType(xRef, 'int');
-    } else {
-      // assertElementNull(xRef);
-      assertTypeNull(xRef);
-    }
+    assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true);
   }
 
   test_prefix_increment_of_prefix_increment() async {
@@ -6078,13 +6028,7 @@
     await resolveTestFile();
 
     var xRef = findNode.simple('x;');
-    if (hasAssignmentLeftResolution) {
-      assertElement(xRef, findElement.parameter('x'));
-      assertType(xRef, 'int');
-    } else {
-      // assertElementNull(xRef);
-      assertTypeNull(xRef);
-    }
+    assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true);
   }
 
   test_prefixedIdentifier_classInstance_instanceField() async {
@@ -6268,14 +6212,7 @@
       var assignment = statement.expression as AssignmentExpression;
       var left = assignment.leftHandSide as PrefixedIdentifier;
       assertPrefix(left.prefix);
-
-      if (hasAssignmentLeftResolution) {
-        expect(left.identifier.staticElement, same(mySetter));
-        expect(left.identifier.staticType, typeProvider.intType);
-      } else {
-        assertElementNull(left.identifier);
-        assertTypeNull(left.identifier);
-      }
+      assertUnresolvedSimpleIdentifier(left.identifier);
     }
   }
 
@@ -6309,13 +6246,7 @@
       expect(prefix.staticType, typeProvider.intType);
 
       var operand = prefix.operand as SimpleIdentifier;
-      if (hasAssignmentLeftResolution) {
-        expect(operand.staticElement, same(v));
-        expect(operand.staticType, typeProvider.intType);
-      } else {
-        // assertElementNull(operand);
-        assertTypeNull(operand);
-      }
+      assertUnresolvedSimpleIdentifier(operand, disableElementCheck: true);
     }
 
     {
@@ -6396,20 +6327,10 @@
       expect(prefix.staticType, typeProvider.intType);
 
       var propertyAccess = prefix.operand as PropertyAccess;
-      if (hasAssignmentLeftResolution) {
-        expect(propertyAccess.staticType, typeProvider.intType);
-      } else {
-        assertTypeNull(propertyAccess);
-      }
+      assertUnresolvedPropertyAccess(propertyAccess);
 
       SimpleIdentifier propertyName = propertyAccess.propertyName;
-      if (hasAssignmentLeftResolution) {
-        expect(propertyName.staticElement, same(fElement.setter));
-        expect(propertyName.staticType, typeProvider.intType);
-      } else {
-        assertElementNull(propertyName.staticElement);
-        assertTypeNull(propertyName);
-      }
+      assertUnresolvedSimpleIdentifier(propertyName);
     }
 
     {
@@ -6635,8 +6556,6 @@
     var methodElement = aNode.members[0].declaredElement as MethodElement;
     var getterElement =
         aNode.members[1].declaredElement as PropertyAccessorElement;
-    var setterElement =
-        aNode.members[2].declaredElement as PropertyAccessorElement;
     var operatorElement = aNode.members[3].declaredElement as MethodElement;
 
     var testNode = bNode.members[0] as MethodDeclaration;
@@ -6694,13 +6613,7 @@
       var assignment = statement.expression as AssignmentExpression;
 
       var identifier = assignment.leftHandSide as SimpleIdentifier;
-      if (hasAssignmentLeftResolution) {
-        expect(identifier.staticElement, same(setterElement));
-        expect(identifier.staticType, typeProvider.intType);
-      } else {
-        assertElementNull(identifier);
-        assertTypeNull(identifier);
-      }
+      assertUnresolvedSimpleIdentifier(identifier);
     }
 
     // this.setter = 4;
@@ -6714,13 +6627,7 @@
       expect(
           target.staticType, interfaceTypeNone(bNode.declaredElement!)); // raw
 
-      if (hasAssignmentLeftResolution) {
-        expect(propertyAccess.propertyName.staticElement, same(setterElement));
-        expect(propertyAccess.propertyName.staticType, typeProvider.intType);
-      } else {
-        assertElementNull(propertyAccess.propertyName);
-        assertTypeNull(propertyAccess.propertyName);
-      }
+      assertUnresolvedSimpleIdentifier(propertyAccess.propertyName);
     }
 
     // super + 5;
@@ -6763,8 +6670,6 @@
     var methodElement = aNode.members[0].declaredElement as MethodElement;
     var getterElement =
         aNode.members[1].declaredElement as PropertyAccessorElement;
-    var setterElement =
-        aNode.members[2].declaredElement as PropertyAccessorElement;
     var operatorElement = aNode.members[3].declaredElement as MethodElement;
 
     var testNode = aNode.members[4] as MethodDeclaration;
@@ -6823,13 +6728,7 @@
       var assignment = statement.expression as AssignmentExpression;
 
       var identifier = assignment.leftHandSide as SimpleIdentifier;
-      if (hasAssignmentLeftResolution) {
-        expect(identifier.staticElement, same(setterElement));
-        expect(identifier.staticType, typeProvider.intType);
-      } else {
-        assertElementNull(identifier);
-        assertTypeNull(identifier);
-      }
+      assertUnresolvedSimpleIdentifier(identifier);
     }
 
     // this.setter = 4;
@@ -6842,13 +6741,7 @@
       var target = propertyAccess.target as ThisExpression;
       expect(target.staticType, thisTypeA); // raw
 
-      if (hasAssignmentLeftResolution) {
-        expect(propertyAccess.propertyName.staticElement, same(setterElement));
-        expect(propertyAccess.propertyName.staticType, typeProvider.intType);
-      } else {
-        assertElementNull(propertyAccess.propertyName);
-        assertTypeNull(propertyAccess.propertyName);
-      }
+      assertUnresolvedSimpleIdentifier(propertyAccess.propertyName);
     }
 
     // this + 5;
@@ -8274,13 +8167,7 @@
     assertTypeDynamic(postfix);
 
     var aRef = postfix.operand as SimpleIdentifier;
-    if (hasAssignmentLeftResolution) {
-      assertElementNull(aRef);
-      assertTypeDynamic(aRef);
-    } else {
-      assertElementNull(aRef);
-      assertTypeNull(aRef);
-    }
+    assertUnresolvedSimpleIdentifier(aRef);
   }
 
   test_unresolved_postfix_operator() async {
@@ -8299,13 +8186,7 @@
     assertType(postfix, 'A');
 
     var aRef = postfix.operand as SimpleIdentifier;
-    if (hasAssignmentLeftResolution) {
-      assertElement(aRef, findElement.topSet('a'));
-      assertType(aRef, 'A');
-    } else {
-      assertElementNull(aRef);
-      assertTypeNull(aRef);
-    }
+    assertUnresolvedSimpleIdentifier(aRef);
   }
 
   test_unresolved_prefix_operand() async {
@@ -8322,13 +8203,7 @@
     assertTypeDynamic(prefix);
 
     var aRef = prefix.operand as SimpleIdentifier;
-    if (hasAssignmentLeftResolution) {
-      assertElementNull(aRef);
-      assertTypeDynamic(aRef);
-    } else {
-      assertElementNull(aRef);
-      assertTypeNull(aRef);
-    }
+    assertUnresolvedSimpleIdentifier(aRef);
   }
 
   test_unresolved_prefix_operator() async {
@@ -8347,13 +8222,7 @@
     assertTypeDynamic(prefix);
 
     var aRef = prefix.operand as SimpleIdentifier;
-    if (hasAssignmentLeftResolution) {
-      assertElement(aRef, findElement.topSet('a'));
-      assertType(aRef, 'A');
-    } else {
-      assertElementNull(aRef);
-      assertTypeNull(aRef);
-    }
+    assertUnresolvedSimpleIdentifier(aRef);
   }
 
   test_unresolved_prefixedIdentifier_identifier() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart b/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart
index 0adbdc7..11916bd 100644
--- a/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart
@@ -28,7 +28,7 @@
   test_enum() async {
     await assertNoErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   final int f;
   const E(this.f);
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index 384b9be..91bc686 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -168,14 +168,6 @@
     var numPlusElement = numElement.getMethod('+')!;
 
     var indexExpression = findNode.index('a[0]');
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        indexExpression,
-        readElement: indexElement,
-        writeElement: indexEqElement,
-        type: 'num',
-      );
-    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -217,20 +209,6 @@
     var doublePlusElement = doubleElement.getMethod('+')!;
 
     var indexExpression = findNode.index('a[0]');
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        indexExpression,
-        readElement: elementMatcher(
-          indexElement,
-          substitution: {'T': 'double'},
-        ),
-        writeElement: elementMatcher(
-          indexEqElement,
-          substitution: {'T': 'double'},
-        ),
-        type: 'double',
-      );
-    }
     assertParameterElement(
       indexExpression.index,
       elementMatcher(
@@ -281,14 +259,6 @@
     var numPlusElement = numElement.getMethod('+')!;
 
     var indexExpression = findNode.index('a?[0]');
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        indexExpression,
-        readElement: indexElement,
-        writeElement: indexEqElement,
-        type: 'num',
-      );
-    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -324,14 +294,6 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a[0]');
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        indexExpression,
-        readElement: null,
-        writeElement: indexEqElement,
-        type: null,
-      );
-    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -364,8 +326,6 @@
 }
 ''');
 
-    var indexEqElement = findElement.method('[]=');
-
     assertAssignment(
       findNode.assignment('[0]'),
       readElement: null,
@@ -386,22 +346,6 @@
       type: 'A',
     );
 
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        findNode.index('..[0]'),
-        readElement: null,
-        writeElement: indexEqElement,
-        type: null,
-      );
-
-      assertIndexExpression(
-        findNode.index('..[1]'),
-        readElement: null,
-        writeElement: indexEqElement,
-        type: null,
-      );
-    }
-
     assertType(findNode.cascade('a?'), 'A?');
   }
 
@@ -419,17 +363,6 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a[0]');
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        indexExpression,
-        readElement: null,
-        writeElement: elementMatcher(
-          indexEqElement,
-          substitution: {'T': 'double'},
-        ),
-        type: null,
-      );
-    }
     assertParameterElement(
       indexExpression.index,
       elementMatcher(
@@ -474,14 +407,6 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a?[0]');
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        indexExpression,
-        readElement: null,
-        writeElement: indexEqElement,
-        type: null,
-      );
-    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
index 3cfabd6..3c3c165 100644
--- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -55,10 +55,6 @@
 }
 ''');
 
-    if (hasAssignmentLeftResolution) {
-      assertType(findNode.simple('x++;'), 'A');
-    }
-
     assertPostfixExpression(
       findNode.postfix('x++'),
       readElement: findElement.parameter('x'),
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
index 3408237..24948fe 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
@@ -91,10 +91,6 @@
       element: findElement.method('+'),
       type: 'Object',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertType(findNode.simple('x;'), 'A');
-    }
   }
 
   test_plusPlus_nullShorting() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index b9df396..998efbf 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -102,14 +102,6 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    if (hasAssignmentLeftResolution) {
-      assertPrefixedIdentifier(
-        prefixed,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
     assertSimpleIdentifier(
       prefixed.prefix,
       element: findElement.parameter('e'),
@@ -363,14 +355,6 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    if (hasAssignmentLeftResolution) {
-      assertPrefixedIdentifier(
-        prefixed,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
     assertSimpleIdentifier(
       prefixed.prefix,
       element: findElement.parameter('a'),
@@ -405,14 +389,6 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    if (hasAssignmentLeftResolution) {
-      assertPrefixedIdentifier(
-        prefixed,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
     assertSimpleIdentifier(
       prefixed.prefix,
       element: findElement.parameter('a'),
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 5c75760..d4b57a6 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -311,15 +311,6 @@
       ),
       type: 'int',
     );
-
-    var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'num',
-      );
-    }
   }
 
   test_extensionOverride_write() async {
@@ -345,19 +336,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
-    assertSimpleIdentifierAssignmentTarget(
-      propertyAccess.propertyName,
-    );
   }
 
   test_functionType_call_read() async {
@@ -423,15 +401,6 @@
       ),
       type: 'int',
     );
-
-    var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
   }
 
   test_instanceCreation_write() async {
@@ -455,19 +424,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
-    assertSimpleIdentifierAssignmentTarget(
-      propertyAccess.propertyName,
-    );
   }
 
   test_invalid_inDefaultValue_nullAware() async {
@@ -659,15 +615,6 @@
       ),
       type: 'int',
     );
-
-    var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'num',
-      );
-    }
   }
 
   test_ofExtension_write() async {
@@ -693,19 +640,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
-    assertSimpleIdentifierAssignmentTarget(
-      propertyAccess.propertyName,
-    );
   }
 
   test_super_read() async {
@@ -767,21 +701,9 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
     assertSuperExpression(
       propertyAccess.target,
     );
-
-    assertSimpleIdentifierAssignmentTarget(
-      propertyAccess.propertyName,
-    );
   }
 
   test_super_write() async {
@@ -809,21 +731,9 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess2(
-        propertyAccess,
-        element: findElement.setter('foo'),
-        type: 'int',
-      );
-    }
-
     assertSuperExpression(
       propertyAccess.target,
     );
-
-    assertSimpleIdentifierAssignmentTarget(
-      propertyAccess.propertyName,
-    );
   }
 
   test_targetTypeParameter_dynamicBounded() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index ee209b2..a32c4bb 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -51,9 +51,6 @@
 
   ClassElement get futureElement => typeProvider.futureElement;
 
-  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
-  bool get hasAssignmentLeftResolution => false;
-
   ClassElement get intElement => typeProvider.intType.element;
 
   InterfaceType get intType => typeProvider.intType;
@@ -111,6 +108,8 @@
     );
     assertElement(node.staticElement, operatorElement);
     assertType(node, type);
+
+    _assertUnresolvedAssignmentTarget(node.leftHandSide);
   }
 
   void assertBinaryExpression(
@@ -684,6 +683,10 @@
     );
     assertElement(node.staticElement, element);
     assertType(node, type);
+
+    if (writeElement != null) {
+      _assertUnresolvedAssignmentTarget(node.operand);
+    }
   }
 
   void assertPrefixedIdentifier(
@@ -713,6 +716,10 @@
     );
     assertElement(node.staticElement, element);
     assertType(node, type);
+
+    if (writeElement != null) {
+      _assertUnresolvedAssignmentTarget(node.operand);
+    }
   }
 
   void assertPropertyAccess(
@@ -882,6 +889,40 @@
     expect(node.staticType, isNull);
   }
 
+  void assertUnresolvedIndexExpression(IndexExpression node) {
+    assertElementNull(node);
+    assertTypeNull(node);
+  }
+
+  void assertUnresolvedPrefixedIdentifier(PrefixedIdentifier node) {
+    assertElementNull(node);
+    assertTypeNull(node);
+    assertUnresolvedSimpleIdentifier(node.identifier);
+  }
+
+  /// TODO(scheglov) Remove [disableElementCheck]
+  void assertUnresolvedPropertyAccess(
+    PropertyAccess node, {
+    bool disableElementCheck = false,
+  }) {
+    if (!disableElementCheck) {
+      assertElementNull(node);
+    }
+    assertTypeNull(node);
+    assertUnresolvedSimpleIdentifier(node.propertyName);
+  }
+
+  /// TODO(scheglov) Remove [disableElementCheck]
+  void assertUnresolvedSimpleIdentifier(
+    SimpleIdentifier node, {
+    bool disableElementCheck = false,
+  }) {
+    if (!disableElementCheck) {
+      assertElementNull(node);
+    }
+    assertTypeNull(node);
+  }
+
   /// TODO(scheglov) Remove `?` from [declaration].
   Matcher elementMatcher(
     Element? declaration, {
@@ -1031,6 +1072,22 @@
     }
   }
 
+  /// Nodes that are targets of an assignment should not be resolved,
+  /// instead the enclosing [CompoundAssignmentExpression] is resolved.
+  void _assertUnresolvedAssignmentTarget(Expression node) {
+    if (node is IndexExpression) {
+      assertUnresolvedIndexExpression(node);
+    } else if (node is PrefixedIdentifier) {
+      assertUnresolvedPrefixedIdentifier(node);
+    } else if (node is PropertyAccess) {
+      assertUnresolvedPropertyAccess(node);
+    } else if (node is SimpleIdentifier) {
+      assertUnresolvedSimpleIdentifier(node, disableElementCheck: true);
+    } else {
+      // Not LValue.
+    }
+  }
+
   Matcher _elementMatcher(Object? elementOrMatcher) {
     if (elementOrMatcher is Element) {
       return _ElementMatcher(this, declaration: elementOrMatcher);
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
index 8711811..8112a55 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -146,8 +146,6 @@
   a.foo = 0;
 }
 ''');
-    var propertyAccess = findNode.prefixed('.foo =');
-
     assertAssignment(
       findNode.assignment('foo ='),
       readElement: null,
@@ -160,14 +158,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertMember(
-        propertyAccess,
-        findElement.setter('foo', of: 'E'),
-        {'T': 'int'},
-      );
-    }
   }
 
   test_implicit_targetTypeParameter_hasBound_methodInvocation() async {
@@ -265,17 +255,6 @@
         type: 'S',
       );
 
-      if (hasAssignmentLeftResolution) {
-        assertPropertyAccess2(
-          findNode.propertyAccess('.test'),
-          element: elementMatcher(
-            findElement.setter('test'),
-            substitution: {'T': 'S'},
-          ),
-          type: 'S',
-        );
-      }
-
       assertTypeArgumentTypes(
         findNode.methodInvocation('g()'),
         ['S'],
@@ -294,17 +273,6 @@
         type: 'num',
       );
 
-      if (hasAssignmentLeftResolution) {
-        assertPropertyAccess2(
-          findNode.propertyAccess('.test'),
-          element: elementMatcher(
-            findElement.setter('test'),
-            substitution: {'T': 'num'},
-          ),
-          type: 'num',
-        );
-      }
-
       assertTypeArgumentTypes(
         findNode.methodInvocation('g()'),
         ['num'],
@@ -465,15 +433,6 @@
       operatorElement: null,
       type: 'double',
     );
-
-    if (hasAssignmentLeftResolution) {
-      var propertyAccess = findNode.propertyAccess('.foo =');
-      assertMember(
-        propertyAccess,
-        findElement.setter('foo', of: 'E'),
-        {'T': 'num'},
-      );
-    }
   }
 
   test_override_inferTypeArguments_error_couldNotInfer() async {
@@ -606,14 +565,5 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      var propertyAccess = findNode.propertyAccess('.foo =');
-      assertMember(
-        propertyAccess,
-        findElement.setter('foo', of: 'E'),
-        {'T': 'int'},
-      );
-    }
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
index 762abe6..da65cb3 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
@@ -368,14 +368,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess(
-        findNode.propertyAccess('super.foo'),
-        findElement.setter('foo', of: 'A'),
-        'int',
-      );
-    }
   }
 
   test_propertyAccess_setter_mixin_implements() async {
@@ -432,14 +424,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess(
-        findNode.propertyAccess('super.foo'),
-        findElement.setter('foo', of: 'A'),
-        'int',
-      );
-    }
   }
 
   test_propertyAccess_setter_superHasNoSuchMethod() async {
@@ -466,14 +450,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess(
-        findNode.propertyAccess('super.foo'),
-        findElement.setter('foo', of: 'A'),
-        'int',
-      );
-    }
   }
 
   test_propertyAccess_setter_superSuperHasConcrete() async {
@@ -504,13 +480,5 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertPropertyAccess(
-        findNode.propertyAccess('super.foo'),
-        findElement.setter('foo', of: 'A'),
-        'int',
-      );
-    }
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index 79b9f6e..46fccef 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -342,11 +342,15 @@
 ''', [
       error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 88, 1),
     ]);
-    var access = findNode.propertyAccess('0.a');
-    assertElementNull(access);
-    if (hasAssignmentLeftResolution) {
-      assertTypeDynamic(access);
-    }
+    assertAssignment(
+      findNode.assignment('= 3'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: 'dynamic',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_unnamed_extensions() async {
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 f8b4487..432c0e1 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
@@ -85,6 +85,26 @@
 ''');
   }
 
+  test_enumConstant() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v(0);
+  const E(String a);
+}
+''', [
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 13, 1),
+    ]);
+  }
+
+  test_enumConstant_implicitDouble() async {
+    await assertNoErrorsInCode(r'''
+enum E {
+  v(0);
+  const E(double a);
+}
+''');
+  }
+
   test_expressionFromConstructorTearoff_withoutTypeArgs() async {
     await assertNoErrorsInCode('''
 class C<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
index a41afd4..a254d03 100644
--- a/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
@@ -58,17 +58,17 @@
   test_enum_assertBeforeRedirection() async {
     await assertErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   const E(int x) : assert(x > 0), this.name();
   const E.name();
 }
-''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 33, 13)]);
+''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 36, 13)]);
   }
 
   test_enum_justAssert() async {
     await assertNoErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   const E(int x) : assert(x > 0);
 }
 ''');
@@ -77,7 +77,7 @@
   test_enum_justRedirection() async {
     await assertNoErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   const E(int x) : this.name();
   const E.name();
 }
@@ -87,10 +87,10 @@
   test_enum_redirectionBeforeAssert() async {
     await assertErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   const E(int x) : this.name(), assert(x > 0);
   const E.name();
 }
-''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 46, 13)]);
+''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 49, 13)]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
index 74bca78..2b2b9aa 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
@@ -54,6 +54,17 @@
 ''', [error(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, 88, 1)]);
   }
 
+  test_enumConstant() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v(a: 0, a: 1);
+  const E({required int a});
+}
+''', [
+      error(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, 19, 1),
+    ]);
+  }
+
   test_function() async {
     await assertErrorsInCode(r'''
 f({a, b}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
index a1caf5d..152ae4c 100644
--- a/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
@@ -60,6 +60,18 @@
     ]);
   }
 
+  test_enumConstant() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v(0);
+  const E({int? a});
+}
+''', [
+      error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED, 13,
+          1),
+    ]);
+  }
+
   test_functionExpressionInvocation() async {
     await assertErrorsInCode('''
 main() {
@@ -126,6 +138,16 @@
     ]);
   }
 
+  test_enumConstant() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v(0)
+}
+''', [
+      error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS, 13, 1),
+    ]);
+  }
+
   test_functionExpressionInvocation() async {
     await assertErrorsInCode('''
 main() {
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
index 7610d43..682d603 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
@@ -86,13 +86,13 @@
   test_enum_redirectionOnly() async {
     await assertErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   final int x;
   const E.named();
   const E(this.x) : this.named();
 }
 ''', [
-      error(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, 58,
+      error(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, 61,
           6),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart b/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart
index 78509a6..cc82ccb 100644
--- a/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart
@@ -101,12 +101,12 @@
   test_enum_synthetic() async {
     await assertErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   const E(this.x);
   int get x => 1;
 }
 ''', [
-      error(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, 24,
+      error(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, 27,
           6),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index 620441c..fb52e33 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -169,13 +169,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertElement(
-        findNode.simple('a = 2;'),
-        findElement.setter('a'),
-      );
-    }
   }
 
   test_method_reference() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index fb7e87c..6144c42 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -451,7 +451,6 @@
   x = null;
 }
 ''', [
-      if (hasAssignmentLeftResolution) error(HintCode.DEAD_CODE, 24, 5),
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 24, 4),
     ]);
   }
@@ -464,7 +463,6 @@
   x = null;
 }
 ''', [
-      if (hasAssignmentLeftResolution) error(HintCode.DEAD_CODE, 37, 5),
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 37, 4),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart
index 913b93f..f0b91f9 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart
@@ -96,6 +96,22 @@
 ''');
   }
 
+  test_generative_named_redirectingFactory() async {
+    await assertErrorsInCode('''
+enum E {
+  v;
+
+  const factory E() = E.named;
+  const E.named();
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR,
+          37,
+          7),
+    ]);
+  }
+
   test_generative_unnamed_constructorReference() async {
     await assertErrorsInCode('''
 enum E {
@@ -174,4 +190,20 @@
 }
 ''');
   }
+
+  test_generative_unnamed_redirectingFactory() async {
+    await assertErrorsInCode('''
+enum E {
+  v;
+
+  const factory E.named() = E;
+  const E();
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR,
+          43,
+          1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
index 604be9a..456f6d0 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
@@ -328,6 +328,28 @@
     ]);
   }
 
+  test_enumConstant_withArguments() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v();
+  const E({required int a});
+}
+''', [
+      error(CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT, 11, 1),
+    ]);
+  }
+
+  test_enumConstant_withoutArguments() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v;
+  const E({required int a});
+}
+''', [
+      error(CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT, 11, 1),
+    ]);
+  }
+
   test_function() async {
     await assertErrorsInCode(r'''
 void f({required int a}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart
index 5ef58f0..5f509b3 100644
--- a/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart
@@ -18,7 +18,7 @@
   test_factory() async {
     await assertNoErrorsInCode(r'''
 enum E {
-  v;
+  v(0);
   factory E(int i) => values[i];
 }
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
index dcb8a8f..af89c90 100644
--- a/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
@@ -57,6 +57,28 @@
     ]);
   }
 
+  test_enumConstant_withArgumentList() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v();
+  const E(int a);
+}
+''', [
+      error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS, 12, 2),
+    ]);
+  }
+
+  test_enumConstant_withoutArgumentList() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v;
+  const E(int a);
+}
+''', [
+      error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS, 11, 1),
+    ]);
+  }
+
   test_functionExpression() async {
     await assertErrorsInCode('''
 main() {
diff --git a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
index be8cabb..2768242 100644
--- a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
@@ -42,13 +42,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertElement(
-        findNode.simple('_foo = 0'),
-        aImport.setter('_foo'),
-      );
-    }
   }
 
   test_typeLiteral_privateField_sameLibrary() async {
@@ -93,13 +86,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertElement(
-        findNode.simple('_foo = 0'),
-        aImport.setter('_foo'),
-      );
-    }
   }
 
   test_typeLiteral_privateSetter_differentLibrary_noGetter() async {
@@ -129,13 +115,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertElement(
-        findNode.simple('_foo = 0'),
-        aImport.setter('_foo'),
-      );
-    }
   }
 
   test_typeLiteral_privateSetter_sameLibrary() async {
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index a120a6f..0d5f71f 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -166,15 +166,6 @@
       type: 'dynamic',
     );
 
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        findNode.index('x[0]'),
-        readElement: null,
-        writeElement: null,
-        type: 'dynamic',
-      );
-    }
-
     assertType(findNode.binary('1 + 2'), 'int');
   }
 
@@ -236,15 +227,6 @@
       type: 'dynamic',
     );
 
-    if (hasAssignmentLeftResolution) {
-      assertIndexExpression(
-        findNode.index('x[0]'),
-        readElement: null,
-        writeElement: null,
-        type: 'dynamic',
-      );
-    }
-
     assertType(findNode.binary('1 + 2'), 'int');
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart
index 96bbf01..2d7020f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart
@@ -41,6 +41,17 @@
     ]);
   }
 
+  test_enumConstant() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v(a: 0);
+  const E();
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER, 13, 1),
+    ]);
+  }
+
   test_function() async {
     await assertErrorsInCode('''
 f({a, b}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 44ea839..3ef5688 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -430,13 +430,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      var assignment1 = findNode.assignment('b.a?.x = 1');
-      var assignment2 = findNode.assignment('b.a.x = 2');
-      assertType(assignment1.leftHandSide, 'int');
-      assertType(assignment2.leftHandSide, 'int');
-    }
   }
 
   test_assignment_eq_simpleIdentifier() async {
@@ -466,13 +459,6 @@
       operatorElement: null,
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      var assignment1 = findNode.assignment('x =');
-      var assignment2 = findNode.assignment('y =');
-      assertType(assignment1.leftHandSide, 'int');
-      assertType(assignment2.leftHandSide, 'int?');
-    }
   }
 
   test_assignment_plusEq_propertyAccess3() async {
@@ -522,13 +508,6 @@
       ),
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      var assignment1 = findNode.assignment('b.a.x +=');
-      var assignment2 = findNode.assignment('b.a.y +=');
-      assertType(assignment1.leftHandSide, 'int');
-      assertType(assignment2.leftHandSide, 'int?');
-    }
   }
 
   test_assignment_plusEq_propertyAccess3_short1() async {
@@ -578,13 +557,6 @@
       ),
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      var assignment1 = findNode.assignment('b.a?.x += 1');
-      var assignment2 = findNode.assignment('b.a.x += 2');
-      assertType(assignment1.leftHandSide, 'int');
-      assertType(assignment2.leftHandSide, 'int');
-    }
   }
 
   test_assignment_plusEq_simpleIdentifier() async {
@@ -597,8 +569,6 @@
       error(CompileTimeErrorCode.UNCHECKED_METHOD_INVOCATION_OF_NULLABLE_VALUE,
           33, 2),
     ]);
-    var assignment1 = findNode.assignment('x +=');
-    var assignment2 = findNode.assignment('y +=');
 
     assertAssignment(
       findNode.assignment('x +='),
@@ -625,11 +595,6 @@
       ),
       type: 'int',
     );
-
-    if (hasAssignmentLeftResolution) {
-      assertType(assignment1.leftHandSide, 'int');
-      assertType(assignment2.leftHandSide, 'int?');
-    }
   }
 
   test_await_nonNullable() async {
diff --git a/tools/VERSION b/tools/VERSION
index 19b9b02..a12a574 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 88
+PRERELEASE 89
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/linux_dist_support/upload_debian_packages.py b/tools/linux_dist_support/upload_debian_packages.py
index ab3c911..13deeb9 100755
--- a/tools/linux_dist_support/upload_debian_packages.py
+++ b/tools/linux_dist_support/upload_debian_packages.py
@@ -37,12 +37,16 @@
 if __name__ == '__main__':
     bot_name = os.environ.get('BUILDBOT_BUILDERNAME')
     channel = bot_utils.GetChannelFromName(bot_name)
-    if channel not in (bot_utils.Channel.BLEEDING_EDGE, bot_utils.Channel.TRY):
+    if os.environ.get('DART_EXPERIMENTAL_BUILD') == '1':
+        print('Not uploading artifacts on experimental builds')
+    elif channel == bot_utils.Channel.TRY:
+        print('Not uploading artifacts on try builds')
+    elif channel == bot_utils.Channel.BLEEDING_EDGE:
+        print('Not uploading artifacts on bleeding edge')
+    else:
         builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
                                 'src_and_installation')
         version = utils.GetVersion()
         tarfilename = 'dart-%s.tar.gz' % version
         tarfile = os.path.join(builddir, tarfilename)
         ArchiveArtifacts(tarfile, builddir, channel)
-    else:
-        print('Not uploading artifacts on bleeding edge')
