Version 2.15.0-55.0.dev

Merge commit '965af148f3db6d7a119dd329d8ed066571a608e5' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
index d42c6ed..d83d3a0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
@@ -17,7 +17,10 @@
 class ClassMemberParser extends Parser {
   Parser? skipParser;
 
-  ClassMemberParser(Listener listener) : super(listener);
+  ClassMemberParser(Listener listener,
+      {bool useImplicitCreationExpression: true})
+      : super(listener,
+            useImplicitCreationExpression: useImplicitCreationExpression);
 
   @override
   Token parseExpression(Token token) {
@@ -35,7 +38,8 @@
     // not triggered during the second parse.
     // When the parser supports not doing token stream rewriting, use that
     // feature together with a no-op listener instead.
-    this.skipParser ??= new Parser(new ErrorDelegationListener(listener));
+    this.skipParser ??= new Parser(new ErrorDelegationListener(listener),
+        useImplicitCreationExpression: useImplicitCreationExpression);
     Parser skipParser = this.skipParser!;
     skipParser.mayParseFunctionExpressions = mayParseFunctionExpressions;
     skipParser.asyncState = asyncState;
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart
index 0bd8882..0239fca 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart
@@ -53,9 +53,11 @@
   }
 }
 
-List<ParserError> parse(Token tokens) {
+List<ParserError> parse(Token tokens,
+    {bool useImplicitCreationExpression: true}) {
   ErrorCollectingListener listener = new ErrorCollectingListener();
-  Parser parser = new Parser(listener);
+  Parser parser = new Parser(listener,
+      useImplicitCreationExpression: useImplicitCreationExpression);
   parser.parseUnit(tokens);
   return listener.recoverableErrors;
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index aa035a0..26c8242 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -300,7 +300,22 @@
     return cachedRewriter ??= new TokenStreamRewriterImpl();
   }
 
-  Parser(this.listener)
+  /// If `true`, syntax like `foo<bar>.baz()` is parsed like an implicit
+  /// creation expression. Otherwise it is parsed as a explicit instantiation
+  /// followed by an invocation.
+  ///
+  /// With the constructor-tearoffs experiment, such syntax can lead to a valid
+  /// expression that is _not_ an implicit creation expression, and the parser
+  /// should therefore not special case the syntax but instead let listeners
+  /// resolve the expression by the seen selectors.
+  ///
+  /// Use this flag to test that the implementation doesn't need the special
+  /// casing.
+  // TODO(johnniwinther): Remove this when both analyzer and CFE can parse the
+  // implicit create expression without the special casing.
+  final bool useImplicitCreationExpression;
+
+  Parser(this.listener, {this.useImplicitCreationExpression: true})
       : assert(listener != null); // ignore:unnecessary_null_comparison
 
   bool get inGenerator {
@@ -5260,7 +5275,7 @@
           token.next!, POSTFIX_PRECEDENCE, allowCascades);
       listener.handleUnaryPrefixAssignmentExpression(operator);
       return token;
-    } else if (token.next!.isIdentifier) {
+    } else if (useImplicitCreationExpression && token.next!.isIdentifier) {
       Token identifier = token.next!;
       if (optional(".", identifier.next!)) {
         identifier = identifier.next!.next!;
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
index 93be64c..5399b86 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
@@ -15,7 +15,9 @@
 /// Parser which only parses top-level elements, but ignores their bodies.
 /// Use [Parser] to parse everything.
 class TopLevelParser extends ClassMemberParser {
-  TopLevelParser(Listener listener) : super(listener);
+  TopLevelParser(Listener listener, {bool useImplicitCreationExpression: true})
+      : super(listener,
+            useImplicitCreationExpression: useImplicitCreationExpression);
 
   @override
   Token parseClassOrMixinOrExtensionBody(Token token, DeclarationKind kind,
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 0e3c1e3..6a29b7d 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -7542,8 +7542,10 @@
   // }
   // ```
   static const CompileTimeErrorCode LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR =
-      CompileTimeErrorCode('LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR',
-          "Can't have a late final field in a class with a const constructor.",
+      CompileTimeErrorCode(
+          'LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR',
+          "Can't have a late final field in a class with a generative "
+              "const constructor.",
           correction: "Try removing the 'late' modifier, or don't declare "
               "'const' constructors.",
           hasPublishedDocs: true);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 80e0fb6..7f5d9e6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2817,8 +2817,10 @@
       // The field is in an extension and should be handled elsewhere.
       return;
     }
-    var hasConstConstructor = enclosingClass.constructors.any((c) => c.isConst);
-    if (!hasConstConstructor) return;
+
+    var hasGenerativeConstConstructor =
+        _enclosingClass!.constructors.any((c) => c.isConst && !c.isFactory);
+    if (!hasGenerativeConstConstructor) return;
 
     errorReporter.reportErrorForToken(
       CompileTimeErrorCode.LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 7f49c50..6287bc4 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -245,17 +245,16 @@
   void visitFieldFormalParameter(FieldFormalParameter node) {
     _writeByte(Tag.FieldFormalParameter);
 
-    _pushScopeTypeParameters(node.typeParameters);
-    _writeOptionalNode(node.typeParameters);
-    _writeOptionalNode(node.type);
-    _writeOptionalNode(node.parameters);
-    _storeNormalFormalParameter(
-      node,
-      node.keyword,
-      hasQuestion: node.question != null,
-    );
-
-    _sink.localElements.popScope();
+    _withTypeParameters(node.typeParameters, () {
+      _writeOptionalNode(node.typeParameters);
+      _writeOptionalNode(node.type);
+      _writeOptionalNode(node.parameters);
+      _storeNormalFormalParameter(
+        node,
+        node.keyword,
+        hasQuestion: node.question != null,
+      );
+    });
   }
 
   @override
@@ -325,13 +324,12 @@
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     _writeByte(Tag.FunctionTypedFormalParameter);
 
-    _pushScopeTypeParameters(node.typeParameters);
-    _writeOptionalNode(node.typeParameters);
-    _writeOptionalNode(node.returnType);
-    _writeNode(node.parameters);
-    _storeNormalFormalParameter(node, null);
-
-    _sink.localElements.popScope();
+    _withTypeParameters(node.typeParameters, () {
+      _writeOptionalNode(node.typeParameters);
+      _writeOptionalNode(node.returnType);
+      _writeNode(node.parameters);
+      _storeNormalFormalParameter(node, null);
+    });
   }
 
   @override
@@ -344,14 +342,12 @@
       ),
     );
 
-    _pushScopeTypeParameters(node.typeParameters);
-
-    _writeOptionalNode(node.typeParameters);
-    _writeOptionalNode(node.returnType);
-    _writeNode(node.parameters);
-
-    _sink.writeType(node.type);
-    _sink.localElements.popScope();
+    _withTypeParameters(node.typeParameters, () {
+      _writeOptionalNode(node.typeParameters);
+      _writeOptionalNode(node.returnType);
+      _writeNode(node.parameters);
+      _sink.writeType(node.type);
+    });
   }
 
   @override
@@ -776,18 +772,6 @@
     _storeAnnotatedNode(node);
   }
 
