Extract _resolveGuardedPattern() and use for if-case and switch-case.

Change-Id: I242aaf2311eac908c59de4c464bbc3a63e0836df
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/271560
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 0f184b9..92df4b2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -805,17 +805,7 @@
     var caseClause = node.caseClause;
     if (caseClause != null) {
       node.expression.accept(this);
-      _patternVariables.casePatternStart();
-      var guardedPattern = caseClause.guardedPattern;
-      guardedPattern.pattern.accept(this);
-      var variables = _patternVariables.casePatternFinish();
-      _withNameScope(() {
-        guardedPattern.variables = variables;
-        // TODO(scheglov) Use `_defineVariables`.
-        for (var variable in variables.values) {
-          _define(variable);
-        }
-        guardedPattern.whenClause?.accept(this);
+      _resolveGuardedPattern(caseClause.guardedPattern, then: () {
         node.thenStatement.accept(this);
       });
       node.elseStatement?.accept(this);
@@ -1153,14 +1143,10 @@
         } else if (member is SwitchDefaultImpl) {
           _patternVariables.switchStatementSharedCaseScopeEmpty(node);
         } else if (member is SwitchPatternCaseImpl) {
-          _patternVariables.casePatternStart();
-          var guardedPattern = member.guardedPattern;
-          guardedPattern.pattern.accept(this);
-          // TODO(scheglov) use variables
-          _patternVariables.casePatternFinish(
+          _resolveGuardedPattern(
+            member.guardedPattern,
             sharedCaseScopeKey: node,
           );
-          guardedPattern.whenClause?.accept(this);
         } else {
           throw UnimplementedError('(${member.runtimeType}) $member');
         }
@@ -1408,6 +1394,29 @@
     return NullabilitySuffix.star;
   }
 
+  void _resolveGuardedPattern(
+    GuardedPatternImpl guardedPattern, {
+    Object? sharedCaseScopeKey,
+    void Function()? then,
+  }) {
+    _patternVariables.casePatternStart();
+    guardedPattern.pattern.accept(this);
+    var variables = _patternVariables.casePatternFinish(
+      sharedCaseScopeKey: sharedCaseScopeKey,
+    );
+    // Matched variables are available in `whenClause`.
+    _withNameScope(() {
+      for (var variable in variables.values) {
+        _define(variable);
+      }
+      guardedPattern.variables = variables;
+      guardedPattern.whenClause?.accept(this);
+      if (then != null) {
+        then();
+      }
+    });
+  }
+
   void _resolveImplementsClause(ImplementsClause? clause) {
     if (clause == null) return;
 
diff --git a/pkg/analyzer/test/src/dart/resolution/if_statement_test.dart b/pkg/analyzer/test/src/dart/resolution/if_statement_test.dart
index 834e869..1dbf5b9 100644
--- a/pkg/analyzer/test/src/dart/resolution/if_statement_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/if_statement_test.dart
@@ -9,12 +9,12 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(IfStatementTest);
+    defineReflectiveTests(IfStatementResolutionTest);
   });
 }
 
 @reflectiveTest
-class IfStatementTest extends PatternsResolutionTest {
+class IfStatementResolutionTest extends PatternsResolutionTest {
   test_caseClause() async {
     await assertNoErrorsInCode(r'''
 void f(x) {