[parser] Parse record literals

This is the first stab at implementing the record expressions from
https://github.com/dart-lang/language/blob/master/working/0546-patterns/records-feature-specification.md

Change-Id: I2adb6cb3cd50d4ee45e144e86ec7011d046f6170
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/253783
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Michael Thomsen <mit@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index a10e793..9380289 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -1570,6 +1570,11 @@
   }
 
   @override
+  void handleNamedRecordField(Token colon) {
+    listener?.handleNamedRecordField(colon);
+  }
+
+  @override
   void handleNamedMixinApplicationWithClause(Token withKeyword) {
     listener?.handleNamedMixinApplicationWithClause(withKeyword);
   }
@@ -1685,8 +1690,18 @@
   }
 
   @override
-  void handleParenthesizedExpression(Token token) {
-    listener?.handleParenthesizedExpression(token);
+  void beginParenthesizedExpressionOrRecordLiteral(Token token) {
+    listener?.beginParenthesizedExpressionOrRecordLiteral(token);
+  }
+
+  @override
+  void endRecordLiteral(Token token, int count) {
+    listener?.endRecordLiteral(token, count);
+  }
+
+  @override
+  void endParenthesizedExpression(Token token) {
+    listener?.endParenthesizedExpression(token);
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart
index 5236661..8151611 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart
@@ -255,6 +255,12 @@
   static const NamedArgumentReferenceIdentifierContext namedArgumentReference =
       const NamedArgumentReferenceIdentifierContext();
 
+  /// Identifier is a reference to a named record field
+  /// (e.g. `foo` in `(42, foo: 42);`.
+  static const NamedRecordFieldReferenceIdentifierContext
+      namedRecordFieldReference =
+      const NamedRecordFieldReferenceIdentifierContext();
+
   /// Identifier is a name being declared by a local variable declaration.
   static const LocalVariableDeclarationIdentifierContext
       localVariableDeclaration =
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
index 979d161..9793d5a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
@@ -1020,6 +1020,42 @@
   }
 }
 
+/// See [IdentifierContext.namedRecordFieldReference].
+/// Initially this is just a copy of NamedArgumentReferenceIdentifierContext.
+class NamedRecordFieldReferenceIdentifierContext extends IdentifierContext {
+  const NamedRecordFieldReferenceIdentifierContext()
+      : super('namedRecordFieldReference', allowedInConstantExpression: true);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next!;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.isIdentifier) {
+      checkAsyncAwaitYieldAsIdentifier(identifier, parser);
+      return identifier;
+    }
+
+    // Recovery
+    if (isOneOfOrEof(identifier, const [':'])) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: codes.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      if (!identifier.isKeywordOrIdentifier) {
+        parser.reportRecoverableErrorWithToken(
+            identifier, codes.templateExpectedIdentifier);
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+      } else {
+        // Use the keyword as the identifier.
+        parser.reportRecoverableErrorWithToken(
+            identifier, codes.templateExpectedIdentifierButGotKeyword);
+      }
+    }
+    return identifier;
+  }
+}
+
 /// See [IdentifierContext.topLevelFunctionDeclaration]
 /// and [IdentifierContext.topLevelVariableDeclaration].
 class TopLevelDeclarationIdentifierContext extends IdentifierContext {
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 107f7da..10b0ee7 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -1692,6 +1692,10 @@
     logEvent("NamedArgument");
   }
 
+  void handleNamedRecordField(Token colon) {
+    logEvent("NamedRecordField");
+  }
+
   void beginNewExpression(Token token) {}
 
   void endNewExpression(Token token) {
@@ -1746,10 +1750,19 @@
     logEvent("ParenthesizedCondition");
   }
 
-  /// Handle a parenthesized expression.
+  /// Starts a parenthesized expression or a record literal. Will be ended with
+  /// either [endParenthesizedExpression] or [endRecordLiteral].
+  void beginParenthesizedExpressionOrRecordLiteral(Token token) {}
+
+  /// Ends a record literal with [count] entries.
+  void endRecordLiteral(Token token, int count) {
+    logEvent("RecordLiteral");
+  }
+
+  /// End a parenthesized expression.
   /// These may be within the condition expression of a control structure
   /// but will not be the condition of a control structure.
-  void handleParenthesizedExpression(Token token) {
+  void endParenthesizedExpression(Token token) {
     logEvent("ParenthesizedExpression");
   }
 
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 efd5fc2..f5b2825 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -5852,7 +5852,7 @@
         // Fall through to the recovery code.
       }
     } else if (kind == OPEN_PAREN_TOKEN) {
-      return parseParenthesizedExpressionOrFunctionLiteral(token);
+      return parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(token);
     } else if (kind == OPEN_SQUARE_BRACKET_TOKEN ||
         optional('[]', token.next!)) {
       listener.handleNoTypeArguments(token.next!);
@@ -5871,12 +5871,14 @@
     return parseSend(token, context);
   }
 
