Version 2.17.0-89.0.dev

Merge commit '62488444c9a4f3b6bfa625b5ead98bc6140fa8d5' into 'dev'
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')