Patterns parsing: track when variable patterns are in an assignment context.

Variable patterns behave so differently inside a patternAssignment
that we may want to represent them using different AST nodes inside
the analyzer/CFE.  This change adds a boolean flag allowing the
implementation to know what kind of variable pattern it's looking at
when parsing occurs.

Bug: https://github.com/dart-lang/sdk/issues/50035
Change-Id: I60adf2865bbe24f85b72a79b1360833bf823bd67
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/273829
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 2b68e91..6dcc89c 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -1778,8 +1778,10 @@
   }
 
   @override
-  void handleVariablePattern(Token? keyword, Token variable) {
-    listener?.handleVariablePattern(keyword, variable);
+  void handleVariablePattern(Token? keyword, Token variable,
+      {required bool inAssignmentPattern}) {
+    listener?.handleVariablePattern(keyword, variable,
+        inAssignmentPattern: inAssignmentPattern);
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 28c02b5..9fe0915 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -1433,7 +1433,12 @@
   /// Called after the parser has consumed a variable pattern, consisting of an
   /// optional `var` or `final` keyword, an optional type annotation, and a
   /// variable name identifier.
-  void handleVariablePattern(Token? keyword, Token variable) {
+  ///
+  /// The flag [inAssignmentPattern] indicates whether this variable pattern is
+  /// part of a `patternAssignment` (and hence should refer to a previously
+  /// declared variable rather than declaring a fresh one).
+  void handleVariablePattern(Token? keyword, Token variable,
+      {required bool inAssignmentPattern}) {
     logEvent('VariablePattern');
   }
 
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 4d8415a..788f2f7 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -6298,7 +6298,7 @@
     Token next = token.next!;
     if (allowPatterns && optional('case', next)) {
       Token case_ = token = next;
-      token = parsePattern(token, isRefutableContext: true);
+      token = parsePattern(token, PatternContext.matching);
       next = token.next!;
       Token? when;
       if (optional('when', next)) {
@@ -7459,7 +7459,7 @@
         }
         if (forPartsContext != null) {
           forPartsContext.patternKeyword = varFinalOrConst;
-          return parsePattern(beforeType, isRefutableContext: false);
+          return parsePattern(beforeType, PatternContext.declaration);
         } else {
           return parsePatternVariableDeclarationStatement(
               beforeType, start, varFinalOrConst);
@@ -8371,7 +8371,7 @@
           }
           listener.beginCaseExpression(caseKeyword);
           if (allowPatterns) {
-            token = parsePattern(caseKeyword, isRefutableContext: true);
+            token = parsePattern(caseKeyword, PatternContext.matching);
           } else {
             token = parseExpression(caseKeyword);
           }
@@ -9234,20 +9234,13 @@
   /// nullAssertPattern ::= primaryPattern '!'
   /// nullCheckPattern ::= primaryPattern '?'
   ///
-  /// [isRefutableContext] should be `true` if the pattern occurs in a
-  /// `guardedPattern` or any of its sub-patterns (i.e. in a
-  /// `switchStatementCase`, `switchExpressionCase`, or `ifCondition`); these
-  /// are contexts where a pattern match might be expected to fail, and bare
-  /// identifiers are treated as constant patterns.  It should be `false` if the
-  /// pattern occurs in a `localVariableDeclaration`, `forLoopParts`, or
-  /// `patternAssignment`; these are contexts where a pattern match failure is
-  /// either prohibited statically or causes a runtime exception, and bare
-  /// identifiers are treated as variable patterns.
-  Token parsePattern(Token token,
-      {int precedence = 1, required bool isRefutableContext}) {
+  /// [patternContext] indicates whether the pattern is refutable or
+  /// irrefutable, and whether it occurs as part of a patternAssignment.
+  Token parsePattern(Token token, PatternContext patternContext,
+      {int precedence = 1}) {
     assert(precedence >= 1);
     assert(precedence <= SELECTOR_PRECEDENCE);
-    token = parsePrimaryPattern(token, isRefutableContext: isRefutableContext);
+    token = parsePrimaryPattern(token, patternContext);
     while (true) {
       Token next = token.next!;
       int tokenLevel = _computePrecedence(next, forPattern: true);
@@ -9278,9 +9271,8 @@
         case '||':
           listener.beginBinaryPattern(next);
           // Left associative so we parse the RHS one precedence level higher
-          token = parsePattern(next,
-              precedence: tokenLevel + 1,
-              isRefutableContext: isRefutableContext);
+          token =
+              parsePattern(next, patternContext, precedence: tokenLevel + 1);
           listener.endBinaryPattern(next);
           break;
         default:
@@ -9317,7 +9309,7 @@
   ///                   | 'const' typeArguments? '{' elements? '}'
   ///                   | 'const' '(' expression ')'
   /// objectPattern ::= typeName typeArguments? '(' patternFields? ')'
-  Token parsePrimaryPattern(Token token, {required bool isRefutableContext}) {
+  Token parsePrimaryPattern(Token token, PatternContext patternContext) {
     Token start = token;
     TypeParamOrArgInfo typeArg =
         computeTypeParamOrArg(token, /* inDeclaration = */ true);
@@ -9327,8 +9319,7 @@
       case '[':
         // listPattern ::= typeArguments? '[' patterns? ']'
         token = typeArg.parseArguments(token, this);
-        token = parseListPatternSuffix(token,
-            isRefutableContext: isRefutableContext);
+        token = parseListPatternSuffix(token, patternContext);
         // A list pattern is a valid form of outerPattern, so verify that
         // skipOuterPattern would have skipped this pattern properly.
         assert(
@@ -9339,8 +9330,7 @@
         // mapPatternEntries ::= mapPatternEntry ( ',' mapPatternEntry )* ','?
         // mapPatternEntry   ::= expression ':' pattern
         token = typeArg.parseArguments(token, this);
-        token = parseMapPatternSuffix(token,
-            isRefutableContext: isRefutableContext);
+        token = parseMapPatternSuffix(token, patternContext);
         // A map pattern is a valid form of outerPattern, so verify that
         // skipOuterPattern would have skipped this pattern properly.
         assert(
@@ -9355,7 +9345,7 @@
       case 'var':
       case 'final':
         // variablePattern ::= ( 'var' | 'final' | 'final'? type )? identifier
-        return parseVariablePattern(token);
+        return parseVariablePattern(token, patternContext);
       case '(':
         // parenthesizedPattern  ::= '(' pattern ')'
         // recordPattern         ::= '(' patternFields? ')'
@@ -9366,8 +9356,8 @@
           listener.handleRecordPattern(next, /* count = */ 0);
           token = nextNext;
         } else {
-          token = parseParenthesizedPatternOrRecordPattern(token,
-              isRefutableContext: isRefutableContext);
+          token =
+              parseParenthesizedPatternOrRecordPattern(token, patternContext);
         }
         // A record or parenthesized pattern is a valid form of outerPattern, so
         // verify that skipOuterPattern would have skipped this pattern
@@ -9412,7 +9402,7 @@
     }
     TypeInfo typeInfo = computeVariablePatternType(token);
     if (typeInfo != noType) {
-      return parseVariablePattern(token, typeInfo: typeInfo);
+      return parseVariablePattern(token, patternContext, typeInfo: typeInfo);
     }
     // objectPattern ::= typeName typeArguments? '(' patternFields? ')'
     // TODO(paulberry): Make sure OTHER_IDENTIFIER is handled
@@ -9441,8 +9431,7 @@
       if (optional('(', afterToken) && !potentialTypeArg.recovered) {
         TypeParamOrArgInfo typeArg = potentialTypeArg;
         token = typeArg.parseArguments(token, this);
-        token = parseObjectPatternRest(token,
-            isRefutableContext: isRefutableContext);
+        token = parseObjectPatternRest(token, patternContext);
         listener.handleObjectPattern(firstIdentifier, dot, secondIdentifier);
         // An object pattern is a valid form of outerPattern, so verify that
         // skipOuterPattern would have skipped this pattern properly.
@@ -9452,10 +9441,10 @@
       } else if (dot == null) {
         // It's a single identifier.  If it's a wildcard pattern or we're in an
         // irrefutable context, parse it as a variable pattern.
-        if (!isRefutableContext || firstIdentifier.lexeme == '_') {
+        if (!patternContext.isRefutable || firstIdentifier.lexeme == '_') {
           // It's a wildcard pattern with no preceding type, so parse it as a
           // variable pattern.
-          return parseVariablePattern(beforeFirstIdentifier,
+          return parseVariablePattern(beforeFirstIdentifier, patternContext,
               typeInfo: typeInfo);
         }
       }
@@ -9474,7 +9463,8 @@
   /// about the type appearing after [token], if any.
   ///
   /// variablePattern ::= ( 'var' | 'final' | 'final'? type )? identifier
-  Token parseVariablePattern(Token token, {TypeInfo typeInfo = noType}) {
+  Token parseVariablePattern(Token token, PatternContext patternContext,
+      {TypeInfo typeInfo = noType}) {
     Token? keyword;
     if (typeInfo != noType) {
       token = typeInfo.parseType(token, this);
@@ -9500,7 +9490,8 @@
       token = insertSyntheticIdentifier(
           token, IdentifierContext.localVariableDeclaration);
     }
-    listener.handleVariablePattern(keyword, token);
+    listener.handleVariablePattern(keyword, token,
+        inAssignmentPattern: patternContext == PatternContext.assignment);
     return token;
   }
 
@@ -9508,8 +9499,7 @@
   /// bracket.
   ///
   /// listPattern ::= typeArguments? '[' patterns? ']'
-  Token parseListPatternSuffix(Token token,
-      {required bool isRefutableContext}) {
+  Token parseListPatternSuffix(Token token, PatternContext patternContext) {
     Token beforeToken = token;
     Token beginToken = token = token.next!;
     assert(optional('[', token) || optional('[]', token));
@@ -9537,11 +9527,11 @@
         next = token.next!;
         bool hasSubPattern = looksLikePatternStart(next);
         if (hasSubPattern) {
-          token = parsePattern(token, isRefutableContext: isRefutableContext);
+          token = parsePattern(token, patternContext);
         }
         listener.handleRestPattern(dots, hasSubPattern: hasSubPattern);
       } else {
-        token = parsePattern(token, isRefutableContext: isRefutableContext);
+        token = parsePattern(token, patternContext);
       }
       next = token.next!;
       ++count;
@@ -9585,7 +9575,7 @@
   /// mapPattern        ::= typeArguments? '{' mapPatternEntries? '}'
   /// mapPatternEntries ::= mapPatternEntry ( ',' mapPatternEntry )* ','?
   /// mapPatternEntry   ::= expression ':' pattern
-  Token parseMapPatternSuffix(Token token, {required bool isRefutableContext}) {
+  Token parseMapPatternSuffix(Token token, PatternContext patternContext) {
     Token leftBrace = token = token.next!;
     assert(optional('{', leftBrace));
     Token next = token.next!;
@@ -9604,7 +9594,7 @@
         next = token.next!;
         bool hasSubPattern = looksLikePatternStart(next);
         if (hasSubPattern) {
-          token = parsePattern(token, isRefutableContext: isRefutableContext);
+          token = parsePattern(token, patternContext);
         }
         listener.handleRestPattern(dots, hasSubPattern: hasSubPattern);
       } else {
@@ -9618,7 +9608,7 @@
               codes.templateExpectedButGot.withArguments(':'),
               new SyntheticToken(TokenType.PERIOD, next.charOffset));
         }
-        token = parsePattern(colon, isRefutableContext: isRefutableContext);
+        token = parsePattern(colon, patternContext);
         listener.handleMapPatternEntry(colon, token.next!);
       }
       ++count;
@@ -9664,8 +9654,8 @@
   /// recordPattern         ::= '(' patternFields? ')'
   /// patternFields         ::= patternField ( ',' patternField )* ','?
   /// patternField          ::= ( identifier? ':' )? pattern
-  Token parseParenthesizedPatternOrRecordPattern(Token token,
-      {required bool isRefutableContext}) {
+  Token parseParenthesizedPatternOrRecordPattern(
+      Token token, PatternContext patternContext) {
     Token begin = token.next!;
     assert(optional('(', begin));
     bool old = mayParseFunctionExpressions;
@@ -9698,7 +9688,7 @@
         colon = token;
         wasValidRecord = true;
       }
-      token = parsePattern(token, isRefutableContext: isRefutableContext);
+      token = parsePattern(token, patternContext);
       next = token.next!;
       if (wasRecord || colon != null) {
         listener.handlePatternField(colon);
@@ -9741,8 +9731,7 @@
   /// `(`.
   ///
   /// objectPattern ::= typeName typeArguments? '(' patternFields? ')'
-  Token parseObjectPatternRest(Token token,
-      {required bool isRefutableContext}) {
+  Token parseObjectPatternRest(Token token, PatternContext patternContext) {
     Token begin = token = token.next!;
     assert(optional('(', begin));
     int argumentCount = 0;
@@ -9764,7 +9753,7 @@
                 .next!;
         colon = token;
       }
-      token = parsePattern(token, isRefutableContext: isRefutableContext);
+      token = parsePattern(token, patternContext);
       next = token.next!;
       listener.handlePatternField(colon);
       ++argumentCount;
@@ -9869,7 +9858,7 @@
   ///                                expression
   Token parsePatternVariableDeclarationStatement(
       Token keyword, Token start, Token varOrFinal) {
-    Token token = parsePattern(keyword, isRefutableContext: false);
+    Token token = parsePattern(keyword, PatternContext.declaration);
     Token equals = token.next!;
     // Caller should have assured that the pattern was followed by an `=`.
     assert(optional('=', equals));
@@ -9882,7 +9871,7 @@
 
   /// patternAssignment ::= outerPattern '=' expression
   Token parsePatternAssignment(Token token) {
-    token = parsePattern(token, isRefutableContext: false);
+    token = parsePattern(token, PatternContext.assignment);
     Token equals = token.next!;
     // Caller should have assured that the pattern was followed by an `=`.
     assert(optional('=', equals));
@@ -9911,7 +9900,7 @@
       mayParseFunctionExpressions = false;
       while (true) {
         listener.beginSwitchExpressionCase();
-        token = parsePattern(token, isRefutableContext: true);
+        token = parsePattern(token, PatternContext.matching);
         Token? when;
         next = token.next!;
         if (optional('when', next)) {
@@ -9980,3 +9969,23 @@
   @override
   String toString() => 'ForPartsContext($patternKeyword)';
 }
+
+/// Enum describing the different contexts in which a pattern can occur.
+enum PatternContext {
+  /// The pattern is part of a localVariableDeclaration or forLoopParts, meaning
+  /// bare identifiers refer to freshly declared variables.
+  declaration(isRefutable: false),
+
+  /// The pattern is part of a guardedPattern inside an if-case, switch
+  /// expression, or switch statement, meaning bare identifiers refer to
+  /// constants.
+  matching(isRefutable: true),
+
+  /// The pattern is part of a pattern assignment, meaning bare identifiers
+  /// refer to previously declared variables.
+  assignment(isRefutable: false);
+
+  final bool isRefutable;
+
+  const PatternContext({required this.isRefutable});
+}
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 0f752c0..9fb931b 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -5274,7 +5274,9 @@
   }
 
   @override
-  void handleVariablePattern(Token? keyword, Token variable) {
+  void handleVariablePattern(Token? keyword, Token variable,
+      {required bool inAssignmentPattern}) {
+    // TODO(paulberry, scheglov): use inAssignmentPattern
     debugEvent('VariablePattern');
     if (!_featureSet.isEnabled(Feature.patterns)) {
       // TODO(paulberry): report the appropriate error
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 94025ed..c52be52 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -8428,7 +8428,8 @@
   }
 
   @override
-  void handleVariablePattern(Token? keyword, Token variable) {
+  void handleVariablePattern(Token? keyword, Token variable,
+      {required bool inAssignmentPattern}) {
     debugEvent('VariablePattern');
     assert(checkState(keyword ?? variable, [
       ValueKinds.TypeBuilderOrNull,
@@ -8443,6 +8444,7 @@
     if (variable.lexeme == "_") {
       pattern = new WildcardPattern(patternType, variable.charOffset);
     } else {
+      // TODO(paulberry): use inAssignmentPattern.
       pattern = new VariablePattern(
           patternType,
           variable.lexeme,
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
index 27949a2..66bc63e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
@@ -2032,7 +2032,8 @@
   }
 
   @override
-  void handleVariablePattern(Token? keyword, Token variable) {
+  void handleVariablePattern(Token? keyword, Token variable,
+      {required bool inAssignmentPattern}) {
     _unsupported();
   }
 
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
index 72fa1bc..76c11c8 100644
--- a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
@@ -1906,9 +1906,12 @@
   }
 
   @override
-  void handleVariablePattern(Token? keyword, Token variable) {
+  void handleVariablePattern(Token? keyword, Token variable,
+      {required bool inAssignmentPattern}) {
     VariablePatternHandle data = new VariablePatternHandle(ParserAstType.HANDLE,
-        keyword: keyword, variable: variable);
+        keyword: keyword,
+        variable: variable,
+        inAssignmentPattern: inAssignmentPattern);
     seen(data);
   }
 
@@ -6329,15 +6332,17 @@
 class VariablePatternHandle extends ParserAstNode {
   final Token? keyword;
   final Token variable;
+  final bool inAssignmentPattern;
 
   VariablePatternHandle(ParserAstType type,
-      {this.keyword, required this.variable})
+      {this.keyword, required this.variable, required this.inAssignmentPattern})
       : super("VariablePattern", type);
 
   @override
   Map<String, Object?> get deprecatedArguments => {
         "keyword": keyword,
         "variable": variable,
+        "inAssignmentPattern": inAssignmentPattern,
       };
 }
 
diff --git a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_case.dart.intertwined.expect
index b8e0f58..6e00cbb 100644
--- a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_case.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_cast.dart.intertwined.expect
index 45a8b23..d593584 100644
--- a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_cast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_if_case.dart.intertwined.expect
index 46139c6..a0d3dd8 100644
--- a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_if_case.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_assert.dart.intertwined.expect
index d4bb2f7..2decdde 100644
--- a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_assert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_check.dart.intertwined.expect
index ae5fc42..7f10027 100644
--- a/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/boolean_literal_inside_null_check.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideIfStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideIfStatement.dart.intertwined.expect
index 78ddf45..0cf06bd 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideIfStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideIfStatement.dart.intertwined.expect
@@ -58,8 +58,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideSwitchStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideSwitchStatement.dart.intertwined.expect
index f9f1a37..093794d 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideSwitchStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_guarded_insideSwitchStatement.dart.intertwined.expect
@@ -66,8 +66,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideIfStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideIfStatement.dart.intertwined.expect
index f450d63..6df4683 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideIfStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideIfStatement.dart.intertwined.expect
@@ -58,8 +58,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideSwitchStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideSwitchStatement.dart.intertwined.expect
index 9e9df2a..9e63c00 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideSwitchStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withClassicPattern_unguarded_insideSwitchStatement.dart.intertwined.expect
@@ -66,8 +66,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideIfStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideIfStatement.dart.intertwined.expect
index b403f66..97e6ad4 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideIfStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideIfStatement.dart.intertwined.expect
@@ -58,8 +58,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideSwitchStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideSwitchStatement.dart.intertwined.expect
index bfc1c6e..e0a4f9e 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideSwitchStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_guarded_insideSwitchStatement.dart.intertwined.expect
@@ -66,8 +66,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideIfStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideIfStatement.dart.intertwined.expect
index 94a6fc9..cb7ee39 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideIfStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideIfStatement.dart.intertwined.expect
@@ -58,8 +58,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideSwitchStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideSwitchStatement.dart.intertwined.expect
index b400811..47bded5 100644
--- a/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideSwitchStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/caseHead_withNewPattern_unguarded_insideSwitchStatement.dart.intertwined.expect
@@ -66,8 +66,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_case.dart.intertwined.expect
index fc08ae6..b311d5e 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_case.dart.intertwined.expect
@@ -98,8 +98,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern.dart.intertwined.expect
index 256aee6..e6c40fe 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern.dart.intertwined.expect
@@ -113,14 +113,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.expect
index 5d1a77f..9871124 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.expect
@@ -56,7 +56,7 @@
               handleNoTypeArguments(()
               handleNoName(()
               handleNoType(var)
-              handleVariablePattern(var, f)
+              handleVariablePattern(var, f, false)
               beginAsOperatorType(as)
                 handleIdentifier(int, typeReference)
                 handleNoTypeArguments())
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
index af1c600..b37c465 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
@@ -113,16 +113,16 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, f)
+                              listener: handleVariablePattern(var, f, false)
                           listener: beginAsOperatorType(as)
                           computeTypeAfterIsOrAs(as)
                           listener: handleIdentifier(int, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.expect
index 8f4e727..7a0fbe4 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.expect
@@ -25,7 +25,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(var)
-          handleVariablePattern(var, y)
+          handleVariablePattern(var, y, false)
           beginAsOperatorType(as)
             handleIdentifier(int, typeReference)
             handleNoTypeArguments())
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.intertwined.expect
index dcdbc22..f5a033d 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_if_case.dart.intertwined.expect
@@ -61,11 +61,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(var)
-                          listener: handleVariablePattern(var, y)
+                          listener: handleVariablePattern(var, y, false)
                       listener: beginAsOperatorType(as)
                       computeTypeAfterIsOrAs(as)
                       listener: handleIdentifier(int, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_list_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_list_pattern.dart.intertwined.expect
index feea266..3d72595 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_list_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_list_pattern.dart.intertwined.expect
@@ -69,12 +69,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.expect
index f22bc8d..99b746b 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginAsOperatorType(as)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
@@ -41,7 +41,7 @@
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(?)
                 handleType(Object, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(&&)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.intertwined.expect
index f38103f..1621d04 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_lhs.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(double, typeReference)
@@ -84,13 +84,13 @@
                     listener: endAsOperatorType(as)
                     listener: handleCastPattern(as)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
-                        parseVariablePattern(&&, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
+                        parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(Object, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(Object, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(&&)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.expect
index 03f6122..92b1779 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.expect
@@ -30,12 +30,12 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginBinaryPattern(&&)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
                 handleType(double, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
                 beginAsOperatorType(as)
                   handleIdentifier(Object, typeReference)
                   handleNoTypeArguments(?)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.intertwined.expect
index 2233b21..95bf73c 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_and_rhs.dart.intertwined.expect
@@ -69,21 +69,21 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
-                        parseVariablePattern(&&, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
+                        parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(double, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(double, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                       listener: beginAsOperatorType(as)
                       computeTypeAfterIsOrAs(as)
                       listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.expect
index b0ea97e..ec686a0 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginAsOperatorType(as)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
@@ -41,7 +41,7 @@
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(?)
                 handleType(Object, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(||)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.intertwined.expect
index 8470d81..3ac2b64 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_lhs.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(double, typeReference)
@@ -84,13 +84,13 @@
                     listener: endAsOperatorType(as)
                     listener: handleCastPattern(as)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
-                        parseVariablePattern(||, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
+                        parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(Object, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(Object, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(||)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.expect
index ec337d6..1283c09 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.expect
@@ -30,12 +30,12 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginBinaryPattern(||)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
                 handleType(double, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
                 beginAsOperatorType(as)
                   handleIdentifier(Object, typeReference)
                   handleNoTypeArguments(?)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.intertwined.expect
index 1fc7fdf..e6c550d 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_logical_or_rhs.dart.intertwined.expect
@@ -69,21 +69,21 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
-                        parseVariablePattern(||, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
+                        parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(double, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(double, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                       listener: beginAsOperatorType(as)
                       computeTypeAfterIsOrAs(as)
                       listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_map_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_map_pattern.dart.intertwined.expect
index a4edaa2..b86afa3 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_map_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_map_pattern.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_parenthesized_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_parenthesized_pattern.dart.intertwined.expect
index aff6005..bd6716e 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_parenthesized_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_parenthesized_pattern.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.expect
index dabdcb9..85c01f1 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.expect
@@ -29,7 +29,7 @@
             beginCaseExpression(case)
               handleNoName(()
               handleNoType(var)
-              handleVariablePattern(var, n)
+              handleVariablePattern(var, n, false)
               beginAsOperatorType(as)
                 handleIdentifier(int, typeReference)
                 handleNoTypeArguments(,)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.intertwined.expect
index f608927..a0a8179 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_implicitly_named.dart.intertwined.expect
@@ -69,15 +69,15 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, n)
+                              listener: handleVariablePattern(var, n, false)
                           listener: beginAsOperatorType(as)
                           computeTypeAfterIsOrAs(as)
                           listener: handleIdentifier(int, typeReference)
@@ -86,8 +86,8 @@
                           listener: endAsOperatorType(as)
                           listener: handleCastPattern(as)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_named.dart.intertwined.expect
index 82dddc2..4a309ea 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_named.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         ensureIdentifier((, namedRecordFieldReference)
                           listener: handleIdentifier(n, namedRecordFieldReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
@@ -90,8 +90,8 @@
                           listener: endAsOperatorType(as)
                           listener: handleCastPattern(as)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_unnamed.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_unnamed.dart.intertwined.expect
index cf2cb93..8c639e8 100644
--- a/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_unnamed.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/cast_inside_record_pattern_unnamed.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
@@ -88,8 +88,8 @@
                           listener: endAsOperatorType(as)
                           listener: handleCastPattern(as)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_builtin.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_builtin.dart.intertwined.expect
index 97aba29..7a3e069 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_builtin.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_builtin.dart.intertwined.expect
@@ -131,8 +131,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCase.dart.intertwined.expect
index 3b82366..63f0097 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCast.dart.intertwined.expect
index 9d4779c..9caf2c9 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideIfCase.dart.intertwined.expect
index bbf6005..1f8ba62 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullAssert.dart.intertwined.expect
index 4474c1e..c055a0a 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullCheck.dart.intertwined.expect
index 0b77517..d52cbbe 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_pseudoKeyword.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_pseudoKeyword.dart.intertwined.expect
index 112a32d..9e09325 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_pseudoKeyword.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_doublyPrefixed_pseudoKeyword.dart.intertwined.expect
@@ -131,8 +131,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_case.dart.intertwined.expect
index 77d1048..a826821 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_case.dart.intertwined.expect
@@ -98,8 +98,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_cast.dart.intertwined.expect
index bfdbe23..d13f09a2 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_cast.dart.intertwined.expect
@@ -98,8 +98,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_if_case.dart.intertwined.expect
index 5fbdaf0..467dfb9 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_if_case.dart.intertwined.expect
@@ -90,8 +90,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_assert.dart.intertwined.expect
index 8eb976c..0edd0ab 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_assert.dart.intertwined.expect
@@ -98,8 +98,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_check.dart.intertwined.expect
index e6eb394..37406ac0 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_inside_null_check.dart.intertwined.expect
@@ -98,8 +98,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixedWithUnderscore_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixedWithUnderscore_insideCase.dart.intertwined.expect
index d2e28a3..53f9175 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixedWithUnderscore_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixedWithUnderscore_insideCase.dart.intertwined.expect
@@ -66,8 +66,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_builtin.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_builtin.dart.intertwined.expect
index b54e7fb..d994b09 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_builtin.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_builtin.dart.intertwined.expect
@@ -118,8 +118,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCase.dart.intertwined.expect
index 711c7ac..945a9551 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCast.dart.intertwined.expect
index 4cb5a81..1e16276 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideIfCase.dart.intertwined.expect
index 6b82410..831aef0 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullAssert.dart.intertwined.expect
index 529d859..fcb2700 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullCheck.dart.intertwined.expect
index d4370df..f402196 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_pseudoKeyword.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_pseudoKeyword.dart.intertwined.expect
index d657127..c2fecd2 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_pseudoKeyword.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_prefixed_pseudoKeyword.dart.intertwined.expect
@@ -118,8 +118,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_beforeWhen.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_beforeWhen.dart.intertwined.expect
index 09b8c7c..53049cb 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_beforeWhen.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_beforeWhen.dart.intertwined.expect
@@ -95,8 +95,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_builtin.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_builtin.dart.intertwined.expect
index 74822cc..6c4acbb 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_builtin.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_builtin.dart.intertwined.expect
@@ -105,8 +105,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_insideSwitchExpression.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_insideSwitchExpression.dart.intertwined.expect
index 6f89a56..2b4316c 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_insideSwitchExpression.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_insideSwitchExpression.dart.intertwined.expect
@@ -68,8 +68,8 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           parsePrecedenceExpression({, 17, false)
                             parseUnaryExpression({, false)
                               parsePrimary({, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_pseudoKeyword.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_pseudoKeyword.dart.intertwined.expect
index f93c4b0..625508e 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_pseudoKeyword.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_identifier_unprefixed_pseudoKeyword.dart.intertwined.expect
@@ -105,8 +105,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCase.dart.intertwined.expect
index cf79697..f1e4d5c 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCast.dart.intertwined.expect
index abda7aa..ffd8541 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideIfCase.dart.intertwined.expect
index 87bd6d7..8ba24be 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullAssert.dart.intertwined.expect
index 7d76540..e21948c 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullCheck.dart.intertwined.expect
index bbfddee..07f853d 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_empty_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCase.dart.intertwined.expect
index cfecb37..74e32db 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCast.dart.intertwined.expect
index 1df5f1a..cd614ea 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideIfCase.dart.intertwined.expect
index b46f1cc..b514275 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullAssert.dart.intertwined.expect
index 44a10c23..ab2984e 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullCheck.dart.intertwined.expect
index d6f53f8..5615bdb 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_typed_nonEmpty_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCase.dart.intertwined.expect
index 3d89775..2b091b3 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCast.dart.intertwined.expect
index da751d9..467fb1e 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideIfCase.dart.intertwined.expect
index bc000dd..23693bd 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullAssert.dart.intertwined.expect
index c8d3737..ef9a1976 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullCheck.dart.intertwined.expect
index 2fa02f0..914214d 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_empty_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCase.dart.intertwined.expect
index 2d16fc6..20b0292 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCast.dart.intertwined.expect
index bc12440..3e8765df 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideIfCase.dart.intertwined.expect
index f8c8fce..8bc259c 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullAssert.dart.intertwined.expect
index 2c9cb9d..41e00e2 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullCheck.dart.intertwined.expect
index 529c0ca..b58b956 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_list_untyped_nonEmpty_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect
index e66dc5a..62dbd5e 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect
index cec2c64..a19e1cd 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect
index 814781d..5de20af 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect
index 2953c49..1ec5226 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect
index 8741a27..287b474 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_typed_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect
index b279dfd..1df115c 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect
index 9e8b736..cf08341 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect
index 922d1a9..5f4a6ff 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect
index 1cda99b..55eb8d4 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect
index 3bb1045..c2e9b86 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_map_untyped_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCase.dart.intertwined.expect
index 8ed47ae3..7744850 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCast.dart.intertwined.expect
index 9226b57..6163756 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideIfCase.dart.intertwined.expect
index 19ee169..0c53e46 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullAssert.dart.intertwined.expect
index ef176e8..92d8992 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullCheck.dart.intertwined.expect
index 87732c6..76a331f 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_objectExpression_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCase.dart.intertwined.expect
index 9b548d0..13baa44 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCast.dart.intertwined.expect
index bdaa899..6ef8f98 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideIfCase.dart.intertwined.expect
index 9e6ce5bb..f689a3e 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullAssert.dart.intertwined.expect
index 039af5b..bc57b81 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullCheck.dart.intertwined.expect
index f8d1a04..01f56bb 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_parenthesized_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCase.dart.intertwined.expect
index 2085bb9..1310d56 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCast.dart.intertwined.expect
index 431879a..fd2e299 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideIfCase.dart.intertwined.expect
index 668cdb6..1ad4783 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullAssert.dart.intertwined.expect
index 0c2f5e1..c1cbd3d 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullCheck.dart.intertwined.expect
index 5b126ed..90d53ed 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_typed_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCase.dart.intertwined.expect
index 3b0d39a..2f86114 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCase.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCast.dart.intertwined.expect
index 8bb8e06..ee986c1 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideCast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideIfCase.dart.intertwined.expect
index 7964395..a7d122c 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideIfCase.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(const, 17, false)
                           parseUnaryExpression(const, false)
                             parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullAssert.dart.intertwined.expect
index 8575618..09922178 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullAssert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullCheck.dart.intertwined.expect
index 8afddc3..a43de97 100644
--- a/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/constant_set_untyped_insideNullCheck.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(const, 17, false)
                         parseUnaryExpression(const, false)
                           parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/double_literal_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/double_literal_inside_case.dart.intertwined.expect
index 5dca641..074a32d 100644
--- a/pkg/front_end/parser_testcases/patterns/double_literal_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/double_literal_inside_case.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/double_literal_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/double_literal_inside_cast.dart.intertwined.expect
index 4c8ff87..31882d5 100644
--- a/pkg/front_end/parser_testcases/patterns/double_literal_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/double_literal_inside_cast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/double_literal_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/double_literal_inside_if_case.dart.intertwined.expect
index 721068a..9a582ef 100644
--- a/pkg/front_end/parser_testcases/patterns/double_literal_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/double_literal_inside_if_case.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_assert.dart.intertwined.expect
index 9199719..5b52989 100644
--- a/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_assert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_check.dart.intertwined.expect
index c6e5e8d..480b1a1 100644
--- a/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/double_literal_inside_null_check.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_cast.dart.intertwined.expect
index bfae2dc..5dafd3f 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_cast.dart.intertwined.expect
@@ -113,14 +113,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_assert.dart.intertwined.expect
index 3a2789a..91d15db 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_assert.dart.intertwined.expect
@@ -113,14 +113,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_check.dart.intertwined.expect
index 6c79e1c..6a5a19a 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_pattern_inside_null_check.dart.intertwined.expect
@@ -113,14 +113,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args.dart.intertwined.expect
index 37c544a..8ca26ce 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args.dart.intertwined.expect
@@ -104,14 +104,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(C, null, null)
                   ensureColon())
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect
index bf05643..fdf7e27 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect
@@ -121,18 +121,18 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect
index c7c4d01..f770d35 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect
@@ -66,14 +66,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(_, ., Future)
                   ensureColon())
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect
index f1a4fb9..bb77a2d 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_prefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect
@@ -66,10 +66,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(Future, isRefutableContext: true)
+                      parseObjectPatternRest(Future, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(_, ., Future)
                   ensureColon())
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect
index 66c28bd..b29259b 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withTypeArgs_insideCase.dart.intertwined.expect
@@ -66,14 +66,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(_, null, null)
                   ensureColon())
diff --git a/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect
index 5e889cc4..a413a46 100644
--- a/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/extractor_unprefixedNamedUnderscore_withoutTypeArgs_insideCase.dart.intertwined.expect
@@ -66,10 +66,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(_, isRefutableContext: true)
+                      parseObjectPatternRest(_, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(_, null, null)
                   ensureColon())
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.expect
index 1d75c91..bf701cf 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.intertwined.expect
index 7518379..5039700 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_case.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                   ensureColon(y)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.expect
index 80d63f7..53d4c95 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.intertwined.expect
index 7e74dcc..a357004 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_cast.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.expect
index 58c69d9..3f6453f 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.expect
@@ -25,7 +25,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(final)
-          handleVariablePattern(final, y)
+          handleVariablePattern(final, y, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.intertwined.expect
index d4fcfb3..fbe35fd 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_if_case.dart.intertwined.expect
@@ -61,11 +61,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(final)
-                          listener: handleVariablePattern(final, y)
+                          listener: handleVariablePattern(final, y, false)
                     ensureCloseParen(y, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.expect
index c9bf2ae..6d99048 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.intertwined.expect
index a05368d..aa192b4 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_assert.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.expect
index 9f5f380..af7172d 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.intertwined.expect
index 87f0321..1ca4c92 100644
--- a/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/final_variable_inside_null_check.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.expect
index 62c4b0d..83bb0ea 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.expect
@@ -30,7 +30,7 @@
         handleNoArguments(case)
         handleSend(x, case)
         handleNoType(case)
-        handleVariablePattern(null, _)
+        handleVariablePattern(null, _, false)
         handleIdentifier(y, expression)
         handleNoTypeArguments(+)
         handleNoArguments(+)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.intertwined.expect
index 15615fa..de77693 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_element.dart.intertwined.expect
@@ -73,11 +73,11 @@
                                       parseArgumentsOpt(x)
                                         listener: handleNoArguments(case)
                                       listener: handleSend(x, case)
-                          parsePattern(case, precedence: 1, isRefutableContext: true)
-                            parsePrimaryPattern(case, isRefutableContext: true)
-                              parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                          parsePattern(case, PatternContext.matching, precedence: 1)
+                            parsePrimaryPattern(case, PatternContext.matching)
+                              parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(case)
-                                listener: handleVariablePattern(null, _)
+                                listener: handleVariablePattern(null, _, false)
                           parseExpression(when)
                             looksLikeOuterPatternEquals(when)
                               skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.expect
index 6b1a589..a300270 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.expect
@@ -30,7 +30,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(case)
-          handleVariablePattern(null, _)
+          handleVariablePattern(null, _, false)
           handleIdentifier(y, expression)
           handleNoTypeArguments(+)
           handleNoArguments(+)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.intertwined.expect
index 2f39dad..5a9709a 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideIfCaseWhenClause_statement.dart.intertwined.expect
@@ -69,11 +69,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(case)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     parseExpression(when)
                       looksLikeOuterPatternEquals(when)
                         skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideListPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideListPattern.dart.intertwined.expect
index 7f3c915..7697b15 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideListPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideListPattern.dart.intertwined.expect
@@ -68,12 +68,12 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           listener: handleNoTypeArguments([)
-                          parseListPatternSuffix({, isRefutableContext: true)
-                            parsePattern([, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern([, isRefutableContext: true)
+                          parseListPatternSuffix({, PatternContext.matching)
+                            parsePattern([, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern([, PatternContext.matching)
                                 parsePrecedenceExpression(==, 12, false)
                                   parseUnaryExpression(==, false)
                                     parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideMapPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideMapPattern.dart.intertwined.expect
index d09a90d..9861736 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideMapPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideMapPattern.dart.intertwined.expect
@@ -68,10 +68,10 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           listener: handleNoTypeArguments({)
-                          parseMapPatternSuffix({, isRefutableContext: true)
+                          parseMapPatternSuffix({, PatternContext.matching)
                             parseExpression({)
                               looksLikeOuterPatternEquals({)
                                 skipOuterPattern({)
@@ -82,8 +82,8 @@
                                       parseSingleLiteralString({)
                                         listener: beginLiteralString('x')
                                         listener: endLiteralString(0, :)
-                            parsePattern(:, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern(:, isRefutableContext: true)
+                            parsePattern(:, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern(:, PatternContext.matching)
                                 parsePrecedenceExpression(==, 12, false)
                                   parseUnaryExpression(==, false)
                                     parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideObjectPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideObjectPattern.dart.intertwined.expect
index 758e860..8cb22df 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideObjectPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideObjectPattern.dart.intertwined.expect
@@ -68,14 +68,14 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           listener: handleNoTypeArguments(()
-                          parseObjectPatternRest(Foo, isRefutableContext: true)
+                          parseObjectPatternRest(Foo, PatternContext.matching)
                             ensureIdentifier((, namedArgumentReference)
                               listener: handleIdentifier(bar, namedArgumentReference)
-                            parsePattern(:, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern(:, isRefutableContext: true)
+                            parsePattern(:, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern(:, PatternContext.matching)
                                 parsePrecedenceExpression(==, 12, false)
                                   parseUnaryExpression(==, false)
                                     parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedConstPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedConstPattern.dart.intertwined.expect
index 233de11..9e70f6f 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedConstPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedConstPattern.dart.intertwined.expect
@@ -68,8 +68,8 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           parsePrecedenceExpression(const, 17, false)
                             parseUnaryExpression(const, false)
                               parsePrimary(const, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedPattern.dart.intertwined.expect
index 97b833b..7ee901e 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideParenthesizedPattern.dart.intertwined.expect
@@ -68,11 +68,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseParenthesizedPatternOrRecordPattern({, isRefutableContext: true)
-                            parsePattern((, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern((, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseParenthesizedPatternOrRecordPattern({, PatternContext.matching)
+                            parsePattern((, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern((, PatternContext.matching)
                                 parsePrecedenceExpression(==, 12, false)
                                   parseUnaryExpression(==, false)
                                     parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.expect
index 2914ad8..839eefc 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.expect
@@ -25,7 +25,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             beginSwitchExpression(switch)
               handleIdentifier(x, expression)
               handleNoTypeArguments())
@@ -35,7 +35,7 @@
               beginSwitchExpressionBlock({)
                 beginSwitchExpressionCase()
                   handleNoType({)
-                  handleVariablePattern(null, _)
+                  handleVariablePattern(null, _, false)
                   handleLiteralBool(true)
                   handleNoTypeVariables(()
                   beginFunctionExpression(()
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.intertwined.expect
index 4765fe3..2370762 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_guarded.dart.intertwined.expect
@@ -68,11 +68,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       parseExpression(when)
                         looksLikeOuterPatternEquals(when)
                           skipOuterPattern(when)
@@ -105,11 +105,11 @@
                                 ensureBlock(), null, switch expression)
                                 listener: beginSwitchExpressionBlock({)
                                 listener: beginSwitchExpressionCase()
-                                parsePattern({, precedence: 1, isRefutableContext: true)
-                                  parsePrimaryPattern({, isRefutableContext: true)
-                                    parseVariablePattern({, typeInfo: Instance of 'NoType')
+                                parsePattern({, PatternContext.matching, precedence: 1)
+                                  parsePrimaryPattern({, PatternContext.matching)
+                                    parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                                       listener: handleNoType({)
-                                      listener: handleVariablePattern(null, _)
+                                      listener: handleVariablePattern(null, _, false)
                                 parseExpression(when)
                                   looksLikeOuterPatternEquals(when)
                                     skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.expect
index 5489461..e75ae7d 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.expect
@@ -25,7 +25,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             beginSwitchExpression(switch)
               handleIdentifier(x, expression)
               handleNoTypeArguments())
@@ -35,7 +35,7 @@
               beginSwitchExpressionBlock({)
                 beginSwitchExpressionCase()
                   handleNoType({)
-                  handleVariablePattern(null, _)
+                  handleVariablePattern(null, _, false)
                   handleNoTypeVariables(()
                   beginFunctionExpression(()
                     beginFormalParameters((, MemberKind.Local)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.intertwined.expect
index 83b6117..d39675b 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchExpressionCase_unguarded.dart.intertwined.expect
@@ -68,11 +68,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       parseExpression(when)
                         looksLikeOuterPatternEquals(when)
                           skipOuterPattern(when)
@@ -105,11 +105,11 @@
                                 ensureBlock(), null, switch expression)
                                 listener: beginSwitchExpressionBlock({)
                                 listener: beginSwitchExpressionCase()
-                                parsePattern({, precedence: 1, isRefutableContext: true)
-                                  parsePrimaryPattern({, isRefutableContext: true)
-                                    parseVariablePattern({, typeInfo: Instance of 'NoType')
+                                parsePattern({, PatternContext.matching, precedence: 1)
+                                  parsePrimaryPattern({, PatternContext.matching)
+                                    parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                                       listener: handleNoType({)
-                                      listener: handleVariablePattern(null, _)
+                                      listener: handleVariablePattern(null, _, false)
                                 ensureFunctionArrow(_)
                                 parseExpression(=>)
                                   looksLikeOuterPatternEquals(=>)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.expect
index 7bcdc50..d20b829 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.expect
@@ -33,7 +33,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(case)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleIdentifier(y, expression)
               handleNoTypeArguments(+)
               handleNoArguments(+)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.intertwined.expect
index 873bb8a..1c663d7 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.intertwined.expect
@@ -77,11 +77,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(case)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                   parseExpression(when)
                     looksLikeOuterPatternEquals(when)
                       skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.expect
index a4e8424..71d03d3 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchExpressionCase()
             handleNoTypeArguments([)
             handleNoType([)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleListPattern(1, [, ])
             beginParenthesizedExpressionOrRecordLiteral(()
             endRecordLiteral((, 0, null)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.intertwined.expect
index 4adb62d..cea5f98 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterListPattern.dart.intertwined.expect
@@ -68,15 +68,15 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           listener: handleNoTypeArguments([)
-                          parseListPatternSuffix({, isRefutableContext: true)
-                            parsePattern([, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern([, isRefutableContext: true)
-                                parseVariablePattern([, typeInfo: Instance of 'NoType')
+                          parseListPatternSuffix({, PatternContext.matching)
+                            parsePattern([, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern([, PatternContext.matching)
+                                parseVariablePattern([, PatternContext.matching, typeInfo: Instance of 'NoType')
                                   listener: handleNoType([)
-                                  listener: handleVariablePattern(null, _)
+                                  listener: handleVariablePattern(null, _, false)
                             listener: handleListPattern(1, [, ])
                       parseExpression(when)
                         looksLikeOuterPatternEquals(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.expect
index 8107fc2..fbdfcf2 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.expect
@@ -28,7 +28,7 @@
             beginLiteralString('x')
             endLiteralString(0, :)
             handleNoType(:)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleMapPatternEntry(:, })
             handleMapPattern(1, {, })
             beginParenthesizedExpressionOrRecordLiteral(()
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.intertwined.expect
index 45e47dd..d3323d4 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterMapPattern.dart.intertwined.expect
@@ -68,10 +68,10 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           listener: handleNoTypeArguments({)
-                          parseMapPatternSuffix({, isRefutableContext: true)
+                          parseMapPatternSuffix({, PatternContext.matching)
                             parseExpression({)
                               looksLikeOuterPatternEquals({)
                                 skipOuterPattern({)
@@ -82,11 +82,11 @@
                                       parseSingleLiteralString({)
                                         listener: beginLiteralString('x')
                                         listener: endLiteralString(0, :)
-                            parsePattern(:, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern(:, isRefutableContext: true)
-                                parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                            parsePattern(:, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern(:, PatternContext.matching)
+                                parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(:)
-                                  listener: handleVariablePattern(null, _)
+                                  listener: handleVariablePattern(null, _, false)
                             listener: handleMapPatternEntry(:, })
                             listener: handleMapPattern(1, {, })
                       parseExpression(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.expect
index fb59b3f..17a47ef 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.expect
@@ -27,7 +27,7 @@
             handleNoTypeArguments(()
             handleIdentifier(bar, namedArgumentReference)
             handleNoType(:)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handlePatternField(:)
             handleObjectPatternFields(1, (, ))
             handleObjectPattern(Foo, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.intertwined.expect
index bbd787f..362f39b 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterObjectPattern.dart.intertwined.expect
@@ -68,17 +68,17 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
                           listener: handleNoTypeArguments(()
-                          parseObjectPatternRest(Foo, isRefutableContext: true)
+                          parseObjectPatternRest(Foo, PatternContext.matching)
                             ensureIdentifier((, namedArgumentReference)
                               listener: handleIdentifier(bar, namedArgumentReference)
-                            parsePattern(:, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern(:, isRefutableContext: true)
-                                parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                            parsePattern(:, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern(:, PatternContext.matching)
+                                parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(:)
-                                  listener: handleVariablePattern(null, _)
+                                  listener: handleVariablePattern(null, _, false)
                             listener: handlePatternField(:)
                             listener: handleObjectPatternFields(1, (, ))
                           listener: handleObjectPattern(Foo, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.expect
index 3c7c550..adb8c11 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.expect
@@ -25,7 +25,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType(()
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleParenthesizedPattern(()
             beginParenthesizedExpressionOrRecordLiteral(()
             endRecordLiteral((, 0, null)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.intertwined.expect
index 089c757..70f50ec 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterParenthesizedPattern.dart.intertwined.expect
@@ -68,14 +68,14 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseParenthesizedPatternOrRecordPattern({, isRefutableContext: true)
-                            parsePattern((, precedence: 1, isRefutableContext: true)
-                              parsePrimaryPattern((, isRefutableContext: true)
-                                parseVariablePattern((, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseParenthesizedPatternOrRecordPattern({, PatternContext.matching)
+                            parsePattern((, PatternContext.matching, precedence: 1)
+                              parsePrimaryPattern((, PatternContext.matching)
+                                parseVariablePattern((, PatternContext.matching, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(()
-                                  listener: handleVariablePattern(null, _)
+                                  listener: handleVariablePattern(null, _, false)
                             ensureCloseParen(_, ()
                             listener: handleParenthesizedPattern(()
                       parseExpression(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.expect
index 3b0ac92..d96cbce 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.expect
@@ -25,7 +25,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             beginSwitchExpression(switch)
               handleIdentifier(x, expression)
               handleNoTypeArguments())
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.intertwined.expect
index ca03d26..50d1a34 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_afterSwitchExpressionInWhenClause.dart.intertwined.expect
@@ -68,11 +68,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       parseExpression(when)
                         looksLikeOuterPatternEquals(when)
                           skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.expect
index 159847a..1b9122c 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.expect
@@ -32,7 +32,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleIdentifier(y, expression)
             handleNoTypeArguments(+)
             handleNoArguments(+)
diff --git a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.intertwined.expect
index f8ea54f..4c2f6bf 100644
--- a/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/functionExpression_disallowed_insideSwitchExpressionInWhenClause.dart.intertwined.expect
@@ -78,11 +78,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       parseExpression(when)
                         looksLikeOuterPatternEquals(when)
                           skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_case.dart.intertwined.expect
index 764a624..b35c5c7 100644
--- a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_case.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_cast.dart.intertwined.expect
index 77fbfe0..03f2ce3f 100644
--- a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_cast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_if_case.dart.intertwined.expect
index b1c0dde..ebf4852 100644
--- a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_if_case.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_assert.dart.intertwined.expect
index e8178df..9684b99 100644
--- a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_assert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_check.dart.intertwined.expect
index aecb835..4fc7a7c 100644
--- a/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/integer_literal_inside_null_check.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/issue50591.dart.expect b/pkg/front_end/parser_testcases/patterns/issue50591.dart.expect
index 96aa656..616b764 100644
--- a/pkg/front_end/parser_testcases/patterns/issue50591.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/issue50591.dart.expect
@@ -39,7 +39,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleIdentifier(a, expression)
             handleNoTypeArguments(()
             beginArguments(()
diff --git a/pkg/front_end/parser_testcases/patterns/issue50591.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/issue50591.dart.intertwined.expect
index e86e853..c5b75b9 100644
--- a/pkg/front_end/parser_testcases/patterns/issue50591.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/issue50591.dart.intertwined.expect
@@ -88,11 +88,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       parseExpression(when)
                         looksLikeOuterPatternEquals(when)
                           skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.expect b/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.expect
index abb05ed..3753b96 100644
--- a/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.expect
@@ -44,7 +44,7 @@
               endSwitchExpressionCase(null, =>, 0)
               beginSwitchExpressionCase()
                 handleNoType(,)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
                 handleLiteralInt(1)
               endSwitchExpressionCase(null, =>, 1)
             endSwitchExpressionBlock(2, {, })
diff --git a/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.intertwined.expect
index fa4b238..dfde1aaf 100644
--- a/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/issue50591_example2.dart.intertwined.expect
@@ -85,8 +85,8 @@
                                           ensureBlock(), null, switch expression)
                                           listener: beginSwitchExpressionBlock({)
                                           listener: beginSwitchExpressionCase()
-                                          parsePattern({, precedence: 1, isRefutableContext: true)
-                                            parsePrimaryPattern({, isRefutableContext: true)
+                                          parsePattern({, PatternContext.matching, precedence: 1)
+                                            parsePrimaryPattern({, PatternContext.matching)
                                               parsePrecedenceExpression(const, 17, false)
                                                 parseUnaryExpression(const, false)
                                                   parsePrimary(const, expression)
@@ -114,11 +114,11 @@
                                                     listener: handleLiteralInt(0)
                                           listener: endSwitchExpressionCase(null, =>, 0)
                                           listener: beginSwitchExpressionCase()
-                                          parsePattern(,, precedence: 1, isRefutableContext: true)
-                                            parsePrimaryPattern(,, isRefutableContext: true)
-                                              parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                                          parsePattern(,, PatternContext.matching, precedence: 1)
+                                            parsePrimaryPattern(,, PatternContext.matching)
+                                              parseVariablePattern(,, PatternContext.matching, typeInfo: Instance of 'NoType')
                                                 listener: handleNoType(,)
-                                                listener: handleVariablePattern(null, _)
+                                                listener: handleVariablePattern(null, _, false)
                                           ensureFunctionArrow(_)
                                           parseExpression(=>)
                                             looksLikeOuterPatternEquals(=>)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.expect
index 5a0299c..0e83f25 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.expect
@@ -23,9 +23,9 @@
           handleType(int, null)
         endTypeArguments(1, <, >)
         handleNoType([)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, true)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, true)
         handleListPattern(2, [, ])
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.intertwined.expect
index 370c1c3..edc3cbe 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_typed_nonEmpty.dart.intertwined.expect
@@ -46,24 +46,24 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
                             listener: beginTypeArguments(<)
                             listener: handleIdentifier(int, typeReference)
                             listener: handleNoTypeArguments(>)
                             listener: handleType(int, null)
                             listener: endTypeArguments(1, <, >)
-                            parseListPatternSuffix(>, isRefutableContext: false)
-                              parsePattern([, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern([, isRefutableContext: false)
-                                  parseVariablePattern([, typeInfo: Instance of 'NoType')
+                            parseListPatternSuffix(>, PatternContext.assignment)
+                              parsePattern([, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern([, PatternContext.assignment)
+                                  parseVariablePattern([, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType([)
-                                    listener: handleVariablePattern(null, a)
-                              parsePattern(,, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern(,, isRefutableContext: false)
-                                  parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                                    listener: handleVariablePattern(null, a, true)
+                              parsePattern(,, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.assignment)
+                                  parseVariablePattern(,, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(,)
-                                    listener: handleVariablePattern(null, b)
+                                    listener: handleVariablePattern(null, b, true)
                               listener: handleListPattern(2, [, ])
                         parseExpression(=)
                           looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_empty.dart.intertwined.expect
index 765865e..6e5150e 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_empty.dart.intertwined.expect
@@ -46,10 +46,10 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
                             listener: handleNoTypeArguments([])
-                            parseListPatternSuffix({, isRefutableContext: false)
+                            parseListPatternSuffix({, PatternContext.assignment)
                               rewriteSquareBrackets({)
                                 link([, ])
                                 rewriter()
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_emptyWithWhitespace.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_emptyWithWhitespace.dart.intertwined.expect
index 7f9f607..167ef33 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_emptyWithWhitespace.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_emptyWithWhitespace.dart.intertwined.expect
@@ -46,10 +46,10 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
                             listener: handleNoTypeArguments([)
-                            parseListPatternSuffix({, isRefutableContext: false)
+                            parseListPatternSuffix({, PatternContext.assignment)
                               listener: handleListPattern(0, [, ])
                         parseExpression(=)
                           looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.expect
index 5aba751..a005029 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.expect
@@ -19,9 +19,9 @@
       beginBlockFunctionBody({)
         handleNoTypeArguments([)
         handleNoType([)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, true)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, true)
         handleListPattern(2, [, ])
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.intertwined.expect
index a32fef8..130bfe6 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideAssignment_untyped_nonEmpty.dart.intertwined.expect
@@ -46,20 +46,20 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
                             listener: handleNoTypeArguments([)
-                            parseListPatternSuffix({, isRefutableContext: false)
-                              parsePattern([, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern([, isRefutableContext: false)
-                                  parseVariablePattern([, typeInfo: Instance of 'NoType')
+                            parseListPatternSuffix({, PatternContext.assignment)
+                              parsePattern([, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern([, PatternContext.assignment)
+                                  parseVariablePattern([, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType([)
-                                    listener: handleVariablePattern(null, a)
-                              parsePattern(,, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern(,, isRefutableContext: false)
-                                  parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                                    listener: handleVariablePattern(null, a, true)
+                              parsePattern(,, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.assignment)
+                                  parseVariablePattern(,, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(,)
-                                    listener: handleVariablePattern(null, b)
+                                    listener: handleVariablePattern(null, b, true)
                               listener: handleListPattern(2, [, ])
                         parseExpression(=)
                           looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.expect
index bf8cf1d..9cdca2a 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.expect
@@ -25,9 +25,9 @@
           handleType(int, null)
         endTypeArguments(1, <, >)
         handleNoType([)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handleListPattern(2, [, ])
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.intertwined.expect
index 024b16b..e4b1685 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_typed_nonEmpty.dart.intertwined.expect
@@ -43,24 +43,24 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseListPatternSuffix(>, isRefutableContext: false)
-                        parsePattern([, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern([, isRefutableContext: false)
-                            parseVariablePattern([, typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(>, PatternContext.declaration)
+                        parsePattern([, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.declaration)
+                            parseVariablePattern([, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType([)
-                              listener: handleVariablePattern(null, a)
-                        parsePattern(,, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(,, isRefutableContext: false)
-                            parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                              listener: handleVariablePattern(null, a, false)
+                        parsePattern(,, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.declaration)
+                            parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(,)
-                              listener: handleVariablePattern(null, b)
+                              listener: handleVariablePattern(null, b, false)
                         listener: handleListPattern(2, [, ])
                   parseExpression(=)
                     looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_empty.dart.intertwined.expect
index e144134..30f3472 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_empty.dart.intertwined.expect
@@ -43,10 +43,10 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments([])
-                      parseListPatternSuffix(var, isRefutableContext: false)
+                      parseListPatternSuffix(var, PatternContext.declaration)
                         rewriteSquareBrackets(var)
                           link([, ])
                           rewriter()
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_emptyWithWhitespace.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_emptyWithWhitespace.dart.intertwined.expect
index c07267a..ddb8436 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_emptyWithWhitespace.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_emptyWithWhitespace.dart.intertwined.expect
@@ -43,10 +43,10 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(var, isRefutableContext: false)
+                      parseListPatternSuffix(var, PatternContext.declaration)
                         listener: handleListPattern(0, [, ])
                   parseExpression(=)
                     looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.expect
index deb1c8a..8de6776 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.expect
@@ -21,9 +21,9 @@
         endMetadataStar(0)
         handleNoTypeArguments([)
         handleNoType([)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handleListPattern(2, [, ])
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect
index c1cd259..7f4fa2b 100644
--- a/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect
@@ -43,20 +43,20 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(var, isRefutableContext: false)
-                        parsePattern([, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern([, isRefutableContext: false)
-                            parseVariablePattern([, typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(var, PatternContext.declaration)
+                        parsePattern([, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.declaration)
+                            parseVariablePattern([, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType([)
-                              listener: handleVariablePattern(null, a)
-                        parsePattern(,, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(,, isRefutableContext: false)
-                            parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                              listener: handleVariablePattern(null, a, false)
+                        parsePattern(,, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.declaration)
+                            parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(,)
-                              listener: handleVariablePattern(null, b)
+                              listener: handleVariablePattern(null, b, false)
                         listener: handleListPattern(2, [, ])
                   parseExpression(=)
                     looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case.dart.intertwined.expect
index 9bee1bd..21e2fe9 100644
--- a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case.dart.intertwined.expect
@@ -69,20 +69,20 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
                                   parseLiteralInt([)
                                     listener: handleLiteralInt(1)
                             listener: handleConstantPattern(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty.dart.intertwined.expect
index a64a4de..d4972bc 100644
--- a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([])
-                      parseListPatternSuffix(case, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
                         rewriteSquareBrackets(case)
                           link([, ])
                           rewriter()
diff --git a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty_whitespace.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty_whitespace.dart.intertwined.expect
index 328818b..b581b40 100644
--- a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty_whitespace.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_empty_whitespace.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
                         listener: handleListPattern(0, [, ])
                   ensureColon(])
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_with_type_arguments.dart.intertwined.expect
index ef3375b..6778fca 100644
--- a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_with_type_arguments.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_case_with_type_arguments.dart.intertwined.expect
@@ -69,24 +69,24 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseListPatternSuffix(>, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(>, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
                                   parseLiteralInt([)
                                     listener: handleLiteralInt(1)
                             listener: handleConstantPattern(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_cast.dart.intertwined.expect
index a5ffa1e..1944f7a 100644
--- a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_cast.dart.intertwined.expect
@@ -69,12 +69,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_assert.dart.intertwined.expect
index 2baba3e..89df196 100644
--- a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_assert.dart.intertwined.expect
@@ -69,12 +69,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_check.dart.intertwined.expect
index 0fbbdd9..ede71b0 100644
--- a/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/list_pattern_inside_null_check.dart.intertwined.expect
@@ -69,12 +69,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.expect
index a443956..6c81437 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.expect
@@ -27,12 +27,12 @@
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(?)
           handleType(int, ?)
-          handleVariablePattern(null, _)
+          handleVariablePattern(null, _, false)
           beginBinaryPattern(&&)
             handleIdentifier(double, typeReference)
             handleNoTypeArguments(?)
             handleType(double, ?)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
           endBinaryPattern(&&)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.intertwined.expect
index 1c74567..7f54f3e 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_if_case.dart.intertwined.expect
@@ -61,21 +61,21 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(int, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                       listener: beginBinaryPattern(&&)
-                      parsePattern(&&, precedence: 7, isRefutableContext: true)
-                        parsePrimaryPattern(&&, isRefutableContext: true)
-                          parseVariablePattern(&&, typeInfo: Instance of 'SimpleNullableType')
+                      parsePattern(&&, PatternContext.matching, precedence: 7)
+                        parsePrimaryPattern(&&, PatternContext.matching)
+                          parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                             listener: handleIdentifier(double, typeReference)
                             listener: handleNoTypeArguments(?)
                             listener: handleType(double, ?)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       listener: endBinaryPattern(&&)
                     ensureCloseParen(_, ()
                     listener: handleParenthesizedCondition((, case, null)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.expect
index e37b8ce..aaa22b6 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.expect
@@ -30,18 +30,18 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginBinaryPattern(&&)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
                 handleType(double, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(&&)
               beginBinaryPattern(&&)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(?)
                 handleType(Object, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(&&)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.intertwined.expect
index 71b1314..cc0ed4e 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_and_lhs.dart.intertwined.expect
@@ -69,30 +69,30 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
-                        parseVariablePattern(&&, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
+                        parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(double, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(double, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(&&)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
-                        parseVariablePattern(&&, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
+                        parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(Object, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(Object, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(&&)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.expect
index a0d09fd..da67e08 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.expect
@@ -30,18 +30,18 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginBinaryPattern(&&)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
                 handleType(double, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(&&)
               beginBinaryPattern(||)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(?)
                 handleType(Object, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(||)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.intertwined.expect
index 3fd4460..de424ac 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_lhs.dart.intertwined.expect
@@ -69,30 +69,30 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
-                        parseVariablePattern(&&, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
+                        parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(double, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(double, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(&&)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
-                        parseVariablePattern(||, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
+                        parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(Object, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(Object, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(||)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.expect
index 62b3b2a..ea6cae1 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.expect
@@ -30,17 +30,17 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginBinaryPattern(||)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
                 handleType(double, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
                 beginBinaryPattern(&&)
                   handleIdentifier(Object, typeReference)
                   handleNoTypeArguments(?)
                   handleType(Object, ?)
-                  handleVariablePattern(null, _)
+                  handleVariablePattern(null, _, false)
                 endBinaryPattern(&&)
               endBinaryPattern(||)
             endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.intertwined.expect
index 0c70eaf..1d9d713 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_and_inside_logical_or_rhs.dart.intertwined.expect
@@ -69,29 +69,29 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
-                        parseVariablePattern(||, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
+                        parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(double, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(double, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                       listener: beginBinaryPattern(&&)
-                      parsePattern(&&, precedence: 7, isRefutableContext: true)
-                        parsePrimaryPattern(&&, isRefutableContext: true)
-                          parseVariablePattern(&&, typeInfo: Instance of 'SimpleNullableType')
+                      parsePattern(&&, PatternContext.matching, precedence: 7)
+                        parsePrimaryPattern(&&, PatternContext.matching)
+                          parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                             listener: handleIdentifier(Object, typeReference)
                             listener: handleNoTypeArguments(?)
                             listener: handleType(Object, ?)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       listener: endBinaryPattern(&&)
                     listener: endBinaryPattern(||)
                   ensureColon(_)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.expect
index bee0cb6..50919db 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.expect
@@ -27,12 +27,12 @@
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(?)
           handleType(int, ?)
-          handleVariablePattern(null, _)
+          handleVariablePattern(null, _, false)
           beginBinaryPattern(||)
             handleIdentifier(double, typeReference)
             handleNoTypeArguments(?)
             handleType(double, ?)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
           endBinaryPattern(||)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.intertwined.expect
index 270f6af..90a7bfb 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_or_inside_if_case.dart.intertwined.expect
@@ -61,21 +61,21 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(int, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                       listener: beginBinaryPattern(||)
-                      parsePattern(||, precedence: 6, isRefutableContext: true)
-                        parsePrimaryPattern(||, isRefutableContext: true)
-                          parseVariablePattern(||, typeInfo: Instance of 'SimpleNullableType')
+                      parsePattern(||, PatternContext.matching, precedence: 6)
+                        parsePrimaryPattern(||, PatternContext.matching)
+                          parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                             listener: handleIdentifier(double, typeReference)
                             listener: handleNoTypeArguments(?)
                             listener: handleType(double, ?)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       listener: endBinaryPattern(||)
                     ensureCloseParen(_, ()
                     listener: handleParenthesizedCondition((, case, null)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.expect b/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.expect
index 585ccbd..7de3cea 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.expect
@@ -30,18 +30,18 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(?)
               handleType(int, ?)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginBinaryPattern(||)
                 handleIdentifier(double, typeReference)
                 handleNoTypeArguments(?)
                 handleType(double, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(||)
               beginBinaryPattern(||)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(?)
                 handleType(Object, ?)
-                handleVariablePattern(null, _)
+                handleVariablePattern(null, _, false)
               endBinaryPattern(||)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.intertwined.expect
index 5f60873..bf48544 100644
--- a/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/logical_or_inside_logical_or_lhs.dart.intertwined.expect
@@ -69,30 +69,30 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleNullableType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(?)
                         listener: handleType(int, ?)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
-                        parseVariablePattern(||, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
+                        parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(double, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(double, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(||)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
-                        parseVariablePattern(||, typeInfo: Instance of 'SimpleNullableType')
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
+                        parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleNullableType')
                           listener: handleIdentifier(Object, typeReference)
                           listener: handleNoTypeArguments(?)
                           listener: handleType(Object, ?)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     listener: endBinaryPattern(||)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.expect
index ba77159..0bbb0aa 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.expect
@@ -28,12 +28,12 @@
         beginLiteralString('a')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, true)
         handleMapPatternEntry(:, ,)
         beginLiteralString('b')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, true)
         handleMapPatternEntry(:, })
         handleMapPattern(2, {, })
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.intertwined.expect
index 0cc0b7b..2258fb0 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_typed_nonEmpty.dart.intertwined.expect
@@ -46,8 +46,8 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
                             listener: beginTypeArguments(<)
                             listener: handleIdentifier(String, typeReference)
                             listener: handleNoTypeArguments(,)
@@ -56,7 +56,7 @@
                             listener: handleNoTypeArguments(>)
                             listener: handleType(int, null)
                             listener: endTypeArguments(2, <, >)
-                            parseMapPatternSuffix(>, isRefutableContext: false)
+                            parseMapPatternSuffix(>, PatternContext.assignment)
                               parseExpression({)
                                 looksLikeOuterPatternEquals({)
                                   skipOuterPattern({)
@@ -67,11 +67,11 @@
                                         parseSingleLiteralString({)
                                           listener: beginLiteralString('a')
                                           listener: endLiteralString(0, :)
-                              parsePattern(:, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern(:, isRefutableContext: false)
-                                  parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                              parsePattern(:, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.assignment)
+                                  parseVariablePattern(:, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(:)
-                                    listener: handleVariablePattern(null, a)
+                                    listener: handleVariablePattern(null, a, true)
                               listener: handleMapPatternEntry(:, ,)
                               parseExpression(,)
                                 looksLikeOuterPatternEquals(,)
@@ -83,11 +83,11 @@
                                         parseSingleLiteralString(,)
                                           listener: beginLiteralString('b')
                                           listener: endLiteralString(0, :)
-                              parsePattern(:, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern(:, isRefutableContext: false)
-                                  parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                              parsePattern(:, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern(:, PatternContext.assignment)
+                                  parseVariablePattern(:, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(:)
-                                    listener: handleVariablePattern(null, b)
+                                    listener: handleVariablePattern(null, b, true)
                               listener: handleMapPatternEntry(:, })
                               listener: handleMapPattern(2, {, })
                         parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty.dart.intertwined.expect
index aa5a74b..537011c 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty.dart.intertwined.expect
@@ -55,10 +55,10 @@
                                   looksLikeOuterPatternEquals(()
                                     skipOuterPattern(()
                                   parsePatternAssignment(()
-                                    parsePattern((, precedence: 1, isRefutableContext: false)
-                                      parsePrimaryPattern((, isRefutableContext: false)
+                                    parsePattern((, PatternContext.assignment, precedence: 1)
+                                      parsePrimaryPattern((, PatternContext.assignment)
                                         listener: handleNoTypeArguments({)
-                                        parseMapPatternSuffix((, isRefutableContext: false)
+                                        parseMapPatternSuffix((, PatternContext.assignment)
                                           listener: handleMapPattern(0, {, })
                                     parseExpression(=)
                                       looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty_beginningOfStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty_beginningOfStatement.dart.intertwined.expect
index 46b43db..be77126 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty_beginningOfStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_empty_beginningOfStatement.dart.intertwined.expect
@@ -43,10 +43,10 @@
                   looksLikeOuterPatternEquals({)
                     skipOuterPattern({)
                   parsePatternAssignment({)
-                    parsePattern({, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern({, isRefutableContext: false)
+                    parsePattern({, PatternContext.assignment, precedence: 1)
+                      parsePrimaryPattern({, PatternContext.assignment)
                         listener: handleNoTypeArguments({)
-                        parseMapPatternSuffix({, isRefutableContext: false)
+                        parseMapPatternSuffix({, PatternContext.assignment)
                           listener: handleMapPattern(0, {, })
                     parseExpression(=)
                       looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.expect
index c20886b..4ece6138 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.expect
@@ -22,12 +22,12 @@
           beginLiteralString('a')
           endLiteralString(0, :)
           handleNoType(:)
-          handleVariablePattern(null, a)
+          handleVariablePattern(null, a, true)
           handleMapPatternEntry(:, ,)
           beginLiteralString('b')
           endLiteralString(0, :)
           handleNoType(:)
-          handleVariablePattern(null, b)
+          handleVariablePattern(null, b, true)
           handleMapPatternEntry(:, })
           handleMapPattern(2, {, })
           handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.intertwined.expect
index 85484c9..cf8b2e0 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty.dart.intertwined.expect
@@ -55,10 +55,10 @@
                                   looksLikeOuterPatternEquals(()
                                     skipOuterPattern(()
                                   parsePatternAssignment(()
-                                    parsePattern((, precedence: 1, isRefutableContext: false)
-                                      parsePrimaryPattern((, isRefutableContext: false)
+                                    parsePattern((, PatternContext.assignment, precedence: 1)
+                                      parsePrimaryPattern((, PatternContext.assignment)
                                         listener: handleNoTypeArguments({)
-                                        parseMapPatternSuffix((, isRefutableContext: false)
+                                        parseMapPatternSuffix((, PatternContext.assignment)
                                           parseExpression({)
                                             looksLikeOuterPatternEquals({)
                                               skipOuterPattern({)
@@ -69,11 +69,11 @@
                                                     parseSingleLiteralString({)
                                                       listener: beginLiteralString('a')
                                                       listener: endLiteralString(0, :)
-                                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                                            parsePrimaryPattern(:, isRefutableContext: false)
-                                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                                          parsePattern(:, PatternContext.assignment, precedence: 1)
+                                            parsePrimaryPattern(:, PatternContext.assignment)
+                                              parseVariablePattern(:, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                                 listener: handleNoType(:)
-                                                listener: handleVariablePattern(null, a)
+                                                listener: handleVariablePattern(null, a, true)
                                           listener: handleMapPatternEntry(:, ,)
                                           parseExpression(,)
                                             looksLikeOuterPatternEquals(,)
@@ -85,11 +85,11 @@
                                                     parseSingleLiteralString(,)
                                                       listener: beginLiteralString('b')
                                                       listener: endLiteralString(0, :)
-                                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                                            parsePrimaryPattern(:, isRefutableContext: false)
-                                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                                          parsePattern(:, PatternContext.assignment, precedence: 1)
+                                            parsePrimaryPattern(:, PatternContext.assignment)
+                                              parseVariablePattern(:, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                                 listener: handleNoType(:)
-                                                listener: handleVariablePattern(null, b)
+                                                listener: handleVariablePattern(null, b, true)
                                           listener: handleMapPatternEntry(:, })
                                           listener: handleMapPattern(2, {, })
                                     parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.expect
index 1d37e82..80d63fd 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.expect
@@ -21,12 +21,12 @@
         beginLiteralString('a')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, true)
         handleMapPatternEntry(:, ,)
         beginLiteralString('b')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, true)
         handleMapPatternEntry(:, })
         handleMapPattern(2, {, })
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.intertwined.expect
index 3337095..fbe6ce6 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideAssignment_untyped_nonEmpty_beginningOfStatement.dart.intertwined.expect
@@ -43,10 +43,10 @@
                   looksLikeOuterPatternEquals({)
                     skipOuterPattern({)
                   parsePatternAssignment({)
-                    parsePattern({, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern({, isRefutableContext: false)
+                    parsePattern({, PatternContext.assignment, precedence: 1)
+                      parsePrimaryPattern({, PatternContext.assignment)
                         listener: handleNoTypeArguments({)
-                        parseMapPatternSuffix({, isRefutableContext: false)
+                        parseMapPatternSuffix({, PatternContext.assignment)
                           parseExpression({)
                             looksLikeOuterPatternEquals({)
                               skipOuterPattern({)
@@ -57,11 +57,11 @@
                                     parseSingleLiteralString({)
                                       listener: beginLiteralString('a')
                                       listener: endLiteralString(0, :)
-                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern(:, isRefutableContext: false)
-                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                          parsePattern(:, PatternContext.assignment, precedence: 1)
+                            parsePrimaryPattern(:, PatternContext.assignment)
+                              parseVariablePattern(:, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(:)
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, true)
                           listener: handleMapPatternEntry(:, ,)
                           parseExpression(,)
                             looksLikeOuterPatternEquals(,)
@@ -73,11 +73,11 @@
                                     parseSingleLiteralString(,)
                                       listener: beginLiteralString('b')
                                       listener: endLiteralString(0, :)
-                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern(:, isRefutableContext: false)
-                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                          parsePattern(:, PatternContext.assignment, precedence: 1)
+                            parsePrimaryPattern(:, PatternContext.assignment)
+                              parseVariablePattern(:, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(:)
-                                listener: handleVariablePattern(null, b)
+                                listener: handleVariablePattern(null, b, true)
                           listener: handleMapPatternEntry(:, })
                           listener: handleMapPattern(2, {, })
                     parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.expect
index b839413..1efd19a 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.expect
@@ -30,12 +30,12 @@
         beginLiteralString('a')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleMapPatternEntry(:, ,)
         beginLiteralString('b')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handleMapPatternEntry(:, })
         handleMapPattern(2, {, })
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.intertwined.expect
index 4d7cb65..473cc3d 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_typed_nonEmpty.dart.intertwined.expect
@@ -43,8 +43,8 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(String, typeReference)
                       listener: handleNoTypeArguments(,)
@@ -53,7 +53,7 @@
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(2, <, >)
-                      parseMapPatternSuffix(>, isRefutableContext: false)
+                      parseMapPatternSuffix(>, PatternContext.declaration)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -64,11 +64,11 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(:, isRefutableContext: false)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(:)
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handleMapPatternEntry(:, ,)
                         parseExpression(,)
                           looksLikeOuterPatternEquals(,)
@@ -80,11 +80,11 @@
                                   parseSingleLiteralString(,)
                                     listener: beginLiteralString('b')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(:, isRefutableContext: false)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(:)
-                              listener: handleVariablePattern(null, b)
+                              listener: handleVariablePattern(null, b, false)
                         listener: handleMapPatternEntry(:, })
                         listener: handleMapPattern(2, {, })
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_empty.dart.intertwined.expect
index 50f3979..8877636 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_empty.dart.intertwined.expect
@@ -43,10 +43,10 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(var, isRefutableContext: false)
+                      parseMapPatternSuffix(var, PatternContext.declaration)
                         listener: handleMapPattern(0, {, })
                   parseExpression(=)
                     looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.expect b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.expect
index 4f41088..bdb2c58 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.expect
@@ -23,12 +23,12 @@
         beginLiteralString('a')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleMapPatternEntry(:, ,)
         beginLiteralString('b')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handleMapPatternEntry(:, })
         handleMapPattern(2, {, })
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect
index de604f2..b19d2bc 100644
--- a/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_insideDeclaration_untyped_nonEmpty.dart.intertwined.expect
@@ -43,10 +43,10 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(var, isRefutableContext: false)
+                      parseMapPatternSuffix(var, PatternContext.declaration)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -57,11 +57,11 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(:, isRefutableContext: false)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(:)
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handleMapPatternEntry(:, ,)
                         parseExpression(,)
                           looksLikeOuterPatternEquals(,)
@@ -73,11 +73,11 @@
                                   parseSingleLiteralString(,)
                                     listener: beginLiteralString('b')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(:, isRefutableContext: false)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(:)
-                              listener: handleVariablePattern(null, b)
+                              listener: handleVariablePattern(null, b, false)
                         listener: handleMapPatternEntry(:, })
                         listener: handleMapPattern(2, {, })
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case.dart.intertwined.expect
index 4d288c1..3635047 100644
--- a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
@@ -102,8 +102,8 @@
                                   parseSingleLiteralString(,)
                                     listener: beginLiteralString('b')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_empty.dart.intertwined.expect
index 4fe0102..4178f51 100644
--- a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_empty.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         listener: handleMapPattern(0, {, })
                   ensureColon(})
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_with_type_arguments.dart.intertwined.expect
index cbf3d1a..a140d56 100644
--- a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_with_type_arguments.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_case_with_type_arguments.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(String, typeReference)
                       listener: handleNoTypeArguments(,)
@@ -79,7 +79,7 @@
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(2, <, >)
-                      parseMapPatternSuffix(>, isRefutableContext: true)
+                      parseMapPatternSuffix(>, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -90,8 +90,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
@@ -109,8 +109,8 @@
                                   parseSingleLiteralString(,)
                                     listener: beginLiteralString('b')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_cast.dart.intertwined.expect
index ea06d8b..a2632c7 100644
--- a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_cast.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_assert.dart.intertwined.expect
index 5f2a2cd..177c912 100644
--- a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_assert.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_check.dart.intertwined.expect
index a4defa8..47c3489 100644
--- a/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/map_pattern_inside_null_check.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_case.dart.intertwined.expect
index 8eb976c..0edd0ab 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_case.dart.intertwined.expect
@@ -98,8 +98,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern.dart.intertwined.expect
index 285cc52..7f82ff4 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern.dart.intertwined.expect
@@ -113,14 +113,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.expect
index 3e73904..bf9caa7 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.expect
@@ -56,7 +56,7 @@
               handleNoTypeArguments(()
               handleNoName(()
               handleNoType(var)
-              handleVariablePattern(var, f)
+              handleVariablePattern(var, f, false)
               handleNullAssertPattern(!)
               handlePatternField(:)
               handleObjectPatternFields(1, (, ))
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
index 4ed032b..4aaea54 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
@@ -113,16 +113,16 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, f)
+                              listener: handleVariablePattern(var, f, false)
                           listener: handleNullAssertPattern(!)
                         listener: handlePatternField(:)
                         listener: handleObjectPatternFields(1, (, ))
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.expect
index b2d7bdb..50e9e05 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.expect
@@ -25,7 +25,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(var)
-          handleVariablePattern(var, y)
+          handleVariablePattern(var, y, false)
           handleNullAssertPattern(!)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.intertwined.expect
index e16d340..d946278 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_if_case.dart.intertwined.expect
@@ -61,11 +61,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(var)
-                          listener: handleVariablePattern(var, y)
+                          listener: handleVariablePattern(var, y, false)
                       listener: handleNullAssertPattern(!)
                     ensureCloseParen(!, ()
                     listener: handleParenthesizedCondition((, case, null)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_list_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_list_pattern.dart.intertwined.expect
index 0247763..a94e34b 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_list_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_list_pattern.dart.intertwined.expect
@@ -69,12 +69,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_lhs.dart.intertwined.expect
index 90ecf8f..a7426cc 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_lhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -79,8 +79,8 @@
                       listener: handleConstantPattern(null)
                     listener: handleNullAssertPattern(!)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
                         parsePrecedenceExpression(&&, 17, false)
                           parseUnaryExpression(&&, false)
                             parsePrimary(&&, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_rhs.dart.intertwined.expect
index da8754e..283fedf 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_and_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
                         parsePrecedenceExpression(&&, 17, false)
                           parseUnaryExpression(&&, false)
                             parsePrimary(&&, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_lhs.dart.intertwined.expect
index 76c0a53..c01c1a8 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_lhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -79,8 +79,8 @@
                       listener: handleConstantPattern(null)
                     listener: handleNullAssertPattern(!)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
                         parsePrecedenceExpression(||, 17, false)
                           parseUnaryExpression(||, false)
                             parsePrimary(||, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_rhs.dart.intertwined.expect
index e5037f4..38a236e1 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_logical_or_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
                         parsePrecedenceExpression(||, 17, false)
                           parseUnaryExpression(||, false)
                             parsePrimary(||, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_map_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_map_pattern.dart.intertwined.expect
index d125efa..b863dd4 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_map_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_map_pattern.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_parenthesized_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_parenthesized_pattern.dart.intertwined.expect
index 8f344ec..b0619fa 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_parenthesized_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_parenthesized_pattern.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.expect
index e5eb56e..f9147db 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.expect
@@ -29,7 +29,7 @@
             beginCaseExpression(case)
               handleNoName(()
               handleNoType(var)
-              handleVariablePattern(var, n)
+              handleVariablePattern(var, n, false)
               handleNullAssertPattern(!)
               handlePatternField(:)
               handleLiteralInt(2)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.intertwined.expect
index fb30f4f..808aa29 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_implicitly_named.dart.intertwined.expect
@@ -69,19 +69,19 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, n)
+                              listener: handleVariablePattern(var, n, false)
                           listener: handleNullAssertPattern(!)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_named.dart.intertwined.expect
index 65e5bce..24214fc 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_named.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         ensureIdentifier((, namedRecordFieldReference)
                           listener: handleIdentifier(n, namedRecordFieldReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
@@ -84,8 +84,8 @@
                             listener: handleConstantPattern(null)
                           listener: handleNullAssertPattern(!)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_unnamed.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_unnamed.dart.intertwined.expect
index af80369..8d8f124 100644
--- a/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_unnamed.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_assert_inside_record_pattern_unnamed.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
@@ -82,8 +82,8 @@
                             listener: handleConstantPattern(null)
                           listener: handleNullAssertPattern(!)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_case.dart.intertwined.expect
index e6eb394..37406ac0 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_case.dart.intertwined.expect
@@ -98,8 +98,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern.dart.intertwined.expect
index 6047b92..43584a9 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern.dart.intertwined.expect
@@ -113,14 +113,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.expect
index 91fc022..f70fe79 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.expect
@@ -56,7 +56,7 @@
               handleNoTypeArguments(()
               handleNoName(()
               handleNoType(var)
-              handleVariablePattern(var, f)
+              handleVariablePattern(var, f, false)
               handleNullCheckPattern(?)
               handlePatternField(:)
               handleObjectPatternFields(1, (, ))
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
index 742ccec..7ff83df 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
@@ -113,16 +113,16 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, f)
+                              listener: handleVariablePattern(var, f, false)
                           listener: handleNullCheckPattern(?)
                         listener: handlePatternField(:)
                         listener: handleObjectPatternFields(1, (, ))
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.expect
index 00e9683..f3fa194 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.expect
@@ -25,7 +25,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(var)
-          handleVariablePattern(var, y)
+          handleVariablePattern(var, y, false)
           handleNullCheckPattern(?)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.intertwined.expect
index f28e4e9..c7d077b 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_if_case.dart.intertwined.expect
@@ -61,11 +61,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(var)
-                          listener: handleVariablePattern(var, y)
+                          listener: handleVariablePattern(var, y, false)
                       listener: handleNullCheckPattern(?)
                     ensureCloseParen(?, ()
                     listener: handleParenthesizedCondition((, case, null)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_list_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_list_pattern.dart.intertwined.expect
index 9ad5e5f..6cb1fe2 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_list_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_list_pattern.dart.intertwined.expect
@@ -69,12 +69,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression([, 17, false)
                               parseUnaryExpression([, false)
                                 parsePrimary([, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_lhs.dart.intertwined.expect
index 628460e..002765d 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_lhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -79,8 +79,8 @@
                       listener: handleConstantPattern(null)
                     listener: handleNullCheckPattern(?)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
                         parsePrecedenceExpression(&&, 17, false)
                           parseUnaryExpression(&&, false)
                             parsePrimary(&&, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_rhs.dart.intertwined.expect
index ce7fa20..6f85c7c 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_and_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
                         parsePrecedenceExpression(&&, 17, false)
                           parseUnaryExpression(&&, false)
                             parsePrimary(&&, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_lhs.dart.intertwined.expect
index ee4de62..5a3d2d3 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_lhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -79,8 +79,8 @@
                       listener: handleConstantPattern(null)
                     listener: handleNullCheckPattern(?)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
                         parsePrecedenceExpression(||, 17, false)
                           parseUnaryExpression(||, false)
                             parsePrimary(||, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_rhs.dart.intertwined.expect
index c171ba9..88b40c1 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_logical_or_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
                         parsePrecedenceExpression(||, 17, false)
                           parseUnaryExpression(||, false)
                             parsePrimary(||, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_map_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_map_pattern.dart.intertwined.expect
index ee5071b..f76bdb1 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_map_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_map_pattern.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_parenthesized_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_parenthesized_pattern.dart.intertwined.expect
index e68c63b..8917aca 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_parenthesized_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_parenthesized_pattern.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.expect
index 675b06e..debfad2 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.expect
@@ -29,7 +29,7 @@
             beginCaseExpression(case)
               handleNoName(()
               handleNoType(var)
-              handleVariablePattern(var, n)
+              handleVariablePattern(var, n, false)
               handleNullCheckPattern(?)
               handlePatternField(:)
               handleLiteralInt(2)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.intertwined.expect
index a967b68..0cc84b3 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_implicitly_named.dart.intertwined.expect
@@ -69,19 +69,19 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, n)
+                              listener: handleVariablePattern(var, n, false)
                           listener: handleNullCheckPattern(?)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_named.dart.intertwined.expect
index f2c778e..29d6e35 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_named.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         ensureIdentifier((, namedRecordFieldReference)
                           listener: handleIdentifier(n, namedRecordFieldReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(:, 17, false)
                               parseUnaryExpression(:, false)
                                 parsePrimary(:, expression)
@@ -84,8 +84,8 @@
                             listener: handleConstantPattern(null)
                           listener: handleNullCheckPattern(?)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_unnamed.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_unnamed.dart.intertwined.expect
index 94fa288..deb6809 100644
--- a/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_unnamed.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_check_inside_record_pattern_unnamed.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
@@ -82,8 +82,8 @@
                             listener: handleConstantPattern(null)
                           listener: handleNullCheckPattern(?)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_literal_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_literal_inside_case.dart.intertwined.expect
index fb69cf4..0b112a6 100644
--- a/pkg/front_end/parser_testcases/patterns/null_literal_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_literal_inside_case.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_literal_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_literal_inside_cast.dart.intertwined.expect
index a15d7da..b469529 100644
--- a/pkg/front_end/parser_testcases/patterns/null_literal_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_literal_inside_cast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_literal_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_literal_inside_if_case.dart.intertwined.expect
index ae737f3..5f4ef70 100644
--- a/pkg/front_end/parser_testcases/patterns/null_literal_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_literal_inside_if_case.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_assert.dart.intertwined.expect
index fc60c6b..1ccabe5 100644
--- a/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_assert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_check.dart.intertwined.expect
index a9f117e..5fe7a47e 100644
--- a/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/null_literal_inside_null_check.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/object_prefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/object_prefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect
index 1234770..a05efc1 100644
--- a/pkg/front_end/parser_testcases/patterns/object_prefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/object_prefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect
@@ -44,10 +44,10 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(Future, isRefutableContext: false)
+                      parseObjectPatternRest(Future, PatternContext.declaration)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(_, ., Future)
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideAssignment.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideAssignment.dart.intertwined.expect
index 8171b60..e84eae5 100644
--- a/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideAssignment.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideAssignment.dart.intertwined.expect
@@ -47,14 +47,14 @@
                         skipOuterPattern({)
                           skipObjectPatternRest(Future)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
                             listener: beginTypeArguments(<)
                             listener: handleIdentifier(int, typeReference)
                             listener: handleNoTypeArguments(>)
                             listener: handleType(int, null)
                             listener: endTypeArguments(1, <, >)
-                            parseObjectPatternRest(>, isRefutableContext: false)
+                            parseObjectPatternRest(>, PatternContext.assignment)
                               listener: handleObjectPatternFields(0, (, ))
                             listener: handleObjectPattern(async, ., Future)
                         parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect
index e5d58ee..9a0854c8 100644
--- a/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/object_prefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect
@@ -44,14 +44,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: false)
+                      parseObjectPatternRest(>, PatternContext.declaration)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(async, ., Future)
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withTypeArgs_insideDeclaration.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withTypeArgs_insideDeclaration.dart.intertwined.expect
index 430f2d7..8e56a96 100644
--- a/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withTypeArgs_insideDeclaration.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withTypeArgs_insideDeclaration.dart.intertwined.expect
@@ -44,14 +44,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: false)
+                      parseObjectPatternRest(>, PatternContext.declaration)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(_, null, null)
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect
index 8380688..5be4c38 100644
--- a/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/object_unprefixedNamedUnderscore_withoutTypeArgs_insideDeclaration.dart.intertwined.expect
@@ -44,10 +44,10 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(_, isRefutableContext: false)
+                      parseObjectPatternRest(_, PatternContext.declaration)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(_, null, null)
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/object_unprefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/object_unprefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect
index a7b9b5e..505a32f 100644
--- a/pkg/front_end/parser_testcases/patterns/object_unprefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/object_unprefixed_withTypeArgs_insideDeclaration.dart.intertwined.expect
@@ -79,14 +79,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: false)
+                      parseObjectPatternRest(>, PatternContext.declaration)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(C, null, null)
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.expect
index 99e8f880..e65a41e 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.expect
@@ -18,7 +18,7 @@
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, true)
         handleParenthesizedPattern(()
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.intertwined.expect
index ab37f5d..ecba959 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_insideAssignment.dart.intertwined.expect
@@ -47,14 +47,14 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
-                            parseParenthesizedPatternOrRecordPattern({, isRefutableContext: false)
-                              parsePattern((, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern((, isRefutableContext: false)
-                                  parseVariablePattern((, typeInfo: Instance of 'NoType')
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
+                            parseParenthesizedPatternOrRecordPattern({, PatternContext.assignment)
+                              parsePattern((, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern((, PatternContext.assignment)
+                                  parseVariablePattern((, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(()
-                                    listener: handleVariablePattern(null, a)
+                                    listener: handleVariablePattern(null, a, true)
                               ensureCloseParen(a, ()
                               listener: handleParenthesizedPattern(()
                         parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_insideCase.dart.intertwined.expect
index 6bd438b..8797a44 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_insideCase.dart.intertwined.expect
@@ -67,11 +67,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.expect
index 9433514..ddbadb4 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.expect
@@ -20,7 +20,7 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleParenthesizedPattern(()
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.intertwined.expect
index 005421f..a95645f 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_insideDeclaration.dart.intertwined.expect
@@ -44,14 +44,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
-                      parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                        parsePattern((, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern((, isRefutableContext: false)
-                            parseVariablePattern((, typeInfo: Instance of 'NoType')
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(()
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         ensureCloseParen(a, ()
                         listener: handleParenthesizedPattern(()
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_cast.dart.intertwined.expect
index cffc2cf..129eacb 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_cast.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_assert.dart.intertwined.expect
index 4b3656f..52cbc7f 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_assert.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_check.dart.intertwined.expect
index 5af2d83..ad2f816 100644
--- a/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/parenthesized_pattern_inside_null_check.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.expect
index 68e1e4d..e60b59e 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.expect
@@ -22,7 +22,7 @@
         handleNoTypeArguments(()
         handleIdentifier(f, namedArgumentReference)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(:)
         handleObjectPatternFields(1, (, ))
         handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.intertwined.expect
index 9fbb680..f73b7b0 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_final_extractor.dart.intertwined.expect
@@ -45,17 +45,17 @@
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(final, {, final)
-                  parsePattern(final, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(final, isRefutableContext: false)
+                  parsePattern(final, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(final, PatternContext.declaration)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: false)
+                      parseObjectPatternRest(C, PatternContext.declaration)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(:, isRefutableContext: false)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(:)
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handlePatternField(:)
                         listener: handleObjectPatternFields(1, (, ))
                       listener: handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.expect
index f1cb460..d760397 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.expect
@@ -22,7 +22,7 @@
         handleNoTypeArguments(()
         handleIdentifier(f, namedArgumentReference)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(:)
         handleObjectPatternFields(1, (, ))
         handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.intertwined.expect
index 343b018..aadc9546 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_extractor.dart.intertwined.expect
@@ -45,17 +45,17 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: false)
+                      parseObjectPatternRest(C, PatternContext.declaration)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(:, isRefutableContext: false)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(:)
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handlePatternField(:)
                         listener: handleObjectPatternFields(1, (, ))
                       listener: handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.expect
index 0e70c97..5dfe376 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.expect
@@ -21,7 +21,7 @@
         endMetadataStar(0)
         handleNoTypeArguments([)
         handleNoType([)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleListPattern(1, [, ])
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.intertwined.expect
index 935ec12..b11d0be 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_list.dart.intertwined.expect
@@ -44,15 +44,15 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(var, isRefutableContext: false)
-                        parsePattern([, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern([, isRefutableContext: false)
-                            parseVariablePattern([, typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(var, PatternContext.declaration)
+                        parsePattern([, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.declaration)
+                            parseVariablePattern([, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType([)
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handleListPattern(1, [, ])
                   parseExpression(=)
                     looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.expect
index 46117ad..b1d68da 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.expect
@@ -23,7 +23,7 @@
         beginLiteralString('a')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleMapPatternEntry(:, })
         handleMapPattern(1, {, })
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.intertwined.expect
index efbc9f3..584da9d 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_map.dart.intertwined.expect
@@ -44,10 +44,10 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(var, isRefutableContext: false)
+                      parseMapPatternSuffix(var, PatternContext.declaration)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -58,11 +58,11 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(:, isRefutableContext: false)
-                            parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                        parsePattern(:, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.declaration)
+                            parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(:)
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handleMapPatternEntry(:, })
                         listener: handleMapPattern(1, {, })
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.expect
index 9433514..ddbadb4 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.expect
@@ -20,7 +20,7 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleParenthesizedPattern(()
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.intertwined.expect
index 005421f..a95645f 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_parenthesized.dart.intertwined.expect
@@ -44,14 +44,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
-                      parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                        parsePattern((, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern((, isRefutableContext: false)
-                            parseVariablePattern((, typeInfo: Instance of 'NoType')
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(()
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         ensureCloseParen(a, ()
                         listener: handleParenthesizedPattern(()
                   parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.expect
index 1a8c47a..73a7d53 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.expect
@@ -20,7 +20,7 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleRecordPattern((, 1)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.intertwined.expect
index e79dabe..5bf0080 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_noMetadata_var_record.dart.intertwined.expect
@@ -44,14 +44,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
-                      parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                        parsePattern((, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern((, isRefutableContext: false)
-                            parseVariablePattern((, typeInfo: Instance of 'NoType')
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(()
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handlePatternField(null)
                         ensureCloseParen(,, ()
                         listener: handleRecordPattern((, 1)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.expect
index fa819b7..5c3a57c 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.expect
@@ -27,7 +27,7 @@
         handleNoTypeArguments(()
         handleIdentifier(f, namedArgumentReference)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(:)
         handleObjectPatternFields(1, (, ))
         handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.intertwined.expect
index 38c8c17..c2f1ffa 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_extractor.dart.intertwined.expect
@@ -56,17 +56,17 @@
                   skipOuterPattern(final)
                     skipObjectPatternRest(C)
                   parsePatternVariableDeclarationStatement(final, {, final)
-                    parsePattern(final, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(final, isRefutableContext: false)
+                    parsePattern(final, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(final, PatternContext.declaration)
                         listener: handleNoTypeArguments(()
-                        parseObjectPatternRest(C, isRefutableContext: false)
+                        parseObjectPatternRest(C, PatternContext.declaration)
                           ensureIdentifier((, namedArgumentReference)
                             listener: handleIdentifier(f, namedArgumentReference)
-                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern(:, isRefutableContext: false)
-                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                          parsePattern(:, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern(:, PatternContext.declaration)
+                              parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(:)
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handlePatternField(:)
                           listener: handleObjectPatternFields(1, (, ))
                         listener: handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.expect
index c223f8a..3a515f4 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.expect
@@ -26,7 +26,7 @@
         endMetadataStar(1)
         handleNoTypeArguments([)
         handleNoType([)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleListPattern(1, [, ])
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.intertwined.expect
index bdf621f..4a45050 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_list.dart.intertwined.expect
@@ -55,15 +55,15 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
                   skipOuterPattern(final)
                   parsePatternVariableDeclarationStatement(final, {, final)
-                    parsePattern(final, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(final, isRefutableContext: false)
+                    parsePattern(final, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(final, PatternContext.declaration)
                         listener: handleNoTypeArguments([)
-                        parseListPatternSuffix(final, isRefutableContext: false)
-                          parsePattern([, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern([, isRefutableContext: false)
-                              parseVariablePattern([, typeInfo: Instance of 'NoType')
+                        parseListPatternSuffix(final, PatternContext.declaration)
+                          parsePattern([, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern([, PatternContext.declaration)
+                              parseVariablePattern([, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType([)
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handleListPattern(1, [, ])
                     parseExpression(=)
                       looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.expect
index e2a2e95..0eb9ae9 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.expect
@@ -28,7 +28,7 @@
         beginLiteralString('a')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleMapPatternEntry(:, })
         handleMapPattern(1, {, })
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.intertwined.expect
index abc339e..63dea9f 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_map.dart.intertwined.expect
@@ -55,10 +55,10 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
                   skipOuterPattern(final)
                   parsePatternVariableDeclarationStatement(final, {, final)
-                    parsePattern(final, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(final, isRefutableContext: false)
+                    parsePattern(final, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(final, PatternContext.declaration)
                         listener: handleNoTypeArguments({)
-                        parseMapPatternSuffix(final, isRefutableContext: false)
+                        parseMapPatternSuffix(final, PatternContext.declaration)
                           parseExpression({)
                             looksLikeOuterPatternEquals({)
                               skipOuterPattern({)
@@ -69,11 +69,11 @@
                                     parseSingleLiteralString({)
                                       listener: beginLiteralString('a')
                                       listener: endLiteralString(0, :)
-                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern(:, isRefutableContext: false)
-                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                          parsePattern(:, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern(:, PatternContext.declaration)
+                              parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(:)
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handleMapPatternEntry(:, })
                           listener: handleMapPattern(1, {, })
                     parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.expect
index 289c8d2..51c7417 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.expect
@@ -25,7 +25,7 @@
           endMetadata(@, null, final)
         endMetadataStar(1)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleParenthesizedPattern(()
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.intertwined.expect
index e8de68b..b31dea6 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_parenthesized.dart.intertwined.expect
@@ -55,14 +55,14 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
                   skipOuterPattern(final)
                   parsePatternVariableDeclarationStatement(final, {, final)
-                    parsePattern(final, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(final, isRefutableContext: false)
-                        parseParenthesizedPatternOrRecordPattern(final, isRefutableContext: false)
-                          parsePattern((, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern((, isRefutableContext: false)
-                              parseVariablePattern((, typeInfo: Instance of 'NoType')
+                    parsePattern(final, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(final, PatternContext.declaration)
+                        parseParenthesizedPatternOrRecordPattern(final, PatternContext.declaration)
+                          parsePattern((, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern((, PatternContext.declaration)
+                              parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(()
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           ensureCloseParen(a, ()
                           listener: handleParenthesizedPattern(()
                     parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.expect
index beab512..0b64c13 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.expect
@@ -25,7 +25,7 @@
           endMetadata(@, null, final)
         endMetadataStar(1)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleRecordPattern((, 1)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.intertwined.expect
index b3db92d..f0d647b 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_final_record.dart.intertwined.expect
@@ -55,14 +55,14 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
                   skipOuterPattern(final)
                   parsePatternVariableDeclarationStatement(final, {, final)
-                    parsePattern(final, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(final, isRefutableContext: false)
-                        parseParenthesizedPatternOrRecordPattern(final, isRefutableContext: false)
-                          parsePattern((, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern((, isRefutableContext: false)
-                              parseVariablePattern((, typeInfo: Instance of 'NoType')
+                    parsePattern(final, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(final, PatternContext.declaration)
+                        parseParenthesizedPatternOrRecordPattern(final, PatternContext.declaration)
+                          parsePattern((, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern((, PatternContext.declaration)
+                              parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(()
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handlePatternField(null)
                           ensureCloseParen(,, ()
                           listener: handleRecordPattern((, 1)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.expect
index eb25e24..63859cf 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.expect
@@ -27,7 +27,7 @@
         handleNoTypeArguments(()
         handleIdentifier(f, namedArgumentReference)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(:)
         handleObjectPatternFields(1, (, ))
         handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.intertwined.expect
index b425558..537eefc 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_extractor.dart.intertwined.expect
@@ -56,17 +56,17 @@
                   skipOuterPattern(var)
                     skipObjectPatternRest(C)
                   parsePatternVariableDeclarationStatement(var, {, var)
-                    parsePattern(var, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(var, isRefutableContext: false)
+                    parsePattern(var, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(var, PatternContext.declaration)
                         listener: handleNoTypeArguments(()
-                        parseObjectPatternRest(C, isRefutableContext: false)
+                        parseObjectPatternRest(C, PatternContext.declaration)
                           ensureIdentifier((, namedArgumentReference)
                             listener: handleIdentifier(f, namedArgumentReference)
-                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern(:, isRefutableContext: false)
-                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                          parsePattern(:, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern(:, PatternContext.declaration)
+                              parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(:)
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handlePatternField(:)
                           listener: handleObjectPatternFields(1, (, ))
                         listener: handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.expect
index 9863e06..89abea1 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.expect
@@ -26,7 +26,7 @@
         endMetadataStar(1)
         handleNoTypeArguments([)
         handleNoType([)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleListPattern(1, [, ])
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.intertwined.expect
index 6884531..b3babc6 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_list.dart.intertwined.expect
@@ -55,15 +55,15 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
                   skipOuterPattern(var)
                   parsePatternVariableDeclarationStatement(var, {, var)
-                    parsePattern(var, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(var, isRefutableContext: false)
+                    parsePattern(var, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(var, PatternContext.declaration)
                         listener: handleNoTypeArguments([)
-                        parseListPatternSuffix(var, isRefutableContext: false)
-                          parsePattern([, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern([, isRefutableContext: false)
-                              parseVariablePattern([, typeInfo: Instance of 'NoType')
+                        parseListPatternSuffix(var, PatternContext.declaration)
+                          parsePattern([, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern([, PatternContext.declaration)
+                              parseVariablePattern([, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType([)
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handleListPattern(1, [, ])
                     parseExpression(=)
                       looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.expect
index a5e4077..5698def 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.expect
@@ -28,7 +28,7 @@
         beginLiteralString('a')
         endLiteralString(0, :)
         handleNoType(:)
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleMapPatternEntry(:, })
         handleMapPattern(1, {, })
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.intertwined.expect
index aa22f12..4f9dbfa 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_map.dart.intertwined.expect
@@ -55,10 +55,10 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
                   skipOuterPattern(var)
                   parsePatternVariableDeclarationStatement(var, {, var)
-                    parsePattern(var, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(var, isRefutableContext: false)
+                    parsePattern(var, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(var, PatternContext.declaration)
                         listener: handleNoTypeArguments({)
-                        parseMapPatternSuffix(var, isRefutableContext: false)
+                        parseMapPatternSuffix(var, PatternContext.declaration)
                           parseExpression({)
                             looksLikeOuterPatternEquals({)
                               skipOuterPattern({)
@@ -69,11 +69,11 @@
                                     parseSingleLiteralString({)
                                       listener: beginLiteralString('a')
                                       listener: endLiteralString(0, :)
-                          parsePattern(:, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern(:, isRefutableContext: false)
-                              parseVariablePattern(:, typeInfo: Instance of 'NoType')
+                          parsePattern(:, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern(:, PatternContext.declaration)
+                              parseVariablePattern(:, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(:)
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handleMapPatternEntry(:, })
                           listener: handleMapPattern(1, {, })
                     parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.expect
index 3f694a5..f2ab180 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.expect
@@ -25,7 +25,7 @@
           endMetadata(@, null, var)
         endMetadataStar(1)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handleParenthesizedPattern(()
         handleIdentifier(x, expression)
         handleNoTypeArguments(;)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.intertwined.expect
index 5a2aa1c..3e51e33 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_parenthesized.dart.intertwined.expect
@@ -55,14 +55,14 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
                   skipOuterPattern(var)
                   parsePatternVariableDeclarationStatement(var, {, var)
-                    parsePattern(var, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(var, isRefutableContext: false)
-                        parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                          parsePattern((, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern((, isRefutableContext: false)
-                              parseVariablePattern((, typeInfo: Instance of 'NoType')
+                    parsePattern(var, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(var, PatternContext.declaration)
+                        parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                          parsePattern((, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern((, PatternContext.declaration)
+                              parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(()
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           ensureCloseParen(a, ()
                           listener: handleParenthesizedPattern(()
                     parseExpression(=)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.expect
index 58b0912..bf48b06 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.expect
@@ -25,7 +25,7 @@
           endMetadata(@, null, var)
         endMetadataStar(1)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleRecordPattern((, 1)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.intertwined.expect
index 64161f0..34152dc 100644
--- a/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/patternVariableDeclarationStatement_withMetadata_var_record.dart.intertwined.expect
@@ -55,14 +55,14 @@
                 parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
                   skipOuterPattern(var)
                   parsePatternVariableDeclarationStatement(var, {, var)
-                    parsePattern(var, precedence: 1, isRefutableContext: false)
-                      parsePrimaryPattern(var, isRefutableContext: false)
-                        parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                          parsePattern((, precedence: 1, isRefutableContext: false)
-                            parsePrimaryPattern((, isRefutableContext: false)
-                              parseVariablePattern((, typeInfo: Instance of 'NoType')
+                    parsePattern(var, PatternContext.declaration, precedence: 1)
+                      parsePrimaryPattern(var, PatternContext.declaration)
+                        parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                          parsePattern((, PatternContext.declaration, precedence: 1)
+                            parsePrimaryPattern((, PatternContext.declaration)
+                              parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                 listener: handleNoType(()
-                                listener: handleVariablePattern(null, a)
+                                listener: handleVariablePattern(null, a, false)
                           listener: handlePatternField(null)
                           ensureCloseParen(,, ()
                           listener: handleRecordPattern((, 1)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.expect
index cf7b5c5..dce7a8f 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.expect
@@ -21,10 +21,10 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handlePatternField(null)
         handleRecordPattern((, 2)
         beginForInExpression(x)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.intertwined.expect
index 50e3bc5..e469acf 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element.dart.intertwined.expect
@@ -50,20 +50,20 @@
                             skipOuterPattern(var)
                             listener: beginMetadataStar(var)
                             listener: endMetadataStar(0)
-                            parsePattern(var, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern(var, isRefutableContext: false)
-                                parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                                  parsePattern((, precedence: 1, isRefutableContext: false)
-                                    parsePrimaryPattern((, isRefutableContext: false)
-                                      parseVariablePattern((, typeInfo: Instance of 'NoType')
+                            parsePattern(var, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern(var, PatternContext.declaration)
+                                parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                                  parsePattern((, PatternContext.declaration, precedence: 1)
+                                    parsePrimaryPattern((, PatternContext.declaration)
+                                      parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                         listener: handleNoType(()
-                                        listener: handleVariablePattern(null, a)
+                                        listener: handleVariablePattern(null, a, false)
                                   listener: handlePatternField(null)
-                                  parsePattern(,, precedence: 1, isRefutableContext: false)
-                                    parsePrimaryPattern(,, isRefutableContext: false)
-                                      parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                                  parsePattern(,, PatternContext.declaration, precedence: 1)
+                                    parsePrimaryPattern(,, PatternContext.declaration)
+                                      parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                         listener: handleNoType(,)
-                                        listener: handleVariablePattern(null, b)
+                                        listener: handleVariablePattern(null, b, false)
                                   listener: handlePatternField(null)
                                   ensureCloseParen(b, ()
                                   listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.expect
index d24ff18..b16e31c 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.expect
@@ -26,10 +26,10 @@
           endMetadata(@, null, var)
         endMetadataStar(1)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handlePatternField(null)
         handleRecordPattern((, 2)
         beginForInExpression(x)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.intertwined.expect
index 1193376..96d9a60 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.intertwined.expect
@@ -60,20 +60,20 @@
                             listener: endMetadataStar(1)
                           parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
                             skipOuterPattern(var)
-                            parsePattern(var, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern(var, isRefutableContext: false)
-                                parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                                  parsePattern((, precedence: 1, isRefutableContext: false)
-                                    parsePrimaryPattern((, isRefutableContext: false)
-                                      parseVariablePattern((, typeInfo: Instance of 'NoType')
+                            parsePattern(var, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern(var, PatternContext.declaration)
+                                parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                                  parsePattern((, PatternContext.declaration, precedence: 1)
+                                    parsePrimaryPattern((, PatternContext.declaration)
+                                      parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                         listener: handleNoType(()
-                                        listener: handleVariablePattern(null, a)
+                                        listener: handleVariablePattern(null, a, false)
                                   listener: handlePatternField(null)
-                                  parsePattern(,, precedence: 1, isRefutableContext: false)
-                                    parsePrimaryPattern(,, isRefutableContext: false)
-                                      parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                                  parsePattern(,, PatternContext.declaration, precedence: 1)
+                                    parsePrimaryPattern(,, PatternContext.declaration)
+                                      parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                         listener: handleNoType(,)
-                                        listener: handleVariablePattern(null, b)
+                                        listener: handleVariablePattern(null, b, false)
                                   listener: handlePatternField(null)
                                   ensureCloseParen(b, ()
                                   listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.expect
index 9d6ceb6..988d2c3 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.expect
@@ -21,10 +21,10 @@
           beginMetadataStar(var)
           endMetadataStar(0)
           handleNoType(()
-          handleVariablePattern(null, a)
+          handleVariablePattern(null, a, false)
           handlePatternField(null)
           handleNoType(,)
-          handleVariablePattern(null, b)
+          handleVariablePattern(null, b, false)
           handlePatternField(null)
           handleRecordPattern((, 2)
           beginForInExpression(x)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.intertwined.expect
index d183f13..120e29a 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement.dart.intertwined.expect
@@ -46,20 +46,20 @@
                       skipOuterPattern(var)
                       listener: beginMetadataStar(var)
                       listener: endMetadataStar(0)
-                      parsePattern(var, precedence: 1, isRefutableContext: false)
-                        parsePrimaryPattern(var, isRefutableContext: false)
-                          parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                            parsePattern((, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern((, isRefutableContext: false)
-                                parseVariablePattern((, typeInfo: Instance of 'NoType')
+                      parsePattern(var, PatternContext.declaration, precedence: 1)
+                        parsePrimaryPattern(var, PatternContext.declaration)
+                          parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                            parsePattern((, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern((, PatternContext.declaration)
+                                parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(()
-                                  listener: handleVariablePattern(null, a)
+                                  listener: handleVariablePattern(null, a, false)
                             listener: handlePatternField(null)
-                            parsePattern(,, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern(,, isRefutableContext: false)
-                                parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                            parsePattern(,, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern(,, PatternContext.declaration)
+                                parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(,)
-                                  listener: handleVariablePattern(null, b)
+                                  listener: handleVariablePattern(null, b, false)
                             listener: handlePatternField(null)
                             ensureCloseParen(b, ()
                             listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.expect
index d5e68a3..e89cc63 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.expect
@@ -26,10 +26,10 @@
             endMetadata(@, null, var)
           endMetadataStar(1)
           handleNoType(()
-          handleVariablePattern(null, a)
+          handleVariablePattern(null, a, false)
           handlePatternField(null)
           handleNoType(,)
-          handleVariablePattern(null, b)
+          handleVariablePattern(null, b, false)
           handlePatternField(null)
           handleRecordPattern((, 2)
           beginForInExpression(x)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.intertwined.expect
index 8a4314b..d715215 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.intertwined.expect
@@ -56,20 +56,20 @@
                       listener: endMetadataStar(1)
                     parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
                       skipOuterPattern(var)
-                      parsePattern(var, precedence: 1, isRefutableContext: false)
-                        parsePrimaryPattern(var, isRefutableContext: false)
-                          parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                            parsePattern((, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern((, isRefutableContext: false)
-                                parseVariablePattern((, typeInfo: Instance of 'NoType')
+                      parsePattern(var, PatternContext.declaration, precedence: 1)
+                        parsePrimaryPattern(var, PatternContext.declaration)
+                          parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                            parsePattern((, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern((, PatternContext.declaration)
+                                parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(()
-                                  listener: handleVariablePattern(null, a)
+                                  listener: handleVariablePattern(null, a, false)
                             listener: handlePatternField(null)
-                            parsePattern(,, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern(,, isRefutableContext: false)
-                                parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                            parsePattern(,, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern(,, PatternContext.declaration)
+                                parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(,)
-                                  listener: handleVariablePattern(null, b)
+                                  listener: handleVariablePattern(null, b, false)
                             listener: handlePatternField(null)
                             ensureCloseParen(b, ()
                             listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.expect
index 0617d4a..bf4dbda 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.expect
@@ -21,10 +21,10 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handlePatternField(null)
         handleRecordPattern((, 2)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.intertwined.expect
index bc80dba..d4b0d3a 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_element.dart.intertwined.expect
@@ -50,20 +50,20 @@
                             skipOuterPattern(var)
                             listener: beginMetadataStar(var)
                             listener: endMetadataStar(0)
-                            parsePattern(var, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern(var, isRefutableContext: false)
-                                parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                                  parsePattern((, precedence: 1, isRefutableContext: false)
-                                    parsePrimaryPattern((, isRefutableContext: false)
-                                      parseVariablePattern((, typeInfo: Instance of 'NoType')
+                            parsePattern(var, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern(var, PatternContext.declaration)
+                                parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                                  parsePattern((, PatternContext.declaration, precedence: 1)
+                                    parsePrimaryPattern((, PatternContext.declaration)
+                                      parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                         listener: handleNoType(()
-                                        listener: handleVariablePattern(null, a)
+                                        listener: handleVariablePattern(null, a, false)
                                   listener: handlePatternField(null)
-                                  parsePattern(,, precedence: 1, isRefutableContext: false)
-                                    parsePrimaryPattern(,, isRefutableContext: false)
-                                      parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                                  parsePattern(,, PatternContext.declaration, precedence: 1)
+                                    parsePrimaryPattern(,, PatternContext.declaration)
+                                      parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                         listener: handleNoType(,)
-                                        listener: handleVariablePattern(null, b)
+                                        listener: handleVariablePattern(null, b, false)
                                   listener: handlePatternField(null)
                                   ensureCloseParen(b, ()
                                   listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.expect
index 1ec7d1d..026d103 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.expect
@@ -21,10 +21,10 @@
           beginMetadataStar(var)
           endMetadataStar(0)
           handleNoType(()
-          handleVariablePattern(null, a)
+          handleVariablePattern(null, a, false)
           handlePatternField(null)
           handleNoType(,)
-          handleVariablePattern(null, b)
+          handleVariablePattern(null, b, false)
           handlePatternField(null)
           handleRecordPattern((, 2)
           handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.intertwined.expect
index c6de210..8d6ad05 100644
--- a/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForInitializer_statement.dart.intertwined.expect
@@ -46,20 +46,20 @@
                       skipOuterPattern(var)
                       listener: beginMetadataStar(var)
                       listener: endMetadataStar(0)
-                      parsePattern(var, precedence: 1, isRefutableContext: false)
-                        parsePrimaryPattern(var, isRefutableContext: false)
-                          parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                            parsePattern((, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern((, isRefutableContext: false)
-                                parseVariablePattern((, typeInfo: Instance of 'NoType')
+                      parsePattern(var, PatternContext.declaration, precedence: 1)
+                        parsePrimaryPattern(var, PatternContext.declaration)
+                          parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                            parsePattern((, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern((, PatternContext.declaration)
+                                parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(()
-                                  listener: handleVariablePattern(null, a)
+                                  listener: handleVariablePattern(null, a, false)
                             listener: handlePatternField(null)
-                            parsePattern(,, precedence: 1, isRefutableContext: false)
-                              parsePrimaryPattern(,, isRefutableContext: false)
-                                parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                            parsePattern(,, PatternContext.declaration, precedence: 1)
+                              parsePrimaryPattern(,, PatternContext.declaration)
+                                parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                   listener: handleNoType(,)
-                                  listener: handleVariablePattern(null, b)
+                                  listener: handleVariablePattern(null, b, false)
                             listener: handlePatternField(null)
                             ensureCloseParen(b, ()
                             listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args.dart.intertwined.expect
index 551f0e3..89925ef 100644
--- a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args.dart.intertwined.expect
@@ -94,14 +94,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(async, ., Future)
                   ensureColon())
diff --git a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_cast.dart.intertwined.expect
index 3dbbf7a..f51f6de 100644
--- a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_cast.dart.intertwined.expect
@@ -94,14 +94,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(async, ., Future)
                     listener: beginAsOperatorType(as)
diff --git a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect
index f6e5089..14a3d60 100644
--- a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_assert.dart.intertwined.expect
@@ -94,14 +94,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(async, ., Future)
                     listener: handleNullAssertPattern(!)
diff --git a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_check.dart.intertwined.expect
index e8cddcc..38506f8 100644
--- a/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/prefixed_extractor_pattern_with_type_args_inside_null_check.dart.intertwined.expect
@@ -94,14 +94,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: beginTypeArguments(<)
                       listener: handleIdentifier(int, typeReference)
                       listener: handleNoTypeArguments(>)
                       listener: handleType(int, null)
                       listener: endTypeArguments(1, <, >)
-                      parseObjectPatternRest(>, isRefutableContext: true)
+                      parseObjectPatternRest(>, PatternContext.matching)
                         listener: handleObjectPatternFields(0, (, ))
                       listener: handleObjectPattern(async, ., Future)
                     listener: handleNullCheckPattern(?)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_empty.dart.intertwined.expect
index 48b0010..7d5d679 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_empty.dart.intertwined.expect
@@ -46,8 +46,8 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
                             listener: handleRecordPattern((, 0)
                         parseExpression(=)
                           looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.expect b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.expect
index be279f6..bb4b783 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.expect
@@ -18,7 +18,7 @@
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, true)
         handlePatternField(null)
         handleRecordPattern((, 1)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.intertwined.expect
index e81e57a..203d542 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_oneField.dart.intertwined.expect
@@ -46,14 +46,14 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
-                            parseParenthesizedPatternOrRecordPattern({, isRefutableContext: false)
-                              parsePattern((, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern((, isRefutableContext: false)
-                                  parseVariablePattern((, typeInfo: Instance of 'NoType')
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
+                            parseParenthesizedPatternOrRecordPattern({, PatternContext.assignment)
+                              parsePattern((, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern((, PatternContext.assignment)
+                                  parseVariablePattern((, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(()
-                                    listener: handleVariablePattern(null, a)
+                                    listener: handleVariablePattern(null, a, true)
                               listener: handlePatternField(null)
                               ensureCloseParen(,, ()
                               listener: handleRecordPattern((, 1)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.expect b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.expect
index b095b19..f2d965d 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.expect
@@ -18,10 +18,10 @@
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, true)
         handlePatternField(null)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, true)
         handlePatternField(null)
         handleRecordPattern((, 2)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.intertwined.expect
index f47a51b..2a87ab4 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideAssignment_twoFields.dart.intertwined.expect
@@ -46,20 +46,20 @@
                       looksLikeOuterPatternEquals({)
                         skipOuterPattern({)
                       parsePatternAssignment({)
-                        parsePattern({, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern({, isRefutableContext: false)
-                            parseParenthesizedPatternOrRecordPattern({, isRefutableContext: false)
-                              parsePattern((, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern((, isRefutableContext: false)
-                                  parseVariablePattern((, typeInfo: Instance of 'NoType')
+                        parsePattern({, PatternContext.assignment, precedence: 1)
+                          parsePrimaryPattern({, PatternContext.assignment)
+                            parseParenthesizedPatternOrRecordPattern({, PatternContext.assignment)
+                              parsePattern((, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern((, PatternContext.assignment)
+                                  parseVariablePattern((, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(()
-                                    listener: handleVariablePattern(null, a)
+                                    listener: handleVariablePattern(null, a, true)
                               listener: handlePatternField(null)
-                              parsePattern(,, precedence: 1, isRefutableContext: false)
-                                parsePrimaryPattern(,, isRefutableContext: false)
-                                  parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                              parsePattern(,, PatternContext.assignment, precedence: 1)
+                                parsePrimaryPattern(,, PatternContext.assignment)
+                                  parseVariablePattern(,, PatternContext.assignment, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(,)
-                                    listener: handleVariablePattern(null, b)
+                                    listener: handleVariablePattern(null, b, true)
                               listener: handlePatternField(null)
                               ensureCloseParen(b, ()
                               listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_empty.dart.intertwined.expect
index 8dbab78..a3ce115 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_empty.dart.intertwined.expect
@@ -43,8 +43,8 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
                       listener: handleRecordPattern((, 0)
                   parseExpression(=)
                     looksLikeOuterPatternEquals(=)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.expect b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.expect
index 703a2ce..9abd848 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.expect
@@ -20,7 +20,7 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleRecordPattern((, 1)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.intertwined.expect
index d819fd5..e92604b 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_oneField.dart.intertwined.expect
@@ -43,14 +43,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
-                      parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                        parsePattern((, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern((, isRefutableContext: false)
-                            parseVariablePattern((, typeInfo: Instance of 'NoType')
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(()
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handlePatternField(null)
                         ensureCloseParen(,, ()
                         listener: handleRecordPattern((, 1)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.expect b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.expect
index 3a8bcc8..979dacc 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.expect
@@ -20,10 +20,10 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, a)
+        handleVariablePattern(null, a, false)
         handlePatternField(null)
         handleNoType(,)
-        handleVariablePattern(null, b)
+        handleVariablePattern(null, b, false)
         handlePatternField(null)
         handleRecordPattern((, 2)
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.intertwined.expect
index 05ff7af..0e8675c 100644
--- a/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_insideDeclaration_twoFields.dart.intertwined.expect
@@ -43,20 +43,20 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
-                      parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                        parsePattern((, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern((, isRefutableContext: false)
-                            parseVariablePattern((, typeInfo: Instance of 'NoType')
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(()
-                              listener: handleVariablePattern(null, a)
+                              listener: handleVariablePattern(null, a, false)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern(,, isRefutableContext: false)
-                            parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                        parsePattern(,, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.declaration)
+                            parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(,)
-                              listener: handleVariablePattern(null, b)
+                              listener: handleVariablePattern(null, b, false)
                         listener: handlePatternField(null)
                         ensureCloseParen(b, ()
                         listener: handleRecordPattern((, 2)
diff --git a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case.dart.intertwined.expect
index de50760..c6c3abf 100644
--- a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
@@ -81,8 +81,8 @@
                                     listener: handleLiteralInt(1)
                             listener: handleConstantPattern(null)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_empty.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_empty.dart.intertwined.expect
index cdcb8ff..3bfec97 100644
--- a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_empty.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_empty.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleRecordPattern((, 0)
                   ensureColon())
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_singleton.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_singleton.dart.intertwined.expect
index b0f156f..8cdd2f8 100644
--- a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_singleton.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_case_singleton.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_cast.dart.intertwined.expect
index a4805ec3d..690bdef 100644
--- a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_cast.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
@@ -81,8 +81,8 @@
                                     listener: handleLiteralInt(1)
                             listener: handleConstantPattern(null)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_assert.dart.intertwined.expect
index 829ec4a..d1221f2 100644
--- a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_assert.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
@@ -81,8 +81,8 @@
                                     listener: handleLiteralInt(1)
                             listener: handleConstantPattern(null)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_check.dart.intertwined.expect
index 7f54fad..2b5e21c 100644
--- a/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/record_pattern_inside_null_check.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression((, 17, false)
                               parseUnaryExpression((, false)
                                 parsePrimary((, expression)
@@ -81,8 +81,8 @@
                                     listener: handleLiteralInt(1)
                             listener: handleConstantPattern(null)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_case_equal.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_case_equal.dart.intertwined.expect
index cb84638..3002c02 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_case_equal.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_case_equal.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(==, 12, false)
                         parseUnaryExpression(==, false)
                           parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than.dart.intertwined.expect
index 7cf536a..8f4d7bf 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(>, 12, false)
                         parseUnaryExpression(>, false)
                           parsePrimary(>, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than_or_equal.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than_or_equal.dart.intertwined.expect
index cbbc975..68631b0 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than_or_equal.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_case_greater_than_or_equal.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(>=, 12, false)
                         parseUnaryExpression(>=, false)
                           parsePrimary(>=, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than.dart.intertwined.expect
index 1628e75..83a89f5 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(<, 12, false)
                         parseUnaryExpression(<, false)
                           parsePrimary(<, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than_or_equal.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than_or_equal.dart.intertwined.expect
index 8d31a4d..e3da00c 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than_or_equal.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_case_less_than_or_equal.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(<=, 12, false)
                         parseUnaryExpression(<=, false)
                           parsePrimary(<=, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_case_not_equal.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_case_not_equal.dart.intertwined.expect
index 735f72b..0a45d3b 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_case_not_equal.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_case_not_equal.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(!=, 12, false)
                         parseUnaryExpression(!=, false)
                           parsePrimary(!=, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_extractor_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_extractor_pattern.dart.intertwined.expect
index db803df..381db96 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_extractor_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_extractor_pattern.dart.intertwined.expect
@@ -113,14 +113,14 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(==, 12, false)
                               parseUnaryExpression(==, false)
                                 parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_if_case.dart.intertwined.expect
index d816943..b390bac 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_if_case.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(==, 12, false)
                           parseUnaryExpression(==, false)
                             parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_list_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_list_pattern.dart.intertwined.expect
index 5f599d5..76412b1 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_list_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_list_pattern.dart.intertwined.expect
@@ -69,12 +69,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
                             parsePrecedenceExpression(==, 12, false)
                               parseUnaryExpression(==, false)
                                 parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_lhs.dart.intertwined.expect
index 9dd0282..bfe462b 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_lhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(==, 12, false)
                         parseUnaryExpression(==, false)
                           parsePrimary(==, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleRelationalPattern(==)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
                         parsePrecedenceExpression(&&, 17, false)
                           parseUnaryExpression(&&, false)
                             parsePrimary(&&, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_rhs.dart.intertwined.expect
index 627c28e..9f3bafc 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_and_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
                         parsePrecedenceExpression(==, 12, false)
                           parseUnaryExpression(==, false)
                             parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_lhs.dart.intertwined.expect
index 640530e..32073fb 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_lhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(==, 12, false)
                         parseUnaryExpression(==, false)
                           parsePrimary(==, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleRelationalPattern(==)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
                         parsePrecedenceExpression(||, 17, false)
                           parseUnaryExpression(||, false)
                             parsePrimary(||, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_rhs.dart.intertwined.expect
index 029c43a..3423655 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_logical_or_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,8 +78,8 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
                         parsePrecedenceExpression(==, 12, false)
                           parseUnaryExpression(==, false)
                             parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_map_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_map_pattern.dart.intertwined.expect
index e0f887a..f6b19d4 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_map_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_map_pattern.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,8 +83,8 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(==, 12, false)
                               parseUnaryExpression(==, false)
                                 parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_parenthesized_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_parenthesized_pattern.dart.intertwined.expect
index 9cf1de7..485d5e2 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_parenthesized_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_parenthesized_pattern.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression(==, 12, false)
                               parseUnaryExpression(==, false)
                                 parsePrimary(==, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_named.dart.intertwined.expect
index 0f7f8ab..8e1307a 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_named.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         ensureIdentifier((, namedRecordFieldReference)
                           listener: handleIdentifier(n, namedRecordFieldReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
                             parsePrecedenceExpression(==, 12, false)
                               parseUnaryExpression(==, false)
                                 parsePrimary(==, expression)
@@ -83,8 +83,8 @@
                                     listener: handleLiteralInt(1)
                             listener: handleRelationalPattern(==)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_unnamed.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_unnamed.dart.intertwined.expect
index 4c864e0..2fcd439 100644
--- a/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_unnamed.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/relational_inside_record_pattern_unnamed.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
                             parsePrecedenceExpression(==, 12, false)
                               parseUnaryExpression(==, false)
                                 parsePrimary(==, expression)
@@ -81,8 +81,8 @@
                                     listener: handleLiteralInt(1)
                             listener: handleRelationalPattern(==)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.expect b/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.expect
index defb798..0cfb59d 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.expect
@@ -140,14 +140,14 @@
             beginCaseExpression(case)
               handleNoTypeArguments([)
               handleNoType(var)
-              handleVariablePattern(var, x)
+              handleVariablePattern(var, x, false)
               handleRestPattern(..., true)
               handleListPattern(1, [, ])
             endCaseExpression(case, null, :)
             beginCaseExpression(case)
               handleNoTypeArguments([)
               handleNoType(final)
-              handleVariablePattern(final, x)
+              handleVariablePattern(final, x, false)
               handleRestPattern(..., true)
               handleListPattern(1, [, ])
             endCaseExpression(case, null, :)
@@ -156,21 +156,21 @@
               handleIdentifier(List, typeReference)
               handleNoTypeArguments(x)
               handleType(List, null)
-              handleVariablePattern(null, x)
+              handleVariablePattern(null, x, false)
               handleRestPattern(..., true)
               handleListPattern(1, [, ])
             endCaseExpression(case, null, :)
             beginCaseExpression(case)
               handleNoTypeArguments([)
               handleNoType(...)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleRestPattern(..., true)
               handleListPattern(1, [, ])
             endCaseExpression(case, null, :)
             beginCaseExpression(case)
               handleNoTypeArguments([)
               handleNoType(()
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleParenthesizedPattern(()
               handleRestPattern(..., true)
               handleListPattern(1, [, ])
@@ -179,7 +179,7 @@
               handleNoTypeArguments([)
               handleNoTypeArguments([)
               handleNoType([)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleListPattern(1, [, ])
               handleRestPattern(..., true)
               handleListPattern(1, [, ])
diff --git a/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.intertwined.expect
index fd44329..314939f 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_subpatternStartingTokens.dart.intertwined.expect
@@ -66,12 +66,12 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(==, 12, false)
                               parseUnaryExpression(==, false)
                                 parsePrimary(==, expression)
@@ -84,12 +84,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(!=, 12, false)
                               parseUnaryExpression(!=, false)
                                 parsePrimary(!=, expression)
@@ -102,12 +102,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(<, 12, false)
                               parseUnaryExpression(<, false)
                                 parsePrimary(<, expression)
@@ -120,12 +120,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(>, 12, false)
                               parseUnaryExpression(>, false)
                                 parsePrimary(>, expression)
@@ -138,12 +138,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(<=, 12, false)
                               parseUnaryExpression(<=, false)
                                 parsePrimary(<=, expression)
@@ -156,12 +156,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(>=, 12, false)
                               parseUnaryExpression(>=, false)
                                 parsePrimary(>=, expression)
@@ -174,12 +174,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -192,12 +192,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -210,12 +210,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -228,12 +228,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -246,12 +246,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -264,12 +264,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -282,12 +282,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -302,12 +302,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(..., 17, false)
                               parseUnaryExpression(..., false)
                                 parsePrimary(..., expression)
@@ -327,12 +327,12 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             parsePrecedenceExpression(const, 17, false)
                               parseUnaryExpression(const, false)
                                 parsePrimary(const, expression)
@@ -356,80 +356,80 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
-                            parseVariablePattern(..., typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
+                            parseVariablePattern(..., PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, x)
+                              listener: handleVariablePattern(var, x, false)
                         listener: handleRestPattern(..., true)
                         listener: handleListPattern(1, [, ])
                   ensureColon(])
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
-                            parseVariablePattern(..., typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
+                            parseVariablePattern(..., PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(final)
-                              listener: handleVariablePattern(final, x)
+                              listener: handleVariablePattern(final, x, false)
                         listener: handleRestPattern(..., true)
                         listener: handleListPattern(1, [, ])
                   ensureColon(])
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
-                            parseVariablePattern(..., typeInfo: Instance of 'SimpleType')
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
+                            parseVariablePattern(..., PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(List, typeReference)
                               listener: handleNoTypeArguments(x)
                               listener: handleType(List, null)
-                              listener: handleVariablePattern(null, x)
+                              listener: handleVariablePattern(null, x, false)
                         listener: handleRestPattern(..., true)
                         listener: handleListPattern(1, [, ])
                   ensureColon(])
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
-                            parseVariablePattern(..., typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
+                            parseVariablePattern(..., PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(...)
-                              listener: handleVariablePattern(null, _)
+                              listener: handleVariablePattern(null, _, false)
                         listener: handleRestPattern(..., true)
                         listener: handleListPattern(1, [, ])
                   ensureColon(])
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
-                            parseParenthesizedPatternOrRecordPattern(..., isRefutableContext: true)
-                              parsePattern((, precedence: 1, isRefutableContext: true)
-                                parsePrimaryPattern((, isRefutableContext: true)
-                                  parseVariablePattern((, typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
+                            parseParenthesizedPatternOrRecordPattern(..., PatternContext.matching)
+                              parsePattern((, PatternContext.matching, precedence: 1)
+                                parsePrimaryPattern((, PatternContext.matching)
+                                  parseVariablePattern((, PatternContext.matching, typeInfo: Instance of 'NoType')
                                     listener: handleNoType(()
-                                    listener: handleVariablePattern(null, _)
+                                    listener: handleVariablePattern(null, _, false)
                               ensureCloseParen(_, ()
                               listener: handleParenthesizedPattern(()
                         listener: handleRestPattern(..., true)
@@ -438,19 +438,19 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             listener: handleNoTypeArguments([)
-                            parseListPatternSuffix(..., isRefutableContext: true)
-                              parsePattern([, precedence: 1, isRefutableContext: true)
-                                parsePrimaryPattern([, isRefutableContext: true)
-                                  parseVariablePattern([, typeInfo: Instance of 'NoType')
+                            parseListPatternSuffix(..., PatternContext.matching)
+                              parsePattern([, PatternContext.matching, precedence: 1)
+                                parsePrimaryPattern([, PatternContext.matching)
+                                  parseVariablePattern([, PatternContext.matching, typeInfo: Instance of 'NoType')
                                     listener: handleNoType([)
-                                    listener: handleVariablePattern(null, _)
+                                    listener: handleVariablePattern(null, _, false)
                               listener: handleListPattern(1, [, ])
                         listener: handleRestPattern(..., true)
                         listener: handleListPattern(1, [, ])
@@ -458,14 +458,14 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             listener: handleNoTypeArguments([])
-                            parseListPatternSuffix(..., isRefutableContext: true)
+                            parseListPatternSuffix(..., PatternContext.matching)
                               rewriteSquareBrackets(...)
                                 link([, ])
                                 rewriter()
@@ -476,18 +476,18 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             listener: beginTypeArguments(<)
                             listener: handleIdentifier(int, typeReference)
                             listener: handleNoTypeArguments(>)
                             listener: handleType(int, null)
                             listener: endTypeArguments(1, <, >)
-                            parseListPatternSuffix(>, isRefutableContext: true)
+                            parseListPatternSuffix(>, PatternContext.matching)
                               rewriteSquareBrackets(>)
                                 link([, ])
                                 rewriter()
@@ -498,14 +498,14 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             listener: handleNoTypeArguments({)
-                            parseMapPatternSuffix(..., isRefutableContext: true)
+                            parseMapPatternSuffix(..., PatternContext.matching)
                               listener: handleMapPattern(0, {, })
                         listener: handleRestPattern(..., true)
                         listener: handleListPattern(1, [, ])
@@ -513,14 +513,14 @@
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
                             listener: handleNoTypeArguments(()
-                            parseObjectPatternRest(List, isRefutableContext: true)
+                            parseObjectPatternRest(List, PatternContext.matching)
                               listener: handleObjectPatternFields(0, (, ))
                             listener: handleObjectPattern(List, null, null)
                         listener: handleRestPattern(..., true)
diff --git a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.expect b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.expect
index fcea1c3..2c55dc7 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.expect
@@ -27,7 +27,7 @@
             beginCaseExpression(case)
               handleNoTypeArguments([)
               handleNoType(var)
-              handleVariablePattern(var, y)
+              handleVariablePattern(var, y, false)
               handleRestPattern(..., true)
               handleListPattern(1, [, ])
             endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.intertwined.expect
index 276cfe3..ab2f880 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideList.dart.intertwined.expect
@@ -66,15 +66,15 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
-                            parseVariablePattern(..., typeInfo: Instance of 'NoType')
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
+                            parseVariablePattern(..., PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, y)
+                              listener: handleVariablePattern(var, y, false)
                         listener: handleRestPattern(..., true)
                         listener: handleListPattern(1, [, ])
                   ensureColon(])
diff --git a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.expect b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.expect
index 19fc18b..3acf44c 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.expect
@@ -27,7 +27,7 @@
             beginCaseExpression(case)
               handleNoTypeArguments({)
               handleNoType(var)
-              handleVariablePattern(var, y)
+              handleVariablePattern(var, y, false)
               handleRestPattern(..., true)
               handleMapPattern(1, {, })
             endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.intertwined.expect
index ac15736..069304b 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_withSubpattern_insideMap.dart.intertwined.expect
@@ -66,15 +66,15 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
-                        parsePattern(..., precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(..., isRefutableContext: true)
-                            parseVariablePattern(..., typeInfo: Instance of 'NoType')
+                      parseMapPatternSuffix(case, PatternContext.matching)
+                        parsePattern(..., PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(..., PatternContext.matching)
+                            parseVariablePattern(..., PatternContext.matching, typeInfo: Instance of 'NoType')
                               listener: handleNoType(var)
-                              listener: handleVariablePattern(var, y)
+                              listener: handleVariablePattern(var, y, false)
                         listener: handleRestPattern(..., true)
                         listener: handleMapPattern(1, {, })
                   ensureColon(})
diff --git a/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideList.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideList.dart.intertwined.expect
index ffc1408..1b60eb7 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideList.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideList.dart.intertwined.expect
@@ -66,10 +66,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
+                      parseListPatternSuffix(case, PatternContext.matching)
                         listener: handleRestPattern(..., false)
                         listener: handleListPattern(1, [, ])
                   ensureColon(])
diff --git a/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideMap.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideMap.dart.intertwined.expect
index 66ad0ad..32012e5 100644
--- a/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideMap.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/rest_withoutSubpattern_insideMap.dart.intertwined.expect
@@ -66,10 +66,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         listener: handleRestPattern(..., false)
                         listener: handleMapPattern(1, {, })
                   ensureColon(})
diff --git a/pkg/front_end/parser_testcases/patterns/string_literal_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/string_literal_inside_case.dart.intertwined.expect
index 7faeb94..e30b204 100644
--- a/pkg/front_end/parser_testcases/patterns/string_literal_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/string_literal_inside_case.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/string_literal_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/string_literal_inside_cast.dart.intertwined.expect
index 5099fa2..8bcf0e4 100644
--- a/pkg/front_end/parser_testcases/patterns/string_literal_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/string_literal_inside_cast.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/string_literal_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/string_literal_inside_if_case.dart.intertwined.expect
index 2f58582..7a8c47d 100644
--- a/pkg/front_end/parser_testcases/patterns/string_literal_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/string_literal_inside_if_case.dart.intertwined.expect
@@ -61,8 +61,8 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
                         parsePrecedenceExpression(case, 17, false)
                           parseUnaryExpression(case, false)
                             parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_assert.dart.intertwined.expect
index de1a790..27fd80b 100644
--- a/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_assert.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_check.dart.intertwined.expect
index d37214c..6f95e53 100644
--- a/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/string_literal_inside_null_check.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.expect
index 63a1deb..35746eb 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.expect
@@ -25,7 +25,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleLiteralBool(true)
             handleLiteralInt(0)
           endSwitchExpressionCase(when, =>, 0)
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.intertwined.expect
index 2856e27..35f7578 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_guarded.dart.intertwined.expect
@@ -68,11 +68,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       parseExpression(when)
                         looksLikeOuterPatternEquals(when)
                           skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.expect
index 47a894c..6d77bd1 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.expect
@@ -25,7 +25,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleLiteralInt(0)
           endSwitchExpressionCase(null, =>, 0)
         endSwitchExpressionBlock(1, {, })
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.intertwined.expect
index c49a163..950bdcf 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_noTrailingComma.dart.intertwined.expect
@@ -68,11 +68,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       ensureFunctionArrow(_)
                       parseExpression(=>)
                         looksLikeOuterPatternEquals(=>)
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.expect
index 47a894c..6d77bd1 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.expect
@@ -25,7 +25,7 @@
         beginSwitchExpressionBlock({)
           beginSwitchExpressionCase()
             handleNoType({)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleLiteralInt(0)
           endSwitchExpressionCase(null, =>, 0)
         endSwitchExpressionBlock(1, {, })
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.intertwined.expect
index c49a163..950bdcf 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_onePattern_trailingComma.dart.intertwined.expect
@@ -68,11 +68,11 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'NoType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType({)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       ensureFunctionArrow(_)
                       parseExpression(=>)
                         looksLikeOuterPatternEquals(=>)
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.expect
index cb8b925..af8753f 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.expect
@@ -27,12 +27,12 @@
             handleIdentifier(int, typeReference)
             handleNoTypeArguments(_)
             handleType(int, null)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleLiteralInt(0)
           endSwitchExpressionCase(null, =>, 0)
           beginSwitchExpressionCase()
             handleNoType(,)
-            handleVariablePattern(null, _)
+            handleVariablePattern(null, _, false)
             handleLiteralInt(1)
           endSwitchExpressionCase(null, =>, 1)
         endSwitchExpressionBlock(2, {, })
diff --git a/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.intertwined.expect
index 7eb93b3..b0854f7 100644
--- a/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/switchExpression_twoPatterns.dart.intertwined.expect
@@ -68,13 +68,13 @@
                       ensureBlock(), null, switch expression)
                       listener: beginSwitchExpressionBlock({)
                       listener: beginSwitchExpressionCase()
-                      parsePattern({, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern({, isRefutableContext: true)
-                          parseVariablePattern({, typeInfo: Instance of 'SimpleType')
+                      parsePattern({, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern({, PatternContext.matching)
+                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                             listener: handleIdentifier(int, typeReference)
                             listener: handleNoTypeArguments(_)
                             listener: handleType(int, null)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       ensureFunctionArrow(_)
                       parseExpression(=>)
                         looksLikeOuterPatternEquals(=>)
@@ -86,11 +86,11 @@
                                 listener: handleLiteralInt(0)
                       listener: endSwitchExpressionCase(null, =>, 0)
                       listener: beginSwitchExpressionCase()
-                      parsePattern(,, precedence: 1, isRefutableContext: true)
-                        parsePrimaryPattern(,, isRefutableContext: true)
-                          parseVariablePattern(,, typeInfo: Instance of 'NoType')
+                      parsePattern(,, PatternContext.matching, precedence: 1)
+                        parsePrimaryPattern(,, PatternContext.matching)
+                          parseVariablePattern(,, PatternContext.matching, typeInfo: Instance of 'NoType')
                             listener: handleNoType(,)
-                            listener: handleVariablePattern(null, _)
+                            listener: handleVariablePattern(null, _, false)
                       ensureFunctionArrow(_)
                       parseExpression(=>)
                         looksLikeOuterPatternEquals(=>)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.expect
index 596e195..3ae67e7 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.intertwined.expect
index 25a5e4d..0b7e427 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_case.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                   ensureColon(y)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.expect
index fca4e04..d943a81 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.intertwined.expect
index 6044f02..1ced8dc 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_cast.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.expect
index e78ddaf..512b27f 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.expect
@@ -27,7 +27,7 @@
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(y)
           handleType(int, null)
-          handleVariablePattern(final, y)
+          handleVariablePattern(final, y, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.intertwined.expect
index 35abab9..1a74858 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_if_case.dart.intertwined.expect
@@ -61,13 +61,13 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(y)
                           listener: handleType(int, null)
-                          listener: handleVariablePattern(final, y)
+                          listener: handleVariablePattern(final, y, false)
                     ensureCloseParen(y, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.expect
index 6910183..0fa4b1f 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.intertwined.expect
index 107cb0e..de23b2a 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_assert.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.expect
index 62bae9d..52913ac 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(final, y)
+              handleVariablePattern(final, y, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.intertwined.expect
index 4671c05..aaef33a 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_final_variable_inside_null_check.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, y)
+                        listener: handleVariablePattern(final, y, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.expect
index 3417c20..d0e64e5 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(null, y)
+              handleVariablePattern(null, y, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.intertwined.expect
index b89ab98..f8e913b 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_case.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, y)
+                        listener: handleVariablePattern(null, y, false)
                   ensureColon(y)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.expect
index 5e0206f..1a6a8be 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(null, y)
+              handleVariablePattern(null, y, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.intertwined.expect
index 39b50ec..b33ade9 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_cast.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, y)
+                        listener: handleVariablePattern(null, y, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.expect
index 21dc891..8b813be 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.expect
@@ -27,7 +27,7 @@
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(y)
           handleType(int, null)
-          handleVariablePattern(null, y)
+          handleVariablePattern(null, y, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.intertwined.expect
index 4f85e86..eefd064 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_if_case.dart.intertwined.expect
@@ -61,13 +61,13 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(y)
                           listener: handleType(int, null)
-                          listener: handleVariablePattern(null, y)
+                          listener: handleVariablePattern(null, y, false)
                     ensureCloseParen(y, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.expect
index e23efb3..a76a058 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(null, y)
+              handleVariablePattern(null, y, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.intertwined.expect
index b5b9792..94ea139 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_assert.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, y)
+                        listener: handleVariablePattern(null, y, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.expect
index 8ccc145..86abef0 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(y)
               handleType(int, null)
-              handleVariablePattern(null, y)
+              handleVariablePattern(null, y, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.intertwined.expect
index 0cbed80..0f6d547 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_inside_null_check.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, y)
+                        listener: handleVariablePattern(null, y, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.expect
index 60ac9d5..a864098 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.intertwined.expect
index 64b6ca8..475809c 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_case.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                   ensureColon(as)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.expect
index 826a4e5..46f0561 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.intertwined.expect
index b46724d..5e72bfd 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_cast.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.expect
index 8f830f6..925258e 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.expect
@@ -58,7 +58,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handlePatternField(:)
               handleObjectPatternFields(1, (, ))
               handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.intertwined.expect
index fc1c039..2748738 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.intertwined.expect
@@ -113,19 +113,19 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         ensureIdentifier((, namedArgumentReference)
                           listener: handleIdentifier(f, namedArgumentReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'SimpleType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         listener: handlePatternField(:)
                         listener: handleObjectPatternFields(1, (, ))
                       listener: handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.expect
index bdad397..34d0911 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.expect
@@ -58,7 +58,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handlePatternField(:)
               handleObjectPatternFields(1, (, ))
               handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
index 1be356f..953c119 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.intertwined.expect
@@ -113,18 +113,18 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments(()
-                      parseObjectPatternRest(C, isRefutableContext: true)
+                      parseObjectPatternRest(C, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'SimpleType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         listener: handlePatternField(:)
                         listener: handleObjectPatternFields(1, (, ))
                       listener: handleObjectPattern(C, null, null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.expect
index fcf10b5..9a152a0 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.expect
@@ -27,7 +27,7 @@
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(as)
           handleType(int, null)
-          handleVariablePattern(null, as)
+          handleVariablePattern(null, as, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.intertwined.expect
index 375ff7b..2671e52 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_if_case.dart.intertwined.expect
@@ -61,13 +61,13 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(as)
                           listener: handleType(int, null)
-                          listener: handleVariablePattern(null, as)
+                          listener: handleVariablePattern(null, as, false)
                     ensureCloseParen(as, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.expect
index fc6c843..d16a8fa 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.expect
@@ -31,7 +31,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handleListPattern(1, [, ])
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.intertwined.expect
index a8cc4ae..ebb66bf 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_list_pattern.dart.intertwined.expect
@@ -69,17 +69,17 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments([)
-                      parseListPatternSuffix(case, isRefutableContext: true)
-                        parsePattern([, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern([, isRefutableContext: true)
-                            parseVariablePattern([, typeInfo: Instance of 'SimpleType')
+                      parseListPatternSuffix(case, PatternContext.matching)
+                        parsePattern([, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern([, PatternContext.matching)
+                            parseVariablePattern([, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         listener: handleListPattern(1, [, ])
                   ensureColon(])
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.expect
index 25bc0ff..fc33a01 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               beginBinaryPattern(&&)
                 handleLiteralInt(2)
                 handleConstantPattern(null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.intertwined.expect
index 8fc5f36..899c2d5 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_lhs.dart.intertwined.expect
@@ -69,16 +69,16 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
                         parsePrecedenceExpression(&&, 17, false)
                           parseUnaryExpression(&&, false)
                             parsePrimary(&&, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.expect
index fb75ae0..2e506d2 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.expect
@@ -33,7 +33,7 @@
                 handleIdentifier(int, typeReference)
                 handleNoTypeArguments(as)
                 handleType(int, null)
-                handleVariablePattern(null, as)
+                handleVariablePattern(null, as, false)
               endBinaryPattern(&&)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.intertwined.expect
index 5d1d765..b544dd4 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_and_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,13 +78,13 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(&&)
-                    parsePattern(&&, precedence: 7, isRefutableContext: true)
-                      parsePrimaryPattern(&&, isRefutableContext: true)
-                        parseVariablePattern(&&, typeInfo: Instance of 'SimpleType')
+                    parsePattern(&&, PatternContext.matching, precedence: 7)
+                      parsePrimaryPattern(&&, PatternContext.matching)
+                        parseVariablePattern(&&, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(as)
                           listener: handleType(int, null)
-                          listener: handleVariablePattern(null, as)
+                          listener: handleVariablePattern(null, as, false)
                     listener: endBinaryPattern(&&)
                   ensureColon(as)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.expect
index d6ddd32..9d29ee1 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               beginBinaryPattern(||)
                 handleLiteralInt(2)
                 handleConstantPattern(null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.intertwined.expect
index dd78502..44d90bb 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_lhs.dart.intertwined.expect
@@ -69,16 +69,16 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
                         parsePrecedenceExpression(||, 17, false)
                           parseUnaryExpression(||, false)
                             parsePrimary(||, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.expect
index 7efdc8b..0e5df4a 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.expect
@@ -33,7 +33,7 @@
                 handleIdentifier(int, typeReference)
                 handleNoTypeArguments(as)
                 handleType(int, null)
-                handleVariablePattern(null, as)
+                handleVariablePattern(null, as, false)
               endBinaryPattern(||)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.intertwined.expect
index c878c9d..1eae7e2 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_logical_or_rhs.dart.intertwined.expect
@@ -69,8 +69,8 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       parsePrecedenceExpression(case, 17, false)
                         parseUnaryExpression(case, false)
                           parsePrimary(case, expression)
@@ -78,13 +78,13 @@
                               listener: handleLiteralInt(1)
                       listener: handleConstantPattern(null)
                     listener: beginBinaryPattern(||)
-                    parsePattern(||, precedence: 6, isRefutableContext: true)
-                      parsePrimaryPattern(||, isRefutableContext: true)
-                        parseVariablePattern(||, typeInfo: Instance of 'SimpleType')
+                    parsePattern(||, PatternContext.matching, precedence: 6)
+                      parsePrimaryPattern(||, PatternContext.matching)
+                        parseVariablePattern(||, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(as)
                           listener: handleType(int, null)
-                          listener: handleVariablePattern(null, as)
+                          listener: handleVariablePattern(null, as, false)
                     listener: endBinaryPattern(||)
                   ensureColon(as)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.expect
index cc0d616..3aa8245 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.expect
@@ -33,7 +33,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handleMapPatternEntry(:, })
               handleMapPattern(1, {, })
             endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.intertwined.expect
index 7793305..c0d3568 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_map_pattern.dart.intertwined.expect
@@ -69,10 +69,10 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
                       listener: handleNoTypeArguments({)
-                      parseMapPatternSuffix(case, isRefutableContext: true)
+                      parseMapPatternSuffix(case, PatternContext.matching)
                         parseExpression({)
                           looksLikeOuterPatternEquals({)
                             skipOuterPattern({)
@@ -83,13 +83,13 @@
                                   parseSingleLiteralString({)
                                     listener: beginLiteralString('a')
                                     listener: endLiteralString(0, :)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'SimpleType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         listener: handleMapPatternEntry(:, })
                         listener: handleMapPattern(1, {, })
                   ensureColon(})
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.expect
index 2b033bc24..f5c3d10 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.intertwined.expect
index 09057e0..8abffc7 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_assert.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.expect
index 348b602..c8abc1d 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.intertwined.expect
index 4d3b2fd..21d23b7 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_null_check.dart.intertwined.expect
@@ -69,13 +69,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.expect
index ca127fd..f3405b2 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handleParenthesizedPattern(()
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.intertwined.expect
index a18b0d7..4444b7e 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_parenthesized_pattern.dart.intertwined.expect
@@ -69,16 +69,16 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
-                            parseVariablePattern((, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
+                            parseVariablePattern((, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         ensureCloseParen(as, ()
                         listener: handleParenthesizedPattern(()
                   ensureColon())
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.expect
index 5df8df2..5adc0ac 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.expect
@@ -31,7 +31,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handlePatternField(:)
               handleLiteralInt(2)
               handleConstantPattern(null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.intertwined.expect
index f1e2939..781d8dd 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_implicitly_named.dart.intertwined.expect
@@ -69,20 +69,20 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         listener: handleNoName(()
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'SimpleType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.expect
index e7596cc..6413dfb 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.expect
@@ -31,7 +31,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handlePatternField(:)
               handleLiteralInt(2)
               handleConstantPattern(null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.intertwined.expect
index 9cf8b60..3e619f5 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_named.dart.intertwined.expect
@@ -69,21 +69,21 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
                         ensureIdentifier((, namedRecordFieldReference)
                           listener: handleIdentifier(n, namedRecordFieldReference)
-                        parsePattern(:, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(:, isRefutableContext: true)
-                            parseVariablePattern(:, typeInfo: Instance of 'SimpleType')
+                        parsePattern(:, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(:, PatternContext.matching)
+                            parseVariablePattern(:, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         listener: handlePatternField(:)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.expect
index ddb6cd7..7d3dc38 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.expect
@@ -30,7 +30,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handlePatternField(null)
               handleLiteralInt(2)
               handleConstantPattern(null)
diff --git a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.intertwined.expect
index cee0258..83478dd 100644
--- a/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/typed_variable_named_as_inside_record_pattern_unnamed.dart.intertwined.expect
@@ -69,19 +69,19 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseParenthesizedPatternOrRecordPattern(case, isRefutableContext: true)
-                        parsePattern((, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern((, isRefutableContext: true)
-                            parseVariablePattern((, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseParenthesizedPatternOrRecordPattern(case, PatternContext.matching)
+                        parsePattern((, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.matching)
+                            parseVariablePattern((, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                               listener: handleIdentifier(int, typeReference)
                               listener: handleNoTypeArguments(as)
                               listener: handleType(int, null)
-                              listener: handleVariablePattern(null, as)
+                              listener: handleVariablePattern(null, as, false)
                         listener: handlePatternField(null)
-                        parsePattern(,, precedence: 1, isRefutableContext: true)
-                          parsePrimaryPattern(,, isRefutableContext: true)
+                        parsePattern(,, PatternContext.matching, precedence: 1)
+                          parsePrimaryPattern(,, PatternContext.matching)
                             parsePrecedenceExpression(,, 17, false)
                               parseUnaryExpression(,, false)
                                 parsePrimary(,, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.expect
index a24021e..9edfb72 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, y)
+              handleVariablePattern(var, y, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.intertwined.expect
index 28b8b38..6efa133 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_case.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, y)
+                        listener: handleVariablePattern(var, y, false)
                   ensureColon(y)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.expect
index 0b2137b..5eafc6b 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, y)
+              handleVariablePattern(var, y, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.intertwined.expect
index 97623b4..f258103 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_cast.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, y)
+                        listener: handleVariablePattern(var, y, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.expect
index 35e81a1..099c8c6 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.expect
@@ -25,7 +25,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(var)
-          handleVariablePattern(var, y)
+          handleVariablePattern(var, y, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.intertwined.expect
index 63bdaec..19a111f 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_if_case.dart.intertwined.expect
@@ -61,11 +61,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(var)
-                          listener: handleVariablePattern(var, y)
+                          listener: handleVariablePattern(var, y, false)
                     ensureCloseParen(y, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.expect
index 23e1545..ebbdf18 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, y)
+              handleVariablePattern(var, y, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.intertwined.expect
index 9aebd7a..1df60f8 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_assert.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, y)
+                        listener: handleVariablePattern(var, y, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.expect
index 8a314d4..74eb962 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.expect
@@ -28,7 +28,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, y)
+              handleVariablePattern(var, y, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.intertwined.expect
index ba37e50..4ed8e70 100644
--- a/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/var_variable_inside_null_check.dart.intertwined.expect
@@ -69,11 +69,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, y)
+                        listener: handleVariablePattern(var, y, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.expect
index e4df700..8e896c4 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.expect
@@ -20,7 +20,7 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, y)
+        handleVariablePattern(null, y, false)
         beginAsOperatorType(as)
           handleIdentifier(Object, typeReference)
           handleNoTypeArguments())
diff --git a/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.intertwined.expect
index 04b93d1..7438844 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_bare_insideCast.dart.intertwined.expect
@@ -43,14 +43,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
-                      parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                        parsePattern((, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern((, isRefutableContext: false)
-                            parseVariablePattern((, typeInfo: Instance of 'NoType')
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(()
-                              listener: handleVariablePattern(null, y)
+                              listener: handleVariablePattern(null, y, false)
                           listener: beginAsOperatorType(as)
                           computeTypeAfterIsOrAs(as)
                           listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.expect
index 55aa98d..fdf9081 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.expect
@@ -20,7 +20,7 @@
         beginMetadataStar(var)
         endMetadataStar(0)
         handleNoType(()
-        handleVariablePattern(null, y)
+        handleVariablePattern(null, y, false)
         handleNullAssertPattern(!)
         handleParenthesizedPattern(()
         handleIdentifier(x, expression)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.intertwined.expect
index 5750635..25e92a9 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_bare_insideNullAssert.dart.intertwined.expect
@@ -43,14 +43,14 @@
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
                 parsePatternVariableDeclarationStatement(var, {, var)
-                  parsePattern(var, precedence: 1, isRefutableContext: false)
-                    parsePrimaryPattern(var, isRefutableContext: false)
-                      parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
-                        parsePattern((, precedence: 1, isRefutableContext: false)
-                          parsePrimaryPattern((, isRefutableContext: false)
-                            parseVariablePattern((, typeInfo: Instance of 'NoType')
+                  parsePattern(var, PatternContext.declaration, precedence: 1)
+                    parsePrimaryPattern(var, PatternContext.declaration)
+                      parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
+                        parsePattern((, PatternContext.declaration, precedence: 1)
+                          parsePrimaryPattern((, PatternContext.declaration)
+                            parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                               listener: handleNoType(()
-                              listener: handleVariablePattern(null, y)
+                              listener: handleVariablePattern(null, y, false)
                           listener: handleNullAssertPattern(!)
                         ensureCloseParen(!, ()
                         listener: handleParenthesizedPattern(()
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.expect
index 13285e6..c00527a 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(when, typeReference)
               handleNoTypeArguments(as)
               handleType(when, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               beginAsOperatorType(as)
                 handleIdentifier(when, typeReference)
                 handleNoTypeArguments(when)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.intertwined.expect
index 3a5ebc64..664c49c 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_absurd.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(when, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(when, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(when, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.expect
index 14f4083..1b0e83a 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(as)
               handleType(int, null)
-              handleVariablePattern(null, as)
+              handleVariablePattern(null, as, false)
               handleLiteralBool(true)
             endCaseExpression(case, when, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.intertwined.expect
index 21039e2..fed5462 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedAs_beforeWhen.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(as)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, as)
+                        listener: handleVariablePattern(null, as, false)
                   parseExpression(when)
                     looksLikeOuterPatternEquals(when)
                       skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.expect
index cff09b1..ab1df05 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(_, typeReference)
               handleNoTypeArguments(y)
               handleType(_, null)
-              handleVariablePattern(null, y)
+              handleVariablePattern(null, y, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.intertwined.expect
index c432898..03fecc3 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedUnderscore_insideCase.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(_, typeReference)
                         listener: handleNoTypeArguments(y)
                         listener: handleType(_, null)
-                        listener: handleVariablePattern(null, y)
+                        listener: handleVariablePattern(null, y, false)
                   ensureColon(y)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.expect
index 9178316..f725b81 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(when)
               handleType(int, null)
-              handleVariablePattern(null, when)
+              handleVariablePattern(null, when, false)
               handleIdentifier(when, expression)
               handleNoTypeArguments(>)
               handleNoArguments(>)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.intertwined.expect
index 1a60140..154fbdb 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_absurd.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(when)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, when)
+                        listener: handleVariablePattern(null, when, false)
                   parseExpression(when)
                     looksLikeOuterPatternEquals(when)
                       skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.expect
index 917df1b..c96ab9b 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(when)
               handleType(int, null)
-              handleVariablePattern(null, when)
+              handleVariablePattern(null, when, false)
               handleLiteralBool(true)
             endCaseExpression(case, when, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.intertwined.expect
index 45e16c6..7c4fdab 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_beforeWhen.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(when)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, when)
+                        listener: handleVariablePattern(null, when, false)
                   parseExpression(when)
                     looksLikeOuterPatternEquals(when)
                       skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.expect
index 60738b5..8fb17cd 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(when)
               handleType(int, null)
-              handleVariablePattern(null, when)
+              handleVariablePattern(null, when, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.intertwined.expect
index 04d4933..3df47a4 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCase.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(when)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, when)
+                        listener: handleVariablePattern(null, when, false)
                   ensureColon(when)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.expect
index 23a828b..8afdf74 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(when)
               handleType(int, null)
-              handleVariablePattern(null, when)
+              handleVariablePattern(null, when, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.intertwined.expect
index c8875c2..f10f7e5 100644
--- a/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/variable_typedNamedWhen_insideCast.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(when)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, when)
+                        listener: handleVariablePattern(null, when, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.expect
index f46d108..3e2413f 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(case)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleLiteralBool(true)
             endCaseExpression(case, when, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.intertwined.expect
index 834f982..ee295f1 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_beforeWhen.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(case)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                   parseExpression(when)
                     looksLikeOuterPatternEquals(when)
                       skipOuterPattern(when)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.expect
index 79ab344..cc77baf 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(case)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.intertwined.expect
index 8e18b62..d951e75 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCase.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(case)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.expect
index 57a6a7c..cec3c66 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(case)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.intertwined.expect
index d5713b4..c2b3d1f 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideCast.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(case)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.expect
index 69c2a6e..64d472e 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.expect
@@ -23,7 +23,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(case)
-          handleVariablePattern(null, _)
+          handleVariablePattern(null, _, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.intertwined.expect
index da25590..e62a8bc 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideIfCase.dart.intertwined.expect
@@ -58,11 +58,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(case)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     ensureCloseParen(_, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.expect
index 8fc402b..a92ee56 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(case)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.intertwined.expect
index 32f7146..bc3db43 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullAssert.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(case)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.expect
index 6173c1d..c2a6225 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(case)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.intertwined.expect
index 47e4ca8..b715816 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_bare_insideNullCheck.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(case)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.expect
index 30ca722..b3e862e 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.intertwined.expect
index d9928fa..0ca52d2 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCase.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.expect
index 386d32c..4922e956 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.intertwined.expect
index 595e205..4880b96 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideCast.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.expect
index 0da0ee4..32cc4f1 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.expect
@@ -25,7 +25,7 @@
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(_)
           handleType(int, null)
-          handleVariablePattern(final, _)
+          handleVariablePattern(final, _, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.intertwined.expect
index ce2f6ce..92bf338 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideIfCase.dart.intertwined.expect
@@ -58,13 +58,13 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(_)
                           listener: handleType(int, null)
-                          listener: handleVariablePattern(final, _)
+                          listener: handleVariablePattern(final, _, false)
                     ensureCloseParen(_, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.expect
index 457968a..498b71a 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.intertwined.expect
index a286af7..eb70e8b 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullAssert.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.expect
index ffb5838..da4d00d 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.intertwined.expect
index 8c9bf86..913a32e 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_typed_insideNullCheck.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.expect
index 9501ba9..e71fb0b 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.intertwined.expect
index bdf5f18..284e8c5 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCase.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.expect
index a10616e..e1723da 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.intertwined.expect
index 938b639..f5005ab 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideCast.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.expect
index cba2ec3..918226c 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.expect
@@ -23,7 +23,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(final)
-          handleVariablePattern(final, _)
+          handleVariablePattern(final, _, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.intertwined.expect
index a64ce73..d7fcd80 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideIfCase.dart.intertwined.expect
@@ -58,11 +58,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(final)
-                          listener: handleVariablePattern(final, _)
+                          listener: handleVariablePattern(final, _, false)
                     ensureCloseParen(_, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.expect
index afe67b8..60cb3cc 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.intertwined.expect
index 1348b6c..6f5dec9 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullAssert.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.expect
index 10d05e1..d9ff7a2b 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(final)
-              handleVariablePattern(final, _)
+              handleVariablePattern(final, _, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.intertwined.expect
index 0e6cfae..57ab3d6 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_final_untyped_insideNullCheck.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(final)
-                        listener: handleVariablePattern(final, _)
+                        listener: handleVariablePattern(final, _, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.expect
index 13dfb17..76836d4 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.intertwined.expect
index 2d39ff2..26dfe9c 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCase.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.expect
index c9b9f6b..e13df50 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.intertwined.expect
index 0904571..d1abfe6 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideCast.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.expect
index 08609dd..df8ef1f 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.expect
@@ -25,7 +25,7 @@
           handleIdentifier(int, typeReference)
           handleNoTypeArguments(_)
           handleType(int, null)
-          handleVariablePattern(null, _)
+          handleVariablePattern(null, _, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.intertwined.expect
index 9c1c220..c64245a 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideIfCase.dart.intertwined.expect
@@ -58,13 +58,13 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(_)
                           listener: handleType(int, null)
-                          listener: handleVariablePattern(null, _)
+                          listener: handleVariablePattern(null, _, false)
                     ensureCloseParen(_, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.expect
index ebe7f20..f68dffd 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.intertwined.expect
index 9387d6c..4586cd0 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullAssert.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.expect
index cc0b1c4..89f7dd8 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.expect
@@ -28,7 +28,7 @@
               handleIdentifier(int, typeReference)
               handleNoTypeArguments(_)
               handleType(int, null)
-              handleVariablePattern(null, _)
+              handleVariablePattern(null, _, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.intertwined.expect
index 144dc83..e6b27d9 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_typed_insideNullCheck.dart.intertwined.expect
@@ -66,13 +66,13 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'SimpleType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'SimpleType')
                         listener: handleIdentifier(int, typeReference)
                         listener: handleNoTypeArguments(_)
                         listener: handleType(int, null)
-                        listener: handleVariablePattern(null, _)
+                        listener: handleVariablePattern(null, _, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.expect
index e60492a..f354621 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, _)
+              handleVariablePattern(var, _, false)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
               handleBreakStatement(false, break, ;)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.intertwined.expect
index 37d2829..2175d56 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCase.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, _)
+                        listener: handleVariablePattern(var, _, false)
                   ensureColon(_)
                   listener: endCaseExpression(case, null, :)
                   peekPastLabels(break)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.expect
index e59f822..1948141 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, _)
+              handleVariablePattern(var, _, false)
               beginAsOperatorType(as)
                 handleIdentifier(Object, typeReference)
                 handleNoTypeArguments(:)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.intertwined.expect
index 6f4748c..356da03d 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideCast.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, _)
+                        listener: handleVariablePattern(var, _, false)
                     listener: beginAsOperatorType(as)
                     computeTypeAfterIsOrAs(as)
                     listener: handleIdentifier(Object, typeReference)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.expect
index 476a022..39c2813 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.expect
@@ -23,7 +23,7 @@
           handleNoArguments(case)
           handleSend(x, case)
           handleNoType(var)
-          handleVariablePattern(var, _)
+          handleVariablePattern(var, _, false)
           handleParenthesizedCondition((, case, null)
           beginThenStatement({)
             beginBlock({, BlockKind(statement))
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.intertwined.expect
index 50241ab..6b0cdf9 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideIfCase.dart.intertwined.expect
@@ -58,11 +58,11 @@
                                 parseArgumentsOpt(x)
                                   listener: handleNoArguments(case)
                                 listener: handleSend(x, case)
-                    parsePattern(case, precedence: 1, isRefutableContext: true)
-                      parsePrimaryPattern(case, isRefutableContext: true)
-                        parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                    parsePattern(case, PatternContext.matching, precedence: 1)
+                      parsePrimaryPattern(case, PatternContext.matching)
+                        parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                           listener: handleNoType(var)
-                          listener: handleVariablePattern(var, _)
+                          listener: handleVariablePattern(var, _, false)
                     ensureCloseParen(_, ()
                     listener: handleParenthesizedCondition((, case, null)
                 listener: beginThenStatement({)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.expect
index 5da8419..d3f45ee 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, _)
+              handleVariablePattern(var, _, false)
               handleNullAssertPattern(!)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.intertwined.expect
index 1067c1b..9cfb26a 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullAssert.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, _)
+                        listener: handleVariablePattern(var, _, false)
                     listener: handleNullAssertPattern(!)
                   ensureColon(!)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.expect
index fa6db20..fd66968 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.expect
@@ -26,7 +26,7 @@
           beginSwitchBlock({)
             beginCaseExpression(case)
               handleNoType(var)
-              handleVariablePattern(var, _)
+              handleVariablePattern(var, _, false)
               handleNullCheckPattern(?)
             endCaseExpression(case, null, :)
             beginSwitchCase(0, 1, case)
diff --git a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.intertwined.expect
index 6fafc16..0ee6c7b 100644
--- a/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/patterns/wildcard_var_insideNullCheck.dart.intertwined.expect
@@ -66,11 +66,11 @@
                   notEofOrValue(}, case)
                   peekPastLabels(case)
                   listener: beginCaseExpression(case)
-                  parsePattern(case, precedence: 1, isRefutableContext: true)
-                    parsePrimaryPattern(case, isRefutableContext: true)
-                      parseVariablePattern(case, typeInfo: Instance of 'NoType')
+                  parsePattern(case, PatternContext.matching, precedence: 1)
+                    parsePrimaryPattern(case, PatternContext.matching)
+                      parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
                         listener: handleNoType(var)
-                        listener: handleVariablePattern(var, _)
+                        listener: handleVariablePattern(var, _, false)
                     listener: handleNullCheckPattern(?)
                   ensureColon(?)
                   listener: endCaseExpression(case, null, :)
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index eda5d69..ddd9b6d 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -2074,10 +2074,14 @@
   }
 
   @override
-  void handleVariablePattern(Token? keyword, Token variable) {
+  void handleVariablePattern(Token? keyword, Token variable,
+      {required bool inAssignmentPattern}) {
     seen(keyword);
     seen(variable);
-    doPrint('handleVariablePattern(' '$keyword, ' '$variable)');
+    doPrint('handleVariablePattern('
+        '$keyword, '
+        '$variable, '
+        '$inAssignmentPattern)');
   }
 
   @override
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index e5d192d..366425b 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -14,7 +14,7 @@
 import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
 import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
 import 'package:_fe_analyzer_shared/src/parser/parser_impl.dart'
-    show AwaitOrYieldContext, ForPartsContext;
+    show AwaitOrYieldContext, ForPartsContext, PatternContext;
 import 'package:_fe_analyzer_shared/src/parser/token_stream_rewriter.dart';
 import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
@@ -2667,87 +2667,78 @@
   }
 
   @override
-  Token parsePattern(Token token,
-      {int precedence = 1, required bool isRefutableContext}) {
+  Token parsePattern(Token token, PatternContext patternContext,
+      {int precedence = 1}) {
     doPrint('parsePattern('
         '$token, '
-        'precedence: $precedence, '
-        'isRefutableContext: $isRefutableContext)');
+        '$patternContext, '
+        'precedence: $precedence)');
     indent++;
-    var result = super.parsePattern(token,
-        precedence: precedence, isRefutableContext: isRefutableContext);
+    var result =
+        super.parsePattern(token, patternContext, precedence: precedence);
     indent--;
     return result;
   }
 
   @override
-  Token parsePrimaryPattern(Token token, {required bool isRefutableContext}) {
-    doPrint('parsePrimaryPattern('
+  Token parsePrimaryPattern(Token token, PatternContext patternContext) {
+    doPrint('parsePrimaryPattern(' '$token, ' '$patternContext)');
+    indent++;
+    var result = super.parsePrimaryPattern(token, patternContext);
+    indent--;
+    return result;
+  }
+
+  @override
+  Token parseVariablePattern(Token token, PatternContext patternContext,
+      {TypeInfo typeInfo = noType}) {
+    doPrint('parseVariablePattern('
         '$token, '
-        'isRefutableContext: $isRefutableContext)');
+        '$patternContext, '
+        'typeInfo: $typeInfo)');
     indent++;
-    var result = super
-        .parsePrimaryPattern(token, isRefutableContext: isRefutableContext);
+    var result =
+        super.parseVariablePattern(token, patternContext, typeInfo: typeInfo);
     indent--;
     return result;
   }
 
   @override
-  Token parseVariablePattern(Token token, {TypeInfo typeInfo = noType}) {
-    doPrint('parseVariablePattern(' '$token, ' 'typeInfo: $typeInfo)');
+  Token parseListPatternSuffix(Token token, PatternContext patternContext) {
+    doPrint('parseListPatternSuffix(' '$token, ' '$patternContext)');
     indent++;
-    var result = super.parseVariablePattern(token, typeInfo: typeInfo);
+    var result = super.parseListPatternSuffix(token, patternContext);
     indent--;
     return result;
   }
 
   @override
-  Token parseListPatternSuffix(Token token,
-      {required bool isRefutableContext}) {
-    doPrint('parseListPatternSuffix('
-        '$token, '
-        'isRefutableContext: $isRefutableContext)');
+  Token parseMapPatternSuffix(Token token, PatternContext patternContext) {
+    doPrint('parseMapPatternSuffix(' '$token, ' '$patternContext)');
     indent++;
-    var result = super
-        .parseListPatternSuffix(token, isRefutableContext: isRefutableContext);
+    var result = super.parseMapPatternSuffix(token, patternContext);
     indent--;
     return result;
   }
 
   @override
-  Token parseMapPatternSuffix(Token token, {required bool isRefutableContext}) {
-    doPrint('parseMapPatternSuffix('
-        '$token, '
-        'isRefutableContext: $isRefutableContext)');
-    indent++;
-    var result = super
-        .parseMapPatternSuffix(token, isRefutableContext: isRefutableContext);
-    indent--;
-    return result;
-  }
-
-  @override
-  Token parseParenthesizedPatternOrRecordPattern(Token token,
-      {required bool isRefutableContext}) {
+  Token parseParenthesizedPatternOrRecordPattern(
+      Token token, PatternContext patternContext) {
     doPrint('parseParenthesizedPatternOrRecordPattern('
         '$token, '
-        'isRefutableContext: $isRefutableContext)');
+        '$patternContext)');
     indent++;
-    var result = super.parseParenthesizedPatternOrRecordPattern(token,
-        isRefutableContext: isRefutableContext);
+    var result =
+        super.parseParenthesizedPatternOrRecordPattern(token, patternContext);
     indent--;
     return result;
   }
 
   @override
-  Token parseObjectPatternRest(Token token,
-      {required bool isRefutableContext}) {
-    doPrint('parseObjectPatternRest('
-        '$token, '
-        'isRefutableContext: $isRefutableContext)');
+  Token parseObjectPatternRest(Token token, PatternContext patternContext) {
+    doPrint('parseObjectPatternRest(' '$token, ' '$patternContext)');
     indent++;
-    var result = super
-        .parseObjectPatternRest(token, isRefutableContext: isRefutableContext);
+    var result = super.parseObjectPatternRest(token, patternContext);
     indent--;
     return result;
   }
diff --git a/pkg/front_end/test/parser_test_parser_creator.dart b/pkg/front_end/test/parser_test_parser_creator.dart
index 5715d21..c345900 100644
--- a/pkg/front_end/test/parser_test_parser_creator.dart
+++ b/pkg/front_end/test/parser_test_parser_creator.dart
@@ -51,7 +51,7 @@
 import 'package:_fe_analyzer_shared/src/parser/listener.dart' show Listener;
 import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
 import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
-import 'package:_fe_analyzer_shared/src/parser/parser_impl.dart' show AwaitOrYieldContext, ForPartsContext;
+import 'package:_fe_analyzer_shared/src/parser/parser_impl.dart' show AwaitOrYieldContext, ForPartsContext, PatternContext;
 import 'package:_fe_analyzer_shared/src/parser/token_stream_rewriter.dart';
 import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';