Skip to content

Commit ae7042b

Browse files
author
Dart CI
committed
Version 2.19.0-431.0.dev
Merge 7759f7f into dev
2 parents 962cd6e + 7759f7f commit ae7042b

14 files changed

+663
-17
lines changed

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'package:analyzer/src/fasta/token_utils.dart' as util show findPrevious;
2121
import 'package:analyzer/src/generated/resolver.dart';
2222
import 'package:analyzer/src/generated/source.dart' show LineInfo;
2323
import 'package:analyzer/src/generated/utilities_dart.dart';
24+
import 'package:collection/collection.dart';
2425
import 'package:meta/meta.dart';
2526

2627
/// Two or more string literals that are implicitly concatenated because of
@@ -1540,8 +1541,9 @@ class CastPatternImpl extends DartPatternImpl implements CastPattern {
15401541
E? accept<E>(AstVisitor<E> visitor) => visitor.visitCastPattern(this);
15411542

15421543
@override
1543-
DartType computePatternSchema(ResolverVisitor resolverVisitor) =>
1544-
throw UnimplementedError('TODO(paulberry)');
1544+
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
1545+
return resolverVisitor.analyzeCastPatternSchema();
1546+
}
15451547

15461548
@override
15471549
void resolvePattern(
@@ -8085,8 +8087,13 @@ class ListPatternImpl extends DartPatternImpl implements ListPattern {
80858087
E? accept<E>(AstVisitor<E> visitor) => visitor.visitListPattern(this);
80868088

80878089
@override
8088-
DartType computePatternSchema(ResolverVisitor resolverVisitor) =>
8089-
throw UnimplementedError('TODO(paulberry)');
8090+
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
8091+
var elementType = typeArguments?.arguments.elementAtOrNull(0)?.typeOrThrow;
8092+
return resolverVisitor.analyzeListPatternSchema(
8093+
elementType: elementType,
8094+
elements: elements,
8095+
);
8096+
}
80908097

80918098
@override
80928099
void resolvePattern(
@@ -9449,8 +9456,9 @@ class ObjectPatternImpl extends DartPatternImpl implements ObjectPattern {
94499456
E? accept<E>(AstVisitor<E> visitor) => visitor.visitObjectPattern(this);
94509457

94519458
@override
9452-
DartType computePatternSchema(ResolverVisitor resolverVisitor) =>
9453-
throw UnimplementedError('TODO(paulberry)');
9459+
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
9460+
return resolverVisitor.analyzeObjectPatternSchema(type.typeOrThrow);
9461+
}
94549462

94559463
@override
94569464
void resolvePattern(
@@ -9644,8 +9652,9 @@ class ParenthesizedPatternImpl extends DartPatternImpl
96449652
visitor.visitParenthesizedPattern(this);
96459653

96469654
@override
9647-
DartType computePatternSchema(ResolverVisitor resolverVisitor) =>
9648-
throw UnimplementedError('TODO(paulberry)');
9655+
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
9656+
return resolverVisitor.dispatchPatternSchema(pattern);
9657+
}
96499658

96509659
@override
96519660
void resolvePattern(
@@ -10109,8 +10118,12 @@ class PostfixPatternImpl extends DartPatternImpl implements PostfixPattern {
1010910118
E? accept<E>(AstVisitor<E> visitor) => visitor.visitPostfixPattern(this);
1011010119

1011110120
@override
10112-
DartType computePatternSchema(ResolverVisitor resolverVisitor) =>
10113-
throw UnimplementedError('TODO(paulberry)');
10121+
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
10122+
return resolverVisitor.analyzeNullCheckOrAssertPatternSchema(
10123+
operand,
10124+
isAssert: operator.type == TokenType.BANG,
10125+
);
10126+
}
1011410127

1011510128
@override
1011610129
void resolvePattern(
@@ -10607,8 +10620,11 @@ class RecordPatternImpl extends DartPatternImpl implements RecordPattern {
1060710620
E? accept<E>(AstVisitor<E> visitor) => visitor.visitRecordPattern(this);
1060810621

1060910622
@override
10610-
DartType computePatternSchema(ResolverVisitor resolverVisitor) =>
10611-
throw UnimplementedError('TODO(paulberry)');
10623+
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
10624+
return resolverVisitor.analyzeRecordPatternSchema(
10625+
fields: resolverVisitor.buildSharedRecordPatternFields(fields),
10626+
);
10627+
}
1061210628

1061310629
@override
1061410630
void resolvePattern(
@@ -13635,8 +13651,9 @@ class VariablePatternImpl extends DartPatternImpl implements VariablePattern {
1363513651
E? accept<E>(AstVisitor<E> visitor) => visitor.visitVariablePattern(this);
1363613652

1363713653
@override
13638-
DartType computePatternSchema(ResolverVisitor resolverVisitor) =>
13639-
throw UnimplementedError('TODO(paulberry)');
13654+
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
13655+
return resolverVisitor.analyzeVariablePatternSchema(type?.typeOrThrow);
13656+
}
1364013657

1364113658
@override
1364213659
void resolvePattern(

pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ class TypeSystemOperations
408408

409409
@override
410410
DartType glb(DartType type1, DartType type2) {
411-
throw UnimplementedError('TODO(paulberry)');
411+
return typeSystem.getGreatestLowerBound(type1, type2);
412412
}
413413

414414
@override
@@ -452,7 +452,7 @@ class TypeSystemOperations
452452

453453
@override
454454
DartType makeNullable(DartType type) {
455-
throw UnimplementedError('TODO(paulberry)');
455+
return typeSystem.makeNullable(type);
456456
}
457457

458458
@override

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,14 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
990990
});
991991
}
992992

993+
@override
994+
void visitPatternVariableDeclarationStatement(
995+
PatternVariableDeclarationStatement node) {
996+
_patternVariables.casePatternStart();
997+
super.visitPatternVariableDeclarationStatement(node);
998+
_patternVariables.casePatternFinish();
999+
}
1000+
9931001
@override
9941002
void visitPrefixedIdentifier(covariant PrefixedIdentifierImpl node) {
9951003
var newNode = _astRewriter.prefixedIdentifier(_nameScope, node);

pkg/analyzer/lib/src/generated/resolver.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2834,6 +2834,19 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
28342834
elementResolver.visitPartOfDirective(node);
28352835
}
28362836

2837+
@override
2838+
void visitPatternVariableDeclarationStatement(
2839+
PatternVariableDeclarationStatement node) {
2840+
checkUnreachableNode(node);
2841+
var declaration = node.declaration;
2842+
// TODO(scheglov) Support for `late` was removed.
2843+
analyzePatternVariableDeclarationStatement(
2844+
node, declaration.pattern, declaration.expression,
2845+
isFinal: declaration.keyword.keyword == Keyword.FINAL, isLate: false);
2846+
// node.visitChildren(this);
2847+
popRewrite(); // expression
2848+
}
2849+
28372850
@override
28382851
void visitPostfixExpression(PostfixExpression node, {DartType? contextType}) {
28392852
checkUnreachableNode(node);

pkg/analyzer/lib/src/test_utilities/find_node.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,29 @@ class FindNode {
4545
return nodes.single;
4646
}
4747

48+
/// Returns the [PatternVariableDeclaration], there must be only one.
49+
PatternVariableDeclaration get singlePatternVariableDeclaration {
50+
var nodes = <PatternVariableDeclaration>[];
51+
unit.accept(
52+
FunctionAstVisitor(
53+
patternVariableDeclaration: nodes.add,
54+
),
55+
);
56+
return nodes.single;
57+
}
58+
59+
/// Returns the [PatternVariableDeclarationStatement], there must be only one.
60+
PatternVariableDeclarationStatement
61+
get singlePatternVariableDeclarationStatement {
62+
var nodes = <PatternVariableDeclarationStatement>[];
63+
unit.accept(
64+
FunctionAstVisitor(
65+
patternVariableDeclarationStatement: nodes.add,
66+
),
67+
);
68+
return nodes.single;
69+
}
70+
4871
AdjacentStrings adjacentStrings(String search) {
4972
return _node(search, (n) => n is AdjacentStrings);
5073
}

pkg/analyzer/lib/src/test_utilities/function_ast_visitor.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class FunctionAstVisitor extends RecursiveAstVisitor<void> {
1515
final void Function(IfStatement)? ifStatement;
1616
final void Function(Label)? label;
1717
final void Function(MethodInvocation)? methodInvocation;
18+
final void Function(PatternVariableDeclaration)? patternVariableDeclaration;
19+
final void Function(PatternVariableDeclarationStatement)?
20+
patternVariableDeclarationStatement;
1821
final void Function(SimpleIdentifier)? simpleIdentifier;
1922
final void Function(SwitchExpressionCase)? switchExpressionCase;
2023
final void Function(SwitchPatternCase)? switchPatternCase;
@@ -28,6 +31,8 @@ class FunctionAstVisitor extends RecursiveAstVisitor<void> {
2831
this.ifStatement,
2932
this.label,
3033
this.methodInvocation,
34+
this.patternVariableDeclaration,
35+
this.patternVariableDeclarationStatement,
3136
this.simpleIdentifier,
3237
this.switchExpressionCase,
3338
this.switchPatternCase,
@@ -88,6 +93,19 @@ class FunctionAstVisitor extends RecursiveAstVisitor<void> {
8893
super.visitMethodInvocation(node);
8994
}
9095

96+
@override
97+
void visitPatternVariableDeclaration(PatternVariableDeclaration node) {
98+
patternVariableDeclaration?.call(node);
99+
super.visitPatternVariableDeclaration(node);
100+
}
101+
102+
@override
103+
void visitPatternVariableDeclarationStatement(
104+
PatternVariableDeclarationStatement node) {
105+
patternVariableDeclarationStatement?.call(node);
106+
super.visitPatternVariableDeclarationStatement(node);
107+
}
108+
91109
@override
92110
void visitSimpleIdentifier(SimpleIdentifier node) {
93111
if (simpleIdentifier != null) {

pkg/analyzer/test/src/dart/resolution/cast_pattern_test.dart

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,39 @@ CastPattern
6262
staticElement: dart:core::@class::int
6363
staticType: null
6464
type: int
65+
''');
66+
}
67+
68+
test_variableDeclaration() async {
69+
await assertNoErrorsInCode(r'''
70+
void f(x) {
71+
var (a as int) = x;
72+
}
73+
''');
74+
final node = findNode.singlePatternVariableDeclaration;
75+
assertResolvedNodeText(node, r'''
76+
PatternVariableDeclaration
77+
keyword: var
78+
pattern: ParenthesizedPattern
79+
leftParenthesis: (
80+
pattern: CastPattern
81+
pattern: VariablePattern
82+
name: a
83+
declaredElement: hasImplicitType a@19
84+
type: int
85+
asToken: as
86+
type: NamedType
87+
name: SimpleIdentifier
88+
token: int
89+
staticElement: dart:core::@class::int
90+
staticType: null
91+
type: int
92+
rightParenthesis: )
93+
equals: =
94+
expression: SimpleIdentifier
95+
token: x
96+
staticElement: self::@function::f::@parameter::x
97+
staticType: dynamic
6598
''');
6699
}
67100
}

pkg/analyzer/test/src/dart/resolution/list_pattern_test.dart

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,123 @@ ListPattern
383383
type: int
384384
rightBracket: ]
385385
requiredType: List<int>
386+
''');
387+
}
388+
389+
test_variableDeclaration_inferredType() async {
390+
await assertNoErrorsInCode(r'''
391+
void f(List<int> x) {
392+
var [a] = x;
393+
}
394+
''');
395+
final node = findNode.singlePatternVariableDeclaration;
396+
assertResolvedNodeText(node, r'''
397+
PatternVariableDeclaration
398+
keyword: var
399+
pattern: ListPattern
400+
leftBracket: [
401+
elements
402+
VariablePattern
403+
name: a
404+
declaredElement: hasImplicitType a@29
405+
type: int
406+
rightBracket: ]
407+
requiredType: List<int>
408+
equals: =
409+
expression: SimpleIdentifier
410+
token: x
411+
staticElement: self::@function::f::@parameter::x
412+
staticType: List<int>
413+
''');
414+
}
415+
416+
test_variableDeclaration_typeSchema_withTypeArguments() async {
417+
await assertNoErrorsInCode(r'''
418+
void f() {
419+
var <int>[a] = g();
420+
}
421+
422+
T g<T>() => throw 0;
423+
''');
424+
final node = findNode.singlePatternVariableDeclaration;
425+
assertResolvedNodeText(node, r'''
426+
PatternVariableDeclaration
427+
keyword: var
428+
pattern: ListPattern
429+
typeArguments: TypeArgumentList
430+
leftBracket: <
431+
arguments
432+
NamedType
433+
name: SimpleIdentifier
434+
token: int
435+
staticElement: dart:core::@class::int
436+
staticType: null
437+
type: int
438+
rightBracket: >
439+
leftBracket: [
440+
elements
441+
VariablePattern
442+
name: a
443+
declaredElement: hasImplicitType a@23
444+
type: int
445+
rightBracket: ]
446+
requiredType: List<int>
447+
equals: =
448+
expression: MethodInvocation
449+
methodName: SimpleIdentifier
450+
token: g
451+
staticElement: self::@function::g
452+
staticType: T Function<T>()
453+
argumentList: ArgumentList
454+
leftParenthesis: (
455+
rightParenthesis: )
456+
staticInvokeType: List<int> Function()
457+
staticType: List<int>
458+
typeArgumentTypes
459+
List<int>
460+
''');
461+
}
462+
463+
test_variableDeclaration_typeSchema_withVariableType() async {
464+
await assertNoErrorsInCode(r'''
465+
void f() {
466+
var [int a] = g();
467+
}
468+
469+
T g<T>() => throw 0;
470+
''');
471+
final node = findNode.singlePatternVariableDeclaration;
472+
assertResolvedNodeText(node, r'''
473+
PatternVariableDeclaration
474+
keyword: var
475+
pattern: ListPattern
476+
leftBracket: [
477+
elements
478+
VariablePattern
479+
type: NamedType
480+
name: SimpleIdentifier
481+
token: int
482+
staticElement: dart:core::@class::int
483+
staticType: null
484+
type: int
485+
name: a
486+
declaredElement: a@22
487+
type: int
488+
rightBracket: ]
489+
requiredType: List<int>
490+
equals: =
491+
expression: MethodInvocation
492+
methodName: SimpleIdentifier
493+
token: g
494+
staticElement: self::@function::g
495+
staticType: T Function<T>()
496+
argumentList: ArgumentList
497+
leftParenthesis: (
498+
rightParenthesis: )
499+
staticInvokeType: List<int> Function()
500+
staticType: List<int>
501+
typeArgumentTypes
502+
List<int>
386503
''');
387504
}
388505
}

0 commit comments

Comments
 (0)