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) {