Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit eafe011

Browse files
author
Dart CI
committed
Version 2.19.0-328.0.dev
Merge e20d10e into dev
2 parents 219df3a + e20d10e commit eafe011

File tree

7 files changed

+548
-20
lines changed

7 files changed

+548
-20
lines changed

DEPS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ vars = {
5353
# hashes.
5454
"co19_rev": "83feddb44881181ad8f2487080dafe0909517b09",
5555
# This line prevents conflicts when both packages are rolled simultaneously.
56-
"co19_2_rev": "17f2b4079f55bb5beb8f8301970089c290590ae4",
56+
"co19_2_rev": "6dc80bd1ff15d0854eaba0c7e5d606ec0ad6b3db",
5757

5858
# The internal benchmarks to use. See go/dart-benchmarks-internal
5959
"benchmarks_internal_rev": "599aa474a03c37be146f82dfbad85f34f25ffa47",

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10543,7 +10543,7 @@ class RecordPatternFieldNameImpl extends AstNodeImpl
1054310543
/// '(' [RecordPatternField] (',' [RecordPatternField])* ')'
1054410544
@experimental
1054510545
class RecordPatternImpl extends DartPatternImpl implements RecordPattern {
10546-
final NodeListImpl<RecordPatternField> _fields = NodeListImpl._();
10546+
final NodeListImpl<RecordPatternFieldImpl> _fields = NodeListImpl._();
1054710547

1054810548
@override
1054910549
final Token leftParenthesis;
@@ -10553,7 +10553,7 @@ class RecordPatternImpl extends DartPatternImpl implements RecordPattern {
1055310553

1055410554
RecordPatternImpl({
1055510555
required this.leftParenthesis,
10556-
required List<RecordPatternField> fields,
10556+
required List<RecordPatternFieldImpl> fields,
1055710557
required this.rightParenthesis,
1055810558
}) {
1055910559
_fields._initialize(this, fields);
@@ -10566,7 +10566,7 @@ class RecordPatternImpl extends DartPatternImpl implements RecordPattern {
1056610566
Token get endToken => rightParenthesis;
1056710567

1056810568
@override
10569-
NodeList<RecordPatternField> get fields => _fields;
10569+
NodeList<RecordPatternFieldImpl> get fields => _fields;
1057010570

1057110571
@override
1057210572
ChildEntities get _childEntities => super._childEntities
@@ -10587,7 +10587,12 @@ class RecordPatternImpl extends DartPatternImpl implements RecordPattern {
1058710587
DartType matchedType,
1058810588
Map<PromotableElement, VariableTypeInfo<AstNode, DartType>> typeInfos,
1058910589
MatchContext<AstNode, Expression> context) {
10590-
// TODO(scheglov) https://github.com/dart-lang/sdk/issues/50066
10590+
resolverVisitor.recordPatternResolver.resolve(
10591+
node: this,
10592+
matchedType: matchedType,
10593+
typeInfos: typeInfos,
10594+
context: context,
10595+
);
1059110596
}
1059210597

1059310598
@override
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:_fe_analyzer_shared/src/type_inference/type_analysis_result.dart';
6+
import 'package:_fe_analyzer_shared/src/type_inference/type_analyzer.dart';
7+
import 'package:analyzer/dart/ast/ast.dart';
8+
import 'package:analyzer/dart/element/element.dart';
9+
import 'package:analyzer/dart/element/type.dart';
10+
import 'package:analyzer/src/dart/ast/ast.dart';
11+
import 'package:analyzer/src/dart/element/extensions.dart';
12+
import 'package:analyzer/src/dart/element/type_provider.dart';
13+
import 'package:analyzer/src/error/codes.dart';
14+
import 'package:analyzer/src/generated/resolver.dart';
15+
16+
class RecordPatternResolver {
17+
final ResolverVisitor resolverVisitor;
18+
19+
int _positionalFieldIndex = 0;
20+
21+
RecordPatternResolver(this.resolverVisitor);
22+
23+
TypeProviderImpl get _typeProvider => resolverVisitor.typeProvider;
24+
25+
void resolve({
26+
required RecordPatternImpl node,
27+
required DartType matchedType,
28+
required Map<PromotableElement, VariableTypeInfo<AstNode, DartType>>
29+
typeInfos,
30+
required MatchContext<AstNode, Expression> context,
31+
}) {
32+
_positionalFieldIndex = 0;
33+
for (var field in node.fields) {
34+
var fieldType = _resolveFieldType(matchedType, field);
35+
field.pattern
36+
.resolvePattern(resolverVisitor, fieldType, typeInfos, context);
37+
}
38+
}
39+
40+
DartType _resolveFieldType(
41+
DartType matchedType,
42+
RecordPatternFieldImpl field,
43+
) {
44+
if (matchedType is RecordType) {
45+
var fieldNameNode = field.fieldName;
46+
if (fieldNameNode != null) {
47+
var nameToken = fieldNameNode.name;
48+
nameToken ??= field.pattern.variablePattern?.name;
49+
if (nameToken == null) {
50+
resolverVisitor.errorReporter.reportErrorForNode(
51+
CompileTimeErrorCode.MISSING_EXTRACTOR_PATTERN_GETTER_NAME,
52+
field,
53+
);
54+
return _typeProvider.dynamicType;
55+
}
56+
57+
var fieldName = nameToken.lexeme;
58+
var recordField = matchedType.fieldByName(fieldName);
59+
if (recordField != null) {
60+
return recordField.type;
61+
}
62+
} else {
63+
if (_positionalFieldIndex < matchedType.positionalFields.length) {
64+
return matchedType.positionalFields[_positionalFieldIndex++].type;
65+
}
66+
}
67+
} else if (matchedType.isDynamic) {
68+
return _typeProvider.dynamicType;
69+
}
70+
71+
return resolverVisitor.typeSystem.objectQuestion;
72+
}
73+
}

pkg/analyzer/lib/src/fasta/ast_builder.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4634,11 +4634,14 @@ class AstBuilder extends StackListener {
46344634
void handleRecordPattern(Token token, int count) {
46354635
debugEvent("RecordPattern");
46364636

4637-
var fields = popTypedList2<RecordPatternField>(count);
4638-
push(RecordPatternImpl(
4637+
var fields = popTypedList2<RecordPatternFieldImpl>(count);
4638+
push(
4639+
RecordPatternImpl(
46394640
leftParenthesis: token,
46404641
fields: fields,
4641-
rightParenthesis: token.endGroup!));
4642+
rightParenthesis: token.endGroup!,
4643+
),
4644+
);
46424645
}
46434646

46444647
@override

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import 'package:analyzer/src/dart/resolver/prefix_expression_resolver.dart';
5757
import 'package:analyzer/src/dart/resolver/prefixed_identifier_resolver.dart';
5858
import 'package:analyzer/src/dart/resolver/property_element_resolver.dart';
5959
import 'package:analyzer/src/dart/resolver/record_literal_resolver.dart';
60+
import 'package:analyzer/src/dart/resolver/record_pattern_resolver.dart';
6061
import 'package:analyzer/src/dart/resolver/scope.dart';
6162
import 'package:analyzer/src/dart/resolver/shared_type_analyzer.dart';
6263
import 'package:analyzer/src/dart/resolver/simple_identifier_resolver.dart';
@@ -281,6 +282,9 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
281282
late final ExtractorPatternResolver extractorPatternResolver =
282283
ExtractorPatternResolver(this);
283284

285+
late final RecordPatternResolver recordPatternResolver =
286+
RecordPatternResolver(this);
287+
284288
final bool genericMetadataIsEnabled;
285289

286290
/// Stack for obtaining rewritten expressions. Prior to visiting an

0 commit comments

Comments
 (0)