[parser] Support record type in pattern

Fixes http://dartbug.com/51169
Fixes http://dartbug.com/51176

Change-Id: Iaa38585ce311319f2f4c106fc979c99d931eaa15
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/280106
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
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 3fcb7a8..22d39d0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -9481,6 +9481,17 @@
         // variablePattern ::= ( 'var' | 'final' | 'final'? type )? identifier
         return parseVariablePattern(token, patternContext);
       case '(':
+        // "(" could start a record type (which has to be followed by an
+        // identifier though), e.g. `(int, int) foo`.
+        if (next.endGroup!.next!.isIdentifier) {
+          TypeInfo typeInfo = computeVariablePatternType(token);
+          if (typeInfo is ComplexTypeInfo &&
+              typeInfo.isRecordType &&
+              !typeInfo.recovered) {
+            return parseVariablePattern(token, patternContext,
+                typeInfo: typeInfo);
+          }
+        }
         // parenthesizedPattern  ::= '(' pattern ')'
         // recordPattern         ::= '(' patternFields? ')'
         // patternFields         ::= patternField ( ',' patternField )* ','?
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51169.dart b/pkg/front_end/parser_testcases/patterns/issue_51169.dart
new file mode 100644
index 0000000..4a55399
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51169.dart
@@ -0,0 +1,17 @@
+class Class {
+  dynamic field;
+  Class(this.field);
+}
+
+test(a) {
+  switch (a) {
+    case (foo: int b) when b != 2:
+      print(b);
+    case (foo: (int, int) b) when b != (2, 3):
+      print(b);
+    case Class(field: int b) when b != 2:
+      print(b);
+    case Class(field: (int, int) b) when b != (2, 3):
+      print(b);
+  }
+}
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51169.dart.expect b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.expect
new file mode 100644
index 0000000..9574f9f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.expect
@@ -0,0 +1,239 @@
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(Class, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, null, null, null, null, null, null, null, null, Class)
+      handleNoType(Class)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+        beginMetadataStar(dynamic)
+        endMetadataStar(0)
+        beginMember()
+          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
+            handleIdentifier(dynamic, typeReference)
+            handleNoTypeArguments(field)
+            handleType(dynamic, null)
+            handleIdentifier(field, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, null, null, null, null, null, null, 1, dynamic, ;)
+        endMember()
+        beginMetadataStar(Class)
+        endMetadataStar(0)
+        beginMember()
+          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, Class)
+            handleNoType(;)
+            handleIdentifier(Class, methodDeclaration)
+            handleNoTypeVariables(()
+            beginFormalParameters((, MemberKind.NonStaticMethod)
+              beginMetadataStar(this)
+              endMetadataStar(0)
+              beginFormalParameter(this, MemberKind.NonStaticMethod, null, null, null)
+                handleNoType(()
+                handleIdentifier(field, fieldInitializer)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(this, null, ., field, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod)
+            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
+            handleNoInitializers()
+            handleAsyncModifier(null, null)
+            handleEmptyFunctionBody(;)
+          endClassConstructor(null, Class, (, null, ;)
+        endMember()
+      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 2, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(test)
+  beginMetadataStar(test)
+  endMetadataStar(0)
+  beginTopLevelMember(test)
+    beginTopLevelMethod(}, null, null)
+      handleNoType(})
+      handleIdentifier(test, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(a)
+        endMetadataStar(0)
+        beginFormalParameter(a, MemberKind.TopLevelMethod, null, null, null)
+          handleNoType(()
+          handleIdentifier(a, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginSwitchStatement(switch)
+          handleIdentifier(a, expression)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(a, ))
+          handleParenthesizedCondition((, null, null)
+          beginSwitchBlock({)
+            beginCaseExpression(case)
+              handleIdentifier(foo, namedRecordFieldReference)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(b)
+              handleType(int, null)
+              handleVariablePattern(null, b, false)
+              handlePatternField(:)
+              handleRecordPattern((, 1)
+              beginSwitchCaseWhenClause(when)
+                handleIdentifier(b, expression)
+                handleNoTypeArguments(!=)
+                handleNoArguments(!=)
+                handleSend(b, !=)
+                beginBinaryExpression(!=)
+                  handleLiteralInt(2)
+                endBinaryExpression(!=)
+              endSwitchCaseWhenClause(2)
+            endCaseExpression(case, when, :)
+            beginSwitchCase(0, 1, case)
+              handleIdentifier(print, expression)
+              handleNoTypeArguments(()
+              beginArguments(()
+                handleIdentifier(b, expression)
+                handleNoTypeArguments())
+                handleNoArguments())
+                handleSend(b, ))
+              endArguments(1, (, ))
+              handleSend(print, ;)
+              handleExpressionStatement(;)
+            endSwitchCase(0, 1, null, null, 1, case, case)
+            beginCaseExpression(case)
+              handleIdentifier(foo, namedRecordFieldReference)
+              beginRecordType(()
+                beginRecordTypeEntry()
+                  beginMetadataStar(int)
+                  endMetadataStar(0)
+                  handleIdentifier(int, typeReference)
+                  handleNoTypeArguments(,)
+                  handleType(int, null)
+                  handleNoName(,)
+                endRecordTypeEntry()
+                beginRecordTypeEntry()
+                  beginMetadataStar(int)
+                  endMetadataStar(0)
+                  handleIdentifier(int, typeReference)
+                  handleNoTypeArguments())
+                  handleType(int, null)
+                  handleNoName())
+                endRecordTypeEntry()
+              endRecordType((, null, 2, false)
+              handleVariablePattern(null, b, false)
+              handlePatternField(:)
+              handleRecordPattern((, 1)
+              beginSwitchCaseWhenClause(when)
+                handleIdentifier(b, expression)
+                handleNoTypeArguments(!=)
+                handleNoArguments(!=)
+                handleSend(b, !=)
+                beginBinaryExpression(!=)
+                  beginParenthesizedExpressionOrRecordLiteral(()
+                    handleLiteralInt(2)
+                    handleLiteralInt(3)
+                  endRecordLiteral((, 2, null)
+                endBinaryExpression(!=)
+              endSwitchCaseWhenClause())
+            endCaseExpression(case, when, :)
+            beginSwitchCase(0, 1, case)
+              handleIdentifier(print, expression)
+              handleNoTypeArguments(()
+              beginArguments(()
+                handleIdentifier(b, expression)
+                handleNoTypeArguments())
+                handleNoArguments())
+                handleSend(b, ))
+              endArguments(1, (, ))
+              handleSend(print, ;)
+              handleExpressionStatement(;)
+            endSwitchCase(0, 1, null, null, 1, case, case)
+            beginCaseExpression(case)
+              handleNoTypeArguments(()
+              handleIdentifier(field, namedArgumentReference)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(b)
+              handleType(int, null)
+              handleVariablePattern(null, b, false)
+              handlePatternField(:)
+              handleObjectPatternFields(1, (, ))
+              handleObjectPattern(Class, null, null)
+              beginSwitchCaseWhenClause(when)
+                handleIdentifier(b, expression)
+                handleNoTypeArguments(!=)
+                handleNoArguments(!=)
+                handleSend(b, !=)
+                beginBinaryExpression(!=)
+                  handleLiteralInt(2)
+                endBinaryExpression(!=)
+              endSwitchCaseWhenClause(2)
+            endCaseExpression(case, when, :)
+            beginSwitchCase(0, 1, case)
+              handleIdentifier(print, expression)
+              handleNoTypeArguments(()
+              beginArguments(()
+                handleIdentifier(b, expression)
+                handleNoTypeArguments())
+                handleNoArguments())
+                handleSend(b, ))
+              endArguments(1, (, ))
+              handleSend(print, ;)
+              handleExpressionStatement(;)
+            endSwitchCase(0, 1, null, null, 1, case, case)
+            beginCaseExpression(case)
+              handleNoTypeArguments(()
+              handleIdentifier(field, namedArgumentReference)
+              beginRecordType(()
+                beginRecordTypeEntry()
+                  beginMetadataStar(int)
+                  endMetadataStar(0)
+                  handleIdentifier(int, typeReference)
+                  handleNoTypeArguments(,)
+                  handleType(int, null)
+                  handleNoName(,)
+                endRecordTypeEntry()
+                beginRecordTypeEntry()
+                  beginMetadataStar(int)
+                  endMetadataStar(0)
+                  handleIdentifier(int, typeReference)
+                  handleNoTypeArguments())
+                  handleType(int, null)
+                  handleNoName())
+                endRecordTypeEntry()
+              endRecordType((, null, 2, false)
+              handleVariablePattern(null, b, false)
+              handlePatternField(:)
+              handleObjectPatternFields(1, (, ))
+              handleObjectPattern(Class, null, null)
+              beginSwitchCaseWhenClause(when)
+                handleIdentifier(b, expression)
+                handleNoTypeArguments(!=)
+                handleNoArguments(!=)
+                handleSend(b, !=)
+                beginBinaryExpression(!=)
+                  beginParenthesizedExpressionOrRecordLiteral(()
+                    handleLiteralInt(2)
+                    handleLiteralInt(3)
+                  endRecordLiteral((, 2, null)
+                endBinaryExpression(!=)
+              endSwitchCaseWhenClause())
+            endCaseExpression(case, when, :)
+            beginSwitchCase(0, 1, case)
+              handleIdentifier(print, expression)
+              handleNoTypeArguments(()
+              beginArguments(()
+                handleIdentifier(b, expression)
+                handleNoTypeArguments())
+                handleNoArguments())
+                handleSend(b, ))
+              endArguments(1, (, ))
+              handleSend(print, ;)
+              handleExpressionStatement(;)
+            endSwitchCase(0, 1, null, null, 1, case, })
+          endSwitchBlock(4, {, })
+        endSwitchStatement(switch, })
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(test, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51169.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.intertwined.expect
new file mode 100644
index 0000000..8864624
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.intertwined.expect
@@ -0,0 +1,611 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, null, null, null, null, null, Instance of 'DirectiveContext')
+      parseClassOrNamedMixinApplication(null, null, null, null, null, null, null, null, null, class)
+        listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Class, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, null, Class)
+        parseClass(Class, class, class, Class)
+          parseClassHeaderOpt(Class, class, class)
+            parseClassExtendsOpt(Class)
+              listener: handleNoType(Class)
+              listener: handleClassExtends(null, 1)
+            parseClassWithClauseOpt(Class)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinOrEnumImplementsOpt(Class)
+              listener: handleImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(Class, DeclarationKind.Class, Class)
+            listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+            notEofOrValue(}, dynamic)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Class)
+              parseMetadataStar({)
+                listener: beginMetadataStar(dynamic)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              parseFields({, null, null, null, null, null, null, null, {, Instance of 'SimpleType', field, DeclarationKind.Class, Class, false)
+                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
+                listener: handleIdentifier(dynamic, typeReference)
+                listener: handleNoTypeArguments(field)
+                listener: handleType(dynamic, null)
+                ensureIdentifierPotentiallyRecovered(dynamic, fieldDeclaration, false)
+                  listener: handleIdentifier(field, fieldDeclaration)
+                parseFieldInitializerOpt(field, field, null, null, null, null, null, DeclarationKind.Class, Class)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, null, null, null, null, null, null, 1, dynamic, ;)
+              listener: endMember()
+            notEofOrValue(}, Class)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Class)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(Class)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              isReservedKeyword(()
+              parseMethod(;, null, null, null, null, null, null, null, ;, Instance of 'NoType', null, Class, DeclarationKind.Class, Class, false)
+                listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, Class)
+                listener: handleNoType(;)
+                ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
+                  listener: handleIdentifier(Class, methodDeclaration)
+                parseQualifiedRestOpt(Class, methodDeclarationContinuation)
+                parseMethodTypeVar(Class)
+                  listener: handleNoTypeVariables(()
+                parseGetterOrFormalParameters(Class, Class, false, MemberKind.NonStaticMethod)
+                  parseFormalParameters(Class, MemberKind.NonStaticMethod)
+                    parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                      listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                      parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod)
+                        parseMetadataStar(()
+                          listener: beginMetadataStar(this)
+                          listener: endMetadataStar(0)
+                        listener: beginFormalParameter(this, MemberKind.NonStaticMethod, null, null, null)
+                        listener: handleNoType(()
+                        ensureIdentifier(., fieldInitializer)
+                          listener: handleIdentifier(field, fieldInitializer)
+                        listener: handleFormalParameterWithoutValue())
+                        listener: endFormalParameter(this, null, ., field, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod)
+                      listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
+                parseInitializersOpt())
+                  listener: handleNoInitializers()
+                parseAsyncModifierOpt())
+                  listener: handleAsyncModifier(null, null)
+                  inPlainSync()
+                inPlainSync()
+                parseFunctionBody(), false, true)
+                  listener: handleEmptyFunctionBody(;)
+                listener: endClassConstructor(null, Class, (, null, ;)
+              listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 2, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(test)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(test)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(test)
+      isReservedKeyword(()
+      parseTopLevelMethod(}, null, null, }, Instance of 'NoType', null, test, false)
+        listener: beginTopLevelMethod(}, null, null)
+        listener: handleNoType(})
+        ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(test, topLevelFunctionDeclaration)
+        parseMethodTypeVar(test)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(test, test, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(test, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(a)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(a, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleNoType(()
+                ensureIdentifier((, formalParameterDeclaration)
+                  listener: handleIdentifier(a, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, switch)
+          parseStatement({)
+            parseStatementX({)
+              parseSwitchStatement({)
+                listener: beginSwitchStatement(switch)
+                ensureParenthesizedCondition(switch, allowCase: false)
+                  parseExpressionInParenthesisRest((, allowCase: false)
+                    parseExpression(()
+                      looksLikeOuterPatternEquals(()
+                        skipOuterPattern(()
+                          skipObjectPatternRest(a)
+                      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, ))
+                    ensureCloseParen(a, ()
+                    listener: handleParenthesizedCondition((, null, null)
+                parseSwitchBlock())
+                  ensureBlock(), null, switch statement)
+                  listener: beginSwitchBlock({)
+                  notEofOrValue(}, case)
+                  peekPastLabels(case)
+                  listener: beginCaseExpression(case)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(foo, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'SimpleType')
+                              listener: handleIdentifier(int, typeReference)
+                              listener: handleNoTypeArguments(b)
+                              listener: handleType(int, null)
+                              listener: handleVariablePattern(null, b, false)
+                        listener: handlePatternField(:)
+                        ensureCloseParen(b, ()
+                        listener: handleRecordPattern((, 1)
+                  listener: beginSwitchCaseWhenClause(when)
+                  parseExpression(when)
+                    looksLikeOuterPatternEquals(when)
+                      skipOuterPattern(when)
+                        skipObjectPatternRest(b)
+                    parsePrecedenceExpression(when, 1, true)
+                      parseUnaryExpression(when, true)
+                        parsePrimary(when, expression)
+                          parseSendOrFunctionLiteral(when, expression)
+                            parseSend(when, expression)
+                              isNextIdentifier(when)
+                              ensureIdentifier(when, expression)
+                                listener: handleIdentifier(b, expression)
+                              listener: handleNoTypeArguments(!=)
+                              parseArgumentsOpt(b)
+                                listener: handleNoArguments(!=)
+                              listener: handleSend(b, !=)
+                      listener: beginBinaryExpression(!=)
+                      parsePrecedenceExpression(!=, 8, true)
+                        parseUnaryExpression(!=, true)
+                          parsePrimary(!=, expression)
+                            parseLiteralInt(!=)
+                              listener: handleLiteralInt(2)
+                      listener: endBinaryExpression(!=)
+                  listener: endSwitchCaseWhenClause(2)
+                  ensureColon(2)
+                  listener: endCaseExpression(case, when, :)
+                  peekPastLabels(print)
+                  parseStatementsInSwitchCase(:, print, case, 0, 1, null, null)
+                    listener: beginSwitchCase(0, 1, case)
+                    parseStatement(:)
+                      parseStatementX(:)
+                        parseExpressionStatementOrDeclarationAfterModifiers(:, :, null, null, null, null)
+                          looksLikeLocalFunction(print)
+                          parseExpressionStatement(:)
+                            parseExpression(:)
+                              looksLikeOuterPatternEquals(:)
+                                skipOuterPattern(:)
+                                  skipObjectPatternRest(print)
+                              parsePrecedenceExpression(:, 1, true)
+                                parseUnaryExpression(:, true)
+                                  parsePrimary(:, expression)
+                                    parseSendOrFunctionLiteral(:, expression)
+                                      looksLikeFunctionBody(;)
+                                      parseSend(:, expression)
+                                        isNextIdentifier(:)
+                                        ensureIdentifier(:, expression)
+                                          listener: handleIdentifier(print, expression)
+                                        listener: handleNoTypeArguments(()
+                                        parseArgumentsOpt(print)
+                                          parseArguments(print)
+                                            parseArgumentsRest(()
+                                              listener: beginArguments(()
+                                              parseExpression(()
+                                                looksLikeOuterPatternEquals(()
+                                                  skipOuterPattern(()
+                                                    skipObjectPatternRest(b)
+                                                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: endArguments(1, (, ))
+                                        listener: handleSend(print, ;)
+                            ensureSemicolon())
+                            listener: handleExpressionStatement(;)
+                    peekPastLabels(case)
+                    listener: endSwitchCase(0, 1, null, null, 1, case, case)
+                  notEofOrValue(}, case)
+                  peekPastLabels(case)
+                  listener: beginCaseExpression(case)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(foo, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'ComplexTypeInfo')
+                              parseRecordType((, :, false)
+                                listener: beginRecordType(()
+                                parseRecordTypeField((, identifierIsOptional: true)
+                                  listener: beginRecordTypeEntry()
+                                  parseMetadataStar(()
+                                    listener: beginMetadataStar(int)
+                                    listener: endMetadataStar(0)
+                                  listener: handleIdentifier(int, typeReference)
+                                  listener: handleNoTypeArguments(,)
+                                  listener: handleType(int, null)
+                                  listener: handleNoName(,)
+                                  listener: endRecordTypeEntry()
+                                parseRecordTypeField(,, identifierIsOptional: true)
+                                  listener: beginRecordTypeEntry()
+                                  parseMetadataStar(,)
+                                    listener: beginMetadataStar(int)
+                                    listener: endMetadataStar(0)
+                                  listener: handleIdentifier(int, typeReference)
+                                  listener: handleNoTypeArguments())
+                                  listener: handleType(int, null)
+                                  listener: handleNoName())
+                                  listener: endRecordTypeEntry()
+                                listener: endRecordType((, null, 2, false)
+                              listener: handleVariablePattern(null, b, false)
+                        listener: handlePatternField(:)
+                        ensureCloseParen(b, ()
+                        listener: handleRecordPattern((, 1)
+                  listener: beginSwitchCaseWhenClause(when)
+                  parseExpression(when)
+                    looksLikeOuterPatternEquals(when)
+                      skipOuterPattern(when)
+                        skipObjectPatternRest(b)
+                    parsePrecedenceExpression(when, 1, true)
+                      parseUnaryExpression(when, true)
+                        parsePrimary(when, expression)
+                          parseSendOrFunctionLiteral(when, expression)
+                            parseSend(when, expression)
+                              isNextIdentifier(when)
+                              ensureIdentifier(when, expression)
+                                listener: handleIdentifier(b, expression)
+                              listener: handleNoTypeArguments(!=)
+                              parseArgumentsOpt(b)
+                                listener: handleNoArguments(!=)
+                              listener: handleSend(b, !=)
+                      listener: beginBinaryExpression(!=)
+                      parsePrecedenceExpression(!=, 8, true)
+                        parseUnaryExpression(!=, true)
+                          parsePrimary(!=, expression)
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(!=)
+                              parseParenthesizedExpressionOrRecordLiteral(!=, null)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  looksLikeOuterPatternEquals(()
+                                    skipOuterPattern(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseLiteralInt(()
+                                          listener: handleLiteralInt(2)
+                                parseExpression(,)
+                                  looksLikeOuterPatternEquals(,)
+                                    skipOuterPattern(,)
+                                  parsePrecedenceExpression(,, 1, true)
+                                    parseUnaryExpression(,, true)
+                                      parsePrimary(,, expression)
+                                        parseLiteralInt(,)
+                                          listener: handleLiteralInt(3)
+                                ensureCloseParen(3, ()
+                                listener: endRecordLiteral((, 2, null)
+                      listener: endBinaryExpression(!=)
+                  listener: endSwitchCaseWhenClause())
+                  ensureColon())
+                  listener: endCaseExpression(case, when, :)
+                  peekPastLabels(print)
+                  parseStatementsInSwitchCase(:, print, case, 0, 1, null, null)
+                    listener: beginSwitchCase(0, 1, case)
+                    parseStatement(:)
+                      parseStatementX(:)
+                        parseExpressionStatementOrDeclarationAfterModifiers(:, :, null, null, null, null)
+                          looksLikeLocalFunction(print)
+                          parseExpressionStatement(:)
+                            parseExpression(:)
+                              looksLikeOuterPatternEquals(:)
+                                skipOuterPattern(:)
+                                  skipObjectPatternRest(print)
+                              parsePrecedenceExpression(:, 1, true)
+                                parseUnaryExpression(:, true)
+                                  parsePrimary(:, expression)
+                                    parseSendOrFunctionLiteral(:, expression)
+                                      looksLikeFunctionBody(;)
+                                      parseSend(:, expression)
+                                        isNextIdentifier(:)
+                                        ensureIdentifier(:, expression)
+                                          listener: handleIdentifier(print, expression)
+                                        listener: handleNoTypeArguments(()
+                                        parseArgumentsOpt(print)
+                                          parseArguments(print)
+                                            parseArgumentsRest(()
+                                              listener: beginArguments(()
+                                              parseExpression(()
+                                                looksLikeOuterPatternEquals(()
+                                                  skipOuterPattern(()
+                                                    skipObjectPatternRest(b)
+                                                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: endArguments(1, (, ))
+                                        listener: handleSend(print, ;)
+                            ensureSemicolon())
+                            listener: handleExpressionStatement(;)
+                    peekPastLabels(case)
+                    listener: endSwitchCase(0, 1, null, null, 1, case, case)
+                  notEofOrValue(}, case)
+                  peekPastLabels(case)
+                  listener: beginCaseExpression(case)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      listener: handleNoTypeArguments(()
+                      parseObjectPatternRest(Class, PatternContext.matching)
+                        ensureIdentifier((, namedArgumentReference)
+                          listener: handleIdentifier(field, namedArgumentReference)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'SimpleType')
+                              listener: handleIdentifier(int, typeReference)
+                              listener: handleNoTypeArguments(b)
+                              listener: handleType(int, null)
+                              listener: handleVariablePattern(null, b, false)
+                        listener: handlePatternField(:)
+                        listener: handleObjectPatternFields(1, (, ))
+                      listener: handleObjectPattern(Class, null, null)
+                  listener: beginSwitchCaseWhenClause(when)
+                  parseExpression(when)
+                    looksLikeOuterPatternEquals(when)
+                      skipOuterPattern(when)
+                        skipObjectPatternRest(b)
+                    parsePrecedenceExpression(when, 1, true)
+                      parseUnaryExpression(when, true)
+                        parsePrimary(when, expression)
+                          parseSendOrFunctionLiteral(when, expression)
+                            parseSend(when, expression)
+                              isNextIdentifier(when)
+                              ensureIdentifier(when, expression)
+                                listener: handleIdentifier(b, expression)
+                              listener: handleNoTypeArguments(!=)
+                              parseArgumentsOpt(b)
+                                listener: handleNoArguments(!=)
+                              listener: handleSend(b, !=)
+                      listener: beginBinaryExpression(!=)
+                      parsePrecedenceExpression(!=, 8, true)
+                        parseUnaryExpression(!=, true)
+                          parsePrimary(!=, expression)
+                            parseLiteralInt(!=)
+                              listener: handleLiteralInt(2)
+                      listener: endBinaryExpression(!=)
+                  listener: endSwitchCaseWhenClause(2)
+                  ensureColon(2)
+                  listener: endCaseExpression(case, when, :)
+                  peekPastLabels(print)
+                  parseStatementsInSwitchCase(:, print, case, 0, 1, null, null)
+                    listener: beginSwitchCase(0, 1, case)
+                    parseStatement(:)
+                      parseStatementX(:)
+                        parseExpressionStatementOrDeclarationAfterModifiers(:, :, null, null, null, null)
+                          looksLikeLocalFunction(print)
+                          parseExpressionStatement(:)
+                            parseExpression(:)
+                              looksLikeOuterPatternEquals(:)
+                                skipOuterPattern(:)
+                                  skipObjectPatternRest(print)
+                              parsePrecedenceExpression(:, 1, true)
+                                parseUnaryExpression(:, true)
+                                  parsePrimary(:, expression)
+                                    parseSendOrFunctionLiteral(:, expression)
+                                      looksLikeFunctionBody(;)
+                                      parseSend(:, expression)
+                                        isNextIdentifier(:)
+                                        ensureIdentifier(:, expression)
+                                          listener: handleIdentifier(print, expression)
+                                        listener: handleNoTypeArguments(()
+                                        parseArgumentsOpt(print)
+                                          parseArguments(print)
+                                            parseArgumentsRest(()
+                                              listener: beginArguments(()
+                                              parseExpression(()
+                                                looksLikeOuterPatternEquals(()
+                                                  skipOuterPattern(()
+                                                    skipObjectPatternRest(b)
+                                                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: endArguments(1, (, ))
+                                        listener: handleSend(print, ;)
+                            ensureSemicolon())
+                            listener: handleExpressionStatement(;)
+                    peekPastLabels(case)
+                    listener: endSwitchCase(0, 1, null, null, 1, case, case)
+                  notEofOrValue(}, case)
+                  peekPastLabels(case)
+                  listener: beginCaseExpression(case)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      listener: handleNoTypeArguments(()
+                      parseObjectPatternRest(Class, PatternContext.matching)
+                        ensureIdentifier((, namedArgumentReference)
+                          listener: handleIdentifier(field, namedArgumentReference)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'ComplexTypeInfo')
+                              parseRecordType((, :, false)
+                                listener: beginRecordType(()
+                                parseRecordTypeField((, identifierIsOptional: true)
+                                  listener: beginRecordTypeEntry()
+                                  parseMetadataStar(()
+                                    listener: beginMetadataStar(int)
+                                    listener: endMetadataStar(0)
+                                  listener: handleIdentifier(int, typeReference)
+                                  listener: handleNoTypeArguments(,)
+                                  listener: handleType(int, null)
+                                  listener: handleNoName(,)
+                                  listener: endRecordTypeEntry()
+                                parseRecordTypeField(,, identifierIsOptional: true)
+                                  listener: beginRecordTypeEntry()
+                                  parseMetadataStar(,)
+                                    listener: beginMetadataStar(int)
+                                    listener: endMetadataStar(0)
+                                  listener: handleIdentifier(int, typeReference)
+                                  listener: handleNoTypeArguments())
+                                  listener: handleType(int, null)
+                                  listener: handleNoName())
+                                  listener: endRecordTypeEntry()
+                                listener: endRecordType((, null, 2, false)
+                              listener: handleVariablePattern(null, b, false)
+                        listener: handlePatternField(:)
+                        listener: handleObjectPatternFields(1, (, ))
+                      listener: handleObjectPattern(Class, null, null)
+                  listener: beginSwitchCaseWhenClause(when)
+                  parseExpression(when)
+                    looksLikeOuterPatternEquals(when)
+                      skipOuterPattern(when)
+                        skipObjectPatternRest(b)
+                    parsePrecedenceExpression(when, 1, true)
+                      parseUnaryExpression(when, true)
+                        parsePrimary(when, expression)
+                          parseSendOrFunctionLiteral(when, expression)
+                            parseSend(when, expression)
+                              isNextIdentifier(when)
+                              ensureIdentifier(when, expression)
+                                listener: handleIdentifier(b, expression)
+                              listener: handleNoTypeArguments(!=)
+                              parseArgumentsOpt(b)
+                                listener: handleNoArguments(!=)
+                              listener: handleSend(b, !=)
+                      listener: beginBinaryExpression(!=)
+                      parsePrecedenceExpression(!=, 8, true)
+                        parseUnaryExpression(!=, true)
+                          parsePrimary(!=, expression)
+                            parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(!=)
+                              parseParenthesizedExpressionOrRecordLiteral(!=, null)
+                                listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                parseExpression(()
+                                  looksLikeOuterPatternEquals(()
+                                    skipOuterPattern(()
+                                  parsePrecedenceExpression((, 1, true)
+                                    parseUnaryExpression((, true)
+                                      parsePrimary((, expression)
+                                        parseLiteralInt(()
+                                          listener: handleLiteralInt(2)
+                                parseExpression(,)
+                                  looksLikeOuterPatternEquals(,)
+                                    skipOuterPattern(,)
+                                  parsePrecedenceExpression(,, 1, true)
+                                    parseUnaryExpression(,, true)
+                                      parsePrimary(,, expression)
+                                        parseLiteralInt(,)
+                                          listener: handleLiteralInt(3)
+                                ensureCloseParen(3, ()
+                                listener: endRecordLiteral((, 2, null)
+                      listener: endBinaryExpression(!=)
+                  listener: endSwitchCaseWhenClause())
+                  ensureColon())
+                  listener: endCaseExpression(case, when, :)
+                  peekPastLabels(print)
+                  parseStatementsInSwitchCase(:, print, case, 0, 1, null, null)
+                    listener: beginSwitchCase(0, 1, case)
+                    parseStatement(:)
+                      parseStatementX(:)
+                        parseExpressionStatementOrDeclarationAfterModifiers(:, :, null, null, null, null)
+                          looksLikeLocalFunction(print)
+                          parseExpressionStatement(:)
+                            parseExpression(:)
+                              looksLikeOuterPatternEquals(:)
+                                skipOuterPattern(:)
+                                  skipObjectPatternRest(print)
+                              parsePrecedenceExpression(:, 1, true)
+                                parseUnaryExpression(:, true)
+                                  parsePrimary(:, expression)
+                                    parseSendOrFunctionLiteral(:, expression)
+                                      looksLikeFunctionBody(;)
+                                      parseSend(:, expression)
+                                        isNextIdentifier(:)
+                                        ensureIdentifier(:, expression)
+                                          listener: handleIdentifier(print, expression)
+                                        listener: handleNoTypeArguments(()
+                                        parseArgumentsOpt(print)
+                                          parseArguments(print)
+                                            parseArgumentsRest(()
+                                              listener: beginArguments(()
+                                              parseExpression(()
+                                                looksLikeOuterPatternEquals(()
+                                                  skipOuterPattern(()
+                                                    skipObjectPatternRest(b)
+                                                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: endArguments(1, (, ))
+                                        listener: handleSend(print, ;)
+                            ensureSemicolon())
+                            listener: handleExpressionStatement(;)
+                    peekPastLabels(})
+                    listener: endSwitchCase(0, 1, null, null, 1, case, })
+                  notEofOrValue(}, })
+                  listener: endSwitchBlock(4, {, })
+                listener: endSwitchStatement(switch, })
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(test, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51169.dart.parser.expect b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.parser.expect
new file mode 100644
index 0000000..bc3e020
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.parser.expect
@@ -0,0 +1,37 @@
+class Class {
+dynamic field;
+Class(this.field);
+}
+
+test(a) {
+switch (a) {
+case (foo: int b) when b != 2:
+print(b);
+case (foo: (int, int) b) when b != (2, 3):
+print(b);
+case Class(field: int b) when b != 2:
+print(b);
+case Class(field: (int, int) b) when b != (2, 3):
+print(b);
+}
+}
+
+
+class[KeywordToken] Class[StringToken] {[BeginToken]
+dynamic[KeywordToken] field[StringToken];[SimpleToken]
+Class[StringToken]([BeginToken]this[KeywordToken].[SimpleToken]field[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+test[StringToken]([BeginToken]a[StringToken])[SimpleToken] {[BeginToken]
+switch[KeywordToken] ([BeginToken]a[StringToken])[SimpleToken] {[BeginToken]
+case[KeywordToken] ([BeginToken]foo[StringToken]:[SimpleToken] int[StringToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] 2[StringToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+case[KeywordToken] ([BeginToken]foo[StringToken]:[SimpleToken] ([BeginToken]int[StringToken],[SimpleToken] int[StringToken])[SimpleToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] ([BeginToken]2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+case[KeywordToken] Class[StringToken]([BeginToken]field[StringToken]:[SimpleToken] int[StringToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] 2[StringToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+case[KeywordToken] Class[StringToken]([BeginToken]field[StringToken]:[SimpleToken] ([BeginToken]int[StringToken],[SimpleToken] int[StringToken])[SimpleToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] ([BeginToken]2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51169.dart.scanner.expect b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.scanner.expect
new file mode 100644
index 0000000..bc3e020
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51169.dart.scanner.expect
@@ -0,0 +1,37 @@
+class Class {
+dynamic field;
+Class(this.field);
+}
+
+test(a) {
+switch (a) {
+case (foo: int b) when b != 2:
+print(b);
+case (foo: (int, int) b) when b != (2, 3):
+print(b);
+case Class(field: int b) when b != 2:
+print(b);
+case Class(field: (int, int) b) when b != (2, 3):
+print(b);
+}
+}
+
+
+class[KeywordToken] Class[StringToken] {[BeginToken]
+dynamic[KeywordToken] field[StringToken];[SimpleToken]
+Class[StringToken]([BeginToken]this[KeywordToken].[SimpleToken]field[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+test[StringToken]([BeginToken]a[StringToken])[SimpleToken] {[BeginToken]
+switch[KeywordToken] ([BeginToken]a[StringToken])[SimpleToken] {[BeginToken]
+case[KeywordToken] ([BeginToken]foo[StringToken]:[SimpleToken] int[StringToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] 2[StringToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+case[KeywordToken] ([BeginToken]foo[StringToken]:[SimpleToken] ([BeginToken]int[StringToken],[SimpleToken] int[StringToken])[SimpleToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] ([BeginToken]2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+case[KeywordToken] Class[StringToken]([BeginToken]field[StringToken]:[SimpleToken] int[StringToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] 2[StringToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+case[KeywordToken] Class[StringToken]([BeginToken]field[StringToken]:[SimpleToken] ([BeginToken]int[StringToken],[SimpleToken] int[StringToken])[SimpleToken] b[StringToken])[SimpleToken] when[KeywordToken] b[StringToken] !=[SimpleToken] ([BeginToken]2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken]:[SimpleToken]
+print[StringToken]([BeginToken]b[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51176.dart b/pkg/front_end/parser_testcases/patterns/issue_51176.dart
new file mode 100644
index 0000000..f34ab34
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51176.dart
@@ -0,0 +1,17 @@
+main() {
+  var ((a1,),) = ((-1,),);
+  var (n: (x: a2)) = (n: (x: 42));
+  var (n: (x: a3, b3), (y: c3, d3)) = (n: (x: 42, -1), (y: 1, 0));
+
+  final ((a4,),) = ((-1,),);
+  final (n: (x: a5)) = (n: (x: 42));
+  final (n: (x: a6, b6), (y: c6, d6)) = (n: (x: 42, -1), (y: 1, 0));
+
+  var ((int a7,),) = ((-1,),);
+  var (n: (x: int a8)) = (n: (x: 42));
+  var (n: (x: int a9, int b9), (y: int c9, int d9))
+      = (n: (x: 42, -1), (y: 1, 0));
+
+  var (n: (int, {int x}) a10, (int z, {int y}) b10)
+      = (n: (x: 42, -1), (y: 1, 0));
+}
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51176.dart.expect b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.expect
new file mode 100644
index 0000000..e121ec1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.expect
@@ -0,0 +1,319 @@
+beginCompilationUnit(main)
+  beginMetadataStar(main)
+  endMetadataStar(0)
+  beginTopLevelMember(main)
+    beginTopLevelMethod(, null, null)
+      handleNoType()
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleNoType(()
+        handleVariablePattern(null, a1, false)
+        handlePatternField(null)
+        handleRecordPattern((, 1)
+        handlePatternField(null)
+        handleRecordPattern((, 1)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleLiteralInt(1)
+            handleUnaryPrefixExpression(-)
+          endRecordLiteral((, 1, null)
+        endRecordLiteral((, 1, null)
+        handlePatternVariableDeclarationStatement(var, =, ;)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleIdentifier(n, namedRecordFieldReference)
+        handleIdentifier(x, namedRecordFieldReference)
+        handleNoType(:)
+        handleVariablePattern(null, a2, false)
+        handlePatternField(:)
+        handleRecordPattern((, 1)
+        handlePatternField(:)
+        handleRecordPattern((, 1)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(n, namedRecordFieldReference)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, namedRecordFieldReference)
+            handleLiteralInt(42)
+            handleNamedRecordField(:)
+          endRecordLiteral((, 1, null)
+          handleNamedRecordField(:)
+        endRecordLiteral((, 1, null)
+        handlePatternVariableDeclarationStatement(var, =, ;)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleIdentifier(n, namedRecordFieldReference)
+        handleIdentifier(x, namedRecordFieldReference)
+        handleNoType(:)
+        handleVariablePattern(null, a3, false)
+        handlePatternField(:)
+        handleNoType(,)
+        handleVariablePattern(null, b3, false)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        handlePatternField(:)
+        handleIdentifier(y, namedRecordFieldReference)
+        handleNoType(:)
+        handleVariablePattern(null, c3, false)
+        handlePatternField(:)
+        handleNoType(,)
+        handleVariablePattern(null, d3, false)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(n, namedRecordFieldReference)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, namedRecordFieldReference)
+            handleLiteralInt(42)
+            handleNamedRecordField(:)
+            handleLiteralInt(1)
+            handleUnaryPrefixExpression(-)
+          endRecordLiteral((, 2, null)
+          handleNamedRecordField(:)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(y, namedRecordFieldReference)
+            handleLiteralInt(1)
+            handleNamedRecordField(:)
+            handleLiteralInt(0)
+          endRecordLiteral((, 2, null)
+        endRecordLiteral((, 2, null)
+        handlePatternVariableDeclarationStatement(var, =, ;)
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleNoType(()
+        handleVariablePattern(null, a4, false)
+        handlePatternField(null)
+        handleRecordPattern((, 1)
+        handlePatternField(null)
+        handleRecordPattern((, 1)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleLiteralInt(1)
+            handleUnaryPrefixExpression(-)
+          endRecordLiteral((, 1, null)
+        endRecordLiteral((, 1, null)
+        handlePatternVariableDeclarationStatement(final, =, ;)
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleIdentifier(n, namedRecordFieldReference)
+        handleIdentifier(x, namedRecordFieldReference)
+        handleNoType(:)
+        handleVariablePattern(null, a5, false)
+        handlePatternField(:)
+        handleRecordPattern((, 1)
+        handlePatternField(:)
+        handleRecordPattern((, 1)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(n, namedRecordFieldReference)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, namedRecordFieldReference)
+            handleLiteralInt(42)
+            handleNamedRecordField(:)
+          endRecordLiteral((, 1, null)
+          handleNamedRecordField(:)
+        endRecordLiteral((, 1, null)
+        handlePatternVariableDeclarationStatement(final, =, ;)
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleIdentifier(n, namedRecordFieldReference)
+        handleIdentifier(x, namedRecordFieldReference)
+        handleNoType(:)
+        handleVariablePattern(null, a6, false)
+        handlePatternField(:)
+        handleNoType(,)
+        handleVariablePattern(null, b6, false)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        handlePatternField(:)
+        handleIdentifier(y, namedRecordFieldReference)
+        handleNoType(:)
+        handleVariablePattern(null, c6, false)
+        handlePatternField(:)
+        handleNoType(,)
+        handleVariablePattern(null, d6, false)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(n, namedRecordFieldReference)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, namedRecordFieldReference)
+            handleLiteralInt(42)
+            handleNamedRecordField(:)
+            handleLiteralInt(1)
+            handleUnaryPrefixExpression(-)
+          endRecordLiteral((, 2, null)
+          handleNamedRecordField(:)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(y, namedRecordFieldReference)
+            handleLiteralInt(1)
+            handleNamedRecordField(:)
+            handleLiteralInt(0)
+          endRecordLiteral((, 2, null)
+        endRecordLiteral((, 2, null)
+        handlePatternVariableDeclarationStatement(final, =, ;)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(a7)
+        handleType(int, null)
+        handleVariablePattern(null, a7, false)
+        handlePatternField(null)
+        handleRecordPattern((, 1)
+        handlePatternField(null)
+        handleRecordPattern((, 1)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleLiteralInt(1)
+            handleUnaryPrefixExpression(-)
+          endRecordLiteral((, 1, null)
+        endRecordLiteral((, 1, null)
+        handlePatternVariableDeclarationStatement(var, =, ;)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleIdentifier(n, namedRecordFieldReference)
+        handleIdentifier(x, namedRecordFieldReference)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(a8)
+        handleType(int, null)
+        handleVariablePattern(null, a8, false)
+        handlePatternField(:)
+        handleRecordPattern((, 1)
+        handlePatternField(:)
+        handleRecordPattern((, 1)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(n, namedRecordFieldReference)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, namedRecordFieldReference)
+            handleLiteralInt(42)
+            handleNamedRecordField(:)
+          endRecordLiteral((, 1, null)
+          handleNamedRecordField(:)
+        endRecordLiteral((, 1, null)
+        handlePatternVariableDeclarationStatement(var, =, ;)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleIdentifier(n, namedRecordFieldReference)
+        handleIdentifier(x, namedRecordFieldReference)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(a9)
+        handleType(int, null)
+        handleVariablePattern(null, a9, false)
+        handlePatternField(:)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(b9)
+        handleType(int, null)
+        handleVariablePattern(null, b9, false)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        handlePatternField(:)
+        handleIdentifier(y, namedRecordFieldReference)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(c9)
+        handleType(int, null)
+        handleVariablePattern(null, c9, false)
+        handlePatternField(:)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(d9)
+        handleType(int, null)
+        handleVariablePattern(null, d9, false)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(n, namedRecordFieldReference)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, namedRecordFieldReference)
+            handleLiteralInt(42)
+            handleNamedRecordField(:)
+            handleLiteralInt(1)
+            handleUnaryPrefixExpression(-)
+          endRecordLiteral((, 2, null)
+          handleNamedRecordField(:)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(y, namedRecordFieldReference)
+            handleLiteralInt(1)
+            handleNamedRecordField(:)
+            handleLiteralInt(0)
+          endRecordLiteral((, 2, null)
+        endRecordLiteral((, 2, null)
+        handlePatternVariableDeclarationStatement(var, =, ;)
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleIdentifier(n, namedRecordFieldReference)
+        beginRecordType(()
+          beginRecordTypeEntry()
+            beginMetadataStar(int)
+            endMetadataStar(0)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments(,)
+            handleType(int, null)
+            handleNoName(,)
+          endRecordTypeEntry()
+          beginRecordTypeNamedFields({)
+            beginRecordTypeEntry()
+              beginMetadataStar(int)
+              endMetadataStar(0)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(x)
+              handleType(int, null)
+              handleIdentifier(x, recordFieldDeclaration)
+            endRecordTypeEntry()
+          endRecordTypeNamedFields(1, {)
+        endRecordType((, null, 2, true)
+        handleVariablePattern(null, a10, false)
+        handlePatternField(:)
+        beginRecordType(()
+          beginRecordTypeEntry()
+            beginMetadataStar(int)
+            endMetadataStar(0)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments(z)
+            handleType(int, null)
+            handleIdentifier(z, recordFieldDeclaration)
+          endRecordTypeEntry()
+          beginRecordTypeNamedFields({)
+            beginRecordTypeEntry()
+              beginMetadataStar(int)
+              endMetadataStar(0)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(y)
+              handleType(int, null)
+              handleIdentifier(y, recordFieldDeclaration)
+            endRecordTypeEntry()
+          endRecordTypeNamedFields(1, {)
+        endRecordType((, null, 2, true)
+        handleVariablePattern(null, b10, false)
+        handlePatternField(null)
+        handleRecordPattern((, 2)
+        beginParenthesizedExpressionOrRecordLiteral(()
+          handleIdentifier(n, namedRecordFieldReference)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(x, namedRecordFieldReference)
+            handleLiteralInt(42)
+            handleNamedRecordField(:)
+            handleLiteralInt(1)
+            handleUnaryPrefixExpression(-)
+          endRecordLiteral((, 2, null)
+          handleNamedRecordField(:)
+          beginParenthesizedExpressionOrRecordLiteral(()
+            handleIdentifier(y, namedRecordFieldReference)
+            handleLiteralInt(1)
+            handleNamedRecordField(:)
+            handleLiteralInt(0)
+          endRecordLiteral((, 2, null)
+        endRecordLiteral((, 2, null)
+        handlePatternVariableDeclarationStatement(var, =, ;)
+      endBlockFunctionBody(10, {, })
+    endTopLevelMethod(main, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51176.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.intertwined.expect
new file mode 100644
index 0000000..5ca47cf
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.intertwined.expect
@@ -0,0 +1,990 @@
+parseUnit(main)
+  skipErrorTokens(main)
+  listener: beginCompilationUnit(main)
+  syntheticPreviousToken(main)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(main)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(main)
+      isReservedKeyword(()
+      parseTopLevelMethod(, null, null, , Instance of 'NoType', null, main, false)
+        listener: beginTopLevelMethod(, null, null)
+        listener: handleNoType()
+        ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, 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, null)
+                skipOuterPattern(var)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(var, {, var)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern((, PatternContext.declaration)
+                              parsePattern((, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern((, PatternContext.declaration)
+                                  parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(()
+                                    listener: handleVariablePattern(null, a1, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(,, ()
+                              listener: handleRecordPattern((, 1)
+                        listener: handlePatternField(null)
+                        ensureCloseParen(,, ()
+                        listener: handleRecordPattern((, 1)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              parseExpression(()
+                                looksLikeOuterPatternEquals(()
+                                  skipOuterPattern(()
+                                parsePrecedenceExpression((, 1, true)
+                                  parseUnaryExpression((, true)
+                                    parsePrimary((, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                        parseParenthesizedExpressionOrRecordLiteral((, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          parseExpression(()
+                                            looksLikeOuterPatternEquals(()
+                                              skipOuterPattern(()
+                                            parsePrecedenceExpression((, 1, true)
+                                              parseUnaryExpression((, true)
+                                                parsePrecedenceExpression(-, 16, true)
+                                                  parseUnaryExpression(-, true)
+                                                    parsePrimary(-, expression)
+                                                      parseLiteralInt(-)
+                                                        listener: handleLiteralInt(1)
+                                                listener: handleUnaryPrefixExpression(-)
+                                          ensureCloseParen(,, ()
+                                          listener: endRecordLiteral((, 1, null)
+                              ensureCloseParen(,, ()
+                              listener: endRecordLiteral((, 1, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(var, =, ;)
+          notEofOrValue(}, var)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, null)
+                skipOuterPattern(var)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(var, ;, var)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(n, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(:, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(x, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(:)
+                                    listener: handleVariablePattern(null, a2, false)
+                              listener: handlePatternField(:)
+                              ensureCloseParen(a2, ()
+                              listener: handleRecordPattern((, 1)
+                        listener: handlePatternField(:)
+                        ensureCloseParen(), ()
+                        listener: handleRecordPattern((, 1)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(n, namedRecordFieldReference)
+                              parseExpression(:)
+                                looksLikeOuterPatternEquals(:)
+                                  skipOuterPattern(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                        parseParenthesizedExpressionOrRecordLiteral(:, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(x, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(42)
+                                          listener: handleNamedRecordField(:)
+                                          ensureCloseParen(42, ()
+                                          listener: endRecordLiteral((, 1, null)
+                              listener: handleNamedRecordField(:)
+                              ensureCloseParen(), ()
+                              listener: endRecordLiteral((, 1, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(var, =, ;)
+          notEofOrValue(}, var)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, null)
+                skipOuterPattern(var)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(var, ;, var)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(n, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(:, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(x, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(:)
+                                    listener: handleVariablePattern(null, a3, false)
+                              listener: handlePatternField(:)
+                              parsePattern(,, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.declaration)
+                                  parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(,)
+                                    listener: handleVariablePattern(null, b3, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(b3, ()
+                              listener: handleRecordPattern((, 2)
+                        listener: handlePatternField(:)
+                        parsePattern(,, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(,, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(y, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(:)
+                                    listener: handleVariablePattern(null, c3, false)
+                              listener: handlePatternField(:)
+                              parsePattern(,, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.declaration)
+                                  parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(,)
+                                    listener: handleVariablePattern(null, d3, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(d3, ()
+                              listener: handleRecordPattern((, 2)
+                        listener: handlePatternField(null)
+                        ensureCloseParen(), ()
+                        listener: handleRecordPattern((, 2)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(n, namedRecordFieldReference)
+                              parseExpression(:)
+                                looksLikeOuterPatternEquals(:)
+                                  skipOuterPattern(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                        parseParenthesizedExpressionOrRecordLiteral(:, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(x, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(42)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrecedenceExpression(-, 16, true)
+                                                  parseUnaryExpression(-, true)
+                                                    parsePrimary(-, expression)
+                                                      parseLiteralInt(-)
+                                                        listener: handleLiteralInt(1)
+                                                listener: handleUnaryPrefixExpression(-)
+                                          ensureCloseParen(1, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              listener: handleNamedRecordField(:)
+                              parseExpression(,)
+                                looksLikeOuterPatternEquals(,)
+                                  skipOuterPattern(,)
+                                parsePrecedenceExpression(,, 1, true)
+                                  parseUnaryExpression(,, true)
+                                    parsePrimary(,, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                        parseParenthesizedExpressionOrRecordLiteral(,, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(y, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(1)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrimary(,, expression)
+                                                  parseLiteralInt(,)
+                                                    listener: handleLiteralInt(0)
+                                          ensureCloseParen(0, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              ensureCloseParen(), ()
+                              listener: endRecordLiteral((, 2, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(var, =, ;)
+          notEofOrValue(}, final)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(final, ;, null, final, null, null)
+                skipOuterPattern(final)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(final, ;, final)
+                  parsePattern(final, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(final, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(final, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern((, PatternContext.declaration)
+                              parsePattern((, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern((, PatternContext.declaration)
+                                  parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(()
+                                    listener: handleVariablePattern(null, a4, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(,, ()
+                              listener: handleRecordPattern((, 1)
+                        listener: handlePatternField(null)
+                        ensureCloseParen(,, ()
+                        listener: handleRecordPattern((, 1)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              parseExpression(()
+                                looksLikeOuterPatternEquals(()
+                                  skipOuterPattern(()
+                                parsePrecedenceExpression((, 1, true)
+                                  parseUnaryExpression((, true)
+                                    parsePrimary((, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                        parseParenthesizedExpressionOrRecordLiteral((, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          parseExpression(()
+                                            looksLikeOuterPatternEquals(()
+                                              skipOuterPattern(()
+                                            parsePrecedenceExpression((, 1, true)
+                                              parseUnaryExpression((, true)
+                                                parsePrecedenceExpression(-, 16, true)
+                                                  parseUnaryExpression(-, true)
+                                                    parsePrimary(-, expression)
+                                                      parseLiteralInt(-)
+                                                        listener: handleLiteralInt(1)
+                                                listener: handleUnaryPrefixExpression(-)
+                                          ensureCloseParen(,, ()
+                                          listener: endRecordLiteral((, 1, null)
+                              ensureCloseParen(,, ()
+                              listener: endRecordLiteral((, 1, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(final, =, ;)
+          notEofOrValue(}, final)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(final, ;, null, final, null, null)
+                skipOuterPattern(final)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(final, ;, final)
+                  parsePattern(final, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(final, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(final, PatternContext.declaration)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(n, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(:, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(x, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(:)
+                                    listener: handleVariablePattern(null, a5, false)
+                              listener: handlePatternField(:)
+                              ensureCloseParen(a5, ()
+                              listener: handleRecordPattern((, 1)
+                        listener: handlePatternField(:)
+                        ensureCloseParen(), ()
+                        listener: handleRecordPattern((, 1)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(n, namedRecordFieldReference)
+                              parseExpression(:)
+                                looksLikeOuterPatternEquals(:)
+                                  skipOuterPattern(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                        parseParenthesizedExpressionOrRecordLiteral(:, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(x, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(42)
+                                          listener: handleNamedRecordField(:)
+                                          ensureCloseParen(42, ()
+                                          listener: endRecordLiteral((, 1, null)
+                              listener: handleNamedRecordField(:)
+                              ensureCloseParen(), ()
+                              listener: endRecordLiteral((, 1, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(final, =, ;)
+          notEofOrValue(}, final)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(final, ;, null, final, null, null)
+                skipOuterPattern(final)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(final, ;, final)
+                  parsePattern(final, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(final, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(final, PatternContext.declaration)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(n, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(:, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(x, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(:)
+                                    listener: handleVariablePattern(null, a6, false)
+                              listener: handlePatternField(:)
+                              parsePattern(,, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.declaration)
+                                  parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(,)
+                                    listener: handleVariablePattern(null, b6, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(b6, ()
+                              listener: handleRecordPattern((, 2)
+                        listener: handlePatternField(:)
+                        parsePattern(,, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(,, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(y, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(:)
+                                    listener: handleVariablePattern(null, c6, false)
+                              listener: handlePatternField(:)
+                              parsePattern(,, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.declaration)
+                                  parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
+                                    listener: handleNoType(,)
+                                    listener: handleVariablePattern(null, d6, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(d6, ()
+                              listener: handleRecordPattern((, 2)
+                        listener: handlePatternField(null)
+                        ensureCloseParen(), ()
+                        listener: handleRecordPattern((, 2)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(n, namedRecordFieldReference)
+                              parseExpression(:)
+                                looksLikeOuterPatternEquals(:)
+                                  skipOuterPattern(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                        parseParenthesizedExpressionOrRecordLiteral(:, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(x, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(42)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrecedenceExpression(-, 16, true)
+                                                  parseUnaryExpression(-, true)
+                                                    parsePrimary(-, expression)
+                                                      parseLiteralInt(-)
+                                                        listener: handleLiteralInt(1)
+                                                listener: handleUnaryPrefixExpression(-)
+                                          ensureCloseParen(1, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              listener: handleNamedRecordField(:)
+                              parseExpression(,)
+                                looksLikeOuterPatternEquals(,)
+                                  skipOuterPattern(,)
+                                parsePrecedenceExpression(,, 1, true)
+                                  parseUnaryExpression(,, true)
+                                    parsePrimary(,, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                        parseParenthesizedExpressionOrRecordLiteral(,, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(y, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(1)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrimary(,, expression)
+                                                  parseLiteralInt(,)
+                                                    listener: handleLiteralInt(0)
+                                          ensureCloseParen(0, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              ensureCloseParen(), ()
+                              listener: endRecordLiteral((, 2, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(final, =, ;)
+          notEofOrValue(}, var)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, null)
+                skipOuterPattern(var)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(var, ;, var)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern((, PatternContext.declaration)
+                              parsePattern((, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern((, PatternContext.declaration)
+                                  parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'SimpleType')
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(a7)
+                                    listener: handleType(int, null)
+                                    listener: handleVariablePattern(null, a7, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(,, ()
+                              listener: handleRecordPattern((, 1)
+                        listener: handlePatternField(null)
+                        ensureCloseParen(,, ()
+                        listener: handleRecordPattern((, 1)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              parseExpression(()
+                                looksLikeOuterPatternEquals(()
+                                  skipOuterPattern(()
+                                parsePrecedenceExpression((, 1, true)
+                                  parseUnaryExpression((, true)
+                                    parsePrimary((, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(()
+                                        parseParenthesizedExpressionOrRecordLiteral((, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          parseExpression(()
+                                            looksLikeOuterPatternEquals(()
+                                              skipOuterPattern(()
+                                            parsePrecedenceExpression((, 1, true)
+                                              parseUnaryExpression((, true)
+                                                parsePrecedenceExpression(-, 16, true)
+                                                  parseUnaryExpression(-, true)
+                                                    parsePrimary(-, expression)
+                                                      parseLiteralInt(-)
+                                                        listener: handleLiteralInt(1)
+                                                listener: handleUnaryPrefixExpression(-)
+                                          ensureCloseParen(,, ()
+                                          listener: endRecordLiteral((, 1, null)
+                              ensureCloseParen(,, ()
+                              listener: endRecordLiteral((, 1, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(var, =, ;)
+          notEofOrValue(}, var)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, null)
+                skipOuterPattern(var)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(var, ;, var)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(n, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(:, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(x, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'SimpleType')
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(a8)
+                                    listener: handleType(int, null)
+                                    listener: handleVariablePattern(null, a8, false)
+                              listener: handlePatternField(:)
+                              ensureCloseParen(a8, ()
+                              listener: handleRecordPattern((, 1)
+                        listener: handlePatternField(:)
+                        ensureCloseParen(), ()
+                        listener: handleRecordPattern((, 1)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(n, namedRecordFieldReference)
+                              parseExpression(:)
+                                looksLikeOuterPatternEquals(:)
+                                  skipOuterPattern(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                        parseParenthesizedExpressionOrRecordLiteral(:, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(x, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(42)
+                                          listener: handleNamedRecordField(:)
+                                          ensureCloseParen(42, ()
+                                          listener: endRecordLiteral((, 1, null)
+                              listener: handleNamedRecordField(:)
+                              ensureCloseParen(), ()
+                              listener: endRecordLiteral((, 1, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(var, =, ;)
+          notEofOrValue(}, var)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, null)
+                skipOuterPattern(var)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(var, ;, var)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(n, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(:, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(x, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'SimpleType')
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(a9)
+                                    listener: handleType(int, null)
+                                    listener: handleVariablePattern(null, a9, false)
+                              listener: handlePatternField(:)
+                              parsePattern(,, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.declaration)
+                                  parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'SimpleType')
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(b9)
+                                    listener: handleType(int, null)
+                                    listener: handleVariablePattern(null, b9, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(b9, ()
+                              listener: handleRecordPattern((, 2)
+                        listener: handlePatternField(:)
+                        parsePattern(,, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.declaration)
+                            parseParenthesizedPatternOrRecordPattern(,, PatternContext.declaration)
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(y, namedRecordFieldReference)
+                              parsePattern(:, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.declaration)
+                                  parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'SimpleType')
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(c9)
+                                    listener: handleType(int, null)
+                                    listener: handleVariablePattern(null, c9, false)
+                              listener: handlePatternField(:)
+                              parsePattern(,, PatternContext.declaration, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.declaration)
+                                  parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'SimpleType')
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(d9)
+                                    listener: handleType(int, null)
+                                    listener: handleVariablePattern(null, d9, false)
+                              listener: handlePatternField(null)
+                              ensureCloseParen(d9, ()
+                              listener: handleRecordPattern((, 2)
+                        listener: handlePatternField(null)
+                        ensureCloseParen(), ()
+                        listener: handleRecordPattern((, 2)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(n, namedRecordFieldReference)
+                              parseExpression(:)
+                                looksLikeOuterPatternEquals(:)
+                                  skipOuterPattern(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                        parseParenthesizedExpressionOrRecordLiteral(:, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(x, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(42)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrecedenceExpression(-, 16, true)
+                                                  parseUnaryExpression(-, true)
+                                                    parsePrimary(-, expression)
+                                                      parseLiteralInt(-)
+                                                        listener: handleLiteralInt(1)
+                                                listener: handleUnaryPrefixExpression(-)
+                                          ensureCloseParen(1, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              listener: handleNamedRecordField(:)
+                              parseExpression(,)
+                                looksLikeOuterPatternEquals(,)
+                                  skipOuterPattern(,)
+                                parsePrecedenceExpression(,, 1, true)
+                                  parseUnaryExpression(,, true)
+                                    parsePrimary(,, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                        parseParenthesizedExpressionOrRecordLiteral(,, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(y, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(1)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrimary(,, expression)
+                                                  parseLiteralInt(,)
+                                                    listener: handleLiteralInt(0)
+                                          ensureCloseParen(0, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              ensureCloseParen(), ()
+                              listener: endRecordLiteral((, 2, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(var, =, ;)
+          notEofOrValue(}, var)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, null)
+                skipOuterPattern(var)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+                parsePatternVariableDeclarationStatement(var, ;, var)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        ensureIdentifier((, namedRecordFieldReference)
+                          listener: handleIdentifier(n, namedRecordFieldReference)
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'ComplexTypeInfo')
+                              parseRecordType((, :, false)
+                                listener: beginRecordType(()
+                                parseRecordTypeField((, identifierIsOptional: true)
+                                  listener: beginRecordTypeEntry()
+                                  parseMetadataStar(()
+                                    listener: beginMetadataStar(int)
+                                    listener: endMetadataStar(0)
+                                  listener: handleIdentifier(int, typeReference)
+                                  listener: handleNoTypeArguments(,)
+                                  listener: handleType(int, null)
+                                  listener: handleNoName(,)
+                                  listener: endRecordTypeEntry()
+                                parseRecordTypeNamedFields(,)
+                                  listener: beginRecordTypeNamedFields({)
+                                  parseRecordTypeField({, identifierIsOptional: false)
+                                    listener: beginRecordTypeEntry()
+                                    parseMetadataStar({)
+                                      listener: beginMetadataStar(int)
+                                      listener: endMetadataStar(0)
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(x)
+                                    listener: handleType(int, null)
+                                    ensureIdentifier(int, recordFieldDeclaration)
+                                      listener: handleIdentifier(x, recordFieldDeclaration)
+                                    listener: endRecordTypeEntry()
+                                  listener: endRecordTypeNamedFields(1, {)
+                                ensureCloseParen(}, ()
+                                listener: endRecordType((, null, 2, true)
+                              listener: handleVariablePattern(null, a10, false)
+                        listener: handlePatternField(:)
+                        parsePattern(,, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.declaration)
+                            parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'ComplexTypeInfo')
+                              parseRecordType((, ,, false)
+                                listener: beginRecordType(()
+                                parseRecordTypeField((, identifierIsOptional: true)
+                                  listener: beginRecordTypeEntry()
+                                  parseMetadataStar(()
+                                    listener: beginMetadataStar(int)
+                                    listener: endMetadataStar(0)
+                                  listener: handleIdentifier(int, typeReference)
+                                  listener: handleNoTypeArguments(z)
+                                  listener: handleType(int, null)
+                                  ensureIdentifier(int, recordFieldDeclaration)
+                                    listener: handleIdentifier(z, recordFieldDeclaration)
+                                  listener: endRecordTypeEntry()
+                                parseRecordTypeNamedFields(,)
+                                  listener: beginRecordTypeNamedFields({)
+                                  parseRecordTypeField({, identifierIsOptional: false)
+                                    listener: beginRecordTypeEntry()
+                                    parseMetadataStar({)
+                                      listener: beginMetadataStar(int)
+                                      listener: endMetadataStar(0)
+                                    listener: handleIdentifier(int, typeReference)
+                                    listener: handleNoTypeArguments(y)
+                                    listener: handleType(int, null)
+                                    ensureIdentifier(int, recordFieldDeclaration)
+                                      listener: handleIdentifier(y, recordFieldDeclaration)
+                                    listener: endRecordTypeEntry()
+                                  listener: endRecordTypeNamedFields(1, {)
+                                ensureCloseParen(}, ()
+                                listener: endRecordType((, null, 2, true)
+                              listener: handleVariablePattern(null, b10, false)
+                        listener: handlePatternField(null)
+                        ensureCloseParen(b10, ()
+                        listener: handleRecordPattern((, 2)
+                  parseExpression(=)
+                    looksLikeOuterPatternEquals(=)
+                      skipOuterPattern(=)
+                    parsePrecedenceExpression(=, 1, true)
+                      parseUnaryExpression(=, true)
+                        parsePrimary(=, expression)
+                          parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=)
+                            parseParenthesizedExpressionOrRecordLiteral(=, null)
+                              listener: beginParenthesizedExpressionOrRecordLiteral(()
+                              ensureIdentifier((, namedRecordFieldReference)
+                                listener: handleIdentifier(n, namedRecordFieldReference)
+                              parseExpression(:)
+                                looksLikeOuterPatternEquals(:)
+                                  skipOuterPattern(:)
+                                parsePrecedenceExpression(:, 1, true)
+                                  parseUnaryExpression(:, true)
+                                    parsePrimary(:, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(:)
+                                        parseParenthesizedExpressionOrRecordLiteral(:, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(x, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(42)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrecedenceExpression(-, 16, true)
+                                                  parseUnaryExpression(-, true)
+                                                    parsePrimary(-, expression)
+                                                      parseLiteralInt(-)
+                                                        listener: handleLiteralInt(1)
+                                                listener: handleUnaryPrefixExpression(-)
+                                          ensureCloseParen(1, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              listener: handleNamedRecordField(:)
+                              parseExpression(,)
+                                looksLikeOuterPatternEquals(,)
+                                  skipOuterPattern(,)
+                                parsePrecedenceExpression(,, 1, true)
+                                  parseUnaryExpression(,, true)
+                                    parsePrimary(,, expression)
+                                      parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(,)
+                                        parseParenthesizedExpressionOrRecordLiteral(,, null)
+                                          listener: beginParenthesizedExpressionOrRecordLiteral(()
+                                          ensureIdentifier((, namedRecordFieldReference)
+                                            listener: handleIdentifier(y, namedRecordFieldReference)
+                                          parseExpression(:)
+                                            looksLikeOuterPatternEquals(:)
+                                              skipOuterPattern(:)
+                                            parsePrecedenceExpression(:, 1, true)
+                                              parseUnaryExpression(:, true)
+                                                parsePrimary(:, expression)
+                                                  parseLiteralInt(:)
+                                                    listener: handleLiteralInt(1)
+                                          listener: handleNamedRecordField(:)
+                                          parseExpression(,)
+                                            looksLikeOuterPatternEquals(,)
+                                              skipOuterPattern(,)
+                                            parsePrecedenceExpression(,, 1, true)
+                                              parseUnaryExpression(,, true)
+                                                parsePrimary(,, expression)
+                                                  parseLiteralInt(,)
+                                                    listener: handleLiteralInt(0)
+                                          ensureCloseParen(0, ()
+                                          listener: endRecordLiteral((, 2, null)
+                              ensureCloseParen(), ()
+                              listener: endRecordLiteral((, 2, null)
+                  ensureSemicolon())
+                  listener: handlePatternVariableDeclarationStatement(var, =, ;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(10, {, })
+        listener: endTopLevelMethod(main, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(main)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51176.dart.parser.expect b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.parser.expect
new file mode 100644
index 0000000..ce2b87a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.parser.expect
@@ -0,0 +1,37 @@
+main() {
+var ((a1,),) = ((-1,),);
+var (n: (x: a2)) = (n: (x: 42));
+var (n: (x: a3, b3), (y: c3, d3)) = (n: (x: 42, -1), (y: 1, 0));
+
+final ((a4,),) = ((-1,),);
+final (n: (x: a5)) = (n: (x: 42));
+final (n: (x: a6, b6), (y: c6, d6)) = (n: (x: 42, -1), (y: 1, 0));
+
+var ((int a7,),) = ((-1,),);
+var (n: (x: int a8)) = (n: (x: 42));
+var (n: (x: int a9, int b9), (y: int c9, int d9))
+= (n: (x: 42, -1), (y: 1, 0));
+
+var (n: (int, {int x}) a10, (int z, {int y}) b10)
+= (n: (x: 42, -1), (y: 1, 0));
+}
+
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] ([BeginToken]([BeginToken]a1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]([BeginToken]-[SimpleToken]1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a2[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a3[StringToken],[SimpleToken] b3[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] c3[StringToken],[SimpleToken] d3[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+final[KeywordToken] ([BeginToken]([BeginToken]a4[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]([BeginToken]-[SimpleToken]1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken];[SimpleToken]
+final[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a5[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+final[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a6[StringToken],[SimpleToken] b6[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] c6[StringToken],[SimpleToken] d6[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] ([BeginToken]([BeginToken]int[StringToken] a7[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]([BeginToken]-[SimpleToken]1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] int[StringToken] a8[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] int[StringToken] a9[StringToken],[SimpleToken] int[StringToken] b9[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] int[StringToken] c9[StringToken],[SimpleToken] int[StringToken] d9[StringToken])[SimpleToken])[SimpleToken]
+=[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]int[StringToken],[SimpleToken] {[BeginToken]int[StringToken] x[StringToken]}[SimpleToken])[SimpleToken] a10[StringToken],[SimpleToken] ([BeginToken]int[StringToken] z[StringToken],[SimpleToken] {[BeginToken]int[StringToken] y[StringToken]}[SimpleToken])[SimpleToken] b10[StringToken])[SimpleToken]
+=[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/patterns/issue_51176.dart.scanner.expect b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.scanner.expect
new file mode 100644
index 0000000..ce2b87a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/issue_51176.dart.scanner.expect
@@ -0,0 +1,37 @@
+main() {
+var ((a1,),) = ((-1,),);
+var (n: (x: a2)) = (n: (x: 42));
+var (n: (x: a3, b3), (y: c3, d3)) = (n: (x: 42, -1), (y: 1, 0));
+
+final ((a4,),) = ((-1,),);
+final (n: (x: a5)) = (n: (x: 42));
+final (n: (x: a6, b6), (y: c6, d6)) = (n: (x: 42, -1), (y: 1, 0));
+
+var ((int a7,),) = ((-1,),);
+var (n: (x: int a8)) = (n: (x: 42));
+var (n: (x: int a9, int b9), (y: int c9, int d9))
+= (n: (x: 42, -1), (y: 1, 0));
+
+var (n: (int, {int x}) a10, (int z, {int y}) b10)
+= (n: (x: 42, -1), (y: 1, 0));
+}
+
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] ([BeginToken]([BeginToken]a1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]([BeginToken]-[SimpleToken]1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a2[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a3[StringToken],[SimpleToken] b3[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] c3[StringToken],[SimpleToken] d3[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+final[KeywordToken] ([BeginToken]([BeginToken]a4[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]([BeginToken]-[SimpleToken]1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken];[SimpleToken]
+final[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a5[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+final[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] a6[StringToken],[SimpleToken] b6[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] c6[StringToken],[SimpleToken] d6[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] ([BeginToken]([BeginToken]int[StringToken] a7[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]([BeginToken]-[SimpleToken]1[StringToken],[SimpleToken])[SimpleToken],[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] int[StringToken] a8[StringToken])[SimpleToken])[SimpleToken] =[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] int[StringToken] a9[StringToken],[SimpleToken] int[StringToken] b9[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] int[StringToken] c9[StringToken],[SimpleToken] int[StringToken] d9[StringToken])[SimpleToken])[SimpleToken]
+=[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+var[KeywordToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]int[StringToken],[SimpleToken] {[BeginToken]int[StringToken] x[StringToken]}[SimpleToken])[SimpleToken] a10[StringToken],[SimpleToken] ([BeginToken]int[StringToken] z[StringToken],[SimpleToken] {[BeginToken]int[StringToken] y[StringToken]}[SimpleToken])[SimpleToken] b10[StringToken])[SimpleToken]
+=[SimpleToken] ([BeginToken]n[StringToken]:[SimpleToken] ([BeginToken]x[StringToken]:[SimpleToken] 42[StringToken],[SimpleToken] -[SimpleToken]1[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]y[StringToken]:[SimpleToken] 1[StringToken],[SimpleToken] 0[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]