-  Token parseParenthesizedExpressionOrFunctionLiteral(Token token) {
+  Token parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(
+      Token token) {
     Token next = token.next!;
     assert(optional('(', next));
-    Token nextToken = next.endGroup!.next!;
-    int kind = nextToken.kind;
+
     if (mayParseFunctionExpressions) {
+      Token nextToken = next.endGroup!.next!;
+      int kind = nextToken.kind;
       if ((identical(kind, FUNCTION_TOKEN) ||
           identical(kind, OPEN_CURLY_BRACKET_TOKEN))) {
         listener.handleNoTypeVariables(next);
@@ -5901,7 +5903,7 @@
     }
     bool old = mayParseFunctionExpressions;
     mayParseFunctionExpressions = true;
-    token = parseParenthesizedExpression(token);
+    token = parseParenthesizedExpressionOrRecordLiteral(token);
     mayParseFunctionExpressions = old;
     return token;
   }
@@ -5919,15 +5921,59 @@
     return token;
   }
 
-  Token parseParenthesizedExpression(Token token) {
+  Token parseParenthesizedExpressionOrRecordLiteral(Token token) {
     Token begin = token.next!;
-    token = parseExpressionInParenthesis(token);
-    listener.handleParenthesizedExpression(begin);
-    return token;
-  }
+    assert(optional('(', begin));
+    listener.beginParenthesizedExpressionOrRecordLiteral(begin);
 
-  Token parseExpressionInParenthesis(Token token) {
-    return parseExpressionInParenthesisRest(token.next!);
+    // For parsing of parenthesized expression we need parity with
+    // parseExpressionInParenthesisRest used in ensureParenthesizedCondition.
+
+    token = begin;
+    int count = 0;
+    bool wasRecord = false;
+    while (true) {
+      Token next = token.next!;
+      if (count > 0 && optional(')', next)) {
+        // TODO(jensj): Possibly bail out even if count is 0 and give some
+        // specific error.
+        break;
+      }
+      Token? colon = null;
+      if (optional(':', next.next!) || /* recovery */ optional(':', next)) {
+        // Record with named expression.
+        wasRecord = true;
+        token = ensureIdentifier(
+          token,
+          IdentifierContext.namedRecordFieldReference,
+        ).next!;
+        colon = token;
+      }
+      token = parseExpression(token);
+      next = token.next!;
+      if (colon != null) listener.handleNamedRecordField(colon);
+      ++count;
+      if (!optional(',', next)) {
+        // TODO(jensj): Possible more specific recovery.
+        break;
+      } else {
+        // It is a comma, i.e. it's a record.
+        wasRecord = true;
+      }
+      token = next;
+    }
+    token = ensureCloseParen(token, begin);
+    assert(optional(')', token));
+
+    assert(wasRecord || count <= 1);
+
+    if (wasRecord) {
+      listener.endRecordLiteral(begin, count);
+    } else {
+      listener.endParenthesizedExpression(begin);
+    }
+
+    return token;
   }
 
   Token parseExpressionInParenthesisRest(Token token) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index e3de0f9..f4a592f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -431,7 +431,12 @@
   }
 
   @override
-  void handleParenthesizedExpression(Token token) {
+  void endRecordLiteral(Token token, int count) {
+    debugEvent("RecordLiteral");
+  }
+
+  @override
+  void endParenthesizedExpression(Token token) {
     debugEvent("ParenthesizedExpression");
   }
 
diff --git a/pkg/analysis_server/test/lsp/type_definition_test.dart b/pkg/analysis_server/test/lsp/type_definition_test.dart
index 8d78416..b363207 100644
--- a/pkg/analysis_server/test/lsp/type_definition_test.dart
+++ b/pkg/analysis_server/test/lsp/type_definition_test.dart
@@ -123,7 +123,7 @@
   Future<void> test_parameter() async {
     final contents = '''
 void f(String a) {
-  void f([['te^st']]);
+  f([['te^st']]);
 }
 ''';
 
@@ -135,7 +135,7 @@
   Future<void> test_parameterName() async {
     final contents = '''
 void f({String a}) {
-  void f([[a^]]: 'test');
+  f([[a^]]: 'test');
 }
 ''';
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index e0e7658..7eb930f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -85,7 +85,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 237;
+  static const int DATA_VERSION = 238;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 5bbbd36..9d73f80 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -33,6 +33,7 @@
   EnableString.non_nullable: ExperimentalFeatures.non_nullable,
   EnableString.nonfunction_type_aliases:
       ExperimentalFeatures.nonfunction_type_aliases,
+  EnableString.records: ExperimentalFeatures.records,
   EnableString.set_literals: ExperimentalFeatures.set_literals,
   EnableString.spread_collections: ExperimentalFeatures.spread_collections,
   EnableString.super_parameters: ExperimentalFeatures.super_parameters,
@@ -87,6 +88,9 @@
   /// String to enable the experiment "nonfunction-type-aliases"
   static const String nonfunction_type_aliases = 'nonfunction-type-aliases';
 
+  /// String to enable the experiment "records"
+  static const String records = 'records';
+
   /// String to enable the experiment "set-literals"
   static const String set_literals = 'set-literals';
 
@@ -254,8 +258,18 @@
     releaseVersion: Version.parse('2.13.0'),
   );
 
-  static final set_literals = ExperimentalFeature(
+  static final records = ExperimentalFeature(
     index: 14,
+    enableString: EnableString.records,
+    isEnabledByDefault: IsEnabledByDefault.records,
+    isExpired: IsExpired.records,
+    documentation: 'Records',
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
+  );
+
+  static final set_literals = ExperimentalFeature(
+    index: 15,
     enableString: EnableString.set_literals,
     isEnabledByDefault: IsEnabledByDefault.set_literals,
     isExpired: IsExpired.set_literals,
@@ -265,7 +279,7 @@
   );
 
   static final spread_collections = ExperimentalFeature(
-    index: 15,
+    index: 16,
     enableString: EnableString.spread_collections,
     isEnabledByDefault: IsEnabledByDefault.spread_collections,
     isExpired: IsExpired.spread_collections,
@@ -275,7 +289,7 @@
   );
 
   static final super_parameters = ExperimentalFeature(
-    index: 16,
+    index: 17,
     enableString: EnableString.super_parameters,
     isEnabledByDefault: IsEnabledByDefault.super_parameters,
     isExpired: IsExpired.super_parameters,
@@ -285,7 +299,7 @@
   );
 
   static final test_experiment = ExperimentalFeature(
-    index: 17,
+    index: 18,
     enableString: EnableString.test_experiment,
     isEnabledByDefault: IsEnabledByDefault.test_experiment,
     isExpired: IsExpired.test_experiment,
@@ -296,7 +310,7 @@
   );
 
   static final triple_shift = ExperimentalFeature(
-    index: 18,
+    index: 19,
     enableString: EnableString.triple_shift,
     isEnabledByDefault: IsEnabledByDefault.triple_shift,
     isExpired: IsExpired.triple_shift,
@@ -306,7 +320,7 @@
   );
 
   static final value_class = ExperimentalFeature(
-    index: 19,
+    index: 20,
     enableString: EnableString.value_class,
     isEnabledByDefault: IsEnabledByDefault.value_class,
     isExpired: IsExpired.value_class,
@@ -316,7 +330,7 @@
   );
 
   static final variance = ExperimentalFeature(
-    index: 20,
+    index: 21,
     enableString: EnableString.variance,
     isEnabledByDefault: IsEnabledByDefault.variance,
     isExpired: IsExpired.variance,
@@ -371,6 +385,9 @@
   /// Default state of the experiment "nonfunction-type-aliases"
   static const bool nonfunction_type_aliases = true;
 
+  /// Default state of the experiment "records"
+  static const bool records = false;
+
   /// Default state of the experiment "set-literals"
   static const bool set_literals = true;
 
@@ -439,6 +456,9 @@
   /// Expiration status of the experiment "nonfunction-type-aliases"
   static const bool nonfunction_type_aliases = true;
 
+  /// Expiration status of the experiment "records"
+  static const bool records = false;
+
   /// Expiration status of the experiment "set-literals"
   static const bool set_literals = true;
 
@@ -512,6 +532,9 @@
   bool get nonfunction_type_aliases =>
       isEnabled(ExperimentalFeatures.nonfunction_type_aliases);
 
+  /// Current state for the flag "records"
+  bool get records => isEnabled(ExperimentalFeatures.records);
+
   /// Current state for the flag "set-literals"
   bool get set_literals => isEnabled(ExperimentalFeatures.set_literals);
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 9a32845..44e0f2b 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -2346,6 +2346,16 @@
   }
 
   @override
+  void endParenthesizedExpression(Token leftParenthesis) {
+    assert(optional('(', leftParenthesis));
+    debugEvent("ParenthesizedExpression");
+
+    var expression = pop() as Expression;
+    push(ast.parenthesizedExpression(
+        leftParenthesis, expression, leftParenthesis.endGroup!));
+  }
+
+  @override
   void endPart(Token partKeyword, Token semicolon) {
     assert(optional('part', partKeyword));
     assert(optional(';', semicolon));
@@ -2396,6 +2406,29 @@
   }
 
   @override
+  void endRecordLiteral(Token token, int count) {
+    debugEvent("RecordLiteral");
+    // TODO: Actual implementation of record literals.
+
+    _reportFeatureNotEnabled(
+      feature: ExperimentalFeatures.records,
+      startToken: token,
+    );
+
+    // Pretend that the record literal is a list literal as the record literal
+    // isn't implemented yet.
+
+    var elements = popTypedList<Expression>(count) ?? const [];
+
+    List<Expression> expressions = <Expression>[];
+    for (var elem in elements) {
+      expressions.add(elem);
+    }
+
+    push(ast.listLiteral(null, null, token, expressions, token));
+  }
+
+  @override
   void endRedirectingFactoryBody(Token equalToken, Token endToken) {
     assert(optional('=', equalToken));
     debugEvent("RedirectingFactoryBody");
@@ -3932,6 +3965,10 @@
   }
 
   @override
+  // TODO: Handle directly.
+  void handleNamedRecordField(Token colon) => handleNamedArgument(colon);
+
+  @override
   void handleNativeClause(Token nativeToken, bool hasName) {
     debugEvent("NativeClause");
 
@@ -4041,17 +4078,7 @@
   @override
   void handleParenthesizedCondition(Token leftParenthesis) {
     // TODO(danrubel): Implement rather than forwarding.
-    handleParenthesizedExpression(leftParenthesis);
-  }
-
-  @override
-  void handleParenthesizedExpression(Token leftParenthesis) {
-    assert(optional('(', leftParenthesis));
-    debugEvent("ParenthesizedExpression");
-
-    var expression = pop() as Expression;
-    push(ast.parenthesizedExpression(
-        leftParenthesis, expression, leftParenthesis.endGroup!));
+    endParenthesizedExpression(leftParenthesis);
   }
 
   @override
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 429cb67..d07bb77 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -538,6 +538,10 @@
   }
 
   @override
+  // TODO: Handle directly.
+  void handleNamedRecordField(Token colon) => handleNamedArgument(colon);
+
+  @override
   void handleNativeClause(Token nativeToken, bool hasName) {
     debugEvent("NativeClause");
     if (hasName) {
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 3c5892a..bac8946 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -171,6 +171,14 @@
       experimentEnabledVersion: const Version(2, 13),
       experimentReleasedVersion: const Version(2, 13));
 
+  static const ExperimentalFlag records = const ExperimentalFlag(
+      name: 'records',
+      isEnabledByDefault: false,
+      isExpired: false,
+      enabledVersion: const Version(2, 19),
+      experimentEnabledVersion: const Version(2, 19),
+      experimentReleasedVersion: const Version(2, 19));
+
   static const ExperimentalFlag setLiterals = const ExperimentalFlag(
       name: 'set-literals',
       isEnabledByDefault: true,
@@ -334,6 +342,10 @@
   GlobalFeature get nonfunctionTypeAliases => _nonfunctionTypeAliases ??=
       _computeGlobalFeature(ExperimentalFlag.nonfunctionTypeAliases);
 
+  GlobalFeature? _records;
+  GlobalFeature get records =>
+      _records ??= _computeGlobalFeature(ExperimentalFlag.records);
+
   GlobalFeature? _setLiterals;
   GlobalFeature get setLiterals =>
       _setLiterals ??= _computeGlobalFeature(ExperimentalFlag.setLiterals);
@@ -456,6 +468,11 @@
           canonicalUri,
           libraryVersion);
 
+  LibraryFeature? _records;
+  LibraryFeature get records =>
+      _records ??= globalFeatures._computeLibraryFeature(
+          ExperimentalFlag.records, canonicalUri, libraryVersion);
+
   LibraryFeature? _setLiterals;
   LibraryFeature get setLiterals =>
       _setLiterals ??= globalFeatures._computeLibraryFeature(
@@ -524,6 +541,8 @@
       return ExperimentalFlag.nonNullable;
     case "nonfunction-type-aliases":
       return ExperimentalFlag.nonfunctionTypeAliases;
+    case "records":
+      return ExperimentalFlag.records;
     case "set-literals":
       return ExperimentalFlag.setLiterals;
     case "spread-collections":
@@ -571,6 +590,7 @@
   ExperimentalFlag.nonNullable: ExperimentalFlag.nonNullable.isEnabledByDefault,
   ExperimentalFlag.nonfunctionTypeAliases:
       ExperimentalFlag.nonfunctionTypeAliases.isEnabledByDefault,
+  ExperimentalFlag.records: ExperimentalFlag.records.isEnabledByDefault,
   ExperimentalFlag.setLiterals: ExperimentalFlag.setLiterals.isEnabledByDefault,
   ExperimentalFlag.spreadCollections:
       ExperimentalFlag.spreadCollections.isEnabledByDefault,
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 930245e..261b444 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -69,7 +69,13 @@
 import '../constant_context.dart' show ConstantContext;
 import '../dill/dill_library_builder.dart' show DillLibraryBuilder;
 import '../fasta_codes.dart' as fasta;
-import '../fasta_codes.dart' show LocatedMessage, Message, Template, noLength;
+import '../fasta_codes.dart'
+    show
+        LocatedMessage,
+        Message,
+        Template,
+        noLength,
+        templateExperimentDisabled;
 import '../identifiers.dart'
     show Identifier, InitializedIdentifier, QualifiedName, flattenName;
 import '../messages.dart' as messages show getLocationFromUri;
@@ -2258,7 +2264,7 @@
   }
 
   @override
-  void handleParenthesizedExpression(Token token) {
+  void endParenthesizedExpression(Token token) {
     assert(checkState(token, [
       unionOfKinds([
         ValueKinds.Expression,
@@ -3951,6 +3957,26 @@
     push(node);
   }
 
+  @override
+  void endRecordLiteral(Token token, int count) {
+    debugEvent("RecordLiteral");
+
+    addProblem(
+        templateExperimentDisabled.withArguments(ExperimentalFlag.records.name),
+        token.offset,
+        noLength);
+
+    // TODO: Actual implementation of record literals.
+    // For now we pretend it's an empty list.
+    for (int i = count - 1; i >= 0; i--) {
+      pop();
+    }
+    ListLiteral node = forest.createListLiteral(
+        TreeNode.noOffset, implicitTypeArgument, [],
+        isConst: constantContext == ConstantContext.inferred);
+    push(node);
+  }
+
   void buildLiteralSet(List<TypeBuilder>? typeArguments, Token? constKeyword,
       Token leftBrace, List<dynamic>? setOrMapEntries) {
     DartType typeArgument;
@@ -5950,6 +5976,10 @@
   }
 
   @override
+  // TODO: Handle directly.
+  void handleNamedRecordField(Token colon) => handleNamedArgument(colon);
+
+  @override
   void endFunctionName(Token beginToken, Token token) {
     debugEvent("FunctionName");
     Identifier name = pop() as Identifier;
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
index 4984f92..251e042 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
@@ -319,6 +319,10 @@
   }
 
   @override
+  // TODO: Handle directly.
+  void handleNamedRecordField(Token colon) => handleNamedArgument(colon);
+
+  @override
   void handleLiteralNull(Token token) {
     push(new _PrimitiveValueNode(null));
   }
@@ -1917,7 +1921,17 @@
   }
 
   @override
-  void handleParenthesizedExpression(Token token) {
+  void beginParenthesizedExpressionOrRecordLiteral(Token token) {
+    _unhandled();
+  }
+
+  @override
+  void endRecordLiteral(Token token, int count) {
+    _unhandled();
+  }
+
+  @override
+  void endParenthesizedExpression(Token token) {
     _unhandled();
   }
 
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 16e8716..0a957b4 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -194,6 +194,12 @@
   }
 
   @override
+  void handleNamedRecordField(Token colon) {
+    debugEvent("NamedRecordField");
+    pop(); // Named record field name.
+  }
+
+  @override
   void handleClassWithClause(Token withKeyword) {
     debugEvent("ClassWithClause");
   }
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index d09d0b6..bb803ff 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -2010,6 +2010,13 @@
   }
 
   @override
+  void handleNamedRecordField(Token colon) {
+    debugEvent("NamedRecordField");
+    pop(); // Named record field offset.
+    pop(); // Named record field name.
+  }
+
+  @override
   void endNamedMixinApplication(Token beginToken, Token classKeyword,
       Token equals, Token? implementsKeyword, Token endToken) {
     debugEvent("endNamedMixinApplication");
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast.dart b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
index f30a4a8..90a51d2 100644
--- a/pkg/front_end/lib/src/fasta/util/parser_ast.dart
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
@@ -1553,6 +1553,10 @@
             (end == "InvalidYieldStatement")) {
           // beginYieldStatement is ended by either endYieldStatement or
           // endInvalidYieldStatement.
+        } else if (begin == "ParenthesizedExpressionOrRecordLiteral" &&
+            (end == "ParenthesizedExpression" || end == "RecordLiteral")) {
+          // beginParenthesizedExpressionOrRecordLiteral is ended by either
+          // endParenthesizedExpression or endRecordLiteral.
         } else {
           throw "Unknown combination: begin$begin and end$end";
         }
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
index 7006708..2e9b882 100644
--- a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
@@ -2294,6 +2294,13 @@
   }
 
   @override
+  void handleNamedRecordField(Token colon) {
+    NamedRecordFieldHandle data =
+        new NamedRecordFieldHandle(ParserAstType.HANDLE, colon: colon);
+    seen(data);
+  }
+
+  @override
   void beginNewExpression(Token token) {
     NewExpressionBegin data =
         new NewExpressionBegin(ParserAstType.BEGIN, token: token);
@@ -2383,9 +2390,24 @@
   }
 
   @override
-  void handleParenthesizedExpression(Token token) {
-    ParenthesizedExpressionHandle data =
-        new ParenthesizedExpressionHandle(ParserAstType.HANDLE, token: token);
+  void beginParenthesizedExpressionOrRecordLiteral(Token token) {
+    ParenthesizedExpressionOrRecordLiteralBegin data =
+        new ParenthesizedExpressionOrRecordLiteralBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void endRecordLiteral(Token token, int count) {
+    RecordLiteralEnd data =
+        new RecordLiteralEnd(ParserAstType.END, token: token, count: count);
+    seen(data);
+  }
+
+  @override
+  void endParenthesizedExpression(Token token) {
+    ParenthesizedExpressionEnd data =
+        new ParenthesizedExpressionEnd(ParserAstType.END, token: token);
     seen(data);
   }
 
@@ -6733,6 +6755,18 @@
       };
 }
 
+class NamedRecordFieldHandle extends ParserAstNode {
+  final Token colon;
+
+  NamedRecordFieldHandle(ParserAstType type, {required this.colon})
+      : super("NamedRecordField", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+      };
+}
+
 class NewExpressionBegin extends ParserAstNode {
   final Token token;
 
@@ -6886,10 +6920,38 @@
       };
 }
 
-class ParenthesizedExpressionHandle extends ParserAstNode {
+class ParenthesizedExpressionOrRecordLiteralBegin extends ParserAstNode {
   final Token token;
 
-  ParenthesizedExpressionHandle(ParserAstType type, {required this.token})
+  ParenthesizedExpressionOrRecordLiteralBegin(ParserAstType type,
+      {required this.token})
+      : super("ParenthesizedExpressionOrRecordLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class RecordLiteralEnd extends ParserAstNode {
+  final Token token;
+  final int count;
+
+  RecordLiteralEnd(ParserAstType type,
+      {required this.token, required this.count})
+      : super("RecordLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "count": count,
+      };
+}
+
+class ParenthesizedExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  ParenthesizedExpressionEnd(ParserAstType type, {required this.token})
       : super("ParenthesizedExpression", type);
 
   @override
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.expect
index ee69b69..2476340 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.expect
@@ -21,9 +21,10 @@
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
         handleNoTypeArguments([)
-        handleNoTypeArguments([)
-        handleLiteralList(0, [, null, ])
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleNoTypeArguments([)
+          handleLiteralList(0, [, null, ])
+        endParenthesizedExpression(()
         handleLiteralList(1, [, null, ])
         handleExpressionStatement(;)
       endBlockFunctionBody(1, {, })
@@ -41,13 +42,14 @@
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
         handleNoTypeArguments([)
-        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {lexeme: ]}], ], ])
-        handleIdentifier(, expression)
-        handleNoTypeArguments(])
-        handleNoArguments(])
-        handleSend(, ])
-        handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], ], ])
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {lexeme: ]}], ], ])
+          handleIdentifier(, expression)
+          handleNoTypeArguments(])
+          handleNoArguments(])
+          handleSend(, ])
+          handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], ], ])
+        endParenthesizedExpression(()
         handleLiteralList(1, [, null, ])
         handleExpressionStatement(;)
       endBlockFunctionBody(1, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.intertwined.expect
index 6bebae6..bc757e9 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_00.dart.intertwined.expect
@@ -42,19 +42,18 @@
                                 parsePrecedenceExpression([, 1, true)
                                   parseUnaryExpression([, true)
                                     parsePrimary([, expression)
-                                      parseParenthesizedExpressionOrFunctionLiteral([)
-                                        parseParenthesizedExpression([)
-                                          parseExpressionInParenthesis([)
-                                            parseExpressionInParenthesisRest(()
-                                              parseExpression(()
-                                                parsePrecedenceExpression((, 1, true)
-                                                  parseUnaryExpression((, true)
-                                                    parsePrimary((, expression)
-                                                      listener: handleNoTypeArguments([)
-                                                      parseLiteralListSuffix((, null)
-                                                        listener: handleLiteralList(0, [, null, ])
-                                              ensureCloseParen(], ()
-                                          listener: handleParenthesizedExpression(()
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral([)
+                                        parseParenthesizedExpressionOrRecordLiteral([)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          parseExpression(()
+                                            parsePrecedenceExpression((, 1, true)
+                                              parseUnaryExpression((, true)
+                                                parsePrimary((, expression)
+                                                  listener: handleNoTypeArguments([)
+                                                  parseLiteralListSuffix((, null)
+                                                    listener: handleLiteralList(0, [, null, ])
+                                          ensureCloseParen(], ()
+                                          listener: endParenthesizedExpression(()
                               listener: handleLiteralList(1, [, null, ])
                     ensureSemicolon(])
                     listener: handleExpressionStatement(;)
@@ -102,29 +101,28 @@
                                 parsePrecedenceExpression([, 1, true)
                                   parseUnaryExpression([, true)
                                     parsePrimary([, expression)
-                                      parseParenthesizedExpressionOrFunctionLiteral([)
-                                        parseParenthesizedExpression([)
-                                          parseExpressionInParenthesis([)
-                                            parseExpressionInParenthesisRest(()
-                                              parseExpression(()
-                                                parsePrecedenceExpression((, 1, true)
-                                                  parseUnaryExpression((, true)
-                                                    parsePrimary((, expression)
-                                                      parseSend((, expression)
-                                                        isNextIdentifier(()
-                                                        ensureIdentifier((, expression)
-                                                          reportRecoverableErrorWithToken(], Instance of 'Template<(Token) => Message>')
-                                                            listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {lexeme: ]}], ], ])
-                                                          rewriter()
-                                                          listener: handleIdentifier(, expression)
-                                                        listener: handleNoTypeArguments(])
-                                                        parseArgumentsOpt()
-                                                          listener: handleNoArguments(])
-                                                        listener: handleSend(, ])
-                                              ensureCloseParen(, ()
-                                                reportRecoverableError(], Message[ExpectedButGot, Expected ')' before this., null, {string: )}])
-                                                  listener: handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], ], ])
-                                          listener: handleParenthesizedExpression(()
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral([)
+                                        parseParenthesizedExpressionOrRecordLiteral([)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          parseExpression(()
+                                            parsePrecedenceExpression((, 1, true)
+                                              parseUnaryExpression((, true)
+                                                parsePrimary((, expression)
+                                                  parseSend((, expression)
+                                                    isNextIdentifier(()
+                                                    ensureIdentifier((, expression)
+                                                      reportRecoverableErrorWithToken(], Instance of 'Template<(Token) => Message>')
+                                                        listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {lexeme: ]}], ], ])
+                                                      rewriter()
+                                                      listener: handleIdentifier(, expression)
+                                                    listener: handleNoTypeArguments(])
+                                                    parseArgumentsOpt()
+                                                      listener: handleNoArguments(])
+                                                    listener: handleSend(, ])
+                                          ensureCloseParen(, ()
+                                            reportRecoverableError(], Message[ExpectedButGot, Expected ')' before this., null, {string: )}])
+                                              listener: handleRecoverableError(Message[ExpectedButGot, Expected ')' before this., null, {string: )}], ], ])
+                                          listener: endParenthesizedExpression(()
                               listener: handleLiteralList(1, [, null, ])
                     ensureSemicolon(])
                     listener: handleExpressionStatement(;)
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_04.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_04.dart.intertwined.expect
index 076e9d1..9bab235 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_04.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_04.dart.intertwined.expect
@@ -50,7 +50,7 @@
                                       parsePrecedenceExpression((, 1, true)
                                         parseUnaryExpression((, true)
                                           parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
                                               listener: handleNoTypeVariables(()
                                               parseFunctionExpression(()
                                                 listener: beginFunctionExpression(()
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
index 19c202d..1fbe01a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
@@ -187,16 +187,17 @@
           endInitializedIdentifier(print)
           handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], print, print)
         endVariablesDeclaration(1, ;)
-        handleIdentifier(l, expression)
-        handleNoTypeArguments(.)
-        handleNoArguments(.)
-        handleSend(l, .)
-        handleIdentifier(b, expressionContinuation)
-        handleNoTypeArguments())
-        handleNoArguments())
-        handleSend(b, ))
-        handleEndingBinaryExpression(.)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(l, expression)
+          handleNoTypeArguments(.)
+          handleNoArguments(.)
+          handleSend(l, .)
+          handleIdentifier(b, expressionContinuation)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(b, ))
+          handleEndingBinaryExpression(.)
+        endParenthesizedExpression(()
         handleExpressionStatement(;)
       endBlockFunctionBody(2, {, })
     endTopLevelMethod(void, null, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
index bdae2a2..c3effb6 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
@@ -328,36 +328,35 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(l, expression)
-                                                listener: handleNoTypeArguments(.)
-                                                parseArgumentsOpt(l)
-                                                  listener: handleNoArguments(.)
-                                                listener: handleSend(l, .)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(b, expressionContinuation)
-                                              listener: handleNoTypeArguments())
-                                              parseArgumentsOpt(b)
-                                                listener: handleNoArguments())
-                                              listener: handleSend(b, ))
-                                        listener: handleEndingBinaryExpression(.)
-                                    ensureCloseParen(b, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(l, expression)
+                                            listener: handleNoTypeArguments(.)
+                                            parseArgumentsOpt(l)
+                                              listener: handleNoArguments(.)
+                                            listener: handleSend(l, .)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(b, expressionContinuation)
+                                          listener: handleNoTypeArguments())
+                                          parseArgumentsOpt(b)
+                                            listener: handleNoArguments())
+                                          listener: handleSend(b, ))
+                                    listener: handleEndingBinaryExpression(.)
+                                ensureCloseParen(b, ()
+                                listener: endParenthesizedExpression(()
                     ensureSemicolon())
                     listener: handleExpressionStatement(;)
           notEofOrValue(}, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
index 0018e7b..ef58d44 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
@@ -99,7 +99,7 @@
                                       parsePrecedenceExpression((, 1, true)
                                         parseUnaryExpression((, true)
                                           parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
                                               listener: handleNoTypeVariables(()
                                               parseFunctionExpression(()
                                                 listener: beginFunctionExpression(()
@@ -250,7 +250,7 @@
                                       parsePrecedenceExpression((, 1, true)
                                         parseUnaryExpression((, true)
                                           parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
                                               listener: handleNoTypeVariables(()
                                               parseFunctionExpression(()
                                                 listener: beginFunctionExpression(()
@@ -403,7 +403,7 @@
                                       parsePrecedenceExpression((, 1, true)
                                         parseUnaryExpression((, true)
                                           parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
                                               listener: handleNoTypeVariables(()
                                               parseFunctionExpression(()
                                                 listener: beginFunctionExpression(()
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
index 902c6a8..85b020f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
@@ -832,14 +832,15 @@
               handleRecoverableError(BreakOutsideOfLoop, break, break)
               handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], break, break)
               handleBreakStatement(false, break, ;)
-              handleIdentifier(x, expression)
-              handleNoTypeArguments(-)
-              handleNoArguments(-)
-              handleSend(x, -)
-              beginBinaryExpression(-)
-                handleLiteralInt(1)
-              endBinaryExpression(-)
-              handleParenthesizedExpression(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleIdentifier(x, expression)
+                handleNoTypeArguments(-)
+                handleNoArguments(-)
+                handleSend(x, -)
+                beginBinaryExpression(-)
+                  handleLiteralInt(1)
+                endBinaryExpression(-)
+              endParenthesizedExpression(()
               beginBinaryExpression(+)
                 handleLiteralInt(1)
               endBinaryExpression(+)
@@ -1141,14 +1142,15 @@
               handleRecoverableError(ContinueOutsideOfLoop, continue, continue)
               handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], continue, continue)
               handleContinueStatement(false, continue, ;)
-              handleIdentifier(x, expression)
-              handleNoTypeArguments(-)
-              handleNoArguments(-)
-              handleSend(x, -)
-              beginBinaryExpression(-)
-                handleLiteralInt(1)
-              endBinaryExpression(-)
-              handleParenthesizedExpression(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleIdentifier(x, expression)
+                handleNoTypeArguments(-)
+                handleNoArguments(-)
+                handleSend(x, -)
+                beginBinaryExpression(-)
+                  handleLiteralInt(1)
+                endBinaryExpression(-)
+              endParenthesizedExpression(()
               beginBinaryExpression(+)
                 handleLiteralInt(1)
               endBinaryExpression(+)
@@ -1381,14 +1383,15 @@
               endReturnStatement(true, return, ;)
               beginDoWhileStatement(do)
                 beginDoWhileStatementBody(()
-                  handleIdentifier(x, expression)
-                  handleNoTypeArguments(-)
-                  handleNoArguments(-)
-                  handleSend(x, -)
-                  beginBinaryExpression(-)
-                    handleLiteralInt(1)
-                  endBinaryExpression(-)
-                  handleParenthesizedExpression(()
+                  beginParenthesizedExpressionOrRecordLiteral(()
+                    handleIdentifier(x, expression)
+                    handleNoTypeArguments(-)
+                    handleNoArguments(-)
+                    handleSend(x, -)
+                    beginBinaryExpression(-)
+                      handleLiteralInt(1)
+                    endBinaryExpression(-)
+                  endParenthesizedExpression(()
                   beginBinaryExpression(+)
                     handleLiteralInt(1)
                   endBinaryExpression(+)
@@ -1520,14 +1523,15 @@
               handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], return, return)
               handleExpressionStatement(;)
               handleRecoverableError(Message[UnexpectedToken, Unexpected token ';'., null, {lexeme: ;}], else, else)
-              handleIdentifier(x, expression)
-              handleNoTypeArguments(-)
-              handleNoArguments(-)
-              handleSend(x, -)
-              beginBinaryExpression(-)
-                handleLiteralInt(1)
-              endBinaryExpression(-)
-              handleParenthesizedExpression(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleIdentifier(x, expression)
+                handleNoTypeArguments(-)
+                handleNoArguments(-)
+                handleSend(x, -)
+                beginBinaryExpression(-)
+                  handleLiteralInt(1)
+                endBinaryExpression(-)
+              endParenthesizedExpression(()
               beginBinaryExpression(+)
                 handleLiteralInt(1)
               endBinaryExpression(+)
@@ -2764,14 +2768,15 @@
                 handleIsOperator(is, null)
                 handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], is, is)
               endReturnStatement(true, return, ;)
-              handleIdentifier(x, expression)
-              handleNoTypeArguments(-)
-              handleNoArguments(-)
-              handleSend(x, -)
-              beginBinaryExpression(-)
-                handleLiteralInt(1)
-              endBinaryExpression(-)
-              handleParenthesizedExpression(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleIdentifier(x, expression)
+                handleNoTypeArguments(-)
+                handleNoArguments(-)
+                handleSend(x, -)
+                beginBinaryExpression(-)
+                  handleLiteralInt(1)
+                endBinaryExpression(-)
+              endParenthesizedExpression(()
               beginBinaryExpression(+)
                 handleLiteralInt(1)
               endBinaryExpression(+)
@@ -3641,14 +3646,15 @@
               endIfStatement(if, null)
               beginReturnStatement(return)
                 handleRecoverableError(Message[UnexpectedToken, Unexpected token 'return'., null, {lexeme: return}], return, return)
-                handleIdentifier(x, expression)
-                handleNoTypeArguments(-)
-                handleNoArguments(-)
-                handleSend(x, -)
-                beginBinaryExpression(-)
-                  handleLiteralInt(1)
-                endBinaryExpression(-)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(x, expression)
+                  handleNoTypeArguments(-)
+                  handleNoArguments(-)
+                  handleSend(x, -)
+                  beginBinaryExpression(-)
+                    handleLiteralInt(1)
+                  endBinaryExpression(-)
+                endParenthesizedExpression(()
                 beginBinaryExpression(+)
                   handleLiteralInt(1)
                 endBinaryExpression(+)
@@ -4198,14 +4204,15 @@
                 endThenStatement(;)
               endIfStatement(if, null)
               beginReturnStatement(return)
-                handleIdentifier(x, expression)
-                handleNoTypeArguments(-)
-                handleNoArguments(-)
-                handleSend(x, -)
-                beginBinaryExpression(-)
-                  handleLiteralInt(1)
-                endBinaryExpression(-)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(x, expression)
+                  handleNoTypeArguments(-)
+                  handleNoArguments(-)
+                  handleSend(x, -)
+                  beginBinaryExpression(-)
+                    handleLiteralInt(1)
+                  endBinaryExpression(-)
+                endParenthesizedExpression(()
                 beginBinaryExpression(+)
                   handleLiteralInt(1)
                 endBinaryExpression(+)
@@ -4326,14 +4333,15 @@
                 endBlock(0, {, }, BlockKind(try statement))
                 handleRecoverableError(OnlyTry, try, try)
               endTryStatement(0, try, null)
-              handleIdentifier(x, expression)
-              handleNoTypeArguments(-)
-              handleNoArguments(-)
-              handleSend(x, -)
-              beginBinaryExpression(-)
-                handleLiteralInt(1)
-              endBinaryExpression(-)
-              handleParenthesizedExpression(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleIdentifier(x, expression)
+                handleNoTypeArguments(-)
+                handleNoArguments(-)
+                handleSend(x, -)
+                beginBinaryExpression(-)
+                  handleLiteralInt(1)
+                endBinaryExpression(-)
+              endParenthesizedExpression(()
               beginBinaryExpression(+)
                 handleLiteralInt(1)
               endBinaryExpression(+)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
index 06dc2d8..df7d6f2 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
@@ -883,32 +883,31 @@
                               parsePrecedenceExpression(;, 1, true)
                                 parseUnaryExpression(;, true)
                                   parsePrimary(;, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(;)
-                                      parseParenthesizedExpression(;)
-                                        parseExpressionInParenthesis(;)
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSendOrFunctionLiteral((, expression)
-                                                      parseSend((, expression)
-                                                        isNextIdentifier(()
-                                                        ensureIdentifier((, expression)
-                                                          listener: handleIdentifier(x, expression)
-                                                        listener: handleNoTypeArguments(-)
-                                                        parseArgumentsOpt(x)
-                                                          listener: handleNoArguments(-)
-                                                        listener: handleSend(x, -)
-                                                listener: beginBinaryExpression(-)
-                                                parsePrecedenceExpression(-, 14, true)
-                                                  parseUnaryExpression(-, true)
-                                                    parsePrimary(-, expression)
-                                                      parseLiteralInt(-)
-                                                        listener: handleLiteralInt(1)
-                                                listener: endBinaryExpression(-)
-                                            ensureCloseParen(1, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                                      parseParenthesizedExpressionOrRecordLiteral(;)
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSendOrFunctionLiteral((, expression)
+                                                  parseSend((, expression)
+                                                    isNextIdentifier(()
+                                                    ensureIdentifier((, expression)
+                                                      listener: handleIdentifier(x, expression)
+                                                    listener: handleNoTypeArguments(-)
+                                                    parseArgumentsOpt(x)
+                                                      listener: handleNoArguments(-)
+                                                    listener: handleSend(x, -)
+                                            listener: beginBinaryExpression(-)
+                                            parsePrecedenceExpression(-, 14, true)
+                                              parseUnaryExpression(-, true)
+                                                parsePrimary(-, expression)
+                                                  parseLiteralInt(-)
+                                                    listener: handleLiteralInt(1)
+                                            listener: endBinaryExpression(-)
+                                        ensureCloseParen(1, ()
+                                        listener: endParenthesizedExpression(()
                                 listener: beginBinaryExpression(+)
                                 parsePrecedenceExpression(+, 14, true)
                                   parseUnaryExpression(+, true)
@@ -1655,32 +1654,31 @@
                               parsePrecedenceExpression(;, 1, true)
                                 parseUnaryExpression(;, true)
                                   parsePrimary(;, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(;)
-                                      parseParenthesizedExpression(;)
-                                        parseExpressionInParenthesis(;)
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSendOrFunctionLiteral((, expression)
-                                                      parseSend((, expression)
-                                                        isNextIdentifier(()
-                                                        ensureIdentifier((, expression)
-                                                          listener: handleIdentifier(x, expression)
-                                                        listener: handleNoTypeArguments(-)
-                                                        parseArgumentsOpt(x)
-                                                          listener: handleNoArguments(-)
-                                                        listener: handleSend(x, -)
-                                                listener: beginBinaryExpression(-)
-                                                parsePrecedenceExpression(-, 14, true)
-                                                  parseUnaryExpression(-, true)
-                                                    parsePrimary(-, expression)
-                                                      parseLiteralInt(-)
-                                                        listener: handleLiteralInt(1)
-                                                listener: endBinaryExpression(-)
-                                            ensureCloseParen(1, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                                      parseParenthesizedExpressionOrRecordLiteral(;)
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSendOrFunctionLiteral((, expression)
+                                                  parseSend((, expression)
+                                                    isNextIdentifier(()
+                                                    ensureIdentifier((, expression)
+                                                      listener: handleIdentifier(x, expression)
+                                                    listener: handleNoTypeArguments(-)
+                                                    parseArgumentsOpt(x)
+                                                      listener: handleNoArguments(-)
+                                                    listener: handleSend(x, -)
+                                            listener: beginBinaryExpression(-)
+                                            parsePrecedenceExpression(-, 14, true)
+                                              parseUnaryExpression(-, true)
+                                                parsePrimary(-, expression)
+                                                  parseLiteralInt(-)
+                                                    listener: handleLiteralInt(1)
+                                            listener: endBinaryExpression(-)
+                                        ensureCloseParen(1, ()
+                                        listener: endParenthesizedExpression(()
                                 listener: beginBinaryExpression(+)
                                 parsePrecedenceExpression(+, 14, true)
                                   parseUnaryExpression(+, true)
@@ -2262,32 +2260,31 @@
                                     parsePrecedenceExpression(do, 1, true)
                                       parseUnaryExpression(do, true)
                                         parsePrimary(do, expression)
-                                          parseParenthesizedExpressionOrFunctionLiteral(do)
-                                            parseParenthesizedExpression(do)
-                                              parseExpressionInParenthesis(do)
-                                                parseExpressionInParenthesisRest(()
-                                                  parseExpression(()
-                                                    parsePrecedenceExpression((, 1, true)
-                                                      parseUnaryExpression((, true)
-                                                        parsePrimary((, expression)
-                                                          parseSendOrFunctionLiteral((, expression)
-                                                            parseSend((, expression)
-                                                              isNextIdentifier(()
-                                                              ensureIdentifier((, expression)
-                                                                listener: handleIdentifier(x, expression)
-                                                              listener: handleNoTypeArguments(-)
-                                                              parseArgumentsOpt(x)
-                                                                listener: handleNoArguments(-)
-                                                              listener: handleSend(x, -)
-                                                      listener: beginBinaryExpression(-)
-                                                      parsePrecedenceExpression(-, 14, true)
-                                                        parseUnaryExpression(-, true)
-                                                          parsePrimary(-, expression)
-                                                            parseLiteralInt(-)
-                                                              listener: handleLiteralInt(1)
-                                                      listener: endBinaryExpression(-)
-                                                  ensureCloseParen(1, ()
-                                              listener: handleParenthesizedExpression(()
+                                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(do)
+                                            parseParenthesizedExpressionOrRecordLiteral(do)
+                                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                              parseExpression(()
+                                                parsePrecedenceExpression((, 1, true)
+                                                  parseUnaryExpression((, true)
+                                                    parsePrimary((, expression)
+                                                      parseSendOrFunctionLiteral((, expression)
+                                                        parseSend((, expression)
+                                                          isNextIdentifier(()
+                                                          ensureIdentifier((, expression)
+                                                            listener: handleIdentifier(x, expression)
+                                                          listener: handleNoTypeArguments(-)
+                                                          parseArgumentsOpt(x)
+                                                            listener: handleNoArguments(-)
+                                                          listener: handleSend(x, -)
+                                                  listener: beginBinaryExpression(-)
+                                                  parsePrecedenceExpression(-, 14, true)
+                                                    parseUnaryExpression(-, true)
+                                                      parsePrimary(-, expression)
+                                                        parseLiteralInt(-)
+                                                          listener: handleLiteralInt(1)
+                                                  listener: endBinaryExpression(-)
+                                              ensureCloseParen(1, ()
+                                              listener: endParenthesizedExpression(()
                                       listener: beginBinaryExpression(+)
                                       parsePrecedenceExpression(+, 14, true)
                                         parseUnaryExpression(+, true)
@@ -2634,32 +2631,31 @@
                               parsePrecedenceExpression(else, 1, true)
                                 parseUnaryExpression(else, true)
                                   parsePrimary(else, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(else)
-                                      parseParenthesizedExpression(else)
-                                        parseExpressionInParenthesis(else)
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSendOrFunctionLiteral((, expression)
-                                                      parseSend((, expression)
-                                                        isNextIdentifier(()
-                                                        ensureIdentifier((, expression)
-                                                          listener: handleIdentifier(x, expression)
-                                                        listener: handleNoTypeArguments(-)
-                                                        parseArgumentsOpt(x)
-                                                          listener: handleNoArguments(-)
-                                                        listener: handleSend(x, -)
-                                                listener: beginBinaryExpression(-)
-                                                parsePrecedenceExpression(-, 14, true)
-                                                  parseUnaryExpression(-, true)
-                                                    parsePrimary(-, expression)
-                                                      parseLiteralInt(-)
-                                                        listener: handleLiteralInt(1)
-                                                listener: endBinaryExpression(-)
-                                            ensureCloseParen(1, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(else)
+                                      parseParenthesizedExpressionOrRecordLiteral(else)
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSendOrFunctionLiteral((, expression)
+                                                  parseSend((, expression)
+                                                    isNextIdentifier(()
+                                                    ensureIdentifier((, expression)
+                                                      listener: handleIdentifier(x, expression)
+                                                    listener: handleNoTypeArguments(-)
+                                                    parseArgumentsOpt(x)
+                                                      listener: handleNoArguments(-)
+                                                    listener: handleSend(x, -)
+                                            listener: beginBinaryExpression(-)
+                                            parsePrecedenceExpression(-, 14, true)
+                                              parseUnaryExpression(-, true)
+                                                parsePrimary(-, expression)
+                                                  parseLiteralInt(-)
+                                                    listener: handleLiteralInt(1)
+                                            listener: endBinaryExpression(-)
+                                        ensureCloseParen(1, ()
+                                        listener: endParenthesizedExpression(()
                                 listener: beginBinaryExpression(+)
                                 parsePrecedenceExpression(+, 14, true)
                                   parseUnaryExpression(+, true)
@@ -5766,32 +5762,31 @@
                               parsePrecedenceExpression(;, 1, true)
                                 parseUnaryExpression(;, true)
                                   parsePrimary(;, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(;)
-                                      parseParenthesizedExpression(;)
-                                        parseExpressionInParenthesis(;)
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSendOrFunctionLiteral((, expression)
-                                                      parseSend((, expression)
-                                                        isNextIdentifier(()
-                                                        ensureIdentifier((, expression)
-                                                          listener: handleIdentifier(x, expression)
-                                                        listener: handleNoTypeArguments(-)
-                                                        parseArgumentsOpt(x)
-                                                          listener: handleNoArguments(-)
-                                                        listener: handleSend(x, -)
-                                                listener: beginBinaryExpression(-)
-                                                parsePrecedenceExpression(-, 14, true)
-                                                  parseUnaryExpression(-, true)
-                                                    parsePrimary(-, expression)
-                                                      parseLiteralInt(-)
-                                                        listener: handleLiteralInt(1)
-                                                listener: endBinaryExpression(-)
-                                            ensureCloseParen(1, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                                      parseParenthesizedExpressionOrRecordLiteral(;)
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSendOrFunctionLiteral((, expression)
+                                                  parseSend((, expression)
+                                                    isNextIdentifier(()
+                                                    ensureIdentifier((, expression)
+                                                      listener: handleIdentifier(x, expression)
+                                                    listener: handleNoTypeArguments(-)
+                                                    parseArgumentsOpt(x)
+                                                      listener: handleNoArguments(-)
+                                                    listener: handleSend(x, -)
+                                            listener: beginBinaryExpression(-)
+                                            parsePrecedenceExpression(-, 14, true)
+                                              parseUnaryExpression(-, true)
+                                                parsePrimary(-, expression)
+                                                  parseLiteralInt(-)
+                                                    listener: handleLiteralInt(1)
+                                            listener: endBinaryExpression(-)
+                                        ensureCloseParen(1, ()
+                                        listener: endParenthesizedExpression(()
                                 listener: beginBinaryExpression(+)
                                 parsePrecedenceExpression(+, 14, true)
                                   parseUnaryExpression(+, true)
@@ -7936,32 +7931,31 @@
                                 reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
                                   listener: handleRecoverableError(Message[UnexpectedToken, Unexpected token 'return'., null, {lexeme: return}], return, return)
                                 parsePrimary(return, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(return)
-                                    parseParenthesizedExpression(return)
-                                      parseExpressionInParenthesis(return)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(x, expression)
-                                                      listener: handleNoTypeArguments(-)
-                                                      parseArgumentsOpt(x)
-                                                        listener: handleNoArguments(-)
-                                                      listener: handleSend(x, -)
-                                              listener: beginBinaryExpression(-)
-                                              parsePrecedenceExpression(-, 14, true)
-                                                parseUnaryExpression(-, true)
-                                                  parsePrimary(-, expression)
-                                                    parseLiteralInt(-)
-                                                      listener: handleLiteralInt(1)
-                                              listener: endBinaryExpression(-)
-                                          ensureCloseParen(1, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(return)
+                                    parseParenthesizedExpressionOrRecordLiteral(return)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(x, expression)
+                                                  listener: handleNoTypeArguments(-)
+                                                  parseArgumentsOpt(x)
+                                                    listener: handleNoArguments(-)
+                                                  listener: handleSend(x, -)
+                                          listener: beginBinaryExpression(-)
+                                          parsePrecedenceExpression(-, 14, true)
+                                            parseUnaryExpression(-, true)
+                                              parsePrimary(-, expression)
+                                                parseLiteralInt(-)
+                                                  listener: handleLiteralInt(1)
+                                          listener: endBinaryExpression(-)
+                                      ensureCloseParen(1, ()
+                                      listener: endParenthesizedExpression(()
                             listener: beginBinaryExpression(+)
                             parsePrecedenceExpression(+, 14, true)
                               parseUnaryExpression(+, true)
@@ -9320,32 +9314,31 @@
                               parsePrecedenceExpression(throw, 1, true)
                                 parseUnaryExpression(throw, true)
                                   parsePrimary(throw, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(throw)
-                                      parseParenthesizedExpression(throw)
-                                        parseExpressionInParenthesis(throw)
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSendOrFunctionLiteral((, expression)
-                                                      parseSend((, expression)
-                                                        isNextIdentifier(()
-                                                        ensureIdentifier((, expression)
-                                                          listener: handleIdentifier(x, expression)
-                                                        listener: handleNoTypeArguments(-)
-                                                        parseArgumentsOpt(x)
-                                                          listener: handleNoArguments(-)
-                                                        listener: handleSend(x, -)
-                                                listener: beginBinaryExpression(-)
-                                                parsePrecedenceExpression(-, 14, true)
-                                                  parseUnaryExpression(-, true)
-                                                    parsePrimary(-, expression)
-                                                      parseLiteralInt(-)
-                                                        listener: handleLiteralInt(1)
-                                                listener: endBinaryExpression(-)
-                                            ensureCloseParen(1, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(throw)
+                                      parseParenthesizedExpressionOrRecordLiteral(throw)
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSendOrFunctionLiteral((, expression)
+                                                  parseSend((, expression)
+                                                    isNextIdentifier(()
+                                                    ensureIdentifier((, expression)
+                                                      listener: handleIdentifier(x, expression)
+                                                    listener: handleNoTypeArguments(-)
+                                                    parseArgumentsOpt(x)
+                                                      listener: handleNoArguments(-)
+                                                    listener: handleSend(x, -)
+                                            listener: beginBinaryExpression(-)
+                                            parsePrecedenceExpression(-, 14, true)
+                                              parseUnaryExpression(-, true)
+                                                parsePrimary(-, expression)
+                                                  parseLiteralInt(-)
+                                                    listener: handleLiteralInt(1)
+                                            listener: endBinaryExpression(-)
+                                        ensureCloseParen(1, ()
+                                        listener: endParenthesizedExpression(()
                                 listener: beginBinaryExpression(+)
                                 parsePrecedenceExpression(+, 14, true)
                                   parseUnaryExpression(+, true)
@@ -9649,32 +9642,31 @@
                               parsePrecedenceExpression(}, 1, true)
                                 parseUnaryExpression(}, true)
                                   parsePrimary(}, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(})
-                                      parseParenthesizedExpression(})
-                                        parseExpressionInParenthesis(})
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSendOrFunctionLiteral((, expression)
-                                                      parseSend((, expression)
-                                                        isNextIdentifier(()
-                                                        ensureIdentifier((, expression)
-                                                          listener: handleIdentifier(x, expression)
-                                                        listener: handleNoTypeArguments(-)
-                                                        parseArgumentsOpt(x)
-                                                          listener: handleNoArguments(-)
-                                                        listener: handleSend(x, -)
-                                                listener: beginBinaryExpression(-)
-                                                parsePrecedenceExpression(-, 14, true)
-                                                  parseUnaryExpression(-, true)
-                                                    parsePrimary(-, expression)
-                                                      parseLiteralInt(-)
-                                                        listener: handleLiteralInt(1)
-                                                listener: endBinaryExpression(-)
-                                            ensureCloseParen(1, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(})
+                                      parseParenthesizedExpressionOrRecordLiteral(})
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSendOrFunctionLiteral((, expression)
+                                                  parseSend((, expression)
+                                                    isNextIdentifier(()
+                                                    ensureIdentifier((, expression)
+                                                      listener: handleIdentifier(x, expression)
+                                                    listener: handleNoTypeArguments(-)
+                                                    parseArgumentsOpt(x)
+                                                      listener: handleNoArguments(-)
+                                                    listener: handleSend(x, -)
+                                            listener: beginBinaryExpression(-)
+                                            parsePrecedenceExpression(-, 14, true)
+                                              parseUnaryExpression(-, true)
+                                                parsePrimary(-, expression)
+                                                  parseLiteralInt(-)
+                                                    listener: handleLiteralInt(1)
+                                            listener: endBinaryExpression(-)
+                                        ensureCloseParen(1, ()
+                                        listener: endParenthesizedExpression(()
                                 listener: beginBinaryExpression(+)
                                 parsePrecedenceExpression(+, 14, true)
                                   parseUnaryExpression(+, true)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
index 02db7c4..06ce561 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
@@ -798,14 +798,15 @@
         handleRecoverableError(BreakOutsideOfLoop, break, break)
         handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], break, break)
         handleBreakStatement(false, break, ;)
-        handleIdentifier(x, expression)
-        handleNoTypeArguments(-)
-        handleNoArguments(-)
-        handleSend(x, -)
-        beginBinaryExpression(-)
-          handleLiteralInt(1)
-        endBinaryExpression(-)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(x, expression)
+          handleNoTypeArguments(-)
+          handleNoArguments(-)
+          handleSend(x, -)
+          beginBinaryExpression(-)
+            handleLiteralInt(1)
+          endBinaryExpression(-)
+        endParenthesizedExpression(()
         beginBinaryExpression(+)
           handleLiteralInt(1)
         endBinaryExpression(+)
@@ -1102,14 +1103,15 @@
         handleRecoverableError(ContinueOutsideOfLoop, continue, continue)
         handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], continue, continue)
         handleContinueStatement(false, continue, ;)
-        handleIdentifier(x, expression)
-        handleNoTypeArguments(-)
-        handleNoArguments(-)
-        handleSend(x, -)
-        beginBinaryExpression(-)
-          handleLiteralInt(1)
-        endBinaryExpression(-)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(x, expression)
+          handleNoTypeArguments(-)
+          handleNoArguments(-)
+          handleSend(x, -)
+          beginBinaryExpression(-)
+            handleLiteralInt(1)
+          endBinaryExpression(-)
+        endParenthesizedExpression(()
         beginBinaryExpression(+)
           handleLiteralInt(1)
         endBinaryExpression(+)
@@ -1338,14 +1340,15 @@
         endReturnStatement(true, return, ;)
         beginDoWhileStatement(do)
           beginDoWhileStatementBody(()
-            handleIdentifier(x, expression)
-            handleNoTypeArguments(-)
-            handleNoArguments(-)
-            handleSend(x, -)
-            beginBinaryExpression(-)
-              handleLiteralInt(1)
-            endBinaryExpression(-)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(x, expression)
+              handleNoTypeArguments(-)
+              handleNoArguments(-)
+              handleSend(x, -)
+              beginBinaryExpression(-)
+                handleLiteralInt(1)
+              endBinaryExpression(-)
+            endParenthesizedExpression(()
             beginBinaryExpression(+)
               handleLiteralInt(1)
             endBinaryExpression(+)
@@ -1475,14 +1478,15 @@
         handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], return, return)
         handleExpressionStatement(;)
         handleRecoverableError(Message[UnexpectedToken, Unexpected token ';'., null, {lexeme: ;}], else, else)
-        handleIdentifier(x, expression)
-        handleNoTypeArguments(-)
-        handleNoArguments(-)
-        handleSend(x, -)
-        beginBinaryExpression(-)
-          handleLiteralInt(1)
-        endBinaryExpression(-)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(x, expression)
+          handleNoTypeArguments(-)
+          handleNoArguments(-)
+          handleSend(x, -)
+          beginBinaryExpression(-)
+            handleLiteralInt(1)
+          endBinaryExpression(-)
+        endParenthesizedExpression(()
         beginBinaryExpression(+)
           handleLiteralInt(1)
         endBinaryExpression(+)
@@ -2699,14 +2703,15 @@
           handleIsOperator(is, null)
           handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], is, is)
         endReturnStatement(true, return, ;)
-        handleIdentifier(x, expression)
-        handleNoTypeArguments(-)
-        handleNoArguments(-)
-        handleSend(x, -)
-        beginBinaryExpression(-)
-          handleLiteralInt(1)
-        endBinaryExpression(-)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(x, expression)
+          handleNoTypeArguments(-)
+          handleNoArguments(-)
+          handleSend(x, -)
+          beginBinaryExpression(-)
+            handleLiteralInt(1)
+          endBinaryExpression(-)
+        endParenthesizedExpression(()
         beginBinaryExpression(+)
           handleLiteralInt(1)
         endBinaryExpression(+)
@@ -3561,14 +3566,15 @@
         endIfStatement(if, null)
         beginReturnStatement(return)
           handleRecoverableError(Message[UnexpectedToken, Unexpected token 'return'., null, {lexeme: return}], return, return)
-          handleIdentifier(x, expression)
-          handleNoTypeArguments(-)
-          handleNoArguments(-)
-          handleSend(x, -)
-          beginBinaryExpression(-)
-            handleLiteralInt(1)
-          endBinaryExpression(-)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, expression)
+            handleNoTypeArguments(-)
+            handleNoArguments(-)
+            handleSend(x, -)
+            beginBinaryExpression(-)
+              handleLiteralInt(1)
+            endBinaryExpression(-)
+          endParenthesizedExpression(()
           beginBinaryExpression(+)
             handleLiteralInt(1)
           endBinaryExpression(+)
@@ -4087,14 +4093,15 @@
           endThenStatement(;)
         endIfStatement(if, null)
         beginReturnStatement(return)
-          handleIdentifier(x, expression)
-          handleNoTypeArguments(-)
-          handleNoArguments(-)
-          handleSend(x, -)
-          beginBinaryExpression(-)
-            handleLiteralInt(1)
-          endBinaryExpression(-)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, expression)
+            handleNoTypeArguments(-)
+            handleNoArguments(-)
+            handleSend(x, -)
+            beginBinaryExpression(-)
+              handleLiteralInt(1)
+            endBinaryExpression(-)
+          endParenthesizedExpression(()
           beginBinaryExpression(+)
             handleLiteralInt(1)
           endBinaryExpression(+)
@@ -4213,14 +4220,15 @@
           endBlock(0, {, }, BlockKind(try statement))
           handleRecoverableError(OnlyTry, try, try)
         endTryStatement(0, try, null)
-        handleIdentifier(x, expression)
-        handleNoTypeArguments(-)
-        handleNoArguments(-)
-        handleSend(x, -)
-        beginBinaryExpression(-)
-          handleLiteralInt(1)
-        endBinaryExpression(-)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(x, expression)
+          handleNoTypeArguments(-)
+          handleNoArguments(-)
+          handleSend(x, -)
+          beginBinaryExpression(-)
+            handleLiteralInt(1)
+          endBinaryExpression(-)
+        endParenthesizedExpression(()
         beginBinaryExpression(+)
           handleLiteralInt(1)
         endBinaryExpression(+)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
index 8b1d7ab..c9a7ba8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
@@ -836,32 +836,31 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(x, expression)
-                                                listener: handleNoTypeArguments(-)
-                                                parseArgumentsOpt(x)
-                                                  listener: handleNoArguments(-)
-                                                listener: handleSend(x, -)
-                                        listener: beginBinaryExpression(-)
-                                        parsePrecedenceExpression(-, 14, true)
-                                          parseUnaryExpression(-, true)
-                                            parsePrimary(-, expression)
-                                              parseLiteralInt(-)
-                                                listener: handleLiteralInt(1)
-                                        listener: endBinaryExpression(-)
-                                    ensureCloseParen(1, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(x, expression)
+                                            listener: handleNoTypeArguments(-)
+                                            parseArgumentsOpt(x)
+                                              listener: handleNoArguments(-)
+                                            listener: handleSend(x, -)
+                                    listener: beginBinaryExpression(-)
+                                    parsePrecedenceExpression(-, 14, true)
+                                      parseUnaryExpression(-, true)
+                                        parsePrimary(-, expression)
+                                          parseLiteralInt(-)
+                                            listener: handleLiteralInt(1)
+                                    listener: endBinaryExpression(-)
+                                ensureCloseParen(1, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(+)
                         parsePrecedenceExpression(+, 14, true)
                           parseUnaryExpression(+, true)
@@ -1588,32 +1587,31 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(x, expression)
-                                                listener: handleNoTypeArguments(-)
-                                                parseArgumentsOpt(x)
-                                                  listener: handleNoArguments(-)
-                                                listener: handleSend(x, -)
-                                        listener: beginBinaryExpression(-)
-                                        parsePrecedenceExpression(-, 14, true)
-                                          parseUnaryExpression(-, true)
-                                            parsePrimary(-, expression)
-                                              parseLiteralInt(-)
-                                                listener: handleLiteralInt(1)
-                                        listener: endBinaryExpression(-)
-                                    ensureCloseParen(1, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(x, expression)
+                                            listener: handleNoTypeArguments(-)
+                                            parseArgumentsOpt(x)
+                                              listener: handleNoArguments(-)
+                                            listener: handleSend(x, -)
+                                    listener: beginBinaryExpression(-)
+                                    parsePrecedenceExpression(-, 14, true)
+                                      parseUnaryExpression(-, true)
+                                        parsePrimary(-, expression)
+                                          parseLiteralInt(-)
+                                            listener: handleLiteralInt(1)
+                                    listener: endBinaryExpression(-)
+                                ensureCloseParen(1, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(+)
                         parsePrecedenceExpression(+, 14, true)
                           parseUnaryExpression(+, true)
@@ -2179,32 +2177,31 @@
                             parsePrecedenceExpression(do, 1, true)
                               parseUnaryExpression(do, true)
                                 parsePrimary(do, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(do)
-                                    parseParenthesizedExpression(do)
-                                      parseExpressionInParenthesis(do)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(x, expression)
-                                                      listener: handleNoTypeArguments(-)
-                                                      parseArgumentsOpt(x)
-                                                        listener: handleNoArguments(-)
-                                                      listener: handleSend(x, -)
-                                              listener: beginBinaryExpression(-)
-                                              parsePrecedenceExpression(-, 14, true)
-                                                parseUnaryExpression(-, true)
-                                                  parsePrimary(-, expression)
-                                                    parseLiteralInt(-)
-                                                      listener: handleLiteralInt(1)
-                                              listener: endBinaryExpression(-)
-                                          ensureCloseParen(1, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(do)
+                                    parseParenthesizedExpressionOrRecordLiteral(do)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(x, expression)
+                                                  listener: handleNoTypeArguments(-)
+                                                  parseArgumentsOpt(x)
+                                                    listener: handleNoArguments(-)
+                                                  listener: handleSend(x, -)
+                                          listener: beginBinaryExpression(-)
+                                          parsePrecedenceExpression(-, 14, true)
+                                            parseUnaryExpression(-, true)
+                                              parsePrimary(-, expression)
+                                                parseLiteralInt(-)
+                                                  listener: handleLiteralInt(1)
+                                          listener: endBinaryExpression(-)
+                                      ensureCloseParen(1, ()
+                                      listener: endParenthesizedExpression(()
                               listener: beginBinaryExpression(+)
                               parsePrecedenceExpression(+, 14, true)
                                 parseUnaryExpression(+, true)
@@ -2543,32 +2540,31 @@
                       parsePrecedenceExpression(else, 1, true)
                         parseUnaryExpression(else, true)
                           parsePrimary(else, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(else)
-                              parseParenthesizedExpression(else)
-                                parseExpressionInParenthesis(else)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(x, expression)
-                                                listener: handleNoTypeArguments(-)
-                                                parseArgumentsOpt(x)
-                                                  listener: handleNoArguments(-)
-                                                listener: handleSend(x, -)
-                                        listener: beginBinaryExpression(-)
-                                        parsePrecedenceExpression(-, 14, true)
-                                          parseUnaryExpression(-, true)
-                                            parsePrimary(-, expression)
-                                              parseLiteralInt(-)
-                                                listener: handleLiteralInt(1)
-                                        listener: endBinaryExpression(-)
-                                    ensureCloseParen(1, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(else)
+                              parseParenthesizedExpressionOrRecordLiteral(else)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(x, expression)
+                                            listener: handleNoTypeArguments(-)
+                                            parseArgumentsOpt(x)
+                                              listener: handleNoArguments(-)
+                                            listener: handleSend(x, -)
+                                    listener: beginBinaryExpression(-)
+                                    parsePrecedenceExpression(-, 14, true)
+                                      parseUnaryExpression(-, true)
+                                        parsePrimary(-, expression)
+                                          parseLiteralInt(-)
+                                            listener: handleLiteralInt(1)
+                                    listener: endBinaryExpression(-)
+                                ensureCloseParen(1, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(+)
                         parsePrecedenceExpression(+, 14, true)
                           parseUnaryExpression(+, true)
@@ -5594,32 +5590,31 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(x, expression)
-                                                listener: handleNoTypeArguments(-)
-                                                parseArgumentsOpt(x)
-                                                  listener: handleNoArguments(-)
-                                                listener: handleSend(x, -)
-                                        listener: beginBinaryExpression(-)
-                                        parsePrecedenceExpression(-, 14, true)
-                                          parseUnaryExpression(-, true)
-                                            parsePrimary(-, expression)
-                                              parseLiteralInt(-)
-                                                listener: handleLiteralInt(1)
-                                        listener: endBinaryExpression(-)
-                                    ensureCloseParen(1, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(x, expression)
+                                            listener: handleNoTypeArguments(-)
+                                            parseArgumentsOpt(x)
+                                              listener: handleNoArguments(-)
+                                            listener: handleSend(x, -)
+                                    listener: beginBinaryExpression(-)
+                                    parsePrecedenceExpression(-, 14, true)
+                                      parseUnaryExpression(-, true)
+                                        parsePrimary(-, expression)
+                                          parseLiteralInt(-)
+                                            listener: handleLiteralInt(1)
+                                    listener: endBinaryExpression(-)
+                                ensureCloseParen(1, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(+)
                         parsePrecedenceExpression(+, 14, true)
                           parseUnaryExpression(+, true)
@@ -7702,32 +7697,31 @@
                         reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
                           listener: handleRecoverableError(Message[UnexpectedToken, Unexpected token 'return'., null, {lexeme: return}], return, return)
                         parsePrimary(return, expression)
-                          parseParenthesizedExpressionOrFunctionLiteral(return)
-                            parseParenthesizedExpression(return)
-                              parseExpressionInParenthesis(return)
-                                parseExpressionInParenthesisRest(()
-                                  parseExpression(()
-                                    parsePrecedenceExpression((, 1, true)
-                                      parseUnaryExpression((, true)
-                                        parsePrimary((, expression)
-                                          parseSendOrFunctionLiteral((, expression)
-                                            parseSend((, expression)
-                                              isNextIdentifier(()
-                                              ensureIdentifier((, expression)
-                                                listener: handleIdentifier(x, expression)
-                                              listener: handleNoTypeArguments(-)
-                                              parseArgumentsOpt(x)
-                                                listener: handleNoArguments(-)
-                                              listener: handleSend(x, -)
-                                      listener: beginBinaryExpression(-)
-                                      parsePrecedenceExpression(-, 14, true)
-                                        parseUnaryExpression(-, true)
-                                          parsePrimary(-, expression)
-                                            parseLiteralInt(-)
-                                              listener: handleLiteralInt(1)
-                                      listener: endBinaryExpression(-)
-                                  ensureCloseParen(1, ()
-                              listener: handleParenthesizedExpression(()
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(return)
+                            parseParenthesizedExpressionOrRecordLiteral(return)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              parseExpression(()
+                                parsePrecedenceExpression((, 1, true)
+                                  parseUnaryExpression((, true)
+                                    parsePrimary((, expression)
+                                      parseSendOrFunctionLiteral((, expression)
+                                        parseSend((, expression)
+                                          isNextIdentifier(()
+                                          ensureIdentifier((, expression)
+                                            listener: handleIdentifier(x, expression)
+                                          listener: handleNoTypeArguments(-)
+                                          parseArgumentsOpt(x)
+                                            listener: handleNoArguments(-)
+                                          listener: handleSend(x, -)
+                                  listener: beginBinaryExpression(-)
+                                  parsePrecedenceExpression(-, 14, true)
+                                    parseUnaryExpression(-, true)
+                                      parsePrimary(-, expression)
+                                        parseLiteralInt(-)
+                                          listener: handleLiteralInt(1)
+                                  listener: endBinaryExpression(-)
+                              ensureCloseParen(1, ()
+                              listener: endParenthesizedExpression(()
                     listener: beginBinaryExpression(+)
                     parsePrecedenceExpression(+, 14, true)
                       parseUnaryExpression(+, true)
@@ -8999,32 +8993,31 @@
                       parsePrecedenceExpression(throw, 1, true)
                         parseUnaryExpression(throw, true)
                           parsePrimary(throw, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(throw)
-                              parseParenthesizedExpression(throw)
-                                parseExpressionInParenthesis(throw)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(x, expression)
-                                                listener: handleNoTypeArguments(-)
-                                                parseArgumentsOpt(x)
-                                                  listener: handleNoArguments(-)
-                                                listener: handleSend(x, -)
-                                        listener: beginBinaryExpression(-)
-                                        parsePrecedenceExpression(-, 14, true)
-                                          parseUnaryExpression(-, true)
-                                            parsePrimary(-, expression)
-                                              parseLiteralInt(-)
-                                                listener: handleLiteralInt(1)
-                                        listener: endBinaryExpression(-)
-                                    ensureCloseParen(1, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(throw)
+                              parseParenthesizedExpressionOrRecordLiteral(throw)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(x, expression)
+                                            listener: handleNoTypeArguments(-)
+                                            parseArgumentsOpt(x)
+                                              listener: handleNoArguments(-)
+                                            listener: handleSend(x, -)
+                                    listener: beginBinaryExpression(-)
+                                    parsePrecedenceExpression(-, 14, true)
+                                      parseUnaryExpression(-, true)
+                                        parsePrimary(-, expression)
+                                          parseLiteralInt(-)
+                                            listener: handleLiteralInt(1)
+                                    listener: endBinaryExpression(-)
+                                ensureCloseParen(1, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(+)
                         parsePrecedenceExpression(+, 14, true)
                           parseUnaryExpression(+, true)
@@ -9320,32 +9313,31 @@
                       parsePrecedenceExpression(}, 1, true)
                         parseUnaryExpression(}, true)
                           parsePrimary(}, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(})
-                              parseParenthesizedExpression(})
-                                parseExpressionInParenthesis(})
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(x, expression)
-                                                listener: handleNoTypeArguments(-)
-                                                parseArgumentsOpt(x)
-                                                  listener: handleNoArguments(-)
-                                                listener: handleSend(x, -)
-                                        listener: beginBinaryExpression(-)
-                                        parsePrecedenceExpression(-, 14, true)
-                                          parseUnaryExpression(-, true)
-                                            parsePrimary(-, expression)
-                                              parseLiteralInt(-)
-                                                listener: handleLiteralInt(1)
-                                        listener: endBinaryExpression(-)
-                                    ensureCloseParen(1, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(})
+                              parseParenthesizedExpressionOrRecordLiteral(})
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(x, expression)
+                                            listener: handleNoTypeArguments(-)
+                                            parseArgumentsOpt(x)
+                                              listener: handleNoArguments(-)
+                                            listener: handleSend(x, -)
+                                    listener: beginBinaryExpression(-)
+                                    parsePrecedenceExpression(-, 14, true)
+                                      parseUnaryExpression(-, true)
+                                        parsePrimary(-, expression)
+                                          parseLiteralInt(-)
+                                            listener: handleLiteralInt(1)
+                                    listener: endBinaryExpression(-)
+                                ensureCloseParen(1, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(+)
                         parsePrecedenceExpression(+, 14, true)
                           parseUnaryExpression(+, true)
diff --git a/pkg/front_end/parser_testcases/general/augment_super.dart.expect b/pkg/front_end/parser_testcases/general/augment_super.dart.expect
index 6eeeb58..0068277 100644
--- a/pkg/front_end/parser_testcases/general/augment_super.dart.expect
+++ b/pkg/front_end/parser_testcases/general/augment_super.dart.expect
@@ -220,12 +220,13 @@
           endInitializedIdentifier(super)
           handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
         endVariablesDeclaration(1, ;)
-        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-        handleIdentifier(, expression)
-        handleNoTypeArguments())
-        handleNoArguments())
-        handleSend(, ))
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+          handleIdentifier(, expression)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(, ))
+        endParenthesizedExpression(()
         handleExpressionStatement(;)
       endBlockFunctionBody(2, {, })
     endTopLevelMethod(void, null, })
@@ -437,12 +438,13 @@
           endInitializedIdentifier(super)
           handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
         endVariablesDeclaration(1, ;)
-        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-        handleIdentifier(, expression)
-        handleNoTypeArguments())
-        handleNoArguments())
-        handleSend(, ))
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+          handleIdentifier(, expression)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(, ))
+        endParenthesizedExpression(()
         handleExpressionStatement(;)
         beginMetadataStar(augment)
         endMetadataStar(0)
@@ -540,12 +542,13 @@
                 endInitializedIdentifier(super)
                 handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
               endVariablesDeclaration(1, ;)
-              handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-              handleIdentifier(, expression)
-              handleNoTypeArguments())
-              handleNoArguments())
-              handleSend(, ))
-              handleParenthesizedExpression(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+                handleIdentifier(, expression)
+                handleNoTypeArguments())
+                handleNoArguments())
+                handleSend(, ))
+              endParenthesizedExpression(()
               handleExpressionStatement(;)
             endBlockFunctionBody(2, {, })
           endClassMethod(null, void, (, null, })
@@ -740,12 +743,13 @@
                 endInitializedIdentifier(super)
                 handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
               endVariablesDeclaration(1, ;)
-              handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-              handleIdentifier(, expression)
-              handleNoTypeArguments())
-              handleNoArguments())
-              handleSend(, ))
-              handleParenthesizedExpression(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+                handleIdentifier(, expression)
+                handleNoTypeArguments())
+                handleNoArguments())
+                handleSend(, ))
+              endParenthesizedExpression(()
               handleExpressionStatement(;)
               beginMetadataStar(augment)
               endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/augment_super.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/augment_super.dart.intertwined.expect
index 4cb40bd..5e67d92 100644
--- a/pkg/front_end/parser_testcases/general/augment_super.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/augment_super.dart.intertwined.expect
@@ -85,27 +85,26 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSend((, expression)
-                                              isNextIdentifier(()
-                                              ensureIdentifier((, expression)
-                                                reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
-                                                  listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-                                                rewriter()
-                                                listener: handleIdentifier(, expression)
-                                              listener: handleNoTypeArguments())
-                                              parseArgumentsOpt()
-                                                listener: handleNoArguments())
-                                              listener: handleSend(, ))
-                                    ensureCloseParen(, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSend((, expression)
+                                          isNextIdentifier(()
+                                          ensureIdentifier((, expression)
+                                            reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
+                                              listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+                                            rewriter()
+                                            listener: handleIdentifier(, expression)
+                                          listener: handleNoTypeArguments())
+                                          parseArgumentsOpt()
+                                            listener: handleNoArguments())
+                                          listener: handleSend(, ))
+                                ensureCloseParen(, ()
+                                listener: endParenthesizedExpression(()
                     ensureSemicolon())
                     listener: handleExpressionStatement(;)
           notEofOrValue(}, })
@@ -599,27 +598,26 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSend((, expression)
-                                              isNextIdentifier(()
-                                              ensureIdentifier((, expression)
-                                                reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
-                                                  listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-                                                rewriter()
-                                                listener: handleIdentifier(, expression)
-                                              listener: handleNoTypeArguments())
-                                              parseArgumentsOpt()
-                                                listener: handleNoArguments())
-                                              listener: handleSend(, ))
-                                    ensureCloseParen(, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSend((, expression)
+                                          isNextIdentifier(()
+                                          ensureIdentifier((, expression)
+                                            reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
+                                              listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+                                            rewriter()
+                                            listener: handleIdentifier(, expression)
+                                          listener: handleNoTypeArguments())
+                                          parseArgumentsOpt()
+                                            listener: handleNoArguments())
+                                          listener: handleSend(, ))
+                                ensureCloseParen(, ()
+                                listener: endParenthesizedExpression(()
                     ensureSemicolon())
                     listener: handleExpressionStatement(;)
           notEofOrValue(}, augment)
@@ -848,27 +846,26 @@
                               parsePrecedenceExpression(;, 1, true)
                                 parseUnaryExpression(;, true)
                                   parsePrimary(;, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(;)
-                                      parseParenthesizedExpression(;)
-                                        parseExpressionInParenthesis(;)
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
-                                                          listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-                                                        rewriter()
-                                                        listener: handleIdentifier(, expression)
-                                                      listener: handleNoTypeArguments())
-                                                      parseArgumentsOpt()
-                                                        listener: handleNoArguments())
-                                                      listener: handleSend(, ))
-                                            ensureCloseParen(, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                                      parseParenthesizedExpressionOrRecordLiteral(;)
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
+                                                      listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+                                                    rewriter()
+                                                    listener: handleIdentifier(, expression)
+                                                  listener: handleNoTypeArguments())
+                                                  parseArgumentsOpt()
+                                                    listener: handleNoArguments())
+                                                  listener: handleSend(, ))
+                                        ensureCloseParen(, ()
+                                        listener: endParenthesizedExpression(()
                             ensureSemicolon())
                             listener: handleExpressionStatement(;)
                   notEofOrValue(}, })
@@ -1349,27 +1346,26 @@
                               parsePrecedenceExpression(;, 1, true)
                                 parseUnaryExpression(;, true)
                                   parsePrimary(;, expression)
-                                    parseParenthesizedExpressionOrFunctionLiteral(;)
-                                      parseParenthesizedExpression(;)
-                                        parseExpressionInParenthesis(;)
-                                          parseExpressionInParenthesisRest(()
-                                            parseExpression(()
-                                              parsePrecedenceExpression((, 1, true)
-                                                parseUnaryExpression((, true)
-                                                  parsePrimary((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
-                                                          listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
-                                                        rewriter()
-                                                        listener: handleIdentifier(, expression)
-                                                      listener: handleNoTypeArguments())
-                                                      parseArgumentsOpt()
-                                                        listener: handleNoArguments())
-                                                      listener: handleSend(, ))
-                                            ensureCloseParen(, ()
-                                        listener: handleParenthesizedExpression(()
+                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                                      parseParenthesizedExpressionOrRecordLiteral(;)
+                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                        parseExpression(()
+                                          parsePrecedenceExpression((, 1, true)
+                                            parseUnaryExpression((, true)
+                                              parsePrimary((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
+                                                      listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
+                                                    rewriter()
+                                                    listener: handleIdentifier(, expression)
+                                                  listener: handleNoTypeArguments())
+                                                  parseArgumentsOpt()
+                                                    listener: handleNoArguments())
+                                                  listener: handleSend(, ))
+                                        ensureCloseParen(, ()
+                                        listener: endParenthesizedExpression(()
                             ensureSemicolon())
                             listener: handleExpressionStatement(;)
                   notEofOrValue(}, augment)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
index 8b0e034..ab99785 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
@@ -19,12 +19,13 @@
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(e, expression)
-        handleNoTypeArguments(()
-        beginArguments(()
-        endArguments(0, (, ))
-        handleSend(e, ))
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(e, expression)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(e, ))
+        endParenthesizedExpression(()
         beginTypeArguments(<)
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
index 5434b21..9e8ca34 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
@@ -48,29 +48,28 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              looksLikeFunctionBody())
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(e, expression)
-                                                listener: handleNoTypeArguments(()
-                                                parseArgumentsOpt(e)
-                                                  parseArguments(e)
-                                                    parseArgumentsRest(()
-                                                      listener: beginArguments(()
-                                                      listener: endArguments(0, (, ))
-                                                listener: handleSend(e, ))
-                                    ensureCloseParen(), ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          looksLikeFunctionBody())
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(e, expression)
+                                            listener: handleNoTypeArguments(()
+                                            parseArgumentsOpt(e)
+                                              parseArguments(e)
+                                                parseArgumentsRest(()
+                                                  listener: beginArguments(()
+                                                  listener: endArguments(0, (, ))
+                                            listener: handleSend(e, ))
+                                ensureCloseParen(), ()
+                                listener: endParenthesizedExpression(()
                         listener: beginTypeArguments(<)
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
index a754bf0..a60ee4d 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
@@ -19,17 +19,18 @@
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(e, expression)
-        handleNoTypeArguments(.)
-        handleNoArguments(.)
-        handleSend(e, .)
-        handleIdentifier(f, expressionContinuation)
-        handleNoTypeArguments(()
-        beginArguments(()
-        endArguments(0, (, ))
-        handleSend(f, ))
-        handleEndingBinaryExpression(.)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(e, expression)
+          handleNoTypeArguments(.)
+          handleNoArguments(.)
+          handleSend(e, .)
+          handleIdentifier(f, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(f, ))
+          handleEndingBinaryExpression(.)
+        endParenthesizedExpression(()
         beginTypeArguments(<)
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
index f308d99..e2b9b0c 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
@@ -48,40 +48,39 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(e, expression)
-                                                listener: handleNoTypeArguments(.)
-                                                parseArgumentsOpt(e)
-                                                  listener: handleNoArguments(.)
-                                                listener: handleSend(e, .)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            looksLikeFunctionBody())
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(f, expressionContinuation)
-                                              listener: handleNoTypeArguments(()
-                                              parseArgumentsOpt(f)
-                                                parseArguments(f)
-                                                  parseArgumentsRest(()
-                                                    listener: beginArguments(()
-                                                    listener: endArguments(0, (, ))
-                                              listener: handleSend(f, ))
-                                        listener: handleEndingBinaryExpression(.)
-                                    ensureCloseParen(), ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(e, expression)
+                                            listener: handleNoTypeArguments(.)
+                                            parseArgumentsOpt(e)
+                                              listener: handleNoArguments(.)
+                                            listener: handleSend(e, .)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        looksLikeFunctionBody())
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(f, expressionContinuation)
+                                          listener: handleNoTypeArguments(()
+                                          parseArgumentsOpt(f)
+                                            parseArguments(f)
+                                              parseArgumentsRest(()
+                                                listener: beginArguments(()
+                                                listener: endArguments(0, (, ))
+                                          listener: handleSend(f, ))
+                                    listener: handleEndingBinaryExpression(.)
+                                ensureCloseParen(), ()
+                                listener: endParenthesizedExpression(()
                         listener: beginTypeArguments(<)
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/general/function_expression.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_expression.dart.intertwined.expect
index 4a83b37..1cb2ded 100644
--- a/pkg/front_end/parser_testcases/general/function_expression.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/function_expression.dart.intertwined.expect
@@ -37,7 +37,7 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
                               listener: handleNoTypeVariables(()
                               parseFunctionExpression({)
                                 listener: beginFunctionExpression(()
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect
index bfa32fb..c0a3ef2 100644
--- a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.expect
@@ -578,11 +578,12 @@
           handleNoArguments(>)
           handleSend(c, >)
           beginBinaryExpression(>)
-            handleIdentifier(d, expression)
-            handleNoTypeArguments())
-            handleNoArguments())
-            handleSend(d, ))
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(d, expression)
+              handleNoTypeArguments())
+              handleNoArguments())
+              handleSend(d, ))
+            endParenthesizedExpression(()
             handleUnaryPrefixExpression(!)
           endBinaryExpression(>)
         endArguments(2, (, ))
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
index 918b3ca..d32578d 100644
--- a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
@@ -1032,25 +1032,24 @@
                                     parsePrecedenceExpression(!, 16, true)
                                       parseUnaryExpression(!, true)
                                         parsePrimary(!, expression)
-                                          parseParenthesizedExpressionOrFunctionLiteral(!)
-                                            parseParenthesizedExpression(!)
-                                              parseExpressionInParenthesis(!)
-                                                parseExpressionInParenthesisRest(()
-                                                  parseExpression(()
-                                                    parsePrecedenceExpression((, 1, true)
-                                                      parseUnaryExpression((, true)
-                                                        parsePrimary((, expression)
-                                                          parseSendOrFunctionLiteral((, expression)
-                                                            parseSend((, expression)
-                                                              isNextIdentifier(()
-                                                              ensureIdentifier((, expression)
-                                                                listener: handleIdentifier(d, expression)
-                                                              listener: handleNoTypeArguments())
-                                                              parseArgumentsOpt(d)
-                                                                listener: handleNoArguments())
-                                                              listener: handleSend(d, ))
-                                                  ensureCloseParen(d, ()
-                                              listener: handleParenthesizedExpression(()
+                                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(!)
+                                            parseParenthesizedExpressionOrRecordLiteral(!)
+                                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                              parseExpression(()
+                                                parsePrecedenceExpression((, 1, true)
+                                                  parseUnaryExpression((, true)
+                                                    parsePrimary((, expression)
+                                                      parseSendOrFunctionLiteral((, expression)
+                                                        parseSend((, expression)
+                                                          isNextIdentifier(()
+                                                          ensureIdentifier((, expression)
+                                                            listener: handleIdentifier(d, expression)
+                                                          listener: handleNoTypeArguments())
+                                                          parseArgumentsOpt(d)
+                                                            listener: handleNoArguments())
+                                                          listener: handleSend(d, ))
+                                              ensureCloseParen(d, ()
+                                              listener: endParenthesizedExpression(()
                                     listener: handleUnaryPrefixExpression(!)
                                 listener: endBinaryExpression(>)
                             listener: endArguments(2, (, ))
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
index 63a4760..bcefa47 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
@@ -102,17 +102,18 @@
             handleNoArguments(,)
             handleSend(y, ,)
           endBinaryExpression(<)
-          handleIdentifier(o, expression)
-          handleNoTypeArguments(as)
-          handleNoArguments(as)
-          handleSend(o, as)
-          beginAsOperatorType(as)
-            handleIdentifier(Function, typeReference)
-            handleNoTypeArguments())
-            handleType(Function, null)
-          endAsOperatorType(as)
-          handleAsOperator(as)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(o, expression)
+            handleNoTypeArguments(as)
+            handleNoArguments(as)
+            handleSend(o, as)
+            beginAsOperatorType(as)
+              handleIdentifier(Function, typeReference)
+              handleNoTypeArguments())
+              handleType(Function, null)
+            endAsOperatorType(as)
+            handleAsOperator(as)
+          endParenthesizedExpression(()
           handleNoTypeArguments(()
           beginArguments(()
           endArguments(0, (, ))
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
index 762eb6c..d9c1bcc 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
@@ -223,34 +223,33 @@
                                       parsePrecedenceExpression(,, 1, true)
                                         parseUnaryExpression(,, true)
                                           parsePrimary(,, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(,)
-                                              parseParenthesizedExpression(,)
-                                                parseExpressionInParenthesis(,)
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(o, expression)
-                                                                listener: handleNoTypeArguments(as)
-                                                                parseArgumentsOpt(o)
-                                                                  listener: handleNoArguments(as)
-                                                                listener: handleSend(o, as)
-                                                        parseAsOperatorRest(o)
-                                                          listener: beginAsOperatorType(as)
-                                                          computeTypeAfterIsOrAs(as)
-                                                          listener: handleIdentifier(Function, typeReference)
-                                                          listener: handleNoTypeArguments())
-                                                          listener: handleType(Function, null)
-                                                          listener: endAsOperatorType(as)
-                                                          listener: handleAsOperator(as)
-                                                          skipChainedAsIsOperators(Function)
-                                                    ensureCloseParen(Function, ()
-                                                listener: handleParenthesizedExpression(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                              parseParenthesizedExpressionOrRecordLiteral(,)
+                                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                parseExpression(()
+                                                  parsePrecedenceExpression((, 1, true)
+                                                    parseUnaryExpression((, true)
+                                                      parsePrimary((, expression)
+                                                        parseSendOrFunctionLiteral((, expression)
+                                                          parseSend((, expression)
+                                                            isNextIdentifier(()
+                                                            ensureIdentifier((, expression)
+                                                              listener: handleIdentifier(o, expression)
+                                                            listener: handleNoTypeArguments(as)
+                                                            parseArgumentsOpt(o)
+                                                              listener: handleNoArguments(as)
+                                                            listener: handleSend(o, as)
+                                                    parseAsOperatorRest(o)
+                                                      listener: beginAsOperatorType(as)
+                                                      computeTypeAfterIsOrAs(as)
+                                                      listener: handleIdentifier(Function, typeReference)
+                                                      listener: handleNoTypeArguments())
+                                                      listener: handleType(Function, null)
+                                                      listener: endAsOperatorType(as)
+                                                      listener: handleAsOperator(as)
+                                                      skipChainedAsIsOperators(Function)
+                                                ensureCloseParen(Function, ()
+                                                listener: endParenthesizedExpression(()
                                         parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
                                           listener: handleNoTypeArguments(()
                                           parseArguments())
@@ -327,7 +326,7 @@
                                       parsePrecedenceExpression(,, 1, true)
                                         parseUnaryExpression(,, true)
                                           parsePrimary(,, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(,)
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
                                               listener: handleNoTypeVariables(()
                                               parseFunctionExpression(,)
                                                 listener: beginFunctionExpression(()
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.equivalence_info b/pkg/front_end/parser_testcases/general/issue_45848_01.equivalence_info
index 7bb0fd9..775e230 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01.equivalence_info
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.equivalence_info
@@ -4,4 +4,5 @@
 filters:
   - ignoreListenerArguments
 ignored:
-  - handleParenthesizedExpression
+  - beginParenthesizedExpressionOrRecordLiteral
+  - endParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
index 20a4b28..b4fb437 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
@@ -92,28 +92,30 @@
         handleIdentifier(f, expression)
         handleNoTypeArguments(()
         beginArguments(()
-          handleIdentifier(x, expression)
-          handleNoTypeArguments(<)
-          handleNoArguments(<)
-          handleSend(x, <)
-          beginBinaryExpression(<)
-            handleIdentifier(y, expression)
-            handleNoTypeArguments())
-            handleNoArguments())
-            handleSend(y, ))
-          endBinaryExpression(<)
-          handleParenthesizedExpression(()
-          handleIdentifier(o, expression)
-          handleNoTypeArguments(as)
-          handleNoArguments(as)
-          handleSend(o, as)
-          beginAsOperatorType(as)
-            handleIdentifier(Function, typeReference)
-            handleNoTypeArguments())
-            handleType(Function, null)
-          endAsOperatorType(as)
-          handleAsOperator(as)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, expression)
+            handleNoTypeArguments(<)
+            handleNoArguments(<)
+            handleSend(x, <)
+            beginBinaryExpression(<)
+              handleIdentifier(y, expression)
+              handleNoTypeArguments())
+              handleNoArguments())
+              handleSend(y, ))
+            endBinaryExpression(<)
+          endParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(o, expression)
+            handleNoTypeArguments(as)
+            handleNoArguments(as)
+            handleSend(o, as)
+            beginAsOperatorType(as)
+              handleIdentifier(Function, typeReference)
+              handleNoTypeArguments())
+              handleType(Function, null)
+            endAsOperatorType(as)
+            handleAsOperator(as)
+          endParenthesizedExpression(()
           handleNoTypeArguments(()
           beginArguments(()
           endArguments(0, (, ))
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
index 6649435..a488a13 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
@@ -195,71 +195,69 @@
                                       parsePrecedenceExpression((, 1, true)
                                         parseUnaryExpression((, true)
                                           parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                              parseParenthesizedExpression(()
-                                                parseExpressionInParenthesis(()
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(x, expression)
-                                                                listener: handleNoTypeArguments(<)
-                                                                parseArgumentsOpt(x)
-                                                                  listener: handleNoArguments(<)
-                                                                listener: handleSend(x, <)
-                                                        listener: beginBinaryExpression(<)
-                                                        parsePrecedenceExpression(<, 9, true)
-                                                          parseUnaryExpression(<, true)
-                                                            parsePrimary(<, expression)
-                                                              parseSendOrFunctionLiteral(<, expression)
-                                                                parseSend(<, expression)
-                                                                  isNextIdentifier(<)
-                                                                  ensureIdentifier(<, expression)
-                                                                    listener: handleIdentifier(y, expression)
-                                                                  listener: handleNoTypeArguments())
-                                                                  parseArgumentsOpt(y)
-                                                                    listener: handleNoArguments())
-                                                                  listener: handleSend(y, ))
-                                                        listener: endBinaryExpression(<)
-                                                    ensureCloseParen(y, ()
-                                                listener: handleParenthesizedExpression(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                              parseParenthesizedExpressionOrRecordLiteral(()
+                                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                parseExpression(()
+                                                  parsePrecedenceExpression((, 1, true)
+                                                    parseUnaryExpression((, true)
+                                                      parsePrimary((, expression)
+                                                        parseSendOrFunctionLiteral((, expression)
+                                                          parseSend((, expression)
+                                                            isNextIdentifier(()
+                                                            ensureIdentifier((, expression)
+                                                              listener: handleIdentifier(x, expression)
+                                                            listener: handleNoTypeArguments(<)
+                                                            parseArgumentsOpt(x)
+                                                              listener: handleNoArguments(<)
+                                                            listener: handleSend(x, <)
+                                                    listener: beginBinaryExpression(<)
+                                                    parsePrecedenceExpression(<, 9, true)
+                                                      parseUnaryExpression(<, true)
+                                                        parsePrimary(<, expression)
+                                                          parseSendOrFunctionLiteral(<, expression)
+                                                            parseSend(<, expression)
+                                                              isNextIdentifier(<)
+                                                              ensureIdentifier(<, expression)
+                                                                listener: handleIdentifier(y, expression)
+                                                              listener: handleNoTypeArguments())
+                                                              parseArgumentsOpt(y)
+                                                                listener: handleNoArguments())
+                                                              listener: handleSend(y, ))
+                                                    listener: endBinaryExpression(<)
+                                                ensureCloseParen(y, ()
+                                                listener: endParenthesizedExpression(()
                                     parseExpression(,)
                                       parsePrecedenceExpression(,, 1, true)
                                         parseUnaryExpression(,, true)
                                           parsePrimary(,, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(,)
-                                              parseParenthesizedExpression(,)
-                                                parseExpressionInParenthesis(,)
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(o, expression)
-                                                                listener: handleNoTypeArguments(as)
-                                                                parseArgumentsOpt(o)
-                                                                  listener: handleNoArguments(as)
-                                                                listener: handleSend(o, as)
-                                                        parseAsOperatorRest(o)
-                                                          listener: beginAsOperatorType(as)
-                                                          computeTypeAfterIsOrAs(as)
-                                                          listener: handleIdentifier(Function, typeReference)
-                                                          listener: handleNoTypeArguments())
-                                                          listener: handleType(Function, null)
-                                                          listener: endAsOperatorType(as)
-                                                          listener: handleAsOperator(as)
-                                                          skipChainedAsIsOperators(Function)
-                                                    ensureCloseParen(Function, ()
-                                                listener: handleParenthesizedExpression(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                              parseParenthesizedExpressionOrRecordLiteral(,)
+                                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                parseExpression(()
+                                                  parsePrecedenceExpression((, 1, true)
+                                                    parseUnaryExpression((, true)
+                                                      parsePrimary((, expression)
+                                                        parseSendOrFunctionLiteral((, expression)
+                                                          parseSend((, expression)
+                                                            isNextIdentifier(()
+                                                            ensureIdentifier((, expression)
+                                                              listener: handleIdentifier(o, expression)
+                                                            listener: handleNoTypeArguments(as)
+                                                            parseArgumentsOpt(o)
+                                                              listener: handleNoArguments(as)
+                                                            listener: handleSend(o, as)
+                                                    parseAsOperatorRest(o)
+                                                      listener: beginAsOperatorType(as)
+                                                      computeTypeAfterIsOrAs(as)
+                                                      listener: handleIdentifier(Function, typeReference)
+                                                      listener: handleNoTypeArguments())
+                                                      listener: handleType(Function, null)
+                                                      listener: endAsOperatorType(as)
+                                                      listener: handleAsOperator(as)
+                                                      skipChainedAsIsOperators(Function)
+                                                ensureCloseParen(Function, ()
+                                                listener: endParenthesizedExpression(()
                                         parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
                                           listener: handleNoTypeArguments(()
                                           parseArguments())
@@ -336,7 +334,7 @@
                                       parsePrecedenceExpression(,, 1, true)
                                         parseUnaryExpression(,, true)
                                           parsePrimary(,, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(,)
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
                                               listener: handleNoTypeVariables(()
                                               parseFunctionExpression(,)
                                                 listener: beginFunctionExpression(()
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
index f217da9..d2f0ce1 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
@@ -104,17 +104,18 @@
           endBinaryExpression(<)
           handleLiteralInt(0)
           beginBinaryExpression(>)
-            handleIdentifier(o, expression)
-            handleNoTypeArguments(as)
-            handleNoArguments(as)
-            handleSend(o, as)
-            beginAsOperatorType(as)
-              handleIdentifier(int, typeReference)
-              handleNoTypeArguments())
-              handleType(int, null)
-            endAsOperatorType(as)
-            handleAsOperator(as)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(o, expression)
+              handleNoTypeArguments(as)
+              handleNoArguments(as)
+              handleSend(o, as)
+              beginAsOperatorType(as)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments())
+                handleType(int, null)
+              endAsOperatorType(as)
+              handleAsOperator(as)
+            endParenthesizedExpression(()
           endBinaryExpression(>)
         endArguments(2, (, ))
         handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
index dd24930..bbb86fc 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
@@ -229,34 +229,33 @@
                                         parsePrecedenceExpression(>, 9, true)
                                           parseUnaryExpression(>, true)
                                             parsePrimary(>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>)
-                                                parseParenthesizedExpression(>)
-                                                  parseExpressionInParenthesis(>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseSendOrFunctionLiteral((, expression)
-                                                                parseSend((, expression)
-                                                                  isNextIdentifier(()
-                                                                  ensureIdentifier((, expression)
-                                                                    listener: handleIdentifier(o, expression)
-                                                                  listener: handleNoTypeArguments(as)
-                                                                  parseArgumentsOpt(o)
-                                                                    listener: handleNoArguments(as)
-                                                                  listener: handleSend(o, as)
-                                                          parseAsOperatorRest(o)
-                                                            listener: beginAsOperatorType(as)
-                                                            computeTypeAfterIsOrAs(as)
-                                                            listener: handleIdentifier(int, typeReference)
-                                                            listener: handleNoTypeArguments())
-                                                            listener: handleType(int, null)
-                                                            listener: endAsOperatorType(as)
-                                                            listener: handleAsOperator(as)
-                                                            skipChainedAsIsOperators(int)
-                                                      ensureCloseParen(int, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseSendOrFunctionLiteral((, expression)
+                                                            parseSend((, expression)
+                                                              isNextIdentifier(()
+                                                              ensureIdentifier((, expression)
+                                                                listener: handleIdentifier(o, expression)
+                                                              listener: handleNoTypeArguments(as)
+                                                              parseArgumentsOpt(o)
+                                                                listener: handleNoArguments(as)
+                                                              listener: handleSend(o, as)
+                                                      parseAsOperatorRest(o)
+                                                        listener: beginAsOperatorType(as)
+                                                        computeTypeAfterIsOrAs(as)
+                                                        listener: handleIdentifier(int, typeReference)
+                                                        listener: handleNoTypeArguments())
+                                                        listener: handleType(int, null)
+                                                        listener: endAsOperatorType(as)
+                                                        listener: handleAsOperator(as)
+                                                        skipChainedAsIsOperators(int)
+                                                  ensureCloseParen(int, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>)
                                     listener: endArguments(2, (, ))
                               listener: handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.equivalence_info b/pkg/front_end/parser_testcases/general/issue_45848_02.equivalence_info
index 786165c..50e2c48 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02.equivalence_info
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.equivalence_info
@@ -4,4 +4,5 @@
 filters:
   - ignoreListenerArguments
 ignored:
-  - handleParenthesizedExpression
+  - beginParenthesizedExpressionOrRecordLiteral
+  - endParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
index ab3fe72..ee4ab3b 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
@@ -92,30 +92,32 @@
         handleIdentifier(f, expression)
         handleNoTypeArguments(()
         beginArguments(()
-          handleIdentifier(x, expression)
-          handleNoTypeArguments(<)
-          handleNoArguments(<)
-          handleSend(x, <)
-          beginBinaryExpression(<)
-            handleIdentifier(y, expression)
-            handleNoTypeArguments())
-            handleNoArguments())
-            handleSend(y, ))
-          endBinaryExpression(<)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, expression)
+            handleNoTypeArguments(<)
+            handleNoArguments(<)
+            handleSend(x, <)
+            beginBinaryExpression(<)
+              handleIdentifier(y, expression)
+              handleNoTypeArguments())
+              handleNoArguments())
+              handleSend(y, ))
+            endBinaryExpression(<)
+          endParenthesizedExpression(()
           handleLiteralInt(0)
           beginBinaryExpression(>)
-            handleIdentifier(o, expression)
-            handleNoTypeArguments(as)
-            handleNoArguments(as)
-            handleSend(o, as)
-            beginAsOperatorType(as)
-              handleIdentifier(int, typeReference)
-              handleNoTypeArguments())
-              handleType(int, null)
-            endAsOperatorType(as)
-            handleAsOperator(as)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(o, expression)
+              handleNoTypeArguments(as)
+              handleNoArguments(as)
+              handleSend(o, as)
+              beginAsOperatorType(as)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments())
+                handleType(int, null)
+              endAsOperatorType(as)
+              handleAsOperator(as)
+            endParenthesizedExpression(()
           endBinaryExpression(>)
         endArguments(2, (, ))
         handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
index cf4975c..974c9dc 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
@@ -195,39 +195,38 @@
                                       parsePrecedenceExpression((, 1, true)
                                         parseUnaryExpression((, true)
                                           parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                              parseParenthesizedExpression(()
-                                                parseExpressionInParenthesis(()
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(x, expression)
-                                                                listener: handleNoTypeArguments(<)
-                                                                parseArgumentsOpt(x)
-                                                                  listener: handleNoArguments(<)
-                                                                listener: handleSend(x, <)
-                                                        listener: beginBinaryExpression(<)
-                                                        parsePrecedenceExpression(<, 9, true)
-                                                          parseUnaryExpression(<, true)
-                                                            parsePrimary(<, expression)
-                                                              parseSendOrFunctionLiteral(<, expression)
-                                                                parseSend(<, expression)
-                                                                  isNextIdentifier(<)
-                                                                  ensureIdentifier(<, expression)
-                                                                    listener: handleIdentifier(y, expression)
-                                                                  listener: handleNoTypeArguments())
-                                                                  parseArgumentsOpt(y)
-                                                                    listener: handleNoArguments())
-                                                                  listener: handleSend(y, ))
-                                                        listener: endBinaryExpression(<)
-                                                    ensureCloseParen(y, ()
-                                                listener: handleParenthesizedExpression(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                              parseParenthesizedExpressionOrRecordLiteral(()
+                                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                parseExpression(()
+                                                  parsePrecedenceExpression((, 1, true)
+                                                    parseUnaryExpression((, true)
+                                                      parsePrimary((, expression)
+                                                        parseSendOrFunctionLiteral((, expression)
+                                                          parseSend((, expression)
+                                                            isNextIdentifier(()
+                                                            ensureIdentifier((, expression)
+                                                              listener: handleIdentifier(x, expression)
+                                                            listener: handleNoTypeArguments(<)
+                                                            parseArgumentsOpt(x)
+                                                              listener: handleNoArguments(<)
+                                                            listener: handleSend(x, <)
+                                                    listener: beginBinaryExpression(<)
+                                                    parsePrecedenceExpression(<, 9, true)
+                                                      parseUnaryExpression(<, true)
+                                                        parsePrimary(<, expression)
+                                                          parseSendOrFunctionLiteral(<, expression)
+                                                            parseSend(<, expression)
+                                                              isNextIdentifier(<)
+                                                              ensureIdentifier(<, expression)
+                                                                listener: handleIdentifier(y, expression)
+                                                              listener: handleNoTypeArguments())
+                                                              parseArgumentsOpt(y)
+                                                                listener: handleNoArguments())
+                                                              listener: handleSend(y, ))
+                                                    listener: endBinaryExpression(<)
+                                                ensureCloseParen(y, ()
+                                                listener: endParenthesizedExpression(()
                                     parseExpression(,)
                                       parsePrecedenceExpression(,, 1, true)
                                         parseUnaryExpression(,, true)
@@ -238,34 +237,33 @@
                                         parsePrecedenceExpression(>, 9, true)
                                           parseUnaryExpression(>, true)
                                             parsePrimary(>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>)
-                                                parseParenthesizedExpression(>)
-                                                  parseExpressionInParenthesis(>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseSendOrFunctionLiteral((, expression)
-                                                                parseSend((, expression)
-                                                                  isNextIdentifier(()
-                                                                  ensureIdentifier((, expression)
-                                                                    listener: handleIdentifier(o, expression)
-                                                                  listener: handleNoTypeArguments(as)
-                                                                  parseArgumentsOpt(o)
-                                                                    listener: handleNoArguments(as)
-                                                                  listener: handleSend(o, as)
-                                                          parseAsOperatorRest(o)
-                                                            listener: beginAsOperatorType(as)
-                                                            computeTypeAfterIsOrAs(as)
-                                                            listener: handleIdentifier(int, typeReference)
-                                                            listener: handleNoTypeArguments())
-                                                            listener: handleType(int, null)
-                                                            listener: endAsOperatorType(as)
-                                                            listener: handleAsOperator(as)
-                                                            skipChainedAsIsOperators(int)
-                                                      ensureCloseParen(int, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseSendOrFunctionLiteral((, expression)
+                                                            parseSend((, expression)
+                                                              isNextIdentifier(()
+                                                              ensureIdentifier((, expression)
+                                                                listener: handleIdentifier(o, expression)
+                                                              listener: handleNoTypeArguments(as)
+                                                              parseArgumentsOpt(o)
+                                                                listener: handleNoArguments(as)
+                                                              listener: handleSend(o, as)
+                                                      parseAsOperatorRest(o)
+                                                        listener: beginAsOperatorType(as)
+                                                        computeTypeAfterIsOrAs(as)
+                                                        listener: handleIdentifier(int, typeReference)
+                                                        listener: handleNoTypeArguments())
+                                                        listener: handleType(int, null)
+                                                        listener: endAsOperatorType(as)
+                                                        listener: handleAsOperator(as)
+                                                        skipChainedAsIsOperators(int)
+                                                  ensureCloseParen(int, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>)
                                     listener: endArguments(2, (, ))
                               listener: handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
index 911ef38..812cb1b 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
@@ -111,29 +111,31 @@
             handleNoArguments(,)
             handleSend(y, ,)
           endBinaryExpression(<)
-          handleIdentifier(o, expression)
-          handleNoTypeArguments(as)
-          handleNoArguments(as)
-          handleSend(o, as)
-          beginAsOperatorType(as)
-            handleIdentifier(int, typeReference)
-            handleNoTypeArguments())
-            handleType(int, null)
-          endAsOperatorType(as)
-          handleAsOperator(as)
-          handleParenthesizedExpression(()
-          beginBinaryExpression(>)
-            handleIdentifier(p, expression)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(o, expression)
             handleNoTypeArguments(as)
             handleNoArguments(as)
-            handleSend(p, as)
+            handleSend(o, as)
             beginAsOperatorType(as)
               handleIdentifier(int, typeReference)
               handleNoTypeArguments())
               handleType(int, null)
             endAsOperatorType(as)
             handleAsOperator(as)
-            handleParenthesizedExpression(()
+          endParenthesizedExpression(()
+          beginBinaryExpression(>)
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(p, expression)
+              handleNoTypeArguments(as)
+              handleNoArguments(as)
+              handleSend(p, as)
+              beginAsOperatorType(as)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments())
+                handleType(int, null)
+              endAsOperatorType(as)
+              handleAsOperator(as)
+            endParenthesizedExpression(()
           endBinaryExpression(>)
         endArguments(2, (, ))
         handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
index 98b3ef5..9a37bbb 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
@@ -235,66 +235,64 @@
                                       parsePrecedenceExpression(,, 1, true)
                                         parseUnaryExpression(,, true)
                                           parsePrimary(,, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(,)
-                                              parseParenthesizedExpression(,)
-                                                parseExpressionInParenthesis(,)
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(o, expression)
-                                                                listener: handleNoTypeArguments(as)
-                                                                parseArgumentsOpt(o)
-                                                                  listener: handleNoArguments(as)
-                                                                listener: handleSend(o, as)
-                                                        parseAsOperatorRest(o)
-                                                          listener: beginAsOperatorType(as)
-                                                          computeTypeAfterIsOrAs(as)
-                                                          listener: handleIdentifier(int, typeReference)
-                                                          listener: handleNoTypeArguments())
-                                                          listener: handleType(int, null)
-                                                          listener: endAsOperatorType(as)
-                                                          listener: handleAsOperator(as)
-                                                          skipChainedAsIsOperators(int)
-                                                    ensureCloseParen(int, ()
-                                                listener: handleParenthesizedExpression(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                              parseParenthesizedExpressionOrRecordLiteral(,)
+                                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                parseExpression(()
+                                                  parsePrecedenceExpression((, 1, true)
+                                                    parseUnaryExpression((, true)
+                                                      parsePrimary((, expression)
+                                                        parseSendOrFunctionLiteral((, expression)
+                                                          parseSend((, expression)
+                                                            isNextIdentifier(()
+                                                            ensureIdentifier((, expression)
+                                                              listener: handleIdentifier(o, expression)
+                                                            listener: handleNoTypeArguments(as)
+                                                            parseArgumentsOpt(o)
+                                                              listener: handleNoArguments(as)
+                                                            listener: handleSend(o, as)
+                                                    parseAsOperatorRest(o)
+                                                      listener: beginAsOperatorType(as)
+                                                      computeTypeAfterIsOrAs(as)
+                                                      listener: handleIdentifier(int, typeReference)
+                                                      listener: handleNoTypeArguments())
+                                                      listener: handleType(int, null)
+                                                      listener: endAsOperatorType(as)
+                                                      listener: handleAsOperator(as)
+                                                      skipChainedAsIsOperators(int)
+                                                ensureCloseParen(int, ()
+                                                listener: endParenthesizedExpression(()
                                         listener: beginBinaryExpression(>)
                                         parsePrecedenceExpression(>, 9, true)
                                           parseUnaryExpression(>, true)
                                             parsePrimary(>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>)
-                                                parseParenthesizedExpression(>)
-                                                  parseExpressionInParenthesis(>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseSendOrFunctionLiteral((, expression)
-                                                                parseSend((, expression)
-                                                                  isNextIdentifier(()
-                                                                  ensureIdentifier((, expression)
-                                                                    listener: handleIdentifier(p, expression)
-                                                                  listener: handleNoTypeArguments(as)
-                                                                  parseArgumentsOpt(p)
-                                                                    listener: handleNoArguments(as)
-                                                                  listener: handleSend(p, as)
-                                                          parseAsOperatorRest(p)
-                                                            listener: beginAsOperatorType(as)
-                                                            computeTypeAfterIsOrAs(as)
-                                                            listener: handleIdentifier(int, typeReference)
-                                                            listener: handleNoTypeArguments())
-                                                            listener: handleType(int, null)
-                                                            listener: endAsOperatorType(as)
-                                                            listener: handleAsOperator(as)
-                                                            skipChainedAsIsOperators(int)
-                                                      ensureCloseParen(int, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseSendOrFunctionLiteral((, expression)
+                                                            parseSend((, expression)
+                                                              isNextIdentifier(()
+                                                              ensureIdentifier((, expression)
+                                                                listener: handleIdentifier(p, expression)
+                                                              listener: handleNoTypeArguments(as)
+                                                              parseArgumentsOpt(p)
+                                                                listener: handleNoArguments(as)
+                                                              listener: handleSend(p, as)
+                                                      parseAsOperatorRest(p)
+                                                        listener: beginAsOperatorType(as)
+                                                        computeTypeAfterIsOrAs(as)
+                                                        listener: handleIdentifier(int, typeReference)
+                                                        listener: handleNoTypeArguments())
+                                                        listener: handleType(int, null)
+                                                        listener: endAsOperatorType(as)
+                                                        listener: handleAsOperator(as)
+                                                        skipChainedAsIsOperators(int)
+                                                  ensureCloseParen(int, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>)
                                     listener: endArguments(2, (, ))
                               listener: handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.equivalence_info b/pkg/front_end/parser_testcases/general/issue_45848_03.equivalence_info
index e17dc1c..7754efb 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03.equivalence_info
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.equivalence_info
@@ -4,4 +4,5 @@
 filters:
   - ignoreListenerArguments
 ignored:
-  - handleParenthesizedExpression
+  - beginParenthesizedExpressionOrRecordLiteral
+  - endParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
index 986780c..b2347f2 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
@@ -101,40 +101,43 @@
         handleIdentifier(f, expression)
         handleNoTypeArguments(()
         beginArguments(()
-          handleIdentifier(x, expression)
-          handleNoTypeArguments(<)
-          handleNoArguments(<)
-          handleSend(x, <)
-          beginBinaryExpression(<)
-            handleIdentifier(y, expression)
-            handleNoTypeArguments())
-            handleNoArguments())
-            handleSend(y, ))
-          endBinaryExpression(<)
-          handleParenthesizedExpression(()
-          handleIdentifier(o, expression)
-          handleNoTypeArguments(as)
-          handleNoArguments(as)
-          handleSend(o, as)
-          beginAsOperatorType(as)
-            handleIdentifier(int, typeReference)
-            handleNoTypeArguments())
-            handleType(int, null)
-          endAsOperatorType(as)
-          handleAsOperator(as)
-          handleParenthesizedExpression(()
-          beginBinaryExpression(>)
-            handleIdentifier(p, expression)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, expression)
+            handleNoTypeArguments(<)
+            handleNoArguments(<)
+            handleSend(x, <)
+            beginBinaryExpression(<)
+              handleIdentifier(y, expression)
+              handleNoTypeArguments())
+              handleNoArguments())
+              handleSend(y, ))
+            endBinaryExpression(<)
+          endParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(o, expression)
             handleNoTypeArguments(as)
             handleNoArguments(as)
-            handleSend(p, as)
+            handleSend(o, as)
             beginAsOperatorType(as)
               handleIdentifier(int, typeReference)
               handleNoTypeArguments())
               handleType(int, null)
             endAsOperatorType(as)
             handleAsOperator(as)
-            handleParenthesizedExpression(()
+          endParenthesizedExpression(()
+          beginBinaryExpression(>)
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(p, expression)
+              handleNoTypeArguments(as)
+              handleNoArguments(as)
+              handleSend(p, as)
+              beginAsOperatorType(as)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments())
+                handleType(int, null)
+              endAsOperatorType(as)
+              handleAsOperator(as)
+            endParenthesizedExpression(()
           endBinaryExpression(>)
         endArguments(2, (, ))
         handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
index c0c86e7..388720f 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
@@ -207,103 +207,100 @@
                                       parsePrecedenceExpression((, 1, true)
                                         parseUnaryExpression((, true)
                                           parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                              parseParenthesizedExpression(()
-                                                parseExpressionInParenthesis(()
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(x, expression)
-                                                                listener: handleNoTypeArguments(<)
-                                                                parseArgumentsOpt(x)
-                                                                  listener: handleNoArguments(<)
-                                                                listener: handleSend(x, <)
-                                                        listener: beginBinaryExpression(<)
-                                                        parsePrecedenceExpression(<, 9, true)
-                                                          parseUnaryExpression(<, true)
-                                                            parsePrimary(<, expression)
-                                                              parseSendOrFunctionLiteral(<, expression)
-                                                                parseSend(<, expression)
-                                                                  isNextIdentifier(<)
-                                                                  ensureIdentifier(<, expression)
-                                                                    listener: handleIdentifier(y, expression)
-                                                                  listener: handleNoTypeArguments())
-                                                                  parseArgumentsOpt(y)
-                                                                    listener: handleNoArguments())
-                                                                  listener: handleSend(y, ))
-                                                        listener: endBinaryExpression(<)
-                                                    ensureCloseParen(y, ()
-                                                listener: handleParenthesizedExpression(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                              parseParenthesizedExpressionOrRecordLiteral(()
+                                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                parseExpression(()
+                                                  parsePrecedenceExpression((, 1, true)
+                                                    parseUnaryExpression((, true)
+                                                      parsePrimary((, expression)
+                                                        parseSendOrFunctionLiteral((, expression)
+                                                          parseSend((, expression)
+                                                            isNextIdentifier(()
+                                                            ensureIdentifier((, expression)
+                                                              listener: handleIdentifier(x, expression)
+                                                            listener: handleNoTypeArguments(<)
+                                                            parseArgumentsOpt(x)
+                                                              listener: handleNoArguments(<)
+                                                            listener: handleSend(x, <)
+                                                    listener: beginBinaryExpression(<)
+                                                    parsePrecedenceExpression(<, 9, true)
+                                                      parseUnaryExpression(<, true)
+                                                        parsePrimary(<, expression)
+                                                          parseSendOrFunctionLiteral(<, expression)
+                                                            parseSend(<, expression)
+                                                              isNextIdentifier(<)
+                                                              ensureIdentifier(<, expression)
+                                                                listener: handleIdentifier(y, expression)
+                                                              listener: handleNoTypeArguments())
+                                                              parseArgumentsOpt(y)
+                                                                listener: handleNoArguments())
+                                                              listener: handleSend(y, ))
+                                                    listener: endBinaryExpression(<)
+                                                ensureCloseParen(y, ()
+                                                listener: endParenthesizedExpression(()
                                     parseExpression(,)
                                       parsePrecedenceExpression(,, 1, true)
                                         parseUnaryExpression(,, true)
                                           parsePrimary(,, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(,)
-                                              parseParenthesizedExpression(,)
-                                                parseExpressionInParenthesis(,)
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(o, expression)
-                                                                listener: handleNoTypeArguments(as)
-                                                                parseArgumentsOpt(o)
-                                                                  listener: handleNoArguments(as)
-                                                                listener: handleSend(o, as)
-                                                        parseAsOperatorRest(o)
-                                                          listener: beginAsOperatorType(as)
-                                                          computeTypeAfterIsOrAs(as)
-                                                          listener: handleIdentifier(int, typeReference)
-                                                          listener: handleNoTypeArguments())
-                                                          listener: handleType(int, null)
-                                                          listener: endAsOperatorType(as)
-                                                          listener: handleAsOperator(as)
-                                                          skipChainedAsIsOperators(int)
-                                                    ensureCloseParen(int, ()
-                                                listener: handleParenthesizedExpression(()
+                                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                              parseParenthesizedExpressionOrRecordLiteral(,)
+                                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                parseExpression(()
+                                                  parsePrecedenceExpression((, 1, true)
+                                                    parseUnaryExpression((, true)
+                                                      parsePrimary((, expression)
+                                                        parseSendOrFunctionLiteral((, expression)
+                                                          parseSend((, expression)
+                                                            isNextIdentifier(()
+                                                            ensureIdentifier((, expression)
+                                                              listener: handleIdentifier(o, expression)
+                                                            listener: handleNoTypeArguments(as)
+                                                            parseArgumentsOpt(o)
+                                                              listener: handleNoArguments(as)
+                                                            listener: handleSend(o, as)
+                                                    parseAsOperatorRest(o)
+                                                      listener: beginAsOperatorType(as)
+                                                      computeTypeAfterIsOrAs(as)
+                                                      listener: handleIdentifier(int, typeReference)
+                                                      listener: handleNoTypeArguments())
+                                                      listener: handleType(int, null)
+                                                      listener: endAsOperatorType(as)
+                                                      listener: handleAsOperator(as)
+                                                      skipChainedAsIsOperators(int)
+                                                ensureCloseParen(int, ()
+                                                listener: endParenthesizedExpression(()
                                         listener: beginBinaryExpression(>)
                                         parsePrecedenceExpression(>, 9, true)
                                           parseUnaryExpression(>, true)
                                             parsePrimary(>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>)
-                                                parseParenthesizedExpression(>)
-                                                  parseExpressionInParenthesis(>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseSendOrFunctionLiteral((, expression)
-                                                                parseSend((, expression)
-                                                                  isNextIdentifier(()
-                                                                  ensureIdentifier((, expression)
-                                                                    listener: handleIdentifier(p, expression)
-                                                                  listener: handleNoTypeArguments(as)
-                                                                  parseArgumentsOpt(p)
-                                                                    listener: handleNoArguments(as)
-                                                                  listener: handleSend(p, as)
-                                                          parseAsOperatorRest(p)
-                                                            listener: beginAsOperatorType(as)
-                                                            computeTypeAfterIsOrAs(as)
-                                                            listener: handleIdentifier(int, typeReference)
-                                                            listener: handleNoTypeArguments())
-                                                            listener: handleType(int, null)
-                                                            listener: endAsOperatorType(as)
-                                                            listener: handleAsOperator(as)
-                                                            skipChainedAsIsOperators(int)
-                                                      ensureCloseParen(int, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseSendOrFunctionLiteral((, expression)
+                                                            parseSend((, expression)
+                                                              isNextIdentifier(()
+                                                              ensureIdentifier((, expression)
+                                                                listener: handleIdentifier(p, expression)
+                                                              listener: handleNoTypeArguments(as)
+                                                              parseArgumentsOpt(p)
+                                                                listener: handleNoArguments(as)
+                                                              listener: handleSend(p, as)
+                                                      parseAsOperatorRest(p)
+                                                        listener: beginAsOperatorType(as)
+                                                        computeTypeAfterIsOrAs(as)
+                                                        listener: handleIdentifier(int, typeReference)
+                                                        listener: handleNoTypeArguments())
+                                                        listener: handleType(int, null)
+                                                        listener: endAsOperatorType(as)
+                                                        listener: handleAsOperator(as)
+                                                        skipChainedAsIsOperators(int)
+                                                  ensureCloseParen(int, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>)
                                     listener: endArguments(2, (, ))
                               listener: handleSend(f, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47008_01.dart.expect b/pkg/front_end/parser_testcases/general/issue_47008_01.dart.expect
index c08a421..41ad8b3 100644
--- a/pkg/front_end/parser_testcases/general/issue_47008_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47008_01.dart.expect
@@ -35,8 +35,9 @@
           endBinaryExpression(<)
           handleLiteralInt(1)
           beginBinaryExpression(>>)
-            handleLiteralInt(2)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleLiteralInt(2)
+            endParenthesizedExpression(()
           endBinaryExpression(>>)
         endArguments(3, (, ))
         handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47008_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_47008_01.dart.intertwined.expect
index cb4e3f7..45bab8d 100644
--- a/pkg/front_end/parser_testcases/general/issue_47008_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47008_01.dart.intertwined.expect
@@ -112,18 +112,17 @@
                                         parsePrecedenceExpression(>>, 13, true)
                                           parseUnaryExpression(>>, true)
                                             parsePrimary(>>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>>)
-                                                parseParenthesizedExpression(>>)
-                                                  parseExpressionInParenthesis(>>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseLiteralInt(()
-                                                                listener: handleLiteralInt(2)
-                                                      ensureCloseParen(2, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseLiteralInt(()
+                                                            listener: handleLiteralInt(2)
+                                                  ensureCloseParen(2, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>>)
                                     listener: endArguments(3, (, ))
                               listener: handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47008_02.dart.expect b/pkg/front_end/parser_testcases/general/issue_47008_02.dart.expect
index db45d9b..2f64398 100644
--- a/pkg/front_end/parser_testcases/general/issue_47008_02.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47008_02.dart.expect
@@ -45,8 +45,9 @@
           endBinaryExpression(<)
           handleLiteralInt(1)
           beginBinaryExpression(>>>)
-            handleLiteralInt(2)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleLiteralInt(2)
+            endParenthesizedExpression(()
           endBinaryExpression(>>>)
         endArguments(4, (, ))
         handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47008_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_47008_02.dart.intertwined.expect
index 075efbb..0cfb7ed 100644
--- a/pkg/front_end/parser_testcases/general/issue_47008_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47008_02.dart.intertwined.expect
@@ -139,18 +139,17 @@
                                         parsePrecedenceExpression(>>>, 13, true)
                                           parseUnaryExpression(>>>, true)
                                             parsePrimary(>>>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>>>)
-                                                parseParenthesizedExpression(>>>)
-                                                  parseExpressionInParenthesis(>>>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseLiteralInt(()
-                                                                listener: handleLiteralInt(2)
-                                                      ensureCloseParen(2, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>>>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>>>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseLiteralInt(()
+                                                            listener: handleLiteralInt(2)
+                                                  ensureCloseParen(2, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>>>)
                                     listener: endArguments(4, (, ))
                               listener: handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47009_01.dart.expect b/pkg/front_end/parser_testcases/general/issue_47009_01.dart.expect
index 2842fa7..5e66939 100644
--- a/pkg/front_end/parser_testcases/general/issue_47009_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47009_01.dart.expect
@@ -28,8 +28,9 @@
           handleNoArguments(>)
           handleSend(as, >)
           beginBinaryExpression(>)
-            handleLiteralInt(1)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleLiteralInt(1)
+            endParenthesizedExpression(()
           endBinaryExpression(>)
         endArguments(2, (, ))
         handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47009_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_47009_01.dart.intertwined.expect
index abc7128..5136298 100644
--- a/pkg/front_end/parser_testcases/general/issue_47009_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47009_01.dart.intertwined.expect
@@ -94,18 +94,17 @@
                                         parsePrecedenceExpression(>, 9, true)
                                           parseUnaryExpression(>, true)
                                             parsePrimary(>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>)
-                                                parseParenthesizedExpression(>)
-                                                  parseExpressionInParenthesis(>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseLiteralInt(()
-                                                                listener: handleLiteralInt(1)
-                                                      ensureCloseParen(1, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseLiteralInt(()
+                                                            listener: handleLiteralInt(1)
+                                                  ensureCloseParen(1, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>)
                                     listener: endArguments(2, (, ))
                               listener: handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47009_02.dart.expect b/pkg/front_end/parser_testcases/general/issue_47009_02.dart.expect
index 398a61b..f02fcc7 100644
--- a/pkg/front_end/parser_testcases/general/issue_47009_02.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47009_02.dart.expect
@@ -38,8 +38,9 @@
           handleNoArguments(>>)
           handleSend(as, >>)
           beginBinaryExpression(>>)
-            handleLiteralInt(1)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleLiteralInt(1)
+            endParenthesizedExpression(()
           endBinaryExpression(>>)
         endArguments(3, (, ))
         handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47009_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_47009_02.dart.intertwined.expect
index d752307..42a1ecf 100644
--- a/pkg/front_end/parser_testcases/general/issue_47009_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47009_02.dart.intertwined.expect
@@ -121,18 +121,17 @@
                                         parsePrecedenceExpression(>>, 13, true)
                                           parseUnaryExpression(>>, true)
                                             parsePrimary(>>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>>)
-                                                parseParenthesizedExpression(>>)
-                                                  parseExpressionInParenthesis(>>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseLiteralInt(()
-                                                                listener: handleLiteralInt(1)
-                                                      ensureCloseParen(1, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseLiteralInt(()
+                                                            listener: handleLiteralInt(1)
+                                                  ensureCloseParen(1, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>>)
                                     listener: endArguments(3, (, ))
                               listener: handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47009_03.dart.expect b/pkg/front_end/parser_testcases/general/issue_47009_03.dart.expect
index f6b6a1f..74215b8 100644
--- a/pkg/front_end/parser_testcases/general/issue_47009_03.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47009_03.dart.expect
@@ -48,8 +48,9 @@
           handleNoArguments(>>>)
           handleSend(as, >>>)
           beginBinaryExpression(>>>)
-            handleLiteralInt(1)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleLiteralInt(1)
+            endParenthesizedExpression(()
           endBinaryExpression(>>>)
         endArguments(4, (, ))
         handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/general/issue_47009_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_47009_03.dart.intertwined.expect
index 935f19a..4194aa5 100644
--- a/pkg/front_end/parser_testcases/general/issue_47009_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_47009_03.dart.intertwined.expect
@@ -148,18 +148,17 @@
                                         parsePrecedenceExpression(>>>, 13, true)
                                           parseUnaryExpression(>>>, true)
                                             parsePrimary(>>>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>>>)
-                                                parseParenthesizedExpression(>>>)
-                                                  parseExpressionInParenthesis(>>>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseLiteralInt(()
-                                                                listener: handleLiteralInt(1)
-                                                      ensureCloseParen(1, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>>>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>>>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseLiteralInt(()
+                                                            listener: handleLiteralInt(1)
+                                                  ensureCloseParen(1, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>>>)
                                     listener: endArguments(4, (, ))
                               listener: handleSend(a, ;)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
index eb681bb..6f4e90c 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
@@ -19,16 +19,17 @@
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(e, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(e, !)
-        handleNonNullAssertExpression(!)
-        handleNoTypeArguments(()
-        beginArguments(()
-        endArguments(0, (, ))
-        handleSend((, ))
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(e, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(e, !)
+          handleNonNullAssertExpression(!)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend((, ))
+        endParenthesizedExpression(()
         handleNonNullAssertExpression(!)
         beginTypeArguments(<)
           handleIdentifier(int, typeReference)
@@ -40,17 +41,18 @@
         handleSend((, ))
         handleNonNullAssertExpression(!)
         handleExpressionStatement(;)
-        handleIdentifier(e, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(e, !)
-        handleNonNullAssertExpression(!)
-        handleNoTypeArguments(()
-        beginArguments(()
-        endArguments(0, (, ))
-        handleSend((, ))
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(e, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(e, !)
+          handleNonNullAssertExpression(!)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend((, ))
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         beginTypeArguments(<)
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
index 1c24308c..ea105b8 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
@@ -48,33 +48,32 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(e, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(e)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(e, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                        parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg', false)
-                                          listener: handleNoTypeArguments(()
-                                          parseArguments(!)
-                                            parseArgumentsRest(()
-                                              listener: beginArguments(()
-                                              listener: endArguments(0, (, ))
-                                          listener: handleSend((, ))
-                                    ensureCloseParen(), ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(e, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(e)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(e, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                    parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg', false)
+                                      listener: handleNoTypeArguments(()
+                                      parseArguments(!)
+                                        parseArgumentsRest(()
+                                          listener: beginArguments(()
+                                          listener: endArguments(0, (, ))
+                                      listener: handleSend((, ))
+                                ensureCloseParen(), ()
+                                listener: endParenthesizedExpression(()
                         listener: handleNonNullAssertExpression(!)
                         listener: beginTypeArguments(<)
                         listener: handleIdentifier(int, typeReference)
@@ -101,34 +100,33 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(e, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(e)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(e, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                        parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg', false)
-                                          listener: handleNoTypeArguments(()
-                                          parseArguments(!)
-                                            parseArgumentsRest(()
-                                              listener: beginArguments(()
-                                              listener: endArguments(0, (, ))
-                                          listener: handleSend((, ))
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(e, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(e)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(e, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                    parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg', false)
+                                      listener: handleNoTypeArguments(()
+                                      parseArguments(!)
+                                        parseArgumentsRest(()
+                                          listener: beginArguments(()
+                                          listener: endArguments(0, (, ))
+                                      listener: handleSend((, ))
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginTypeArguments(<)
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
index 4796374..fc88f50 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
@@ -19,18 +19,19 @@
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(e, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(e, !)
-        handleNonNullAssertExpression(!)
-        handleIdentifier(f, expressionContinuation)
-        handleNoTypeArguments(()
-        beginArguments(()
-        endArguments(0, (, ))
-        handleSend(f, ))
-        handleEndingBinaryExpression(.)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(e, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(e, !)
+          handleNonNullAssertExpression(!)
+          handleIdentifier(f, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(f, ))
+          handleEndingBinaryExpression(.)
+        endParenthesizedExpression(()
         handleNonNullAssertExpression(!)
         beginTypeArguments(<)
           handleIdentifier(int, typeReference)
@@ -41,19 +42,20 @@
         endArguments(0, (, ))
         handleSend((, ))
         handleExpressionStatement(;)
-        handleIdentifier(e, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(e, !)
-        handleNonNullAssertExpression(!)
-        handleIdentifier(f, expressionContinuation)
-        handleNoTypeArguments(()
-        beginArguments(()
-        endArguments(0, (, ))
-        handleSend(f, !)
-        handleEndingBinaryExpression(.)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(e, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(e, !)
+          handleNonNullAssertExpression(!)
+          handleIdentifier(f, expressionContinuation)
+          handleNoTypeArguments(()
+          beginArguments(()
+          endArguments(0, (, ))
+          handleSend(f, !)
+          handleEndingBinaryExpression(.)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         beginTypeArguments(<)
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
index 3e3a9f3..91a81dd 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
@@ -48,41 +48,40 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(e, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(e)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(e, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            looksLikeFunctionBody())
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(f, expressionContinuation)
-                                              listener: handleNoTypeArguments(()
-                                              parseArgumentsOpt(f)
-                                                parseArguments(f)
-                                                  parseArgumentsRest(()
-                                                    listener: beginArguments(()
-                                                    listener: endArguments(0, (, ))
-                                              listener: handleSend(f, ))
-                                        listener: handleEndingBinaryExpression(.)
-                                    ensureCloseParen(), ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(e, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(e)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(e, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        looksLikeFunctionBody())
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(f, expressionContinuation)
+                                          listener: handleNoTypeArguments(()
+                                          parseArgumentsOpt(f)
+                                            parseArguments(f)
+                                              parseArgumentsRest(()
+                                                listener: beginArguments(()
+                                                listener: endArguments(0, (, ))
+                                          listener: handleSend(f, ))
+                                    listener: handleEndingBinaryExpression(.)
+                                ensureCloseParen(), ()
+                                listener: endParenthesizedExpression(()
                         listener: handleNonNullAssertExpression(!)
                         listener: beginTypeArguments(<)
                         listener: handleIdentifier(int, typeReference)
@@ -108,42 +107,41 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(e, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(e)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(e, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            looksLikeFunctionBody(!)
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(f, expressionContinuation)
-                                              listener: handleNoTypeArguments(()
-                                              parseArgumentsOpt(f)
-                                                parseArguments(f)
-                                                  parseArgumentsRest(()
-                                                    listener: beginArguments(()
-                                                    listener: endArguments(0, (, ))
-                                              listener: handleSend(f, !)
-                                        listener: handleEndingBinaryExpression(.)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(e, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(e)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(e, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        looksLikeFunctionBody(!)
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(f, expressionContinuation)
+                                          listener: handleNoTypeArguments(()
+                                          parseArgumentsOpt(f)
+                                            parseArguments(f)
+                                              parseArgumentsRest(()
+                                                listener: beginArguments(()
+                                                listener: endArguments(0, (, ))
+                                          listener: handleSend(f, !)
+                                    listener: handleEndingBinaryExpression(.)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginTypeArguments(<)
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.expect
index 6185fd0..c67ca5e 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.expect
@@ -10,27 +10,28 @@
       handleNoTypeVariables(=>)
       handleNoFormalParameters(=>, MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
-      handleIdentifier(Zone, expression)
-      handleNoTypeArguments(.)
-      handleNoArguments(.)
-      handleSend(Zone, .)
-      handleIdentifier(current, expressionContinuation)
-      handleNoTypeArguments([)
-      handleNoArguments([)
-      handleSend(current, [)
-      handleEndingBinaryExpression(.)
-      handleIdentifier(logKey, expression)
-      handleNoTypeArguments(])
-      handleNoArguments(])
-      handleSend(logKey, ])
-      handleIndexedExpression(null, [, ])
-      beginAsOperatorType(as)
-        handleIdentifier(Logger, typeReference)
-        handleNoTypeArguments(?)
-        handleType(Logger, ?)
-      endAsOperatorType(as)
-      handleAsOperator(as)
-      handleParenthesizedExpression(()
+      beginParenthesizedExpressionOrRecordLiteral(()
+        handleIdentifier(Zone, expression)
+        handleNoTypeArguments(.)
+        handleNoArguments(.)
+        handleSend(Zone, .)
+        handleIdentifier(current, expressionContinuation)
+        handleNoTypeArguments([)
+        handleNoArguments([)
+        handleSend(current, [)
+        handleEndingBinaryExpression(.)
+        handleIdentifier(logKey, expression)
+        handleNoTypeArguments(])
+        handleNoArguments(])
+        handleSend(logKey, ])
+        handleIndexedExpression(null, [, ])
+        beginAsOperatorType(as)
+          handleIdentifier(Logger, typeReference)
+          handleNoTypeArguments(?)
+          handleType(Logger, ?)
+        endAsOperatorType(as)
+        handleAsOperator(as)
+      endParenthesizedExpression(()
       beginBinaryExpression(??)
         handleIdentifier(_default, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.intertwined.expect
index e244fe9..571fd2c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39697_prime.dart.intertwined.expect
@@ -28,60 +28,59 @@
               parsePrecedenceExpression(=>, 1, true)
                 parseUnaryExpression(=>, true)
                   parsePrimary(=>, expression)
-                    parseParenthesizedExpressionOrFunctionLiteral(=>)
-                      parseParenthesizedExpression(=>)
-                        parseExpressionInParenthesis(=>)
-                          parseExpressionInParenthesisRest(()
-                            parseExpression(()
-                              parsePrecedenceExpression((, 1, true)
-                                parseUnaryExpression((, true)
-                                  parsePrimary((, expression)
-                                    parseSendOrFunctionLiteral((, expression)
-                                      parseSend((, expression)
-                                        isNextIdentifier(()
-                                        ensureIdentifier((, expression)
-                                          listener: handleIdentifier(Zone, expression)
-                                        listener: handleNoTypeArguments(.)
-                                        parseArgumentsOpt(Zone)
-                                          listener: handleNoArguments(.)
-                                        listener: handleSend(Zone, .)
-                                parsePrimary(., expressionContinuation)
-                                  parseSendOrFunctionLiteral(., expressionContinuation)
-                                    parseSend(., expressionContinuation)
-                                      isNextIdentifier(.)
-                                      ensureIdentifier(., expressionContinuation)
-                                        listener: handleIdentifier(current, expressionContinuation)
-                                      listener: handleNoTypeArguments([)
-                                      parseArgumentsOpt(current)
-                                        listener: handleNoArguments([)
-                                      listener: handleSend(current, [)
-                                listener: handleEndingBinaryExpression(.)
-                                parseArgumentOrIndexStar(current, Instance of 'NoTypeParamOrArg', false)
-                                  parseExpression([)
-                                    parsePrecedenceExpression([, 1, true)
-                                      parseUnaryExpression([, true)
-                                        parsePrimary([, expression)
-                                          parseSendOrFunctionLiteral([, expression)
-                                            parseSend([, expression)
-                                              isNextIdentifier([)
-                                              ensureIdentifier([, expression)
-                                                listener: handleIdentifier(logKey, expression)
-                                              listener: handleNoTypeArguments(])
-                                              parseArgumentsOpt(logKey)
-                                                listener: handleNoArguments(])
-                                              listener: handleSend(logKey, ])
-                                  listener: handleIndexedExpression(null, [, ])
-                                parseAsOperatorRest(])
-                                  listener: beginAsOperatorType(as)
-                                  computeTypeAfterIsOrAs(as)
-                                  listener: handleIdentifier(Logger, typeReference)
-                                  listener: handleNoTypeArguments(?)
-                                  listener: handleType(Logger, ?)
-                                  listener: endAsOperatorType(as)
-                                  listener: handleAsOperator(as)
-                                  skipChainedAsIsOperators(?)
-                            ensureCloseParen(?, ()
-                        listener: handleParenthesizedExpression(()
+                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=>)
+                      parseParenthesizedExpressionOrRecordLiteral(=>)
+                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseSendOrFunctionLiteral((, expression)
+                                  parseSend((, expression)
+                                    isNextIdentifier(()
+                                    ensureIdentifier((, expression)
+                                      listener: handleIdentifier(Zone, expression)
+                                    listener: handleNoTypeArguments(.)
+                                    parseArgumentsOpt(Zone)
+                                      listener: handleNoArguments(.)
+                                    listener: handleSend(Zone, .)
+                            parsePrimary(., expressionContinuation)
+                              parseSendOrFunctionLiteral(., expressionContinuation)
+                                parseSend(., expressionContinuation)
+                                  isNextIdentifier(.)
+                                  ensureIdentifier(., expressionContinuation)
+                                    listener: handleIdentifier(current, expressionContinuation)
+                                  listener: handleNoTypeArguments([)
+                                  parseArgumentsOpt(current)
+                                    listener: handleNoArguments([)
+                                  listener: handleSend(current, [)
+                            listener: handleEndingBinaryExpression(.)
+                            parseArgumentOrIndexStar(current, Instance of 'NoTypeParamOrArg', false)
+                              parseExpression([)
+                                parsePrecedenceExpression([, 1, true)
+                                  parseUnaryExpression([, true)
+                                    parsePrimary([, expression)
+                                      parseSendOrFunctionLiteral([, expression)
+                                        parseSend([, expression)
+                                          isNextIdentifier([)
+                                          ensureIdentifier([, expression)
+                                            listener: handleIdentifier(logKey, expression)
+                                          listener: handleNoTypeArguments(])
+                                          parseArgumentsOpt(logKey)
+                                            listener: handleNoArguments(])
+                                          listener: handleSend(logKey, ])
+                              listener: handleIndexedExpression(null, [, ])
+                            parseAsOperatorRest(])
+                              listener: beginAsOperatorType(as)
+                              computeTypeAfterIsOrAs(as)
+                              listener: handleIdentifier(Logger, typeReference)
+                              listener: handleNoTypeArguments(?)
+                              listener: handleType(Logger, ?)
+                              listener: endAsOperatorType(as)
+                              listener: handleAsOperator(as)
+                              skipChainedAsIsOperators(?)
+                        ensureCloseParen(?, ()
+                        listener: endParenthesizedExpression(()
                 listener: beginBinaryExpression(??)
                 parsePrecedenceExpression(??, 5, true)
                   parseUnaryExpression(??, true)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
index 5ef701e..ba5ff5d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
@@ -65,12 +65,13 @@
             endVariableInitializer(=)
           endInitializedIdentifier(a)
         endVariablesDeclaration(1, ;)
-        handleIdentifier(a, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(a, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(a, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleIdentifier(toString, expressionContinuation)
         handleNoTypeArguments(()
         beginArguments(()
@@ -78,32 +79,35 @@
         handleSend(toString, ;)
         handleEndingBinaryExpression(?.)
         handleExpressionStatement(;)
-        handleIdentifier(a, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(a, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(a, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleNoTypeArguments([)
         handleLiteralInt(42)
         handleLiteralList(1, [, null, ])
         handleEndingBinaryExpression(?.)
         handleExpressionStatement(;)
-        handleIdentifier(a, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(a, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(a, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleLiteralInt(42)
         handleIndexedExpression(?, [, ])
         handleExpressionStatement(;)
-        handleIdentifier(a, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(a, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(a, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleLiteralInt(42)
         handleIndexedExpression(?, [, ])
         handleExpressionStatement(;)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
index 82758c4..22a3b76 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
@@ -153,26 +153,25 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(a, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(a)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(a, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(a, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(a)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(a, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         parsePrimary(?., expressionContinuation)
                           parseSendOrFunctionLiteral(?., expressionContinuation)
                             looksLikeFunctionBody(;)
@@ -201,26 +200,25 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(a, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(a)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(a, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(a, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(a)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(a, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         parsePrimary(?., expressionContinuation)
                           listener: handleNoTypeArguments([)
                           parseLiteralListSuffix(?., null)
@@ -245,26 +243,25 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(a, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(a)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(a, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(a, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(a)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(a, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         canParseAsConditional(?)
                           parseExpressionWithoutCascade(?)
                             parsePrecedenceExpression(?, 1, false)
@@ -297,26 +294,25 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(a, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(a)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(a, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(a, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(a)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(a, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         canParseAsConditional(?)
                           parseExpressionWithoutCascade(?)
                             parsePrecedenceExpression(?, 1, false)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
index 6dda6e9..d0437e9 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
@@ -112,12 +112,13 @@
             endVariableInitializer(=)
           endInitializedIdentifier(f2)
         endVariablesDeclaration(1, ;)
-        handleIdentifier(f2, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(f2, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(f2, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(f2, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         beginTypeArguments(<)
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
index 56af9fb..23982db 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
@@ -259,26 +259,25 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(f2, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(f2)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(f2, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(f2, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(f2)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(f2, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginTypeArguments(<)
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(>)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.expect
index ba8a1cc..bd40051 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.expect
@@ -144,21 +144,23 @@
         handleNoArguments(?)
         handleSend(a, ?)
         beginConditionalExpression(?)
-          handleNoTypeArguments([)
-          handleIdentifier(b, expression)
-          handleNoTypeArguments(])
-          handleNoArguments(])
-          handleSend(b, ])
-          handleLiteralList(1, [, null, ])
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleNoTypeArguments([)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(b, ])
+            handleLiteralList(1, [, null, ])
+          endParenthesizedExpression(()
           handleConditionalExpressionColon()
-          handleNoTypeArguments([)
-          handleIdentifier(c, expression)
-          handleNoTypeArguments(])
-          handleNoArguments(])
-          handleSend(c, ])
-          handleLiteralList(1, [, null, ])
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleNoTypeArguments([)
+            handleIdentifier(c, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(c, ])
+            handleLiteralList(1, [, null, ])
+          endParenthesizedExpression(()
         endConditionalExpression(?, :)
         handleExpressionStatement(;)
       endBlockFunctionBody(7, {, })
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.intertwined.expect
index ea5feb9..15b1d71 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_conditional.dart.intertwined.expect
@@ -540,64 +540,62 @@
                           parsePrecedenceExpression(?, 1, false)
                             parseUnaryExpression(?, false)
                               parsePrimary(?, expression)
-                                parseParenthesizedExpressionOrFunctionLiteral(?)
-                                  parseParenthesizedExpression(?)
-                                    parseExpressionInParenthesis(?)
-                                      parseExpressionInParenthesisRest(()
-                                        parseExpression(()
-                                          parsePrecedenceExpression((, 1, true)
-                                            parseUnaryExpression((, true)
-                                              parsePrimary((, expression)
-                                                listener: handleNoTypeArguments([)
-                                                parseLiteralListSuffix((, null)
-                                                  parseExpression([)
-                                                    parsePrecedenceExpression([, 1, true)
-                                                      parseUnaryExpression([, true)
-                                                        parsePrimary([, expression)
-                                                          parseSendOrFunctionLiteral([, expression)
-                                                            parseSend([, expression)
-                                                              isNextIdentifier([)
-                                                              ensureIdentifier([, expression)
-                                                                listener: handleIdentifier(b, expression)
-                                                              listener: handleNoTypeArguments(])
-                                                              parseArgumentsOpt(b)
-                                                                listener: handleNoArguments(])
-                                                              listener: handleSend(b, ])
-                                                  listener: handleLiteralList(1, [, null, ])
-                                        ensureCloseParen(], ()
-                                    listener: handleParenthesizedExpression(()
+                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(?)
+                                  parseParenthesizedExpressionOrRecordLiteral(?)
+                                    listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            listener: handleNoTypeArguments([)
+                                            parseLiteralListSuffix((, null)
+                                              parseExpression([)
+                                                parsePrecedenceExpression([, 1, true)
+                                                  parseUnaryExpression([, true)
+                                                    parsePrimary([, expression)
+                                                      parseSendOrFunctionLiteral([, expression)
+                                                        parseSend([, expression)
+                                                          isNextIdentifier([)
+                                                          ensureIdentifier([, expression)
+                                                            listener: handleIdentifier(b, expression)
+                                                          listener: handleNoTypeArguments(])
+                                                          parseArgumentsOpt(b)
+                                                            listener: handleNoArguments(])
+                                                          listener: handleSend(b, ])
+                                              listener: handleLiteralList(1, [, null, ])
+                                    ensureCloseParen(], ()
+                                    listener: endParenthesizedExpression(()
                         ensureColon())
                         listener: handleConditionalExpressionColon()
                         parseExpressionWithoutCascade(:)
                           parsePrecedenceExpression(:, 1, false)
                             parseUnaryExpression(:, false)
                               parsePrimary(:, expression)
-                                parseParenthesizedExpressionOrFunctionLiteral(:)
-                                  parseParenthesizedExpression(:)
-                                    parseExpressionInParenthesis(:)
-                                      parseExpressionInParenthesisRest(()
-                                        parseExpression(()
-                                          parsePrecedenceExpression((, 1, true)
-                                            parseUnaryExpression((, true)
-                                              parsePrimary((, expression)
-                                                listener: handleNoTypeArguments([)
-                                                parseLiteralListSuffix((, null)
-                                                  parseExpression([)
-                                                    parsePrecedenceExpression([, 1, true)
-                                                      parseUnaryExpression([, true)
-                                                        parsePrimary([, expression)
-                                                          parseSendOrFunctionLiteral([, expression)
-                                                            parseSend([, expression)
-                                                              isNextIdentifier([)
-                                                              ensureIdentifier([, expression)
-                                                                listener: handleIdentifier(c, expression)
-                                                              listener: handleNoTypeArguments(])
-                                                              parseArgumentsOpt(c)
-                                                                listener: handleNoArguments(])
-                                                              listener: handleSend(c, ])
-                                                  listener: handleLiteralList(1, [, null, ])
-                                        ensureCloseParen(], ()
-                                    listener: handleParenthesizedExpression(()
+                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                  parseParenthesizedExpressionOrRecordLiteral(:)
+                                    listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            listener: handleNoTypeArguments([)
+                                            parseLiteralListSuffix((, null)
+                                              parseExpression([)
+                                                parsePrecedenceExpression([, 1, true)
+                                                  parseUnaryExpression([, true)
+                                                    parsePrimary([, expression)
+                                                      parseSendOrFunctionLiteral([, expression)
+                                                        parseSend([, expression)
+                                                          isNextIdentifier([)
+                                                          ensureIdentifier([, expression)
+                                                            listener: handleIdentifier(c, expression)
+                                                          listener: handleNoTypeArguments(])
+                                                          parseArgumentsOpt(c)
+                                                            listener: handleNoArguments(])
+                                                          listener: handleSend(c, ])
+                                              listener: handleLiteralList(1, [, null, ])
+                                    ensureCloseParen(], ()
+                                    listener: endParenthesizedExpression(()
                         listener: endConditionalExpression(?, :)
                   ensureSemicolon())
                   listener: handleExpressionStatement(;)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.expect
index 9fe3525..0a1c3d3 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.expect
@@ -53,11 +53,12 @@
         handleNoArguments(?)
         handleSend(a, ?)
         beginConditionalExpression(?)
-          handleIdentifier(b, expression)
-          handleNoTypeArguments())
-          handleNoArguments())
-          handleSend(b, ))
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(b, expression)
+            handleNoTypeArguments())
+            handleNoArguments())
+            handleSend(b, ))
+          endParenthesizedExpression(()
           handleRecoverableError(Message[ExpectedButGot, Expected ':' before this., null, {string: :}], ;, ;)
           handleConditionalExpressionColon()
           handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], ;, ;)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.intertwined.expect
index 243dd75..4c3f2b3 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_no_type_arguments.dart.intertwined.expect
@@ -126,25 +126,24 @@
                           parsePrecedenceExpression(?, 1, false)
                             parseUnaryExpression(?, false)
                               parsePrimary(?, expression)
-                                parseParenthesizedExpressionOrFunctionLiteral(?)
-                                  parseParenthesizedExpression(?)
-                                    parseExpressionInParenthesis(?)
-                                      parseExpressionInParenthesisRest(()
-                                        parseExpression(()
-                                          parsePrecedenceExpression((, 1, true)
-                                            parseUnaryExpression((, true)
-                                              parsePrimary((, expression)
-                                                parseSendOrFunctionLiteral((, expression)
-                                                  parseSend((, expression)
-                                                    isNextIdentifier(()
-                                                    ensureIdentifier((, expression)
-                                                      listener: handleIdentifier(b, expression)
-                                                    listener: handleNoTypeArguments())
-                                                    parseArgumentsOpt(b)
-                                                      listener: handleNoArguments())
-                                                    listener: handleSend(b, ))
-                                        ensureCloseParen(b, ()
-                                    listener: handleParenthesizedExpression(()
+                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(?)
+                                  parseParenthesizedExpressionOrRecordLiteral(?)
+                                    listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            parseSendOrFunctionLiteral((, expression)
+                                              parseSend((, expression)
+                                                isNextIdentifier(()
+                                                ensureIdentifier((, expression)
+                                                  listener: handleIdentifier(b, expression)
+                                                listener: handleNoTypeArguments())
+                                                parseArgumentsOpt(b)
+                                                  listener: handleNoArguments())
+                                                listener: handleSend(b, ))
+                                    ensureCloseParen(b, ()
+                                    listener: endParenthesizedExpression(()
                         ensureColon())
                           rewriteAndRecover(), Message[ExpectedButGot, Expected ':' before this., null, {string: :}], :)
                             reportRecoverableError(;, Message[ExpectedButGot, Expected ':' before this., null, {string: :}])
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
index b6813cd..e620851 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
@@ -20,17 +20,18 @@
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
         beginIfStatement(if)
-          handleIdentifier(sample, expression)
-          handleNoTypeArguments(.)
-          handleNoArguments(.)
-          handleSend(sample, .)
-          handleIdentifier(value, expressionContinuation)
-          handleNoTypeArguments(!)
-          handleNoArguments(!)
-          handleSend(value, !)
-          handleEndingBinaryExpression(.)
-          handleNonNullAssertExpression(!)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(sample, expression)
+            handleNoTypeArguments(.)
+            handleNoArguments(.)
+            handleSend(sample, .)
+            handleIdentifier(value, expressionContinuation)
+            handleNoTypeArguments(!)
+            handleNoArguments(!)
+            handleSend(value, !)
+            handleEndingBinaryExpression(.)
+            handleNonNullAssertExpression(!)
+          endParenthesizedExpression(()
           beginBinaryExpression(<)
             handleLiteralInt(10)
           endBinaryExpression(<)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
index b3f8cc3..645f9a0 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
@@ -48,37 +48,36 @@
                       parsePrecedenceExpression((, 1, true)
                         parseUnaryExpression((, true)
                           parsePrimary((, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(()
-                              parseParenthesizedExpression(()
-                                parseExpressionInParenthesis(()
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(sample, expression)
-                                                listener: handleNoTypeArguments(.)
-                                                parseArgumentsOpt(sample)
-                                                  listener: handleNoArguments(.)
-                                                listener: handleSend(sample, .)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(value, expressionContinuation)
-                                              listener: handleNoTypeArguments(!)
-                                              parseArgumentsOpt(value)
-                                                listener: handleNoArguments(!)
-                                              listener: handleSend(value, !)
-                                        listener: handleEndingBinaryExpression(.)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                              parseParenthesizedExpressionOrRecordLiteral(()
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(sample, expression)
+                                            listener: handleNoTypeArguments(.)
+                                            parseArgumentsOpt(sample)
+                                              listener: handleNoArguments(.)
+                                            listener: handleSend(sample, .)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(value, expressionContinuation)
+                                          listener: handleNoTypeArguments(!)
+                                          parseArgumentsOpt(value)
+                                            listener: handleNoArguments(!)
+                                          listener: handleSend(value, !)
+                                    listener: handleEndingBinaryExpression(.)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(<)
                         parsePrecedenceExpression(<, 9, true)
                           parseUnaryExpression(<, true)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
index 3026351..cb9f057 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
@@ -20,16 +20,17 @@
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
         beginIfStatement(if)
-          handleIdentifier(sample, expression)
-          handleNoTypeArguments(.)
-          handleNoArguments(.)
-          handleSend(sample, .)
-          handleIdentifier(value, expressionContinuation)
-          handleNoTypeArguments())
-          handleNoArguments())
-          handleSend(value, ))
-          handleEndingBinaryExpression(.)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(sample, expression)
+            handleNoTypeArguments(.)
+            handleNoArguments(.)
+            handleSend(sample, .)
+            handleIdentifier(value, expressionContinuation)
+            handleNoTypeArguments())
+            handleNoArguments())
+            handleSend(value, ))
+            handleEndingBinaryExpression(.)
+          endParenthesizedExpression(()
           beginBinaryExpression(<)
             handleLiteralInt(10)
           endBinaryExpression(<)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
index 20ab822..adf5186 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
@@ -48,36 +48,35 @@
                       parsePrecedenceExpression((, 1, true)
                         parseUnaryExpression((, true)
                           parsePrimary((, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(()
-                              parseParenthesizedExpression(()
-                                parseExpressionInParenthesis(()
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(sample, expression)
-                                                listener: handleNoTypeArguments(.)
-                                                parseArgumentsOpt(sample)
-                                                  listener: handleNoArguments(.)
-                                                listener: handleSend(sample, .)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(value, expressionContinuation)
-                                              listener: handleNoTypeArguments())
-                                              parseArgumentsOpt(value)
-                                                listener: handleNoArguments())
-                                              listener: handleSend(value, ))
-                                        listener: handleEndingBinaryExpression(.)
-                                    ensureCloseParen(value, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                              parseParenthesizedExpressionOrRecordLiteral(()
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(sample, expression)
+                                            listener: handleNoTypeArguments(.)
+                                            parseArgumentsOpt(sample)
+                                              listener: handleNoArguments(.)
+                                            listener: handleSend(sample, .)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(value, expressionContinuation)
+                                          listener: handleNoTypeArguments())
+                                          parseArgumentsOpt(value)
+                                            listener: handleNoArguments())
+                                          listener: handleSend(value, ))
+                                    listener: handleEndingBinaryExpression(.)
+                                ensureCloseParen(value, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(<)
                         parsePrecedenceExpression(<, 9, true)
                           parseUnaryExpression(<, true)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
index cafb81f..e60b648 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
@@ -55,12 +55,13 @@
         handleLiteralInt(0)
         handleIndexedExpression(?, [, ])
         handleExpressionStatement(;)
-        handleIdentifier(a, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(a, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(a, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(a, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleLiteralInt(0)
         handleIndexedExpression(?, [, ])
         handleExpressionStatement(;)
@@ -77,12 +78,13 @@
           handleLiteralInt(0)
         endConditionalExpression(?, :)
         handleExpressionStatement(;)
-        handleIdentifier(b, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(b, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(b, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(b, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         beginConditionalExpression(?)
           handleNoTypeArguments([)
           handleLiteralInt(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
index 4be754e..1ad767b 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
@@ -176,26 +176,25 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(a, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(a)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(a, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(a, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(a)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(a, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         canParseAsConditional(?)
                           parseExpressionWithoutCascade(?)
                             parsePrecedenceExpression(?, 1, false)
@@ -290,26 +289,25 @@
                       parsePrecedenceExpression(;, 1, true)
                         parseUnaryExpression(;, true)
                           parsePrimary(;, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(;)
-                              parseParenthesizedExpression(;)
-                                parseExpressionInParenthesis(;)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(b, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(b)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(b, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(b, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(b)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(b, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         canParseAsConditional(?)
                           parseExpressionWithoutCascade(?)
                             parsePrecedenceExpression(?, 1, false)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
index 1931d06..599b09e 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
@@ -202,20 +202,21 @@
             handleNoArguments(=)
             handleSend(x, =)
             handleEndingBinaryExpression(..)
-            handleIdentifier(json, expression)
-            handleNoTypeArguments([)
-            handleNoArguments([)
-            handleSend(json, [)
-            beginLiteralString('x')
-            endLiteralString(0, ])
-            handleIndexedExpression(null, [, ])
-            beginAsOperatorType(as)
-              handleIdentifier(List, typeReference)
-              handleNoTypeArguments(?)
-              handleType(List, ?)
-            endAsOperatorType(as)
-            handleAsOperator(as)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(json, expression)
+              handleNoTypeArguments([)
+              handleNoArguments([)
+              handleSend(json, [)
+              beginLiteralString('x')
+              endLiteralString(0, ])
+              handleIndexedExpression(null, [, ])
+              beginAsOperatorType(as)
+                handleIdentifier(List, typeReference)
+                handleNoTypeArguments(?)
+                handleType(List, ?)
+              endAsOperatorType(as)
+              handleAsOperator(as)
+            endParenthesizedExpression(()
             handleAssignmentExpression(=)
           endCascade()
           beginCascade(..)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
index c621fc7..65386e2 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
@@ -417,44 +417,43 @@
                         parsePrecedenceExpression(=, 1, false)
                           parseUnaryExpression(=, false)
                             parsePrimary(=, expression)
-                              parseParenthesizedExpressionOrFunctionLiteral(=)
-                                parseParenthesizedExpression(=)
-                                  parseExpressionInParenthesis(=)
-                                    parseExpressionInParenthesisRest(()
-                                      parseExpression(()
-                                        parsePrecedenceExpression((, 1, true)
-                                          parseUnaryExpression((, true)
-                                            parsePrimary((, expression)
-                                              parseSendOrFunctionLiteral((, expression)
-                                                parseSend((, expression)
-                                                  isNextIdentifier(()
-                                                  ensureIdentifier((, expression)
-                                                    listener: handleIdentifier(json, expression)
-                                                  listener: handleNoTypeArguments([)
-                                                  parseArgumentsOpt(json)
-                                                    listener: handleNoArguments([)
-                                                  listener: handleSend(json, [)
-                                          parseArgumentOrIndexStar(json, Instance of 'NoTypeParamOrArg', false)
-                                            parseExpression([)
-                                              parsePrecedenceExpression([, 1, true)
-                                                parseUnaryExpression([, true)
-                                                  parsePrimary([, expression)
-                                                    parseLiteralString([)
-                                                      parseSingleLiteralString([)
-                                                        listener: beginLiteralString('x')
-                                                        listener: endLiteralString(0, ])
-                                            listener: handleIndexedExpression(null, [, ])
-                                          parseAsOperatorRest(])
-                                            listener: beginAsOperatorType(as)
-                                            computeTypeAfterIsOrAs(as)
-                                            listener: handleIdentifier(List, typeReference)
-                                            listener: handleNoTypeArguments(?)
-                                            listener: handleType(List, ?)
-                                            listener: endAsOperatorType(as)
-                                            listener: handleAsOperator(as)
-                                            skipChainedAsIsOperators(?)
-                                      ensureCloseParen(?, ()
-                                  listener: handleParenthesizedExpression(()
+                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                parseParenthesizedExpressionOrRecordLiteral(=)
+                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                  parseExpression(()
+                                    parsePrecedenceExpression((, 1, true)
+                                      parseUnaryExpression((, true)
+                                        parsePrimary((, expression)
+                                          parseSendOrFunctionLiteral((, expression)
+                                            parseSend((, expression)
+                                              isNextIdentifier(()
+                                              ensureIdentifier((, expression)
+                                                listener: handleIdentifier(json, expression)
+                                              listener: handleNoTypeArguments([)
+                                              parseArgumentsOpt(json)
+                                                listener: handleNoArguments([)
+                                              listener: handleSend(json, [)
+                                      parseArgumentOrIndexStar(json, Instance of 'NoTypeParamOrArg', false)
+                                        parseExpression([)
+                                          parsePrecedenceExpression([, 1, true)
+                                            parseUnaryExpression([, true)
+                                              parsePrimary([, expression)
+                                                parseLiteralString([)
+                                                  parseSingleLiteralString([)
+                                                    listener: beginLiteralString('x')
+                                                    listener: endLiteralString(0, ])
+                                        listener: handleIndexedExpression(null, [, ])
+                                      parseAsOperatorRest(])
+                                        listener: beginAsOperatorType(as)
+                                        computeTypeAfterIsOrAs(as)
+                                        listener: handleIdentifier(List, typeReference)
+                                        listener: handleNoTypeArguments(?)
+                                        listener: handleType(List, ?)
+                                        listener: endAsOperatorType(as)
+                                        listener: handleAsOperator(as)
+                                        skipChainedAsIsOperators(?)
+                                  ensureCloseParen(?, ()
+                                  listener: endParenthesizedExpression(()
                       listener: handleAssignmentExpression(=)
                       listener: endCascade()
                     parseCascadeExpression())
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_47020.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_47020.dart.intertwined.expect
index 06f70a8..d6bc6c8b 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_47020.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_47020.dart.intertwined.expect
@@ -35,7 +35,7 @@
                     parsePrecedenceExpression(=, 1, false)
                       parseUnaryExpression(=, false)
                         parsePrimary(=, expression)
-                          parseParenthesizedExpressionOrFunctionLiteral(=)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
                             parseFunctionExpression(=)
                               parseFormalParametersRequiredOpt(=, MemberKind.Local)
                                 parseFormalParametersRest((, MemberKind.Local)
@@ -87,7 +87,7 @@
                           parsePrecedenceExpression(=, 1, true)
                             parseUnaryExpression(=, true)
                               parsePrimary(=, expression)
-                                parseParenthesizedExpressionOrFunctionLiteral(=)
+                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
                                   listener: handleNoTypeVariables(()
                                   parseFunctionExpression(=)
                                     listener: beginFunctionExpression(()
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_48999.equivalence_info b/pkg/front_end/parser_testcases/nnbd/issue_48999.equivalence_info
index f638038..194fa58 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_48999.equivalence_info
+++ b/pkg/front_end/parser_testcases/nnbd/issue_48999.equivalence_info
@@ -4,4 +4,5 @@
 filters:
   - ignoreListenerArguments
 ignored:
-  - handleParenthesizedExpression
+  - beginParenthesizedExpressionOrRecordLiteral
+  - endParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.expect
index de2181f..e835c1f 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.expect
@@ -27,17 +27,18 @@
         handleNoTypeArguments(()
         beginArguments(()
           beginLiteralString(')
-            handleIdentifier(i, expression)
-            handleNoTypeArguments(as)
-            handleNoArguments(as)
-            handleSend(i, as)
-            beginAsOperatorType(as)
-              handleIdentifier(int, typeReference)
-              handleNoTypeArguments(?)
-              handleType(int, ?)
-            endAsOperatorType(as)
-            handleAsOperator(as)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(i, expression)
+              handleNoTypeArguments(as)
+              handleNoArguments(as)
+              handleSend(i, as)
+              beginAsOperatorType(as)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(?)
+                handleType(int, ?)
+              endAsOperatorType(as)
+              handleAsOperator(as)
+            endParenthesizedExpression(()
             handleInterpolationExpression(${, })
             handleStringPart(')
           endLiteralString(1, ))
@@ -48,17 +49,18 @@
         handleNoTypeArguments(()
         beginArguments(()
           beginLiteralString(')
-            handleIdentifier(i, expression)
-            handleNoTypeArguments(is)
-            handleNoArguments(is)
-            handleSend(i, is)
-            beginIsOperatorType(is)
-              handleIdentifier(int, typeReference)
-              handleNoTypeArguments(?)
-              handleType(int, ?)
-            endIsOperatorType(is)
-            handleIsOperator(is, null)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(i, expression)
+              handleNoTypeArguments(is)
+              handleNoArguments(is)
+              handleSend(i, is)
+              beginIsOperatorType(is)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(?)
+                handleType(int, ?)
+              endIsOperatorType(is)
+              handleIsOperator(is, null)
+            endParenthesizedExpression(()
             handleInterpolationExpression(${, })
             handleStringPart(')
           endLiteralString(1, ))
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.intertwined.expect
index 85d13b9..0cf156d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_48999_prime.dart.intertwined.expect
@@ -86,34 +86,33 @@
                                                   parsePrecedenceExpression(${, 1, true)
                                                     parseUnaryExpression(${, true)
                                                       parsePrimary(${, expression)
-                                                        parseParenthesizedExpressionOrFunctionLiteral(${)
-                                                          parseParenthesizedExpression(${)
-                                                            parseExpressionInParenthesis(${)
-                                                              parseExpressionInParenthesisRest(()
-                                                                parseExpression(()
-                                                                  parsePrecedenceExpression((, 1, true)
-                                                                    parseUnaryExpression((, true)
-                                                                      parsePrimary((, expression)
-                                                                        parseSendOrFunctionLiteral((, expression)
-                                                                          parseSend((, expression)
-                                                                            isNextIdentifier(()
-                                                                            ensureIdentifier((, expression)
-                                                                              listener: handleIdentifier(i, expression)
-                                                                            listener: handleNoTypeArguments(as)
-                                                                            parseArgumentsOpt(i)
-                                                                              listener: handleNoArguments(as)
-                                                                            listener: handleSend(i, as)
-                                                                    parseAsOperatorRest(i)
-                                                                      listener: beginAsOperatorType(as)
-                                                                      computeTypeAfterIsOrAs(as)
-                                                                      listener: handleIdentifier(int, typeReference)
-                                                                      listener: handleNoTypeArguments(?)
-                                                                      listener: handleType(int, ?)
-                                                                      listener: endAsOperatorType(as)
-                                                                      listener: handleAsOperator(as)
-                                                                      skipChainedAsIsOperators(?)
-                                                                ensureCloseParen(?, ()
-                                                            listener: handleParenthesizedExpression(()
+                                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(${)
+                                                          parseParenthesizedExpressionOrRecordLiteral(${)
+                                                            listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                            parseExpression(()
+                                                              parsePrecedenceExpression((, 1, true)
+                                                                parseUnaryExpression((, true)
+                                                                  parsePrimary((, expression)
+                                                                    parseSendOrFunctionLiteral((, expression)
+                                                                      parseSend((, expression)
+                                                                        isNextIdentifier(()
+                                                                        ensureIdentifier((, expression)
+                                                                          listener: handleIdentifier(i, expression)
+                                                                        listener: handleNoTypeArguments(as)
+                                                                        parseArgumentsOpt(i)
+                                                                          listener: handleNoArguments(as)
+                                                                        listener: handleSend(i, as)
+                                                                parseAsOperatorRest(i)
+                                                                  listener: beginAsOperatorType(as)
+                                                                  computeTypeAfterIsOrAs(as)
+                                                                  listener: handleIdentifier(int, typeReference)
+                                                                  listener: handleNoTypeArguments(?)
+                                                                  listener: handleType(int, ?)
+                                                                  listener: endAsOperatorType(as)
+                                                                  listener: handleAsOperator(as)
+                                                                  skipChainedAsIsOperators(?)
+                                                            ensureCloseParen(?, ()
+                                                            listener: endParenthesizedExpression(()
                                                 listener: handleInterpolationExpression(${, })
                                                 parseStringPart(})
                                                   listener: handleStringPart(')
@@ -154,34 +153,33 @@
                                                   parsePrecedenceExpression(${, 1, true)
                                                     parseUnaryExpression(${, true)
                                                       parsePrimary(${, expression)
-                                                        parseParenthesizedExpressionOrFunctionLiteral(${)
-                                                          parseParenthesizedExpression(${)
-                                                            parseExpressionInParenthesis(${)
-                                                              parseExpressionInParenthesisRest(()
-                                                                parseExpression(()
-                                                                  parsePrecedenceExpression((, 1, true)
-                                                                    parseUnaryExpression((, true)
-                                                                      parsePrimary((, expression)
-                                                                        parseSendOrFunctionLiteral((, expression)
-                                                                          parseSend((, expression)
-                                                                            isNextIdentifier(()
-                                                                            ensureIdentifier((, expression)
-                                                                              listener: handleIdentifier(i, expression)
-                                                                            listener: handleNoTypeArguments(is)
-                                                                            parseArgumentsOpt(i)
-                                                                              listener: handleNoArguments(is)
-                                                                            listener: handleSend(i, is)
-                                                                    parseIsOperatorRest(i)
-                                                                      listener: beginIsOperatorType(is)
-                                                                      computeTypeAfterIsOrAs(is)
-                                                                      listener: handleIdentifier(int, typeReference)
-                                                                      listener: handleNoTypeArguments(?)
-                                                                      listener: handleType(int, ?)
-                                                                      listener: endIsOperatorType(is)
-                                                                      listener: handleIsOperator(is, null)
-                                                                      skipChainedAsIsOperators(?)
-                                                                ensureCloseParen(?, ()
-                                                            listener: handleParenthesizedExpression(()
+                                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(${)
+                                                          parseParenthesizedExpressionOrRecordLiteral(${)
+                                                            listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                            parseExpression(()
+                                                              parsePrecedenceExpression((, 1, true)
+                                                                parseUnaryExpression((, true)
+                                                                  parsePrimary((, expression)
+                                                                    parseSendOrFunctionLiteral((, expression)
+                                                                      parseSend((, expression)
+                                                                        isNextIdentifier(()
+                                                                        ensureIdentifier((, expression)
+                                                                          listener: handleIdentifier(i, expression)
+                                                                        listener: handleNoTypeArguments(is)
+                                                                        parseArgumentsOpt(i)
+                                                                          listener: handleNoArguments(is)
+                                                                        listener: handleSend(i, is)
+                                                                parseIsOperatorRest(i)
+                                                                  listener: beginIsOperatorType(is)
+                                                                  computeTypeAfterIsOrAs(is)
+                                                                  listener: handleIdentifier(int, typeReference)
+                                                                  listener: handleNoTypeArguments(?)
+                                                                  listener: handleType(int, ?)
+                                                                  listener: endIsOperatorType(is)
+                                                                  listener: handleIsOperator(is, null)
+                                                                  skipChainedAsIsOperators(?)
+                                                            ensureCloseParen(?, ()
+                                                            listener: endParenthesizedExpression(()
                                                 listener: handleInterpolationExpression(${, })
                                                 parseStringPart(})
                                                   listener: handleStringPart(')
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49132.equivalence_info b/pkg/front_end/parser_testcases/nnbd/issue_49132.equivalence_info
index b0a9777..e1736c5 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_49132.equivalence_info
+++ b/pkg/front_end/parser_testcases/nnbd/issue_49132.equivalence_info
@@ -4,4 +4,5 @@
 filters:
   - ignoreListenerArguments
 ignored:
-  - handleParenthesizedExpression
+  - beginParenthesizedExpressionOrRecordLiteral
+  - endParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.expect
index 73c3ccc..515c8e1 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.expect
@@ -46,17 +46,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(a, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(a, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -64,17 +65,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(b, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(b, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(;)
             endInitializers(2, :, ;)
@@ -117,17 +119,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(a, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(a, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -135,17 +138,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(b, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(b, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(;)
             endInitializers(2, :, ;)
@@ -188,17 +192,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(a, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(a, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -206,17 +211,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(b, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(b, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(;)
             endInitializers(2, :, ;)
@@ -259,17 +265,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(a, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(a, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -277,17 +284,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(b, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(b, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(;)
             endInitializers(2, :, ;)
@@ -330,17 +338,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(a, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(a, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -348,17 +357,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(b, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(b, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer({)
             endInitializers(2, :, {)
@@ -402,17 +412,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(a, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(a, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -420,17 +431,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(b, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(b, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer({)
             endInitializers(2, :, {)
@@ -474,17 +486,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(a, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(a, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -492,17 +505,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(as)
-                handleNoArguments(as)
-                handleSend(b, as)
-                beginAsOperatorType(as)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endAsOperatorType(as)
-                handleAsOperator(as)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(as)
+                  handleNoArguments(as)
+                  handleSend(b, as)
+                  beginAsOperatorType(as)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endAsOperatorType(as)
+                  handleAsOperator(as)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer({)
             endInitializers(2, :, {)
@@ -546,17 +560,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(x, =)
-                handleIdentifier(a, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(a, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments(?)
-                  handleType(int, ?)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(a, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(a, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments(?)
+                    handleType(int, ?)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer(,)
               beginInitializer(y)
@@ -564,17 +579,18 @@
                 handleNoTypeArguments(=)
                 handleNoArguments(=)
                 handleSend(y, =)
-                handleIdentifier(b, expression)
-                handleNoTypeArguments(is)
-                handleNoArguments(is)
-                handleSend(b, is)
-                beginIsOperatorType(is)
-                  handleIdentifier(int, typeReference)
-                  handleNoTypeArguments())
-                  handleType(int, null)
-                endIsOperatorType(is)
-                handleIsOperator(is, null)
-                handleParenthesizedExpression(()
+                beginParenthesizedExpressionOrRecordLiteral(()
+                  handleIdentifier(b, expression)
+                  handleNoTypeArguments(is)
+                  handleNoArguments(is)
+                  handleSend(b, is)
+                  beginIsOperatorType(is)
+                    handleIdentifier(int, typeReference)
+                    handleNoTypeArguments())
+                    handleType(int, null)
+                  endIsOperatorType(is)
+                  handleIsOperator(is, null)
+                endParenthesizedExpression(()
                 handleAssignmentExpression(=)
               endInitializer({)
             endInitializers(2, :, {)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.intertwined.expect
index 8875225..f0cf0da 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_49132_prime.dart.intertwined.expect
@@ -95,34 +95,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(a, as)
-                                              parseAsOperatorRest(a)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(a, as)
+                                          parseAsOperatorRest(a)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -144,34 +143,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(b, as)
-                                              parseAsOperatorRest(b)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(b, as)
+                                          parseAsOperatorRest(b)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(;)
                     listener: endInitializers(2, :, ;)
@@ -253,34 +251,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(a, is)
-                                              parseIsOperatorRest(a)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(a, is)
+                                          parseIsOperatorRest(a)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -302,34 +299,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(b, is)
-                                              parseIsOperatorRest(b)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(b, is)
+                                          parseIsOperatorRest(b)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(;)
                     listener: endInitializers(2, :, ;)
@@ -411,34 +407,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(a, as)
-                                              parseAsOperatorRest(a)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(a, as)
+                                          parseAsOperatorRest(a)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -460,34 +455,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(b, as)
-                                              parseAsOperatorRest(b)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(b, as)
+                                          parseAsOperatorRest(b)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(;)
                     listener: endInitializers(2, :, ;)
@@ -569,34 +563,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(a, is)
-                                              parseIsOperatorRest(a)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(a, is)
+                                          parseIsOperatorRest(a)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -618,34 +611,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(b, is)
-                                              parseIsOperatorRest(b)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(b, is)
+                                          parseIsOperatorRest(b)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(;)
                     listener: endInitializers(2, :, ;)
@@ -727,34 +719,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(a, as)
-                                              parseAsOperatorRest(a)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(a, as)
+                                          parseAsOperatorRest(a)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -776,34 +767,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(b, as)
-                                              parseAsOperatorRest(b)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(b, as)
+                                          parseAsOperatorRest(b)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer({)
                     listener: endInitializers(2, :, {)
@@ -887,34 +877,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(a, is)
-                                              parseIsOperatorRest(a)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(a, is)
+                                          parseIsOperatorRest(a)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -936,34 +925,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(b, is)
-                                              parseIsOperatorRest(b)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(b, is)
+                                          parseIsOperatorRest(b)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer({)
                     listener: endInitializers(2, :, {)
@@ -1047,34 +1035,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(a, as)
-                                              parseAsOperatorRest(a)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(a, as)
+                                          parseAsOperatorRest(a)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -1096,34 +1083,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(as)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(as)
-                                                      listener: handleSend(b, as)
-                                              parseAsOperatorRest(b)
-                                                listener: beginAsOperatorType(as)
-                                                computeTypeAfterIsOrAs(as)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endAsOperatorType(as)
-                                                listener: handleAsOperator(as)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(as)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(as)
+                                                  listener: handleSend(b, as)
+                                          parseAsOperatorRest(b)
+                                            listener: beginAsOperatorType(as)
+                                            computeTypeAfterIsOrAs(as)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endAsOperatorType(as)
+                                            listener: handleAsOperator(as)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer({)
                     listener: endInitializers(2, :, {)
@@ -1207,34 +1193,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(a, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(a)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(a, is)
-                                              parseIsOperatorRest(a)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments(?)
-                                                listener: handleType(int, ?)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(?)
-                                          ensureCloseParen(?, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(a, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(a)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(a, is)
+                                          parseIsOperatorRest(a)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments(?)
+                                            listener: handleType(int, ?)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(?)
+                                      ensureCloseParen(?, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer(,)
                     parseInitializer(,)
@@ -1256,34 +1241,33 @@
                             parsePrecedenceExpression(=, 1, true)
                               parseUnaryExpression(=, true)
                                 parsePrimary(=, expression)
-                                  parseParenthesizedExpressionOrFunctionLiteral(=)
-                                    parseParenthesizedExpression(=)
-                                      parseExpressionInParenthesis(=)
-                                        parseExpressionInParenthesisRest(()
-                                          parseExpression(()
-                                            parsePrecedenceExpression((, 1, true)
-                                              parseUnaryExpression((, true)
-                                                parsePrimary((, expression)
-                                                  parseSendOrFunctionLiteral((, expression)
-                                                    parseSend((, expression)
-                                                      isNextIdentifier(()
-                                                      ensureIdentifier((, expression)
-                                                        listener: handleIdentifier(b, expression)
-                                                      listener: handleNoTypeArguments(is)
-                                                      parseArgumentsOpt(b)
-                                                        listener: handleNoArguments(is)
-                                                      listener: handleSend(b, is)
-                                              parseIsOperatorRest(b)
-                                                listener: beginIsOperatorType(is)
-                                                computeTypeAfterIsOrAs(is)
-                                                listener: handleIdentifier(int, typeReference)
-                                                listener: handleNoTypeArguments())
-                                                listener: handleType(int, null)
-                                                listener: endIsOperatorType(is)
-                                                listener: handleIsOperator(is, null)
-                                                skipChainedAsIsOperators(int)
-                                          ensureCloseParen(int, ()
-                                      listener: handleParenthesizedExpression(()
+                                  parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                    parseParenthesizedExpressionOrRecordLiteral(=)
+                                      listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseSendOrFunctionLiteral((, expression)
+                                                parseSend((, expression)
+                                                  isNextIdentifier(()
+                                                  ensureIdentifier((, expression)
+                                                    listener: handleIdentifier(b, expression)
+                                                  listener: handleNoTypeArguments(is)
+                                                  parseArgumentsOpt(b)
+                                                    listener: handleNoArguments(is)
+                                                  listener: handleSend(b, is)
+                                          parseIsOperatorRest(b)
+                                            listener: beginIsOperatorType(is)
+                                            computeTypeAfterIsOrAs(is)
+                                            listener: handleIdentifier(int, typeReference)
+                                            listener: handleNoTypeArguments())
+                                            listener: handleType(int, null)
+                                            listener: endIsOperatorType(is)
+                                            listener: handleIsOperator(is, null)
+                                            skipChainedAsIsOperators(int)
+                                      ensureCloseParen(int, ()
+                                      listener: endParenthesizedExpression(()
                             listener: handleAssignmentExpression(=)
                         listener: endInitializer({)
                     listener: endInitializers(2, :, {)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.expect
index d59a18a..847a1e4 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.expect
@@ -10,16 +10,17 @@
       endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(foo, expression)
-        handleNoTypeArguments(.)
-        handleNoArguments(.)
-        handleSend(foo, .)
-        handleIdentifier(bar, expressionContinuation)
-        handleNoTypeArguments())
-        handleNoArguments())
-        handleSend(bar, ))
-        handleEndingBinaryExpression(.)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(foo, expression)
+          handleNoTypeArguments(.)
+          handleNoArguments(.)
+          handleSend(foo, .)
+          handleIdentifier(bar, expressionContinuation)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(bar, ))
+          handleEndingBinaryExpression(.)
+        endParenthesizedExpression(()
         handleNonNullAssertExpression(!)
         handleIdentifier(baz, expressionContinuation)
         handleNoTypeArguments([)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.intertwined.expect
index 779bb69..d293a8a9 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.intertwined.expect
@@ -37,36 +37,35 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(foo, expression)
-                                                listener: handleNoTypeArguments(.)
-                                                parseArgumentsOpt(foo)
-                                                  listener: handleNoArguments(.)
-                                                listener: handleSend(foo, .)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(bar, expressionContinuation)
-                                              listener: handleNoTypeArguments())
-                                              parseArgumentsOpt(bar)
-                                                listener: handleNoArguments())
-                                              listener: handleSend(bar, ))
-                                        listener: handleEndingBinaryExpression(.)
-                                    ensureCloseParen(bar, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(foo, expression)
+                                            listener: handleNoTypeArguments(.)
+                                            parseArgumentsOpt(foo)
+                                              listener: handleNoArguments(.)
+                                            listener: handleSend(foo, .)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(bar, expressionContinuation)
+                                          listener: handleNoTypeArguments())
+                                          parseArgumentsOpt(bar)
+                                            listener: handleNoArguments())
+                                          listener: handleSend(bar, ))
+                                    listener: handleEndingBinaryExpression(.)
+                                ensureCloseParen(bar, ()
+                                listener: endParenthesizedExpression(()
                         listener: handleNonNullAssertExpression(!)
                         parsePrimary(., expressionContinuation)
                           parseSendOrFunctionLiteral(., expressionContinuation)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.expect
index fed0fd1..6dd7657 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.expect
@@ -10,20 +10,23 @@
       endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(obj, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(obj, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
-        handleIdentifier(arg, expression)
-        handleNoTypeArguments(])
-        handleNoArguments(])
-        handleSend(arg, ])
-        handleIndexedExpression(null, [, ])
-        handleParenthesizedExpression(()
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(obj, expression)
+              handleNoTypeArguments(!)
+              handleNoArguments(!)
+              handleSend(obj, !)
+              handleNonNullAssertExpression(!)
+            endParenthesizedExpression(()
+            handleIdentifier(arg, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(arg, ])
+            handleIndexedExpression(null, [, ])
+          endParenthesizedExpression(()
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleIdentifier(arg2, expression)
         handleNoTypeArguments(])
         handleNoArguments(])
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.intertwined.expect
index 40b8536..0b33562 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.intertwined.expect
@@ -37,62 +37,59 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                              parseParenthesizedExpression(()
-                                                parseExpressionInParenthesis(()
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                                              parseParenthesizedExpression(()
-                                                                parseExpressionInParenthesis(()
-                                                                  parseExpressionInParenthesisRest(()
-                                                                    parseExpression(()
-                                                                      parsePrecedenceExpression((, 1, true)
-                                                                        parseUnaryExpression((, true)
-                                                                          parsePrimary((, expression)
-                                                                            parseSendOrFunctionLiteral((, expression)
-                                                                              parseSend((, expression)
-                                                                                isNextIdentifier(()
-                                                                                ensureIdentifier((, expression)
-                                                                                  listener: handleIdentifier(obj, expression)
-                                                                                listener: handleNoTypeArguments(!)
-                                                                                parseArgumentsOpt(obj)
-                                                                                  listener: handleNoArguments(!)
-                                                                                listener: handleSend(obj, !)
-                                                                        listener: handleNonNullAssertExpression(!)
-                                                                    ensureCloseParen(!, ()
-                                                                listener: handleParenthesizedExpression(()
-                                                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
-                                                          parseExpression([)
-                                                            parsePrecedenceExpression([, 1, true)
-                                                              parseUnaryExpression([, true)
-                                                                parsePrimary([, expression)
-                                                                  parseSendOrFunctionLiteral([, expression)
-                                                                    parseSend([, expression)
-                                                                      isNextIdentifier([)
-                                                                      ensureIdentifier([, expression)
-                                                                        listener: handleIdentifier(arg, expression)
-                                                                      listener: handleNoTypeArguments(])
-                                                                      parseArgumentsOpt(arg)
-                                                                        listener: handleNoArguments(])
-                                                                      listener: handleSend(arg, ])
-                                                          listener: handleIndexedExpression(null, [, ])
-                                                    ensureCloseParen(], ()
-                                                listener: handleParenthesizedExpression(()
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                          parseParenthesizedExpressionOrRecordLiteral(()
+                                            listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                            parseExpression(()
+                                              parsePrecedenceExpression((, 1, true)
+                                                parseUnaryExpression((, true)
+                                                  parsePrimary((, expression)
+                                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                                      parseParenthesizedExpressionOrRecordLiteral(()
+                                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                        parseExpression(()
+                                                          parsePrecedenceExpression((, 1, true)
+                                                            parseUnaryExpression((, true)
+                                                              parsePrimary((, expression)
+                                                                parseSendOrFunctionLiteral((, expression)
+                                                                  parseSend((, expression)
+                                                                    isNextIdentifier(()
+                                                                    ensureIdentifier((, expression)
+                                                                      listener: handleIdentifier(obj, expression)
+                                                                    listener: handleNoTypeArguments(!)
+                                                                    parseArgumentsOpt(obj)
+                                                                      listener: handleNoArguments(!)
+                                                                    listener: handleSend(obj, !)
+                                                            listener: handleNonNullAssertExpression(!)
+                                                        ensureCloseParen(!, ()
+                                                        listener: endParenthesizedExpression(()
+                                                parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
+                                                  parseExpression([)
+                                                    parsePrecedenceExpression([, 1, true)
+                                                      parseUnaryExpression([, true)
+                                                        parsePrimary([, expression)
+                                                          parseSendOrFunctionLiteral([, expression)
+                                                            parseSend([, expression)
+                                                              isNextIdentifier([)
+                                                              ensureIdentifier([, expression)
+                                                                listener: handleIdentifier(arg, expression)
+                                                              listener: handleNoTypeArguments(])
+                                                              parseArgumentsOpt(arg)
+                                                                listener: handleNoArguments(])
+                                                              listener: handleSend(arg, ])
+                                                  listener: handleIndexedExpression(null, [, ])
+                                            ensureCloseParen(], ()
+                                            listener: endParenthesizedExpression(()
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
                           parseExpression([)
                             parsePrecedenceExpression([, 1, true)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.expect
index 6bbea90..26e62f1 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.expect
@@ -10,16 +10,17 @@
       endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(foo, expression)
-        handleNoTypeArguments(.)
-        handleNoArguments(.)
-        handleSend(foo, .)
-        handleIdentifier(bar, expressionContinuation)
-        handleNoTypeArguments())
-        handleNoArguments())
-        handleSend(bar, ))
-        handleEndingBinaryExpression(.)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(foo, expression)
+          handleNoTypeArguments(.)
+          handleNoArguments(.)
+          handleSend(foo, .)
+          handleIdentifier(bar, expressionContinuation)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(bar, ))
+          handleEndingBinaryExpression(.)
+        endParenthesizedExpression(()
         handleNonNullAssertExpression(!)
         handleIdentifier(arg, expression)
         handleNoTypeArguments(])
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.intertwined.expect
index 8059ae9..8b34fab 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.intertwined.expect
@@ -37,36 +37,35 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(foo, expression)
-                                                listener: handleNoTypeArguments(.)
-                                                parseArgumentsOpt(foo)
-                                                  listener: handleNoArguments(.)
-                                                listener: handleSend(foo, .)
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(bar, expressionContinuation)
-                                              listener: handleNoTypeArguments())
-                                              parseArgumentsOpt(bar)
-                                                listener: handleNoArguments())
-                                              listener: handleSend(bar, ))
-                                        listener: handleEndingBinaryExpression(.)
-                                    ensureCloseParen(bar, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(foo, expression)
+                                            listener: handleNoTypeArguments(.)
+                                            parseArgumentsOpt(foo)
+                                              listener: handleNoArguments(.)
+                                            listener: handleSend(foo, .)
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(bar, expressionContinuation)
+                                          listener: handleNoTypeArguments())
+                                          parseArgumentsOpt(bar)
+                                            listener: handleNoArguments())
+                                          listener: handleSend(bar, ))
+                                    listener: handleEndingBinaryExpression(.)
+                                ensureCloseParen(bar, ()
+                                listener: endParenthesizedExpression(()
                         listener: handleNonNullAssertExpression(!)
                         parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg', false)
                           parseExpression([)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.expect
index 71e11d0..caeb4d4 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.expect
@@ -10,19 +10,21 @@
       endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(foo, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(foo, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
-        handleIdentifier(bar, expressionContinuation)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(bar, !)
-        handleEndingBinaryExpression(.)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(foo, expression)
+            handleNoTypeArguments(!)
+            handleNoArguments(!)
+            handleSend(foo, !)
+            handleNonNullAssertExpression(!)
+          endParenthesizedExpression(()
+          handleIdentifier(bar, expressionContinuation)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(bar, !)
+          handleEndingBinaryExpression(.)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleIdentifier(arg, expression)
         handleNoTypeArguments(])
         handleNoArguments(])
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.intertwined.expect
index b3d8ee3..21506db 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.intertwined.expect
@@ -37,48 +37,46 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                              parseParenthesizedExpression(()
-                                                parseExpressionInParenthesis(()
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseSendOrFunctionLiteral((, expression)
-                                                              parseSend((, expression)
-                                                                isNextIdentifier(()
-                                                                ensureIdentifier((, expression)
-                                                                  listener: handleIdentifier(foo, expression)
-                                                                listener: handleNoTypeArguments(!)
-                                                                parseArgumentsOpt(foo)
-                                                                  listener: handleNoArguments(!)
-                                                                listener: handleSend(foo, !)
-                                                        listener: handleNonNullAssertExpression(!)
-                                                    ensureCloseParen(!, ()
-                                                listener: handleParenthesizedExpression(()
-                                        parsePrimary(., expressionContinuation)
-                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                            parseSend(., expressionContinuation)
-                                              isNextIdentifier(.)
-                                              ensureIdentifier(., expressionContinuation)
-                                                listener: handleIdentifier(bar, expressionContinuation)
-                                              listener: handleNoTypeArguments(!)
-                                              parseArgumentsOpt(bar)
-                                                listener: handleNoArguments(!)
-                                              listener: handleSend(bar, !)
-                                        listener: handleEndingBinaryExpression(.)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                          parseParenthesizedExpressionOrRecordLiteral(()
+                                            listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                            parseExpression(()
+                                              parsePrecedenceExpression((, 1, true)
+                                                parseUnaryExpression((, true)
+                                                  parsePrimary((, expression)
+                                                    parseSendOrFunctionLiteral((, expression)
+                                                      parseSend((, expression)
+                                                        isNextIdentifier(()
+                                                        ensureIdentifier((, expression)
+                                                          listener: handleIdentifier(foo, expression)
+                                                        listener: handleNoTypeArguments(!)
+                                                        parseArgumentsOpt(foo)
+                                                          listener: handleNoArguments(!)
+                                                        listener: handleSend(foo, !)
+                                                listener: handleNonNullAssertExpression(!)
+                                            ensureCloseParen(!, ()
+                                            listener: endParenthesizedExpression(()
+                                    parsePrimary(., expressionContinuation)
+                                      parseSendOrFunctionLiteral(., expressionContinuation)
+                                        parseSend(., expressionContinuation)
+                                          isNextIdentifier(.)
+                                          ensureIdentifier(., expressionContinuation)
+                                            listener: handleIdentifier(bar, expressionContinuation)
+                                          listener: handleNoTypeArguments(!)
+                                          parseArgumentsOpt(bar)
+                                            listener: handleNoArguments(!)
+                                          listener: handleSend(bar, !)
+                                    listener: handleEndingBinaryExpression(.)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
                           parseExpression([)
                             parsePrecedenceExpression([, 1, true)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.expect
index 4f4a015..d3fba8e 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.expect
@@ -10,25 +10,28 @@
       endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(foo, expression)
-        handleNoTypeArguments(.)
-        handleNoArguments(.)
-        handleSend(foo, .)
-        handleIdentifier(bar, expressionContinuation)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(bar, !)
-        handleEndingBinaryExpression(.)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
-        handleIdentifier(arg, expression)
-        handleNoTypeArguments(])
-        handleNoArguments(])
-        handleSend(arg, ])
-        handleIndexedExpression(null, [, ])
-        handleParenthesizedExpression(()
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleIdentifier(foo, expression)
+              handleNoTypeArguments(.)
+              handleNoArguments(.)
+              handleSend(foo, .)
+              handleIdentifier(bar, expressionContinuation)
+              handleNoTypeArguments(!)
+              handleNoArguments(!)
+              handleSend(bar, !)
+              handleEndingBinaryExpression(.)
+              handleNonNullAssertExpression(!)
+            endParenthesizedExpression(()
+            handleIdentifier(arg, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(arg, ])
+            handleIndexedExpression(null, [, ])
+          endParenthesizedExpression(()
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleIdentifier(arg2, expression)
         handleNoTypeArguments(])
         handleNoArguments(])
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.intertwined.expect
index 2b8b343..0a48a26 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.intertwined.expect
@@ -37,73 +37,70 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                              parseParenthesizedExpression(()
-                                                parseExpressionInParenthesis(()
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                                              parseParenthesizedExpression(()
-                                                                parseExpressionInParenthesis(()
-                                                                  parseExpressionInParenthesisRest(()
-                                                                    parseExpression(()
-                                                                      parsePrecedenceExpression((, 1, true)
-                                                                        parseUnaryExpression((, true)
-                                                                          parsePrimary((, expression)
-                                                                            parseSendOrFunctionLiteral((, expression)
-                                                                              parseSend((, expression)
-                                                                                isNextIdentifier(()
-                                                                                ensureIdentifier((, expression)
-                                                                                  listener: handleIdentifier(foo, expression)
-                                                                                listener: handleNoTypeArguments(.)
-                                                                                parseArgumentsOpt(foo)
-                                                                                  listener: handleNoArguments(.)
-                                                                                listener: handleSend(foo, .)
-                                                                        parsePrimary(., expressionContinuation)
-                                                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                                                            parseSend(., expressionContinuation)
-                                                                              isNextIdentifier(.)
-                                                                              ensureIdentifier(., expressionContinuation)
-                                                                                listener: handleIdentifier(bar, expressionContinuation)
-                                                                              listener: handleNoTypeArguments(!)
-                                                                              parseArgumentsOpt(bar)
-                                                                                listener: handleNoArguments(!)
-                                                                              listener: handleSend(bar, !)
-                                                                        listener: handleEndingBinaryExpression(.)
-                                                                        listener: handleNonNullAssertExpression(!)
-                                                                    ensureCloseParen(!, ()
-                                                                listener: handleParenthesizedExpression(()
-                                                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
-                                                          parseExpression([)
-                                                            parsePrecedenceExpression([, 1, true)
-                                                              parseUnaryExpression([, true)
-                                                                parsePrimary([, expression)
-                                                                  parseSendOrFunctionLiteral([, expression)
-                                                                    parseSend([, expression)
-                                                                      isNextIdentifier([)
-                                                                      ensureIdentifier([, expression)
-                                                                        listener: handleIdentifier(arg, expression)
-                                                                      listener: handleNoTypeArguments(])
-                                                                      parseArgumentsOpt(arg)
-                                                                        listener: handleNoArguments(])
-                                                                      listener: handleSend(arg, ])
-                                                          listener: handleIndexedExpression(null, [, ])
-                                                    ensureCloseParen(], ()
-                                                listener: handleParenthesizedExpression(()
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                          parseParenthesizedExpressionOrRecordLiteral(()
+                                            listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                            parseExpression(()
+                                              parsePrecedenceExpression((, 1, true)
+                                                parseUnaryExpression((, true)
+                                                  parsePrimary((, expression)
+                                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                                      parseParenthesizedExpressionOrRecordLiteral(()
+                                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                        parseExpression(()
+                                                          parsePrecedenceExpression((, 1, true)
+                                                            parseUnaryExpression((, true)
+                                                              parsePrimary((, expression)
+                                                                parseSendOrFunctionLiteral((, expression)
+                                                                  parseSend((, expression)
+                                                                    isNextIdentifier(()
+                                                                    ensureIdentifier((, expression)
+                                                                      listener: handleIdentifier(foo, expression)
+                                                                    listener: handleNoTypeArguments(.)
+                                                                    parseArgumentsOpt(foo)
+                                                                      listener: handleNoArguments(.)
+                                                                    listener: handleSend(foo, .)
+                                                            parsePrimary(., expressionContinuation)
+                                                              parseSendOrFunctionLiteral(., expressionContinuation)
+                                                                parseSend(., expressionContinuation)
+                                                                  isNextIdentifier(.)
+                                                                  ensureIdentifier(., expressionContinuation)
+                                                                    listener: handleIdentifier(bar, expressionContinuation)
+                                                                  listener: handleNoTypeArguments(!)
+                                                                  parseArgumentsOpt(bar)
+                                                                    listener: handleNoArguments(!)
+                                                                  listener: handleSend(bar, !)
+                                                            listener: handleEndingBinaryExpression(.)
+                                                            listener: handleNonNullAssertExpression(!)
+                                                        ensureCloseParen(!, ()
+                                                        listener: endParenthesizedExpression(()
+                                                parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
+                                                  parseExpression([)
+                                                    parsePrecedenceExpression([, 1, true)
+                                                      parseUnaryExpression([, true)
+                                                        parsePrimary([, expression)
+                                                          parseSendOrFunctionLiteral([, expression)
+                                                            parseSend([, expression)
+                                                              isNextIdentifier([)
+                                                              ensureIdentifier([, expression)
+                                                                listener: handleIdentifier(arg, expression)
+                                                              listener: handleNoTypeArguments(])
+                                                              parseArgumentsOpt(arg)
+                                                                listener: handleNoArguments(])
+                                                              listener: handleSend(arg, ])
+                                                  listener: handleIndexedExpression(null, [, ])
+                                            ensureCloseParen(], ()
+                                            listener: endParenthesizedExpression(()
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
                           parseExpression([)
                             parsePrecedenceExpression([, 1, true)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.expect
index 5555c17..64b976b 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.expect
@@ -10,27 +10,31 @@
       endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(foo, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(foo, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
-        handleIdentifier(bar, expressionContinuation)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(bar, !)
-        handleEndingBinaryExpression(.)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
-        handleIdentifier(arg, expression)
-        handleNoTypeArguments(])
-        handleNoArguments(])
-        handleSend(arg, ])
-        handleIndexedExpression(null, [, ])
-        handleParenthesizedExpression(()
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleIdentifier(foo, expression)
+                handleNoTypeArguments(!)
+                handleNoArguments(!)
+                handleSend(foo, !)
+                handleNonNullAssertExpression(!)
+              endParenthesizedExpression(()
+              handleIdentifier(bar, expressionContinuation)
+              handleNoTypeArguments(!)
+              handleNoArguments(!)
+              handleSend(bar, !)
+              handleEndingBinaryExpression(.)
+              handleNonNullAssertExpression(!)
+            endParenthesizedExpression(()
+            handleIdentifier(arg, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(arg, ])
+            handleIndexedExpression(null, [, ])
+          endParenthesizedExpression(()
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleIdentifier(arg2, expression)
         handleNoTypeArguments(])
         handleNoArguments(])
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.intertwined.expect
index 71a5e93..53e472d 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.intertwined.expect
@@ -37,84 +37,80 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                              parseParenthesizedExpression(()
-                                                parseExpressionInParenthesis(()
-                                                  parseExpressionInParenthesisRest(()
-                                                    parseExpression(()
-                                                      parsePrecedenceExpression((, 1, true)
-                                                        parseUnaryExpression((, true)
-                                                          parsePrimary((, expression)
-                                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                                              parseParenthesizedExpression(()
-                                                                parseExpressionInParenthesis(()
-                                                                  parseExpressionInParenthesisRest(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                          parseParenthesizedExpressionOrRecordLiteral(()
+                                            listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                            parseExpression(()
+                                              parsePrecedenceExpression((, 1, true)
+                                                parseUnaryExpression((, true)
+                                                  parsePrimary((, expression)
+                                                    parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                                      parseParenthesizedExpressionOrRecordLiteral(()
+                                                        listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                        parseExpression(()
+                                                          parsePrecedenceExpression((, 1, true)
+                                                            parseUnaryExpression((, true)
+                                                              parsePrimary((, expression)
+                                                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                                                  parseParenthesizedExpressionOrRecordLiteral(()
+                                                                    listener: beginParenthesizedExpressionOrRecordLiteral(()
                                                                     parseExpression(()
                                                                       parsePrecedenceExpression((, 1, true)
                                                                         parseUnaryExpression((, true)
                                                                           parsePrimary((, expression)
-                                                                            parseParenthesizedExpressionOrFunctionLiteral(()
-                                                                              parseParenthesizedExpression(()
-                                                                                parseExpressionInParenthesis(()
-                                                                                  parseExpressionInParenthesisRest(()
-                                                                                    parseExpression(()
-                                                                                      parsePrecedenceExpression((, 1, true)
-                                                                                        parseUnaryExpression((, true)
-                                                                                          parsePrimary((, expression)
-                                                                                            parseSendOrFunctionLiteral((, expression)
-                                                                                              parseSend((, expression)
-                                                                                                isNextIdentifier(()
-                                                                                                ensureIdentifier((, expression)
-                                                                                                  listener: handleIdentifier(foo, expression)
-                                                                                                listener: handleNoTypeArguments(!)
-                                                                                                parseArgumentsOpt(foo)
-                                                                                                  listener: handleNoArguments(!)
-                                                                                                listener: handleSend(foo, !)
-                                                                                        listener: handleNonNullAssertExpression(!)
-                                                                                    ensureCloseParen(!, ()
-                                                                                listener: handleParenthesizedExpression(()
-                                                                        parsePrimary(., expressionContinuation)
-                                                                          parseSendOrFunctionLiteral(., expressionContinuation)
-                                                                            parseSend(., expressionContinuation)
-                                                                              isNextIdentifier(.)
-                                                                              ensureIdentifier(., expressionContinuation)
-                                                                                listener: handleIdentifier(bar, expressionContinuation)
-                                                                              listener: handleNoTypeArguments(!)
-                                                                              parseArgumentsOpt(bar)
-                                                                                listener: handleNoArguments(!)
-                                                                              listener: handleSend(bar, !)
-                                                                        listener: handleEndingBinaryExpression(.)
+                                                                            parseSendOrFunctionLiteral((, expression)
+                                                                              parseSend((, expression)
+                                                                                isNextIdentifier(()
+                                                                                ensureIdentifier((, expression)
+                                                                                  listener: handleIdentifier(foo, expression)
+                                                                                listener: handleNoTypeArguments(!)
+                                                                                parseArgumentsOpt(foo)
+                                                                                  listener: handleNoArguments(!)
+                                                                                listener: handleSend(foo, !)
                                                                         listener: handleNonNullAssertExpression(!)
                                                                     ensureCloseParen(!, ()
-                                                                listener: handleParenthesizedExpression(()
-                                                        parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
-                                                          parseExpression([)
-                                                            parsePrecedenceExpression([, 1, true)
-                                                              parseUnaryExpression([, true)
-                                                                parsePrimary([, expression)
-                                                                  parseSendOrFunctionLiteral([, expression)
-                                                                    parseSend([, expression)
-                                                                      isNextIdentifier([)
-                                                                      ensureIdentifier([, expression)
-                                                                        listener: handleIdentifier(arg, expression)
-                                                                      listener: handleNoTypeArguments(])
-                                                                      parseArgumentsOpt(arg)
-                                                                        listener: handleNoArguments(])
-                                                                      listener: handleSend(arg, ])
-                                                          listener: handleIndexedExpression(null, [, ])
-                                                    ensureCloseParen(], ()
-                                                listener: handleParenthesizedExpression(()
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                                                                    listener: endParenthesizedExpression(()
+                                                            parsePrimary(., expressionContinuation)
+                                                              parseSendOrFunctionLiteral(., expressionContinuation)
+                                                                parseSend(., expressionContinuation)
+                                                                  isNextIdentifier(.)
+                                                                  ensureIdentifier(., expressionContinuation)
+                                                                    listener: handleIdentifier(bar, expressionContinuation)
+                                                                  listener: handleNoTypeArguments(!)
+                                                                  parseArgumentsOpt(bar)
+                                                                    listener: handleNoArguments(!)
+                                                                  listener: handleSend(bar, !)
+                                                            listener: handleEndingBinaryExpression(.)
+                                                            listener: handleNonNullAssertExpression(!)
+                                                        ensureCloseParen(!, ()
+                                                        listener: endParenthesizedExpression(()
+                                                parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
+                                                  parseExpression([)
+                                                    parsePrecedenceExpression([, 1, true)
+                                                      parseUnaryExpression([, true)
+                                                        parsePrimary([, expression)
+                                                          parseSendOrFunctionLiteral([, expression)
+                                                            parseSend([, expression)
+                                                              isNextIdentifier([)
+                                                              ensureIdentifier([, expression)
+                                                                listener: handleIdentifier(arg, expression)
+                                                              listener: handleNoTypeArguments(])
+                                                              parseArgumentsOpt(arg)
+                                                                listener: handleNoArguments(])
+                                                              listener: handleSend(arg, ])
+                                                  listener: handleIndexedExpression(null, [, ])
+                                            ensureCloseParen(], ()
+                                            listener: endParenthesizedExpression(()
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
                           parseExpression([)
                             parsePrecedenceExpression([, 1, true)
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.expect
index e8062f8..5f54d7f 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.expect
@@ -10,12 +10,13 @@
       endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
-        handleIdentifier(obj, expression)
-        handleNoTypeArguments(!)
-        handleNoArguments(!)
-        handleSend(obj, !)
-        handleNonNullAssertExpression(!)
-        handleParenthesizedExpression(()
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(obj, expression)
+          handleNoTypeArguments(!)
+          handleNoArguments(!)
+          handleSend(obj, !)
+          handleNonNullAssertExpression(!)
+        endParenthesizedExpression(()
         handleIdentifier(arg, expression)
         handleNoTypeArguments(])
         handleNoArguments(])
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.intertwined.expect
index 60e3550f..ea8920e 100644
--- a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.intertwined.expect
@@ -37,26 +37,25 @@
                       parsePrecedenceExpression({, 1, true)
                         parseUnaryExpression({, true)
                           parsePrimary({, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral({)
-                              parseParenthesizedExpression({)
-                                parseExpressionInParenthesis({)
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(obj, expression)
-                                                listener: handleNoTypeArguments(!)
-                                                parseArgumentsOpt(obj)
-                                                  listener: handleNoArguments(!)
-                                                listener: handleSend(obj, !)
-                                        listener: handleNonNullAssertExpression(!)
-                                    ensureCloseParen(!, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(obj, expression)
+                                            listener: handleNoTypeArguments(!)
+                                            parseArgumentsOpt(obj)
+                                              listener: handleNoArguments(!)
+                                            listener: handleSend(obj, !)
+                                    listener: handleNonNullAssertExpression(!)
+                                ensureCloseParen(!, ()
+                                listener: endParenthesizedExpression(()
                         parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
                           parseExpression([)
                             parsePrecedenceExpression([, 1, true)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
index 6d8f5ab..3128078 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
@@ -130,14 +130,15 @@
         handleSend(print, ;)
         handleExpressionStatement(;)
         beginIfStatement(if)
-          handleIdentifier(foo, expression)
-          handleNoTypeArguments(>>)
-          handleNoArguments(>>)
-          handleSend(foo, >>)
-          handleRecoverableError(Message[ExperimentNotEnabled, This requires the 'triple-shift' language feature to be enabled., Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'., {string: triple-shift, string2: 2.14}], >>, >=)
-          handleLiteralInt(42)
-          handleAssignmentExpression(>>>=)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(foo, expression)
+            handleNoTypeArguments(>>)
+            handleNoArguments(>>)
+            handleSend(foo, >>)
+            handleRecoverableError(Message[ExperimentNotEnabled, This requires the 'triple-shift' language feature to be enabled., Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'., {string: triple-shift, string2: 2.14}], >>, >=)
+            handleLiteralInt(42)
+            handleAssignmentExpression(>>>=)
+          endParenthesizedExpression(()
           beginBinaryExpression(==)
             handleIdentifier(foo, expression)
             handleNoTypeArguments())
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
index 980cb19..655103c 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
@@ -284,34 +284,33 @@
                       parsePrecedenceExpression((, 1, true)
                         parseUnaryExpression((, true)
                           parsePrimary((, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(()
-                              parseParenthesizedExpression(()
-                                parseExpressionInParenthesis(()
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(foo, expression)
-                                                listener: handleNoTypeArguments(>>)
-                                                parseArgumentsOpt(foo)
-                                                  listener: handleNoArguments(>>)
-                                                listener: handleSend(foo, >>)
-                                        reportRecoverableErrorWithEnd(>>, >=, Message[ExperimentNotEnabled, This requires the 'triple-shift' language feature to be enabled., Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'., {string: triple-shift, string2: 2.14}])
-                                          listener: handleRecoverableError(Message[ExperimentNotEnabled, This requires the 'triple-shift' language feature to be enabled., Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'., {string: triple-shift, string2: 2.14}], >>, >=)
-                                        rewriter()
-                                        parsePrecedenceExpression(>>>=, 1, true)
-                                          parseUnaryExpression(>>>=, true)
-                                            parsePrimary(>>>=, expression)
-                                              parseLiteralInt(>>>=)
-                                                listener: handleLiteralInt(42)
-                                        listener: handleAssignmentExpression(>>>=)
-                                    ensureCloseParen(42, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                              parseParenthesizedExpressionOrRecordLiteral(()
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(foo, expression)
+                                            listener: handleNoTypeArguments(>>)
+                                            parseArgumentsOpt(foo)
+                                              listener: handleNoArguments(>>)
+                                            listener: handleSend(foo, >>)
+                                    reportRecoverableErrorWithEnd(>>, >=, Message[ExperimentNotEnabled, This requires the 'triple-shift' language feature to be enabled., Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'., {string: triple-shift, string2: 2.14}])
+                                      listener: handleRecoverableError(Message[ExperimentNotEnabled, This requires the 'triple-shift' language feature to be enabled., Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'., {string: triple-shift, string2: 2.14}], >>, >=)
+                                    rewriter()
+                                    parsePrecedenceExpression(>>>=, 1, true)
+                                      parseUnaryExpression(>>>=, true)
+                                        parsePrimary(>>>=, expression)
+                                          parseLiteralInt(>>>=)
+                                            listener: handleLiteralInt(42)
+                                    listener: handleAssignmentExpression(>>>=)
+                                ensureCloseParen(42, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(==)
                         parsePrecedenceExpression(==, 8, true)
                           parseUnaryExpression(==, true)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
index 5b84bd6..8cdcc10 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
@@ -104,13 +104,14 @@
         handleSend(print, ;)
         handleExpressionStatement(;)
         beginIfStatement(if)
-          handleIdentifier(foo, expression)
-          handleNoTypeArguments(>>=)
-          handleNoArguments(>>=)
-          handleSend(foo, >>=)
-          handleLiteralInt(42)
-          handleAssignmentExpression(>>=)
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(foo, expression)
+            handleNoTypeArguments(>>=)
+            handleNoArguments(>>=)
+            handleSend(foo, >>=)
+            handleLiteralInt(42)
+            handleAssignmentExpression(>>=)
+          endParenthesizedExpression(()
           beginBinaryExpression(==)
             handleIdentifier(foo, expression)
             handleNoTypeArguments())
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
index 13d82fc..e226427 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
@@ -272,31 +272,30 @@
                       parsePrecedenceExpression((, 1, true)
                         parseUnaryExpression((, true)
                           parsePrimary((, expression)
-                            parseParenthesizedExpressionOrFunctionLiteral(()
-                              parseParenthesizedExpression(()
-                                parseExpressionInParenthesis(()
-                                  parseExpressionInParenthesisRest(()
-                                    parseExpression(()
-                                      parsePrecedenceExpression((, 1, true)
-                                        parseUnaryExpression((, true)
-                                          parsePrimary((, expression)
-                                            parseSendOrFunctionLiteral((, expression)
-                                              parseSend((, expression)
-                                                isNextIdentifier(()
-                                                ensureIdentifier((, expression)
-                                                  listener: handleIdentifier(foo, expression)
-                                                listener: handleNoTypeArguments(>>=)
-                                                parseArgumentsOpt(foo)
-                                                  listener: handleNoArguments(>>=)
-                                                listener: handleSend(foo, >>=)
-                                        parsePrecedenceExpression(>>=, 1, true)
-                                          parseUnaryExpression(>>=, true)
-                                            parsePrimary(>>=, expression)
-                                              parseLiteralInt(>>=)
-                                                listener: handleLiteralInt(42)
-                                        listener: handleAssignmentExpression(>>=)
-                                    ensureCloseParen(42, ()
-                                listener: handleParenthesizedExpression(()
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                              parseParenthesizedExpressionOrRecordLiteral(()
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseSendOrFunctionLiteral((, expression)
+                                          parseSend((, expression)
+                                            isNextIdentifier(()
+                                            ensureIdentifier((, expression)
+                                              listener: handleIdentifier(foo, expression)
+                                            listener: handleNoTypeArguments(>>=)
+                                            parseArgumentsOpt(foo)
+                                              listener: handleNoArguments(>>=)
+                                            listener: handleSend(foo, >>=)
+                                    parsePrecedenceExpression(>>=, 1, true)
+                                      parseUnaryExpression(>>=, true)
+                                        parsePrimary(>>=, expression)
+                                          parseLiteralInt(>>=)
+                                            listener: handleLiteralInt(42)
+                                    listener: handleAssignmentExpression(>>=)
+                                ensureCloseParen(42, ()
+                                listener: endParenthesizedExpression(()
                         listener: beginBinaryExpression(==)
                         parsePrecedenceExpression(==, 8, true)
                           parseUnaryExpression(==, true)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
index 9e599ba..f5521fe 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
@@ -80,8 +80,9 @@
             handleOperator(>>)
           endLiteralSymbol(#, 1)
           beginBinaryExpression(>)
-            handleLiteralInt(2)
-            handleParenthesizedExpression(()
+            beginParenthesizedExpressionOrRecordLiteral(()
+              handleLiteralInt(2)
+            endParenthesizedExpression(()
           endBinaryExpression(>)
         endArguments(1, (, ))
         handleSend(print, ;)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
index d3f42a9..04b1a46 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
@@ -180,18 +180,17 @@
                                         parsePrecedenceExpression(>, 9, true)
                                           parseUnaryExpression(>, true)
                                             parsePrimary(>, expression)
-                                              parseParenthesizedExpressionOrFunctionLiteral(>)
-                                                parseParenthesizedExpression(>)
-                                                  parseExpressionInParenthesis(>)
-                                                    parseExpressionInParenthesisRest(()
-                                                      parseExpression(()
-                                                        parsePrecedenceExpression((, 1, true)
-                                                          parseUnaryExpression((, true)
-                                                            parsePrimary((, expression)
-                                                              parseLiteralInt(()
-                                                                listener: handleLiteralInt(2)
-                                                      ensureCloseParen(2, ()
-                                                  listener: handleParenthesizedExpression(()
+                                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(>)
+                                                parseParenthesizedExpressionOrRecordLiteral(>)
+                                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                                  parseExpression(()
+                                                    parsePrecedenceExpression((, 1, true)
+                                                      parseUnaryExpression((, true)
+                                                        parsePrimary((, expression)
+                                                          parseLiteralInt(()
+                                                            listener: handleLiteralInt(2)
+                                                  ensureCloseParen(2, ()
+                                                  listener: endParenthesizedExpression(()
                                         listener: endBinaryExpression(>)
                                     listener: endArguments(1, (, ))
                               listener: handleSend(print, ;)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.expect
index ba8a1cc..bd40051 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.expect
@@ -144,21 +144,23 @@
         handleNoArguments(?)
         handleSend(a, ?)
         beginConditionalExpression(?)
-          handleNoTypeArguments([)
-          handleIdentifier(b, expression)
-          handleNoTypeArguments(])
-          handleNoArguments(])
-          handleSend(b, ])
-          handleLiteralList(1, [, null, ])
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleNoTypeArguments([)
+            handleIdentifier(b, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(b, ])
+            handleLiteralList(1, [, null, ])
+          endParenthesizedExpression(()
           handleConditionalExpressionColon()
-          handleNoTypeArguments([)
-          handleIdentifier(c, expression)
-          handleNoTypeArguments(])
-          handleNoArguments(])
-          handleSend(c, ])
-          handleLiteralList(1, [, null, ])
-          handleParenthesizedExpression(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleNoTypeArguments([)
+            handleIdentifier(c, expression)
+            handleNoTypeArguments(])
+            handleNoArguments(])
+            handleSend(c, ])
+            handleLiteralList(1, [, null, ])
+          endParenthesizedExpression(()
         endConditionalExpression(?, :)
         handleExpressionStatement(;)
       endBlockFunctionBody(7, {, })
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.intertwined.expect
index ea5feb9..15b1d71 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.intertwined.expect
@@ -540,64 +540,62 @@
                           parsePrecedenceExpression(?, 1, false)
                             parseUnaryExpression(?, false)
                               parsePrimary(?, expression)
-                                parseParenthesizedExpressionOrFunctionLiteral(?)
-                                  parseParenthesizedExpression(?)
-                                    parseExpressionInParenthesis(?)
-                                      parseExpressionInParenthesisRest(()
-                                        parseExpression(()
-                                          parsePrecedenceExpression((, 1, true)
-                                            parseUnaryExpression((, true)
-                                              parsePrimary((, expression)
-                                                listener: handleNoTypeArguments([)
-                                                parseLiteralListSuffix((, null)
-                                                  parseExpression([)
-                                                    parsePrecedenceExpression([, 1, true)
-                                                      parseUnaryExpression([, true)
-                                                        parsePrimary([, expression)
-                                                          parseSendOrFunctionLiteral([, expression)
-                                                            parseSend([, expression)
-                                                              isNextIdentifier([)
-                                                              ensureIdentifier([, expression)
-                                                                listener: handleIdentifier(b, expression)
-                                                              listener: handleNoTypeArguments(])
-                                                              parseArgumentsOpt(b)
-                                                                listener: handleNoArguments(])
-                                                              listener: handleSend(b, ])
-                                                  listener: handleLiteralList(1, [, null, ])
-                                        ensureCloseParen(], ()
-                                    listener: handleParenthesizedExpression(()
+                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(?)
+                                  parseParenthesizedExpressionOrRecordLiteral(?)
+                                    listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            listener: handleNoTypeArguments([)
+                                            parseLiteralListSuffix((, null)
+                                              parseExpression([)
+                                                parsePrecedenceExpression([, 1, true)
+                                                  parseUnaryExpression([, true)
+                                                    parsePrimary([, expression)
+                                                      parseSendOrFunctionLiteral([, expression)
+                                                        parseSend([, expression)
+                                                          isNextIdentifier([)
+                                                          ensureIdentifier([, expression)
+                                                            listener: handleIdentifier(b, expression)
+                                                          listener: handleNoTypeArguments(])
+                                                          parseArgumentsOpt(b)
+                                                            listener: handleNoArguments(])
+                                                          listener: handleSend(b, ])
+                                              listener: handleLiteralList(1, [, null, ])
+                                    ensureCloseParen(], ()
+                                    listener: endParenthesizedExpression(()
                         ensureColon())
                         listener: handleConditionalExpressionColon()
                         parseExpressionWithoutCascade(:)
                           parsePrecedenceExpression(:, 1, false)
                             parseUnaryExpression(:, false)
                               parsePrimary(:, expression)
-                                parseParenthesizedExpressionOrFunctionLiteral(:)
-                                  parseParenthesizedExpression(:)
-                                    parseExpressionInParenthesis(:)
-                                      parseExpressionInParenthesisRest(()
-                                        parseExpression(()
-                                          parsePrecedenceExpression((, 1, true)
-                                            parseUnaryExpression((, true)
-                                              parsePrimary((, expression)
-                                                listener: handleNoTypeArguments([)
-                                                parseLiteralListSuffix((, null)
-                                                  parseExpression([)
-                                                    parsePrecedenceExpression([, 1, true)
-                                                      parseUnaryExpression([, true)
-                                                        parsePrimary([, expression)
-                                                          parseSendOrFunctionLiteral([, expression)
-                                                            parseSend([, expression)
-                                                              isNextIdentifier([)
-                                                              ensureIdentifier([, expression)
-                                                                listener: handleIdentifier(c, expression)
-                                                              listener: handleNoTypeArguments(])
-                                                              parseArgumentsOpt(c)
-                                                                listener: handleNoArguments(])
-                                                              listener: handleSend(c, ])
-                                                  listener: handleLiteralList(1, [, null, ])
-                                        ensureCloseParen(], ()
-                                    listener: handleParenthesizedExpression(()
+                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                  parseParenthesizedExpressionOrRecordLiteral(:)
+                                    listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            listener: handleNoTypeArguments([)
+                                            parseLiteralListSuffix((, null)
+                                              parseExpression([)
+                                                parsePrecedenceExpression([, 1, true)
+                                                  parseUnaryExpression([, true)
+                                                    parsePrimary([, expression)
+                                                      parseSendOrFunctionLiteral([, expression)
+                                                        parseSend([, expression)
+                                                          isNextIdentifier([)
+                                                          ensureIdentifier([, expression)
+                                                            listener: handleIdentifier(c, expression)
+                                                          listener: handleNoTypeArguments(])
+                                                          parseArgumentsOpt(c)
+                                                            listener: handleNoArguments(])
+                                                          listener: handleSend(c, ])
+                                              listener: handleLiteralList(1, [, null, ])
+                                    ensureCloseParen(], ()
+                                    listener: endParenthesizedExpression(()
                         listener: endConditionalExpression(?, :)
                   ensureSemicolon())
                   listener: handleExpressionStatement(;)
diff --git a/pkg/front_end/parser_testcases/record/record_literal_01.dart b/pkg/front_end/parser_testcases/record/record_literal_01.dart
new file mode 100644
index 0000000..f32a178
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_01.dart
@@ -0,0 +1,3 @@
+void foo() {
+  var record = (1, 2, a: 3, b: 4);
+}
diff --git a/pkg/front_end/parser_testcases/record/record_literal_01.dart.expect b/pkg/front_end/parser_testcases/record/record_literal_01.dart.expect
new file mode 100644
index 0000000..8e0987f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_01.dart.expect
@@ -0,0 +1,36 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null, null)
+      handleVoidKeyword(void)
+      handleIdentifier(foo, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleNoType(var)
+        beginVariablesDeclaration(record, null, var)
+          handleIdentifier(record, localVariableDeclaration)
+          beginInitializedIdentifier(record)
+            beginVariableInitializer(=)
+              beginParenthesizedExpressionOrRecordLiteral(()
+                handleLiteralInt(1)
+                handleLiteralInt(2)
+                handleIdentifier(a, namedRecordFieldReference)
+                handleLiteralInt(3)
+                handleNamedRecordField(:)
+                handleIdentifier(b, namedRecordFieldReference)
+                handleLiteralInt(4)
+                handleNamedRecordField(:)
+              endRecordLiteral((, 4)
+            endVariableInitializer(=)
+          endInitializedIdentifier(record)
+        endVariablesDeclaration(1, ;)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/record/record_literal_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/record/record_literal_01.dart.intertwined.expect
new file mode 100644
index 0000000..bce8911
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_01.dart.intertwined.expect
@@ -0,0 +1,92 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, null, , Instance of 'VoidType', null, foo, false)
+        listener: beginTopLevelMethod(, null, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(foo, topLevelFunctionDeclaration)
+        parseMethodTypeVar(foo)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(foo, foo, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(foo, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, var)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, false)
+                looksLikeLocalFunction(record)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                listener: handleNoType(var)
+                listener: beginVariablesDeclaration(record, null, var)
+                parseVariablesDeclarationRest(var, true)
+                  parseOptionallyInitializedIdentifier(var)
+                    ensureIdentifier(var, localVariableDeclaration)
+                      listener: handleIdentifier(record, localVariableDeclaration)
+                    listener: beginInitializedIdentifier(record)
+                    parseVariableInitializerOpt(record)
+                      listener: beginVariableInitializer(=)
+                      parseExpression(=)
+                        parsePrecedenceExpression(=, 1, true)
+                          parseUnaryExpression(=, true)
+                            parsePrimary(=, expression)
+                              parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                                parseParenthesizedExpressionOrRecordLiteral(=)
+                                  listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                  parseExpression(()
+                                    parsePrecedenceExpression((, 1, true)
+                                      parseUnaryExpression((, true)
+                                        parsePrimary((, expression)
+                                          parseLiteralInt(()
+                                            listener: handleLiteralInt(1)
+                                  parseExpression(,)
+                                    parsePrecedenceExpression(,, 1, true)
+                                      parseUnaryExpression(,, true)
+                                        parsePrimary(,, expression)
+                                          parseLiteralInt(,)
+                                            listener: handleLiteralInt(2)
+                                  ensureIdentifier(,, namedRecordFieldReference)
+                                    listener: handleIdentifier(a, namedRecordFieldReference)
+                                  parseExpression(:)
+                                    parsePrecedenceExpression(:, 1, true)
+                                      parseUnaryExpression(:, true)
+                                        parsePrimary(:, expression)
+                                          parseLiteralInt(:)
+                                            listener: handleLiteralInt(3)
+                                  listener: handleNamedRecordField(:)
+                                  ensureIdentifier(,, namedRecordFieldReference)
+                                    listener: handleIdentifier(b, namedRecordFieldReference)
+                                  parseExpression(:)
+                                    parsePrecedenceExpression(:, 1, true)
+                                      parseUnaryExpression(:, true)
+                                        parsePrimary(:, expression)
+                                          parseLiteralInt(:)
+                                            listener: handleLiteralInt(4)
+                                  listener: handleNamedRecordField(:)
+                                  ensureCloseParen(4, ()
+                                  listener: endRecordLiteral((, 4)
+                      listener: endVariableInitializer(=)
+                    listener: endInitializedIdentifier(record)
+                  ensureSemicolon())
+                  listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/record/record_literal_01.dart.parser.expect b/pkg/front_end/parser_testcases/record/record_literal_01.dart.parser.expect
new file mode 100644
index 0000000..500ce14
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_01.dart.parser.expect
@@ -0,0 +1,9 @@
+void foo() {
+var record = (1, 2, a: 3, b: 4);
+}
+
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] record[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] 2[StringToken],[SimpleToken] a[StringToken]:[SimpleToken] 3[StringToken],[SimpleToken] b[StringToken]:[SimpleToken] 4[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/record/record_literal_01.dart.scanner.expect b/pkg/front_end/parser_testcases/record/record_literal_01.dart.scanner.expect
new file mode 100644
index 0000000..500ce14
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_01.dart.scanner.expect
@@ -0,0 +1,9 @@
+void foo() {
+var record = (1, 2, a: 3, b: 4);
+}
+
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] record[StringToken] =[SimpleToken] ([BeginToken]1[StringToken],[SimpleToken] 2[StringToken],[SimpleToken] a[StringToken]:[SimpleToken] 3[StringToken],[SimpleToken] b[StringToken]:[SimpleToken] 4[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/record/record_literal_02.dart b/pkg/front_end/parser_testcases/record/record_literal_02.dart
new file mode 100644
index 0000000..0751484
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_02.dart
@@ -0,0 +1,11 @@
+void foo() {
+  // With ending comma.
+  (42, 42, 42, );
+  (foo: 42, bar: 42, 42, baz: 42, );
+
+  // Nested.
+  ((42, 42), 42);
+
+  // With function inside.
+  ((foo, bar) => 42, 42);
+}
diff --git a/pkg/front_end/parser_testcases/record/record_literal_02.dart.expect b/pkg/front_end/parser_testcases/record/record_literal_02.dart.expect
new file mode 100644
index 0000000..30f102a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_02.dart.expect
@@ -0,0 +1,69 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null, null)
+      handleVoidKeyword(void)
+      handleIdentifier(foo, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleLiteralInt(42)
+          handleLiteralInt(42)
+          handleLiteralInt(42)
+        endRecordLiteral((, 3)
+        handleExpressionStatement(;)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(foo, namedRecordFieldReference)
+          handleLiteralInt(42)
+          handleNamedRecordField(:)
+          handleIdentifier(bar, namedRecordFieldReference)
+          handleLiteralInt(42)
+          handleNamedRecordField(:)
+          handleLiteralInt(42)
+          handleIdentifier(baz, namedRecordFieldReference)
+          handleLiteralInt(42)
+          handleNamedRecordField(:)
+        endRecordLiteral((, 4)
+        handleExpressionStatement(;)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleLiteralInt(42)
+            handleLiteralInt(42)
+          endRecordLiteral((, 2)
+          handleLiteralInt(42)
+        endRecordLiteral((, 2)
+        handleExpressionStatement(;)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleNoTypeVariables(()
+          beginFunctionExpression(()
+            beginFormalParameters((, MemberKind.Local)
+              beginMetadataStar(foo)
+              endMetadataStar(0)
+              beginFormalParameter(foo, MemberKind.Local, null, null, null)
+                handleNoType(()
+                handleIdentifier(foo, formalParameterDeclaration)
+                handleFormalParameterWithoutValue(,)
+              endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.requiredPositional, MemberKind.Local)
+              beginMetadataStar(bar)
+              endMetadataStar(0)
+              beginFormalParameter(bar, MemberKind.Local, null, null, null)
+                handleNoType(,)
+                handleIdentifier(bar, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, bar, null, null, FormalParameterKind.requiredPositional, MemberKind.Local)
+            endFormalParameters(2, (, ), MemberKind.Local)
+            handleAsyncModifier(null, null)
+            handleLiteralInt(42)
+            handleExpressionFunctionBody(=>, null)
+          endFunctionExpression((, ,)
+          handleLiteralInt(42)
+        endRecordLiteral((, 2)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(4, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/record/record_literal_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/record/record_literal_02.dart.intertwined.expect
new file mode 100644
index 0000000..a44d3f8f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_02.dart.intertwined.expect
@@ -0,0 +1,236 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, null, , Instance of 'VoidType', null, foo, false)
+        listener: beginTopLevelMethod(, null, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(foo, topLevelFunctionDeclaration)
+        parseMethodTypeVar(foo)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(foo, foo, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(foo, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, ()
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclaration({, false)
+                parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                  looksLikeLocalFunction(()
+                  parseExpressionStatement({)
+                    parseExpression({)
+                      parsePrecedenceExpression({, 1, true)
+                        parseUnaryExpression({, true)
+                          parsePrimary({, expression)
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral({)
+                              parseParenthesizedExpressionOrRecordLiteral({)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseLiteralInt(()
+                                          listener: handleLiteralInt(42)
+                                parseExpression(,)
+                                  parsePrecedenceExpression(,, 1, true)
+                                    parseUnaryExpression(,, true)
+                                      parsePrimary(,, expression)
+                                        parseLiteralInt(,)
+                                          listener: handleLiteralInt(42)
+                                parseExpression(,)
+                                  parsePrecedenceExpression(,, 1, true)
+                                    parseUnaryExpression(,, true)
+                                      parsePrimary(,, expression)
+                                        parseLiteralInt(,)
+                                          listener: handleLiteralInt(42)
+                                ensureCloseParen(,, ()
+                                listener: endRecordLiteral((, 3)
+                    ensureSemicolon())
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, ()
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(()
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                ensureIdentifier((, namedRecordFieldReference)
+                                  listener: handleIdentifier(foo, namedRecordFieldReference)
+                                parseExpression(:)
+                                  parsePrecedenceExpression(:, 1, true)
+                                    parseUnaryExpression(:, true)
+                                      parsePrimary(:, expression)
+                                        parseLiteralInt(:)
+                                          listener: handleLiteralInt(42)
+                                listener: handleNamedRecordField(:)
+                                ensureIdentifier(,, namedRecordFieldReference)
+                                  listener: handleIdentifier(bar, namedRecordFieldReference)
+                                parseExpression(:)
+                                  parsePrecedenceExpression(:, 1, true)
+                                    parseUnaryExpression(:, true)
+                                      parsePrimary(:, expression)
+                                        parseLiteralInt(:)
+                                          listener: handleLiteralInt(42)
+                                listener: handleNamedRecordField(:)
+                                parseExpression(,)
+                                  parsePrecedenceExpression(,, 1, true)
+                                    parseUnaryExpression(,, true)
+                                      parsePrimary(,, expression)
+                                        parseLiteralInt(,)
+                                          listener: handleLiteralInt(42)
+                                ensureIdentifier(,, namedRecordFieldReference)
+                                  listener: handleIdentifier(baz, namedRecordFieldReference)
+                                parseExpression(:)
+                                  parsePrecedenceExpression(:, 1, true)
+                                    parseUnaryExpression(:, true)
+                                      parsePrimary(:, expression)
+                                        parseLiteralInt(:)
+                                          listener: handleLiteralInt(42)
+                                listener: handleNamedRecordField(:)
+                                ensureCloseParen(,, ()
+                                listener: endRecordLiteral((, 4)
+                    ensureSemicolon())
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, ()
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(()
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                          parseParenthesizedExpressionOrRecordLiteral(()
+                                            listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                            parseExpression(()
+                                              parsePrecedenceExpression((, 1, true)
+                                                parseUnaryExpression((, true)
+                                                  parsePrimary((, expression)
+                                                    parseLiteralInt(()
+                                                      listener: handleLiteralInt(42)
+                                            parseExpression(,)
+                                              parsePrecedenceExpression(,, 1, true)
+                                                parseUnaryExpression(,, true)
+                                                  parsePrimary(,, expression)
+                                                    parseLiteralInt(,)
+                                                      listener: handleLiteralInt(42)
+                                            ensureCloseParen(42, ()
+                                            listener: endRecordLiteral((, 2)
+                                parseExpression(,)
+                                  parsePrecedenceExpression(,, 1, true)
+                                    parseUnaryExpression(,, true)
+                                      parsePrimary(,, expression)
+                                        parseLiteralInt(,)
+                                          listener: handleLiteralInt(42)
+                                ensureCloseParen(42, ()
+                                listener: endRecordLiteral((, 2)
+                    ensureSemicolon())
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, ()
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(()
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(;)
+                              parseParenthesizedExpressionOrRecordLiteral(;)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                          listener: handleNoTypeVariables(()
+                                          parseFunctionExpression(()
+                                            listener: beginFunctionExpression(()
+                                            parseFormalParametersRequiredOpt((, MemberKind.Local)
+                                              parseFormalParametersRest((, MemberKind.Local)
+                                                listener: beginFormalParameters((, MemberKind.Local)
+                                                parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.Local)
+                                                  parseMetadataStar(()
+                                                    listener: beginMetadataStar(foo)
+                                                    listener: endMetadataStar(0)
+                                                  listener: beginFormalParameter(foo, MemberKind.Local, null, null, null)
+                                                  listener: handleNoType(()
+                                                  ensureIdentifier((, formalParameterDeclaration)
+                                                    listener: handleIdentifier(foo, formalParameterDeclaration)
+                                                  listener: handleFormalParameterWithoutValue(,)
+                                                  listener: endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.requiredPositional, MemberKind.Local)
+                                                parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.Local)
+                                                  parseMetadataStar(,)
+                                                    listener: beginMetadataStar(bar)
+                                                    listener: endMetadataStar(0)
+                                                  listener: beginFormalParameter(bar, MemberKind.Local, null, null, null)
+                                                  listener: handleNoType(,)
+                                                  ensureIdentifier(,, formalParameterDeclaration)
+                                                    listener: handleIdentifier(bar, formalParameterDeclaration)
+                                                  listener: handleFormalParameterWithoutValue())
+                                                  listener: endFormalParameter(null, null, null, bar, null, null, FormalParameterKind.requiredPositional, MemberKind.Local)
+                                                listener: endFormalParameters(2, (, ), MemberKind.Local)
+                                            parseAsyncOptBody(), true, false)
+                                              parseAsyncModifierOpt())
+                                                listener: handleAsyncModifier(null, null)
+                                                inPlainSync()
+                                              parseFunctionBody(), true, false)
+                                                parseExpressionFunctionBody(=>, true)
+                                                  parseExpression(=>)
+                                                    parsePrecedenceExpression(=>, 1, true)
+                                                      parseUnaryExpression(=>, true)
+                                                        parsePrimary(=>, expression)
+                                                          parseLiteralInt(=>)
+                                                            listener: handleLiteralInt(42)
+                                                  listener: handleExpressionFunctionBody(=>, null)
+                                                  inGenerator()
+                                            listener: endFunctionExpression((, ,)
+                                parseExpression(,)
+                                  parsePrecedenceExpression(,, 1, true)
+                                    parseUnaryExpression(,, true)
+                                      parsePrimary(,, expression)
+                                        parseLiteralInt(,)
+                                          listener: handleLiteralInt(42)
+                                ensureCloseParen(42, ()
+                                listener: endRecordLiteral((, 2)
+                    ensureSemicolon())
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(4, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/record/record_literal_02.dart.parser.expect b/pkg/front_end/parser_testcases/record/record_literal_02.dart.parser.expect
new file mode 100644
index 0000000..05e0c83
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_02.dart.parser.expect
@@ -0,0 +1,25 @@
+void foo() {
+
+(42, 42, 42, );
+(foo: 42, bar: 42, 42, baz: 42, );
+
+
+((42, 42), 42);
+
+
+((foo, bar) => 42, 42);
+}
+
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+
+([BeginToken]42[StringToken],[SimpleToken] 42[StringToken],[SimpleToken] 42[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken]
+([BeginToken]foo[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] bar[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] 42[StringToken],[SimpleToken] baz[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken]
+
+
+([BeginToken]([BeginToken]42[StringToken],[SimpleToken] 42[StringToken])[SimpleToken],[SimpleToken] 42[StringToken])[SimpleToken];[SimpleToken]
+
+
+([BeginToken]([BeginToken]foo[StringToken],[SimpleToken] bar[StringToken])[SimpleToken] =>[SimpleToken] 42[StringToken],[SimpleToken] 42[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/record/record_literal_02.dart.scanner.expect b/pkg/front_end/parser_testcases/record/record_literal_02.dart.scanner.expect
new file mode 100644
index 0000000..05e0c83
--- /dev/null
+++ b/pkg/front_end/parser_testcases/record/record_literal_02.dart.scanner.expect
@@ -0,0 +1,25 @@
+void foo() {
+
+(42, 42, 42, );
+(foo: 42, bar: 42, 42, baz: 42, );
+
+
+((42, 42), 42);
+
+
+((foo, bar) => 42, 42);
+}
+
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+
+([BeginToken]42[StringToken],[SimpleToken] 42[StringToken],[SimpleToken] 42[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken]
+([BeginToken]foo[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] bar[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] 42[StringToken],[SimpleToken] baz[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] )[SimpleToken];[SimpleToken]
+
+
+([BeginToken]([BeginToken]42[StringToken],[SimpleToken] 42[StringToken])[SimpleToken],[SimpleToken] 42[StringToken])[SimpleToken];[SimpleToken]
+
+
+([BeginToken]([BeginToken]foo[StringToken],[SimpleToken] bar[StringToken])[SimpleToken] =>[SimpleToken] 42[StringToken],[SimpleToken] 42[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/test/parser_equivalence_suite.dart b/pkg/front_end/test/parser_equivalence_suite.dart
index b35a7b3..712e512 100644
--- a/pkg/front_end/test/parser_equivalence_suite.dart
+++ b/pkg/front_end/test/parser_equivalence_suite.dart
@@ -118,7 +118,7 @@
         bIndex++;
       }
       if (anyIgnored) continue;
-      if (aLine != bLine) {
+      if (aLine.trim() != bLine.trim()) {
         return "Disagreement: '${aLine}' vs '${bLine}'";
       }
       aIndex++;
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index 70eba07..c1f95bd 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -2452,6 +2452,12 @@
   }
 
   @override
+  void handleNamedRecordField(Token colon) {
+    seen(colon);
+    doPrint('handleNamedRecordField(' '$colon)');
+  }
+
+  @override
   void beginNewExpression(Token token) {
     seen(token);
     doPrint('beginNewExpression(' '$token)');
@@ -2529,9 +2535,24 @@
   }
 
   @override
-  void handleParenthesizedExpression(Token token) {
+  void beginParenthesizedExpressionOrRecordLiteral(Token token) {
     seen(token);
-    doPrint('handleParenthesizedExpression(' '$token)');
+    doPrint('beginParenthesizedExpressionOrRecordLiteral(' '$token)');
+    indent++;
+  }
+
+  @override
+  void endRecordLiteral(Token token, int count) {
+    indent--;
+    seen(token);
+    doPrint('endRecordLiteral(' '$token, ' '$count)');
+  }
+
+  @override
+  void endParenthesizedExpression(Token token) {
+    indent--;
+    seen(token);
+    doPrint('endParenthesizedExpression(' '$token)');
   }
 
   @override
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index 91a7954..097a722 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -1558,10 +1558,13 @@
   }
 
   @override
-  Token parseParenthesizedExpressionOrFunctionLiteral(Token token) {
-    doPrint('parseParenthesizedExpressionOrFunctionLiteral(' '$token)');
+  Token parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(
+      Token token) {
+    doPrint('parseParenthesizedExpressionFunctionLiteralOrRecordLiteral('
+        '$token)');
     indent++;
-    var result = super.parseParenthesizedExpressionOrFunctionLiteral(token);
+    var result =
+        super.parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(token);
     indent--;
     return result;
   }
@@ -1576,19 +1579,10 @@
   }
 
   @override
-  Token parseParenthesizedExpression(Token token) {
-    doPrint('parseParenthesizedExpression(' '$token)');
+  Token parseParenthesizedExpressionOrRecordLiteral(Token token) {
+    doPrint('parseParenthesizedExpressionOrRecordLiteral(' '$token)');
     indent++;
-    var result = super.parseParenthesizedExpression(token);
-    indent--;
-    return result;
-  }
-
-  @override
-  Token parseExpressionInParenthesis(Token token) {
-    doPrint('parseExpressionInParenthesis(' '$token)');
-    indent++;
-    var result = super.parseExpressionInParenthesis(token);
+    var result = super.parseParenthesizedExpressionOrRecordLiteral(token);
     indent--;
     return result;
   }
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index f8727e4..8c0102f 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -499,6 +499,7 @@
 fileuri
 finally's
 finv
+fire
 firsts
 fishy
 fishythefish
@@ -927,6 +928,7 @@
 paren
 parens
 parenteses
+parity
 particularly
 partof
 patchup
diff --git a/tests/language/record_literal_test.dart b/tests/language/record_literal_test.dart
new file mode 100644
index 0000000..3e17480
--- /dev/null
+++ b/tests/language/record_literal_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  var record1 = (1, 2, a: 3, b: 4);
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record1);
+
+  // With ending comma.
+  var record2 = (42, 42, 42, );
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record2);
+  var record3 = (foo: 42, bar: 42, 42, baz: 42, );
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record3);
+
+  // Nested.
+  var record4 = ((42, 42), 42);
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  //             ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record4);
+
+  // With function inside.
+  var record5 = ((foo, bar) => 42, 42);
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record5);
+}
diff --git a/tests/language_2/record_literal_test.dart b/tests/language_2/record_literal_test.dart
new file mode 100644
index 0000000..9c35f3b
--- /dev/null
+++ b/tests/language_2/record_literal_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+main() {
+  var record1 = (1, 2, a: 3, b: 4);
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record1);
+
+  // With ending comma.
+  var record2 = (42, 42, 42, );
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record2);
+  var record3 = (foo: 42, bar: 42, 42, baz: 42, );
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record3);
+
+  // Nested.
+  var record4 = ((42, 42), 42);
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  //             ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record4);
+
+  // With function inside.
+  var record5 = ((foo, bar) => 42, 42);
+  //            ^
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
+  // [cfe] This requires the 'records' language feature to be enabled.
+  print(record5);
+}
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 2a869d1..ec7842a 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -16,6 +16,10 @@
 # analyzer:
 #   dart pkg/analyzer/tool/experiments/generate.dart
 #
+# Also, pkg/analyzer/lib/src/dart/analysis/driver.dart will need a bump in
+# DATA_VERSION if making changes that changes previous flags' "index", e.g.
+# if adding a new flag that doesn't happen to be lexicographically last.
+#
 # kernel:
 #   pkg/front_end/tool/fasta generate-experimental-flags
 #
@@ -124,6 +128,9 @@
   inference-update-2:
     help: "Type promotion for fields"
 
+  records:
+    help: "Records"
+
 # Experiment flag only used for testing.
   test-experiment:
     help: >-