Add PatternField.effectiveName

Change-Id: Icbeb5bfa8ee96fbed8f60f8b89ff7bf436579239
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/286064
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Konstantin Shcheglov 2023-03-01 16:59:00 +00:00 committed by Commit Queue
parent cfa6d0f735
commit 814eda8edc
3 changed files with 19 additions and 14 deletions

View file

@ -4277,8 +4277,13 @@ abstract class PatternAssignment implements Expression {
/// Clients may not extend, implement or mix-in this class.
@experimental
abstract class PatternField implements AstNode {
/// The element referenced explicitly by [name], or implicitly by the
/// variable pattern inside [pattern]. Is `null` if not resolved yet,
/// The name specified explicitly by [name], or implied by the variable
/// pattern inside [pattern]. Always `null` if [name] is `null`. Can be `null`
/// if [name] does not have the explicit name and [pattern] is not a variable
/// pattern.
String? get effectiveName;
/// The element referenced by [effectiveName]. Is `null` if not resolved yet,
/// not `null` inside valid [ObjectPattern]s, always `null` inside
/// [RecordPattern]s.
Element? get element;

View file

@ -10455,6 +10455,16 @@ class PatternFieldImpl extends AstNodeImpl implements PatternField {
@override
Token get beginToken => name?.beginToken ?? pattern.beginToken;
@override
String? get effectiveName {
final nameNode = name;
if (nameNode != null) {
final nameToken = nameNode.name ?? pattern.variablePattern?.name;
return nameToken?.lexeme;
}
return null;
}
@override
Token get endToken => pattern.endToken;

View file

@ -313,13 +313,7 @@ class PatternConverter {
} else if (pattern is ObjectPattern) {
Map<String, Space> fields = {};
for (PatternField field in pattern.fields) {
PatternFieldName? fieldName = field.name;
String? name;
if (fieldName?.name != null) {
name = fieldName!.name!.lexeme;
} else {
name = field.element?.name;
}
final name = field.effectiveName;
if (name == null) {
// TODO(johnniwinther): How do we handle error cases?
continue;
@ -360,11 +354,7 @@ class PatternConverter {
name = '\$${index++}';
positional.add(cache.typeSystem.typeProvider.dynamicType);
} else {
if (fieldName.name != null) {
name = fieldName.name!.lexeme;
} else {
name = field.pattern.variablePattern?.name.lexeme;
}
name = field.effectiveName;
if (name != null) {
named[name] = cache.typeSystem.typeProvider.dynamicType;
} else {