Issue 51172. Fix resolution for SwitchExpression as a top-level variable initializer.
Bug: https://github.com/dart-lang/sdk/issues/51172
Change-Id: Ie13b7395082ee4a587da4b3abb6c3efa07eb3133
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/280079
Reviewed-by: Brian Wilkerson <brianwilkerson@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 f3c9beb..31369f5 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -1211,12 +1211,14 @@
node.expression.accept(this);
for (var case_ in node.cases) {
- _resolveGuardedPattern(
- case_.guardedPattern,
- then: () {
- case_.expression.accept(this);
- },
- );
+ _withNameScope(() {
+ _resolveGuardedPattern(
+ case_.guardedPattern,
+ then: () {
+ case_.expression.accept(this);
+ },
+ );
+ });
}
}
diff --git a/pkg/analyzer/test/src/dart/resolution/switch_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/switch_expression_test.dart
index fdd4d60..e1b2b24 100644
--- a/pkg/analyzer/test/src/dart/resolution/switch_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/switch_expression_test.dart
@@ -82,6 +82,69 @@
''');
}
+ test_location_topLevel() async {
+ await assertNoErrorsInCode(r'''
+final a = switch (null) {
+ int(:var isEven) when isEven => 1,
+ _ => 0,
+};
+''');
+
+ final node = findNode.singleSwitchExpression;
+ assertResolvedNodeText(node, r'''
+SwitchExpression
+ switchKeyword: switch
+ leftParenthesis: (
+ expression: NullLiteral
+ literal: null
+ staticType: Null
+ rightParenthesis: )
+ leftBracket: {
+ cases
+ SwitchExpressionCase
+ guardedPattern: GuardedPattern
+ pattern: ObjectPattern
+ type: NamedType
+ name: SimpleIdentifier
+ token: int
+ staticElement: dart:core::@class::int
+ staticType: null
+ type: int
+ leftParenthesis: (
+ fields
+ RecordPatternField
+ fieldName: RecordPatternFieldName
+ colon: :
+ pattern: DeclaredVariablePattern
+ keyword: var
+ name: isEven
+ declaredElement: hasImplicitType isEven@37
+ type: bool
+ fieldElement: dart:core::@class::int::@getter::isEven
+ rightParenthesis: )
+ whenClause: WhenClause
+ whenKeyword: when
+ expression: SimpleIdentifier
+ token: isEven
+ staticElement: isEven@37
+ staticType: bool
+ arrow: =>
+ expression: IntegerLiteral
+ literal: 1
+ staticType: int
+ SwitchExpressionCase
+ guardedPattern: GuardedPattern
+ pattern: WildcardPattern
+ name: _
+ arrow: =>
+ expression: IntegerLiteral
+ literal: 0
+ staticType: int
+ rightBracket: }
+ staticType: int
+''');
+ }
+
test_rewrite_case_expression() async {
await assertNoErrorsInCode(r'''
void f(Object? x, int Function() a) {