-  void _pushScopeTypeParameters(TypeParameterList? node) {
-    _sink.localElements.pushScope();
-
-    if (node == null) {
-      return;
-    }
-
-    for (var typeParameter in node.typeParameters) {
-      _sink.localElements.declare(typeParameter.declaredElement!);
-    }
-  }
-
   void _storeAnnotatedNode(AnnotatedNode node) {
     _writeNodeList(node.metadata);
   }
@@ -850,6 +834,19 @@
     _storeFormalParameter(node);
   }
 
+  void _withTypeParameters(TypeParameterList? node, void Function() f) {
+    if (node == null) {
+      f();
+    } else {
+      var elements = node.typeParameters
+          .map((typeParameter) => typeParameter.declaredElement!)
+          .toList();
+      _sink.localElements.withElements(elements, () {
+        f();
+      });
+    }
+  }
+
   void _writeActualType(ResolutionSink resolutionSink, DartType type) {
     resolutionSink.writeType(type);
   }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 8a3993f..6c96d5e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -160,16 +160,12 @@
     ConstructorElementFlags.write(_sink, element);
     _resolutionSink._writeAnnotationList(element.metadata);
 
-    _resolutionSink.localElements.pushScope();
-    _resolutionSink.localElements.declareAll(element.parameters);
-    try {
+    _resolutionSink.localElements.withElements(element.parameters, () {
       _writeList(element.parameters, _writeParameterElement);
       _writeMacro(element.macro);
       _resolutionSink.writeElement(element.redirectedConstructor);
       _resolutionSink._writeNodeList(element.constantInitializers);
-    } finally {
-      _resolutionSink.localElements.popScope();
-    }
+    });
   }
 
   void _writeEnumElement(ClassElement element) {
@@ -430,14 +426,10 @@
     List<TypeParameterElement> typeParameters,
     void Function() f,
   ) {
-    _resolutionSink.localElements.pushScope();
-    _resolutionSink.localElements.declareAll(typeParameters);
-    try {
+    _resolutionSink.localElements.withElements(typeParameters, () {
       _sink.writeList(typeParameters, _writeTypeParameterElement);
       f();
-    } finally {
-      _resolutionSink.localElements.popScope();
-    }
+    });
   }
 
   void _writeUnitElement(CompilationUnitElement unitElement) {
@@ -745,9 +737,7 @@
     void Function() f, {
     required bool withAnnotations,
   }) {
-    localElements.pushScope();
-    localElements.declareAll(typeParameters);
-    try {
+    localElements.withElements(typeParameters, () {
       writeUInt30(typeParameters.length);
       for (var typeParameter in typeParameters) {
         _writeStringReference(typeParameter.name);
@@ -759,9 +749,7 @@
         }
       }
       f();
-    } finally {
-      localElements.popScope();
-    }
+    });
   }
 
   static List<DartType> _enclosingClassTypeArguments(
@@ -942,7 +930,6 @@
 
 class _LocalElementIndexer {
   final Map<Element, int> _index = Map.identity();
-  final List<int> _scopes = [];
   int _stackHeight = 0;
 
   int operator [](Element element) {
@@ -950,22 +937,17 @@
         (throw ArgumentError('Unexpectedly not indexed: $element'));
   }
 
-  void declare(Element element) {
-    _index[element] = _stackHeight++;
-  }
-
-  void declareAll(List<Element> elements) {
+  void withElements(List<Element> elements, void Function() f) {
     for (var element in elements) {
-      declare(element);
+      _index[element] = _stackHeight++;
     }
-  }
 
-  void popScope() {
-    _stackHeight = _scopes.removeLast();
-  }
+    f();
 
-  void pushScope() {
-    _scopes.add(_stackHeight);
+    _stackHeight -= elements.length;
+    for (var element in elements) {
+      _index.remove(element);
+    }
   }
 }
 
diff --git a/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart
index 17cf219..688771e 100644
--- a/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart
@@ -62,6 +62,22 @@
 ''');
   }
 
+  test_class_hasConstFactoryConstructor() async {
+    await assertNoErrorsInCode('''
+class Base {
+  Base();
+  const factory Base.empty() = _Empty;
+  late final int property;
+}
+
+class _Empty implements Base {
+  const _Empty();
+  int get property => 0;
+  set property(_) {}
+}
+''');
+  }
+
   test_class_noConstConstructor() async {
     await assertNoErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index d900b81..a6571b2 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -7438,7 +7438,7 @@
 
 ### late_final_field_with_const_constructor
 
-_Can't have a late final field in a class with a const constructor._
+_Can't have a late final field in a class with a generative const constructor._
 
 #### Description
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 5a8daa1..71bb73f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -99,6 +99,8 @@
 
 import '../scope.dart';
 
+import '../source/diet_parser.dart';
+
 import '../source/scope_listener.dart'
     show
         FixedNullableList,
@@ -1496,7 +1498,8 @@
   }
 
   void parseInitializers(Token token) {
-    Parser parser = new Parser(this);
+    Parser parser = new Parser(this,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     if (!token.isEof) {
       token = parser.parseInitializers(token);
       checkEmpty(token.charOffset);
@@ -1509,7 +1512,8 @@
   }
 
   Expression parseFieldInitializer(Token token) {
-    Parser parser = new Parser(this);
+    Parser parser = new Parser(this,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     token = parser.parseExpression(parser.syntheticPreviousToken(token));
     Expression expression = popForValue();
     checkEmpty(token.charOffset);
@@ -1517,7 +1521,8 @@
   }
 
   Expression parseAnnotation(Token token) {
-    Parser parser = new Parser(this);
+    Parser parser = new Parser(this,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     token = parser.parseMetadata(parser.syntheticPreviousToken(token));
     Expression annotation = pop() as Expression;
     checkEmpty(token.charOffset);
@@ -6454,8 +6459,12 @@
           allowPotentiallyConstantType: allowPotentiallyConstantType);
       if (message == null) return unresolved;
       return new UnresolvedType(
-          new NamedTypeBuilder(typeParameter.name!, builder.nullabilityBuilder,
-              /* arguments = */ null, unresolved.fileUri, unresolved.charOffset)
+          new NamedTypeBuilder(
+              typeParameter.name!,
+              builder.nullabilityBuilder,
+              /* arguments = */ null,
+              unresolved.fileUri,
+              unresolved.charOffset)
             ..bind(new InvalidTypeDeclarationBuilder(
                 typeParameter.name!, message)),
           unresolved.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 331d16b..01268b4 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -64,6 +64,8 @@
 
 import '../type_inference/type_inferrer.dart' show TypeInferrer;
 
+import 'diet_parser.dart';
+
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'stack_listener_impl.dart';
@@ -792,7 +794,8 @@
       MemberKind kind, Token? metadata) {
     final StackListenerImpl listener = createFunctionListener(builder);
     try {
-      Parser parser = new Parser(listener);
+      Parser parser = new Parser(listener,
+          useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
       if (metadata != null) {
         parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
         listener.pop(); // Pops metadata constants.
@@ -971,7 +974,8 @@
       Token? metadata, MemberKind kind) {
     Token token = startToken;
     try {
-      Parser parser = new Parser(listener);
+      Parser parser = new Parser(listener,
+          useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
       if (metadata != null) {
         parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
         listener.pop(); // Annotations.
@@ -1005,7 +1009,8 @@
   void parseFields(StackListenerImpl listener, Token startToken,
       Token? metadata, bool isTopLevel) {
     Token token = startToken;
-    Parser parser = new Parser(listener);
+    Parser parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     if (isTopLevel) {
       token = parser.parseTopLevelMember(metadata ?? token);
     } else {
@@ -1122,7 +1127,8 @@
     if (metadata != null) {
       StackListenerImpl listener = createListener(builder, memberScope,
           isDeclarationInstanceMember: false);
-      Parser parser = new Parser(listener);
+      Parser parser = new Parser(listener,
+          useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
       parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
       return listener.finishMetadata(parent);
     }
diff --git a/pkg/front_end/lib/src/fasta/source/diet_parser.dart b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
index 6bed46d..15b4333 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_parser.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
@@ -9,9 +9,13 @@
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show ClassMemberParser, Listener, MemberKind;
 
+const bool useImplicitCreationExpressionInCfe = true;
+
 // TODO(ahe): Move this to parser package.
 class DietParser extends ClassMemberParser {
-  DietParser(Listener listener) : super(listener);
+  DietParser(Listener listener)
+      : super(listener,
+            useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
 
   Token parseFormalParametersRest(Token token, MemberKind kind) {
     return skipFormalParametersRest(token, kind);
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index c132517..585b690 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -114,7 +114,7 @@
 import '../util/helpers.dart';
 
 import 'diet_listener.dart' show DietListener;
-import 'diet_parser.dart' show DietParser;
+import 'diet_parser.dart' show DietParser, useImplicitCreationExpressionInCfe;
 import 'outline_builder.dart' show OutlineBuilder;
 import 'source_class_builder.dart' show SourceClassBuilder;
 import 'source_library_builder.dart' show SourceLibraryBuilder;
@@ -559,7 +559,10 @@
         isDeclarationInstanceMember: isClassInstanceMember) as BodyBuilder;
 
     return listener.parseSingleExpression(
-        new Parser(listener), token, parameters);
+        new Parser(listener,
+            useImplicitCreationExpression: useImplicitCreationExpressionInCfe),
+        token,
+        parameters);
   }
 
   KernelTarget get target => super.target as KernelTarget;
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
index d32f428..d238f71 100644
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
+++ b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
@@ -17,7 +17,9 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import '../source/diet_parser.dart';
+
+import 'direct_parser_ast_helper.dart';
 
 DirectParserASTContentCompilationUnitEnd getAST(List<int> rawBytes,
     {bool includeBody: true,
@@ -51,9 +53,11 @@
   DirectParserASTListener listener = new DirectParserASTListener();
   Parser parser;
   if (includeBody) {
-    parser = new Parser(listener);
+    parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
   } else {
-    parser = new ClassMemberParser(listener);
+    parser = new ClassMemberParser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
   }
   parser.parseUnit(firstToken);
   return listener.data.single as DirectParserASTContentCompilationUnitEnd;
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index a9cb6ad..9c94019 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -47,6 +47,8 @@
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
 import 'package:front_end/src/fasta/messages.dart' show Message;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+    show useImplicitCreationExpressionInCfe;
 import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
 import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
 
@@ -1984,7 +1986,8 @@
     }
 
     ParserTestListener parserTestListener = new ParserTestListener(false);
-    Parser parser = new Parser(parserTestListener);
+    Parser parser = new Parser(parserTestListener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     parser.parseUnit(firstToken);
     String parsedString =
         parser_suite.tokenStreamToString(firstToken, lineStarts).toString();
@@ -2000,7 +2003,8 @@
     }
 
     ParserErrorListener parserErrorListener = new ParserErrorListener();
-    Parser parser = new Parser(parserErrorListener);
+    Parser parser = new Parser(parserErrorListener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     parser.parseUnit(firstToken);
     return !parserErrorListener.gotError;
   }
diff --git a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
index 3dd5da0..318f02e81 100644
--- a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
@@ -8,6 +8,7 @@
 import 'package:_fe_analyzer_shared/src/parser/async_modifier.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
 import 'package:front_end/src/fasta/messages.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -542,7 +543,8 @@
       {bool inAsync, List<ExpectedError> errors, String expectAfter}) {
     final start = scanString(source).tokens;
     final listener = new TestInfoListener();
-    final parser = new Parser(listener);
+    final parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     if (inAsync != null) parser.asyncState = AsyncModifier.Async;
     final lastConsumed = parser.parseLiteralListSuffix(start, null);
 
@@ -839,7 +841,8 @@
       {bool inAsync, List<ExpectedError> errors, String expectAfter}) {
     final start = scanString(source).tokens;
     final listener = new TestInfoListener();
-    final parser = new Parser(listener);
+    final parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     if (inAsync != null) parser.asyncState = AsyncModifier.Async;
     final lastConsumed = parser.parseMapLiteralEntry(start);
 
diff --git a/pkg/front_end/test/fasta/parser/parser_suite.dart b/pkg/front_end/test/fasta/parser/parser_suite.dart
index 9c9f13a..76bcbd0 100644
--- a/pkg/front_end/test/fasta/parser/parser_suite.dart
+++ b/pkg/front_end/test/fasta/parser/parser_suite.dart
@@ -6,6 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show ParserError, parse;
+import 'package:front_end/src/fasta/source/diet_parser.dart';
 
 import 'package:testing/testing.dart'
     show Chain, ChainContext, Result, Step, runMe;
@@ -32,7 +33,8 @@
 
   Future<Result<Null>> run(ScannedFile file, ChainContext context) async {
     try {
-      List<ParserError> errors = parse(file.result.tokens);
+      List<ParserError> errors = parse(file.result.tokens,
+          useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
       if (errors.isNotEmpty) {
         return fail(null, errors.join("\n"));
       }
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index ce747ba..0894483 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -11,6 +11,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as scanner;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:front_end/src/fasta/messages.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -111,7 +112,12 @@
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noType.ensureTypeNotVoid(start, new Parser(listener)),
+    expect(
+        noType.ensureTypeNotVoid(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
         const TypeMatcher<SyntheticStringToken>());
     expect(listener.calls, [
       'handleIdentifier  typeReference',
@@ -125,7 +131,12 @@
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noType.ensureTypeOrVoid(start, new Parser(listener)),
+    expect(
+        noType.ensureTypeOrVoid(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
         const TypeMatcher<SyntheticStringToken>());
     expect(listener.calls, [
       'handleIdentifier  typeReference',
@@ -139,7 +150,13 @@
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noType.parseType(start, new Parser(listener)), start);
+    expect(
+        noType.parseType(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start);
     expect(listener.calls, ['handleNoType before']);
     expect(listener.errors, isNull);
   }
@@ -148,7 +165,13 @@
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noType.parseTypeNotVoid(start, new Parser(listener)), start);
+    expect(
+        noType.parseTypeNotVoid(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start);
     expect(listener.calls, ['handleNoType before']);
     expect(listener.errors, isNull);
   }
@@ -190,7 +213,13 @@
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(voidType.ensureTypeNotVoid(start, new Parser(listener)), start.next);
+    expect(
+        voidType.ensureTypeNotVoid(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start.next);
     expect(listener.calls, [
       'handleIdentifier void typeReference',
       'handleNoTypeArguments ;',
@@ -203,7 +232,13 @@
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(voidType.parseType(start, new Parser(listener)), start.next);
+    expect(
+        voidType.parseType(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start.next);
     expect(listener.calls, ['handleVoidKeyword void']);
     expect(listener.errors, isNull);
   }
@@ -212,7 +247,13 @@
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(voidType.parseType(start, new Parser(listener)), start.next);
+    expect(
+        voidType.parseType(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start.next);
     expect(listener.calls, ['handleVoidKeyword void']);
     expect(listener.errors, isNull);
   }
@@ -221,7 +262,13 @@
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(voidType.parseTypeNotVoid(start, new Parser(listener)), start.next);
+    expect(
+        voidType.parseTypeNotVoid(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start.next);
     expect(listener.calls, [
       'handleIdentifier void typeReference',
       'handleNoTypeArguments ;',
@@ -270,16 +317,32 @@
     }
 
     listener = new TypeInfoListener();
-    assertResult(prefixedType.ensureTypeNotVoid(start, new Parser(listener)));
+    assertResult(prefixedType.ensureTypeNotVoid(
+        start,
+        new Parser(listener,
+            useImplicitCreationExpression:
+                useImplicitCreationExpressionInCfe)));
 
     listener = new TypeInfoListener();
-    assertResult(prefixedType.ensureTypeOrVoid(start, new Parser(listener)));
+    assertResult(prefixedType.ensureTypeOrVoid(
+        start,
+        new Parser(listener,
+            useImplicitCreationExpression:
+                useImplicitCreationExpressionInCfe)));
 
     listener = new TypeInfoListener();
-    assertResult(prefixedType.parseTypeNotVoid(start, new Parser(listener)));
+    assertResult(prefixedType.parseTypeNotVoid(
+        start,
+        new Parser(listener,
+            useImplicitCreationExpression:
+                useImplicitCreationExpressionInCfe)));
 
     listener = new TypeInfoListener();
-    assertResult(prefixedType.parseType(start, new Parser(listener)));
+    assertResult(prefixedType.parseType(
+        start,
+        new Parser(listener,
+            useImplicitCreationExpression:
+                useImplicitCreationExpressionInCfe)));
   }
 }
 
@@ -1492,7 +1555,13 @@
     final Token start = scanString('before after').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noTypeParamOrArg.parseArguments(start, new Parser(listener)), start);
+    expect(
+        noTypeParamOrArg.parseArguments(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start);
     validateTokens(start);
     expect(listener.calls, ['handleNoTypeArguments after']);
     expect(listener.errors, isNull);
@@ -1502,7 +1571,13 @@
     final Token start = scanString('before after').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noTypeParamOrArg.parseVariables(start, new Parser(listener)), start);
+    expect(
+        noTypeParamOrArg.parseVariables(
+            start,
+            new Parser(listener,
+                useImplicitCreationExpression:
+                    useImplicitCreationExpressionInCfe)),
+        start);
     validateTokens(start);
     expect(listener.calls, ['handleNoTypeVariables after']);
     expect(listener.errors, isNull);
@@ -1585,7 +1660,10 @@
     expect(after.lexeme, 'after');
     final TypeInfoListener listener = new TypeInfoListener();
 
-    var token = typeArg.parseArguments(start, new Parser(listener));
+    var token = typeArg.parseArguments(
+        start,
+        new Parser(listener,
+            useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
     validateTokens(start);
     expect(token.lexeme, '>');
     token = token.next;
@@ -1623,7 +1701,10 @@
     expect(after.lexeme, 'after');
     final TypeInfoListener listener = new TypeInfoListener();
 
-    Token token = typeParam.parseVariables(start, new Parser(listener));
+    Token token = typeParam.parseVariables(
+        start,
+        new Parser(listener,
+            useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
     validateTokens(start);
     expect(token.lexeme, '>');
     token = token.next;
@@ -2576,7 +2657,10 @@
       reason: 'TypeInfo.skipType should not modify the token stream');
 
   TypeInfoListener listener = new TypeInfoListener();
-  Token actualEnd = typeInfo.parseType(start, new Parser(listener));
+  Token actualEnd = typeInfo.parseType(
+      start,
+      new Parser(listener,
+          useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
 
   expectEnd(expectedAfter, actualEnd);
   if (expectedCalls != null) {
@@ -2609,7 +2693,8 @@
   expect(typeVarInfo.typeArgumentCount, typeArgumentCount);
 
   TypeInfoListener listener = new TypeInfoListener();
-  Parser parser = new Parser(listener);
+  Parser parser = new Parser(listener,
+      useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
   Token actualEnd = typeVarInfo.parseArguments(start, parser);
   validateTokens(start);
   expectEnd(expectedAfter, actualEnd);
@@ -2644,7 +2729,8 @@
 
   TypeInfoListener listener =
       new TypeInfoListener(firstToken: start, metadataAllowed: true);
-  Parser parser = new Parser(listener);
+  Parser parser = new Parser(listener,
+      useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
   Token actualEnd = typeVarInfo.parseVariables(start, parser);
   validateTokens(start);
   expectEnd(expectedAfter, actualEnd);
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index d5b0da7..dd393f6 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.dart
@@ -22,6 +22,8 @@
 
 import 'package:front_end/src/fasta/command_line_reporting.dart'
     as command_line_reporting;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+    show useImplicitCreationExpressionInCfe;
 
 import 'package:kernel/kernel.dart';
 
@@ -185,7 +187,8 @@
       return crash(description, StackTrace.current);
     }
 
-    Parser parser = new Parser(description.listener);
+    Parser parser = new Parser(description.listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     parser.parseUnit(description.cache.firstToken);
 
     if (description.listener.problems.isEmpty) {
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 86afab8..1d51206 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -14,6 +14,8 @@
     as command_line_reporting;
 
 import 'package:front_end/src/fasta/messages.dart' show Message;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+    show useImplicitCreationExpressionInCfe;
 
 import 'package:front_end/src/fasta/util/direct_parser_ast.dart' show getAST;
 
@@ -198,7 +200,8 @@
     ParserTestListenerWithMessageFormatting parserTestListener =
         new ParserTestListenerWithMessageFormatting(
             addTrace, annotateLines, source, shortNameId);
-    Parser parser = new Parser(parserTestListener);
+    Parser parser = new Parser(parserTestListener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     parser.parseUnit(firstToken);
     return parserTestListener;
   }
@@ -298,7 +301,8 @@
 
     ParserTestListener parserTestListener =
         new ParserTestListener(context.addTrace);
-    Parser parser = new Parser(parserTestListener);
+    Parser parser = new Parser(parserTestListener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     bool parserCrashed = false;
     dynamic parserCrashedE;
     StackTrace parserCrashedSt;
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index 1e84578..79afa41 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -15,6 +15,8 @@
 import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:front_end/src/fasta/fasta_codes.dart' as codes;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+    show useImplicitCreationExpressionInCfe;
 
 // THIS FILE IS AUTO GENERATED BY 'test/parser_test_parser_creator.dart'
 // Run this command to update it:
@@ -25,7 +27,9 @@
   StringBuffer sb = new StringBuffer();
   final bool trace;
 
-  TestParser(Listener listener, this.trace) : super(listener);
+  TestParser(Listener listener, this.trace)
+      : super(listener,
+            useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
 
   String createTrace() {
     List<String> traceLines = StackTrace.current.toString().split("\n");
diff --git a/pkg/front_end/test/parser_test_parser_creator.dart b/pkg/front_end/test/parser_test_parser_creator.dart
index 0a69b8b..806d113 100644
--- a/pkg/front_end/test/parser_test_parser_creator.dart
+++ b/pkg/front_end/test/parser_test_parser_creator.dart
@@ -55,6 +55,8 @@
 import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:front_end/src/fasta/fasta_codes.dart' as codes;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+    show useImplicitCreationExpressionInCfe;
 
 // THIS FILE IS AUTO GENERATED BY 'test/parser_test_parser_creator.dart'
 // Run this command to update it:
@@ -65,7 +67,9 @@
   StringBuffer sb = new StringBuffer();
   final bool trace;
 
-  TestParser(Listener listener, this.trace) : super(listener);
+  TestParser(Listener listener, this.trace)
+      : super(listener,
+            useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
 
   String createTrace() {
     List<String> traceLines = StackTrace.current.toString().split("\n");
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 38e9a55..09978cc 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -49,6 +49,8 @@
 // ignore: import_of_legacy_library_into_null_safe
 import 'package:front_end/src/fasta/incremental_compiler.dart';
 import 'package:front_end/src/fasta/kernel/utils.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+    show useImplicitCreationExpressionInCfe;
 // ignore: import_of_legacy_library_into_null_safe
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
@@ -549,7 +551,8 @@
     final Token firstToken =
         scanRawBytes(utf8.encode(comments.substring(scanOffset)) as Uint8List);
     final ErrorListener listener = new ErrorListener();
-    final Parser parser = new Parser(listener);
+    final Parser parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
     parser.asyncState = AsyncModifier.Async;
 
     final Token pastErrors = parser.skipErrorTokens(firstToken);
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 1c4cb63..47fa253 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -18,6 +18,7 @@
 
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/base/processed_options.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart';
 import 'package:front_end/src/fasta/source/directive_listener.dart';
 import 'package:front_end/src/fasta/uri_translator.dart' show UriTranslator;
 
@@ -170,7 +171,9 @@
 /// import, export, and part directives.
 Set<String> extractDirectiveUris(List<int> contents) {
   var listener = new DirectiveListenerWithNative();
-  new TopLevelParser(listener).parseUnit(tokenize(contents));
+  new TopLevelParser(listener,
+          useImplicitCreationExpression: useImplicitCreationExpressionInCfe)
+      .parseUnit(tokenize(contents));
   return new Set<String>()
     ..addAll(listener.imports.map((directive) => directive.uri!))
     ..addAll(listener.exports.map((directive) => directive.uri!))
@@ -201,7 +204,8 @@
 /// Parse the full body of [source].
 parseFull(Uri uri, List<int> source) {
   var tokens = tokenize(source);
-  Parser parser = new Parser(new _PartialAstBuilder(uri));
+  Parser parser = new Parser(new _PartialAstBuilder(uri),
+      useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
   parser.parseUnit(tokens);
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index c29197a..2aaac9b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 54
+PRERELEASE 55
 PRERELEASE_PATCH 0
\ No newline at end of file